make와 gmake는 유사하나
Fedora Core 6 에서는 실질적으로 symbolic link로 연결이 되어있다.

# ll /usr/bin/*make
lrwxrwxrwx 1 root root      4 Feb 16 13:23 /usr/bin/gmake -> make
-rwxr-xr-x 1 root root 162204 Jul 13  2006 /usr/bin/make

[링크 : http://linux.die.net/man/1/gmake]
[링크 : http://linux.die.net/man/1/make]

shenzhen{bzhu}$ gmake -version
GNU Make version 3.71, by Richard Stallman and Roland McGrath.
Copyright (C) 1988, 89, 90, 91, 92, 93, 94 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.

shenzhen{bzhu}$ make -version
GNU Make 3.80
Copyright (C) 2002 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.

[링크 : http://www.unix.com/high-level-programming/29191-what-distinguish-between-gmake-make.html]

아무튼, 다르지만 실질적으로 같은 녀석이다.
Posted by 구차니
TAG gmake, make

댓글을 달아 주세요

컴파일 환경 자동화툴인
autoconf, automake, libtool을 설명한다.

컴파일시 각종 헤더들의 위치, 라이브러리들의위치
그리고 설치할 위치들을 설정하고,
컴파일할 프로그램의 세부 패키지를 설정한다.

아래는 ffmpeg의 configure --help 내용중 일부이다.
Standard options:
  --prefix=PREFIX         install in PREFIX          []

  --bindir=DIR            install binaries in DIR    [PREFIX/bin]
  --datadir=DIR           install data files in DIR  [PREFIX/share/ffmpeg]
  --libdir=DIR            install libs in DIR        [PREFIX/lib]
  --shlibdir=DIR          install shared libs in DIR [PREFIX/lib]
  --incdir=DIR            install includes in DIR    [PREFIX/include]
  --mandir=DIR            install man page in DIR    [PREFIX/share/man]

Advanced options (experts only):
  --enable-cross-compile   assume a cross-compiler is used
  --arch=ARCH              select architecture []
  --target-os=OS           compiler targets OS []
  --cross-prefix=PREFIX    use PREFIX for compilation tools []
  --source-path=PATH       path to source code [/home/morpheuz/st7109/target_ori/root/ffmpeg]
  --sysroot=PATH           root of cross-build tree
  --sysinclude=PATH        location of cross-build system headers
  --target-exec=CMD        command to run executables on target
  --target-path=DIR        path to view of build directory on target
  --nm=NM                  use nm tool
  --as=AS                  use assembler AS []
  --cc=CC                  use C compiler CC [gcc]
  --ld=LD                  use linker LD
  --host-cc=HOSTCC         use host C compiler HOSTCC
  --host-cflags=HCFLAGS    use HCFLAGS when compiling for host
  --host-ldflags=HLDFLAGS  use HLDFLAGS when linking for host
  --host-libs=HLIBS        use libs HLIBS when linking for host
  --extra-cflags=ECFLAGS   add ECFLAGS to CFLAGS []
  --extra-ldflags=ELDFLAGS add ELDFLAGS to LDFLAGS []
  --extra-libs=ELIBS       add ELIBS []
  --extra-version=STRING   version string suffix []
  --build-suffix=SUFFIX    library name suffix []
  --cpu=CPU                select the minimum required CPU (affects
                           instruction selection, may crash on older CPUs)
  --disable-yasm           disable use of yasm assembler
  --enable-pic             build position-independent code

이녀석의 경우 arch 와 target-os를 조합해서 cross compiler prefix를 만들어 낸다.
예를들어 sh4-linux의 경우
--enable-cross-compile --arch=sh4 --target-os=linux 라고 하면
자동으로 sh4-linux- 접두를 붙이게 된다.

하지만, target 에만 존재하는 library를 끌어 오려면 어떤 옵션을 써야 하나.. 후우..

[링크 : http://wariua.springnote.com/pages/1041972] << 한글 번역
[링크 : http://sources.redhat.com/autobook/]
Posted by 구차니

댓글을 달아 주세요

make -j2
이렇게 컴파일을 하면 동시에 2개의 작업을 실행하여
다소 컴파일 시간이 줄어드는 효과가 있다.

-j jobs 에서 jobs 에 숫자를 넣지 않으면, make가 돌릴수 있는 최대한의 숫자가 제한되지 않는다고 한다.
현재 사용중인 개발환경에서 make 로는 1분 make -j2 / make -j4 에서 40초 걸리는 것으로 봐서
상당히 유용한 옵션으로 생각이 된다.

-j [jobs], --jobs[=jobs]
    Specifies the number of jobs (commands) to run simultaneously. If there is more than one -j option, the last one is effective. If the -j option is given without an argument, make will not limit the number of jobs that can run simultaneously.

[링크 : http://linux.die.net/man/1/make]
[링크 : http://theory.uwinnipeg.ca/localfiles/infofiles/make/make_47.html]
[링크 : http://www.ibm.com/developerworks/kr/library/l-bash3.html]

Posted by 구차니

댓글을 달아 주세요

아래 링크를 보니, target을 위한 include 들이 잘못되었을 것이라고 되어있다.
나의 경우에는 samba 크로스컴파일 중에 겪은 녀석으로(글 쓰는 시점에도 미해결 ㅠ.ㅠ)
이걸 해결한 줄 알고 있었더니, 콤보로 Error: unknown opcode 라는 녀석이 발동되었다..
왜인가 했더니.. macro 라고 되어있다. 그런이유로, asm 레벨에서 오류가 있었다고 하고
조금은 뜬금 없어 보이지만, asm 에 불가능한 문구가 있다고 에러가 나는 듯 하다.


FD_ZERO is a macro used to initialise an fd_set structure prior to using
select().  These are OS-provided, so if they won't compile then this
suggests that you're using the wrong headers for the target.

[링크 : http://www.realvnc.com/pipermail/vnc-list/2007-February/057070.html]


추적 / Trace
# grep -rn "FD_ZERO" /usr/include
/usr/include/sys/select.h:96:#define    FD_ZERO(fdsetp)         __FD_ZERO (fdsetp)

/usr/include/bits/select.h:70:#define __FD_ZERO(fdsp) \
 26 # define __FD_ZERO(fdsp) \
 27   do {                                                                        \
 28     int __d0, __d1;                                                           \
 29     __asm__ __volatile__ ("cld; rep; stosl"                                   \
 30                           : "=c" (__d0), "=D" (__d1)                          \
 31                           : "a" (0), "0" (sizeof (fd_set)                     \
 32                                           / sizeof (__fd_mask)),              \
 33                             "1" (&__FDS_BITS (fdsp)[0])                       \
 34                           : "memory");                                        \
 35   } while (0)

/usr/include/asm/posix_types.h:70:#define __FD_ZERO(fdsetp) \
 69 #undef  __FD_ZERO
 70 #define __FD_ZERO(fdsetp) \
 71 do { \
 72         int __d0, __d1; \
 73         __asm__ __volatile__("cld ; rep ; stosl" \
 74                         :"=m" (*(__kernel_fd_set *) (fdsetp)), \
 75                           "=&c" (__d0), "=&D" (__d1) \
 76                         :"a" (0), "1" (__FDSET_LONGS), \
 77                         "2" ((__kernel_fd_set *) (fdsetp)) : "memory"); \
 78 } while (0)

Posted by 구차니

댓글을 달아 주세요

아마.. 옵션 바꾸어 본다고 쑈를 하다가
make clean 안하고 하는 바람에 생긴 문제인 듯 하다.


unknown opcode는 어셈블리 수준에서 특정 명령어가 잘 못 되었다는 건데,
중간에 make 하다가 중단되어 옵션을 변경하고 clean 하지 않은채 다시 컴파일을 시도하면
이미 compile 된 녀석들은 잘못된 옵션으로 컴파일이 되면서 특정 함수를 못 찾거나
혹은 이러한 특수한 에러를 발생 시키는 듯 하다.



일단 make clean 후에
./configure 를 수행 후
make 하도록 하면 이러한 에러는 피할 수 있을 것으로 보인다.
Posted by 구차니

댓글을 달아 주세요

위와 같은 에러는 도무지 종을 잡을 수 없었는데
아래의 문서에서 해결책을 찾았다.

# Makefile:10: *** commands commence before first target. Stop.

위의 에러는 '첫 번째 타겟이 나오기 전에 명령어가 시작되었다'는 애매한 에러 메시지이다. 필자가 경험한 이 에러의 원인은 주로 긴 문장을 여러 라인에 표시를 하기 위해서 '\'를 사용할 때, 이를 잘못 사용했기 때문인 것 같다. 즉 '\'부분은 라인의 가장 끝문자가 되어야 하는데 실수로 '\'뒤에 스페이스를 몇 개 집어넣으면 여지없이 위의 에러가 발생한다.

대처: 10번째 줄(근처)에서 '\'문자가 있거든 이 문자가 라인의 가장 끝문자가 되도록 한다. 즉 '\'문자 다음에 나오는 글자(스페이스가 대부분) 는 모조리 없애 버린다.

[링크 : http://wiki.kldp.org/KoreanDoc/html/GNU-Make/GNU-Make-8.html]

결론만 말하자면, 여러줄에 선언하는 녀석의 끝에 \ 가 제대로 들어가 있는지 확인하라는 것이다.
Posted by 구차니

댓글을 달아 주세요

kscope 를 컴파일 하면서 겪은 경우인데..
Makefile.cvs 혹은 Makefile.am 이라는 정체 불명의 녀석들이 있었다.
당근 make하면 될 줄 알았는데 rule 이 없다고 꾸시렁 꾸시렁 ㄱ-


CVS

  1. Check out the source code.
  2. Change to the KScope directory.
  3. Create the configuration script:

    make -f Makefile.cvs

  4. Configure, compile and install as in the previous section.

[출처 : http://kscope.sourceforge.net/install.shtml]

그래서 찾아 봤더니 이런 -f 옵션이라는것이 존재한다.

+-f file, --file=file, --makefile=FILE
Use file as a makefile.

[링크 : http://linux.die.net/man/1/make]
Posted by 구차니
TAG make

댓글을 달아 주세요


make를 하는데 에러가 발생해서 컴파일 진행을 못하길래 먼가 해서 검색을 해봤더니

1. Are you building over an NFS volume?

2. you could do

find . -type f | xargs -n 5 touch
make clean
make

라는 글이 나왔다 그래서 머가 잘못되었나 파일을 검색해봤더니

-rwxr--r-- 1 morpheuz dev 129616 Jan  2  2009 mainmenu.c

참고로 오늘은 2008년 12월 3일이다..
노트북에서 작업을 했는데 노트북 배터리를 뽑아 놓고 방치하는 바람에 시간이 틀어져 있었나 보다.

아무튼 make의 경우에는 시간에 민감하게 작동하므로 반드시 시간을 동기화 시켜야 한다.

[출처 : http://www.unix.com/sun-solaris/45737-make-2-warning-clock-skew-detected-your-build-may-incomplete.html]
Posted by 구차니

댓글을 달아 주세요