IT

make의 wildcard 로 찾은 파일을 변수에 할당할 때 path 오류.

(주)CKBcorp., 2022. 1. 13. 10:50
반응형



두줄요약 : 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 에서 일괄로 변경하면, 꼬인다. 


설명이 쉽지 않네. 쉬운 이야기인데 글이 너무 길어진다. 

반응형