두줄요약 : Makefile 에서 wildcard 함수 쓸때, 검색 결과를 변수에 담아놓으면, 경로값 변경을 일괄로 할 수 없다. 배열의 맨 처음값만 경로가 바뀌고, 나머지는 안 바뀐다.
Makefile 로 make 를 할 때, 파일을 wildcard 로 지정하는 경우가 있을거다.
이 때, Makefile 안에서 wildcard 의 결과값에 일괄적으로 상대경로를 변경할 수 없다.
코드로 보자.
~/aaa$ ls ./
Makefile
~/aaa$ ls ./bbb
test1.c test2.c test2.c
$ ls ./
Makefile
$ cat Makefile
FILELISTS=$(wildcard ./bbb/test*.c)
all:
@echo $(FILELISTS)
1) gcc ./bbb/$(wildcard test*.c)
2) gcc $(wildcard ./bbb/test*.c)
clean:
rm a.out
현재 디렉토리는 ./aaa 이다. 하위에 ./aaa/bbb 가 있다. 만약 Makefile 이 각 디렉토리별로 있어서 땡겨쓴다거나( include ) 하면, path 가 문제가 될거다.
이 상황에서, Makefile 의 wildcard 함수를 쓴다면, 결과값에 해당하는 파일 목록의 상대주소는 어떻게 할당될까?
결론부터 말하면, 1번은 틀린 답이다. 2번으로 써야 된다.
1) gcc ./bbb/$(wildcard test*.c)
의 경우, 실행 위치에 따라 결과값이 다르다.
- 만일 aaa 디렉토리에서 make 를 실행했다면, test*.c 파일 목록 자체를 찾지 못한다. 왜냐면 모든 test*.c 파일은 하위 디렉토리인 ./aaa/bbb 아래에 있으니까.
- 만약 bbb 디렉토리에서 make 를 실행했다면, test*.c 파일 자체는 찾겠지만, 목록이 꼬인다. 그냥 echo 로 찍어보는 게 빠르다.
echo ./bbb/$(wildcard test*.c)
gcc ./bbb/$(wildcard test*.c)
하면, 기대값은
./bbb/test1.c ./bbb/test2.c ./bbb/test3.c
이겠지만, 실제로는
./bbb/test1.c test2.c test3.c
로 나온다.
이게
Makefile 을 자신 한 곳에서만 사용한다면야 상관없는데, 프로젝트로 include 하면서 여기저기 불러쓸 때 , 하위 Makefile 에서 파일목록을 배열에 담고, 그걸 상위 Makefile 에서 일괄로 변경하면, 꼬인다.
설명이 쉽지 않네. 쉬운 이야기인데 글이 너무 길어진다.
'IT ' 카테고리의 다른 글
인터넷 공유기를 스위칭 허브로 사용. (0) | 2022.12.06 |
---|---|
피싱 경고 : Notice: - Amazon Account Suspended (0) | 2021.12.17 |
cmake clean (0) | 2021.12.11 |
창조적 스팸 - [롯데닷컴]주문하신 '티셔츠'반송처리되셨습니다. (0) | 2015.04.19 |
I'm your father - 크리스마스 버전 (0) | 2014.12.25 |