드물게(?) 크로스컴파일을 시도하려다 다시 지우고 컴파일을 하려고 하면 안되는 경우가 있다.
아래는 gdb/insight의 경우인데, 특이하게도 하라는대로 해도 안된다. ㄱ-

configure: loading cache ./config.cache
configure: error: `target_alias' has changed since the previous run:
configure:   former value:  sh4-linux
configure:   current value: i686-pc-linux-gnu
configure: error: changes in the environment can compromise the build
configure: error: run `make distclean' and/or `rm ./config.cache' and start over

이녀석은 make distclean 해도 하위 디렉토리의 config.cache를 개별로 지우지 않기 때문이다.
(음... 알려줘서 원 소스에 넣도록 해야하나?)

미봉책으로는
# make distclean
# find ./ -name config.cache -exec {} \;
를 하면 하위 디렉토리에서 config.cache를 찾아 지우므로 해결된다.

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

make를 조용하게  (0) 2014.09.12
cmake 사용  (0) 2011.10.07
cmake - cross make  (0) 2010.04.06
makefile 에서 컴파일할 목록 생성하기  (0) 2010.04.03
makefile 정렬하기  (2) 2010.03.31
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 구차니
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 구차니
아마.. 옵션 바꾸어 본다고 쑈를 하다가
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 구차니

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 구차니