Welcome to CMake, the cross-platform, open-source build system. CMake is a family of tools designed to build, test and package software. CMake is used to control the software compilation process using simple platform and compiler independent configuration files. CMake generates native makefiles and workspaces that can be used in the compiler environment of your choice.

[링크 : http://www.cmake.org/]

oscam을 컴파이르 하는데 cmake 라는것을 요구하길래 먼가해서 검색해 봤더니
cross platform을 지원하는 make 라고 한다.

사용법은
cmake
make 라는데

configure 와 유사한 역활을 하는것으로 보인다.

'프로그램 사용 > make, configure' 카테고리의 다른 글

cmake 사용  (0) 2011.10.07
cross compile 초기화 하기  (0) 2010.05.18
makefile 에서 컴파일할 목록 생성하기  (0) 2010.04.03
makefile 정렬하기  (2) 2010.03.31
make, gmake  (0) 2010.03.02
Posted by 구차니
makefile에서
OBJS = a.o b.o
SRC = $(OBJ:.o=.c)

a.o : a.c
b.o : b.c
이런식으로 파일을 일일이 나열을 하는데, 아무래도 귀찮다 -ㅁ-!

하지만 $(wildcard) 라는 함수를 이용하면 나열은 하지 않아도 된다.
SRC = $(wildcard *.c)
OBJ = $(SRC:.c=.o)

이렇게 하면 (의존성은 제외하더라도) 복잡하게 할 필요 없이 간단하게 끝!

[링크 : http://www.viper.pe.kr/docs/make-ko/make-ko_4.html#SEC21]

'프로그램 사용 > make, configure' 카테고리의 다른 글

cross compile 초기화 하기  (0) 2010.05.18
cmake - cross make  (0) 2010.04.06
makefile 정렬하기  (2) 2010.03.31
make, gmake  (0) 2010.03.02
개발환경 자동화 - autoconf, automake, libtool  (0) 2010.03.02
Posted by 구차니
make를 이용하여 컴파일할 소스들의 목록을 작성할때

# cat Makefile
OBJS-$(CONFIG_AAC_DEMUXER)               += raw.o id3v1.o id3v2.o
OBJS-$(CONFIG_AC3_DEMUXER)               += raw.o
OBJS-$(CONFIG_AC3_MUXER)                 += raw.o

위와 같이 OBJS에 += 로 계속 더해나가다 보면
raw.o 가 여러개 붙어지고, 이 상태로 컴파일을 하면 symbol들이 중복되어

Function funcname() is deprecated in path/filename.ext on line 00

이런식으로 에러를 발생한다.
이를 간편하게 해결하기 위해서는 sort를 이용하면 된다.
sort는 중복된 내용을 제거해주는 역활도 한다.

$(sort list)
    Sorts the words of list in lexical order, removing duplicate words.
    The output is a list of words separated by single spaces. Thus,

              $(sort foo bar lose)
        

    returns the value `bar foo lose'.

    Incidentally, since sort removes duplicate words,
    you can use it for this purpose even if you don't care about the sort order.

[링크 : http://www.gnu.org/software/make/manual/make.html#Text-Functions]
[링크 : http://korea.gnu.org/manual/4check/make-3.77/ko/make_8.html#SEC76]
Posted by 구차니
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 구차니
컴파일 환경 자동화툴인
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 구차니