Rule 의 요소인 Prerequisite 를 구성하는 소스 파일들은
보통 여러 다른 디렉토리에 분류되며 여러 디렉토리에 분할된 소스 파일을
찾기 위해 VPATH, vpath 를 사용한다.
VPATH
Target, Prerequisite 리스트 목록에 없는 파일이 존재하면 VPATH 로 지정한 디렉토리를 찾는다.
VPATH 변수안에 디렉토리 이름들은 콜론이나 공백들로 구분된다.
디렉토리들이 나열된 순서로 make가 검색한다.
예를 들어서, make가 이 순서로 검색하는, 두 디렉토리들, `src'과 `../headers', 을 담고 있는 경로를 지정하면
VPATH = src : ../headers
foo.o : foo.c
만약 foo.c 가 현재 디렉토리에 없고 src 폴더에 있다면 아래와 같이 자동으로 해석된다.
foo.o : src/foo.c
만약 src 폴더에도 없고 headers 폴더에 있다면 아래와 같이 자동으로 해석된다.
foo.o : ../headers/foo.c
VPATH는 찾을 디렉토리만을 설정한다.
따라서 어떤 소스파일을 찾기 위해서 VPATH를 모두 찾아봐야 한다.
소스의 리스트가 적으면 그리 큰 문제가 되지 않지만 소스파일이 많으면 부하가 걸리는 문제가 있다.
vpath
VPATH 보다 선택적으로 디렉토리를 선택하는 경우 vpath 를 사용한다.
vpath pattern directories
vpath %.h ../headers
make는 `.h'로 끝나는 모든 의존성에 대해, 현재 디렉토리 없으면 `../headers' 디렉토리에서 찾는다.
vpath pattern
vpath %.c foo
vpath % blish
vpath %.c bar
라고 쓰면 `.c'로 끝나는 파일을, `foo', `blish', 그리고 `bar'의 순서대로 찾는다.
vpath
vpath 지시어로 전에 지정된 모든 찾기 경로를 지운다.
vpath Example
예를 들어 아래와 같이 구성된 파일이 있는 경우에
exam/Makefile
exam/main.c
exam/include/bar.h
exam/include/foo.h
exam/src/bar.c
exam/src/foo.c
아래와 같은 makefile 을 만들었다고 하면
exec : bar.o foo.o main.o
gcc -o exec bar.o foo.o main.o
bar.o : src/bar.c include/bar.h
#bar.o : bar.c include/bar.h
gcc -I include -c src/bar.c
foo.o : src/foo.c include/foo.h
#foo.o : foo.c include/foo.h
gcc -I include -c src/foo.c
main.o : bar.o foo.o
gcc -I include -c main.c
clean :
rm -rf *.o *.exe
include 디렉토리에서는 .h 파일들만 검색하고
bar 폴더에서는 .c 파일만 검색하면 된다.
vpath 를 사용해서 아래와 같이 개선할 수 있다.
vpath %.c src
vpath %.h include
exec : bar.o foo.o main.o
gcc -o exec bar.o foo.o main.o
#bar.o : include/bar.h src/bar.c
bar.o : bar.c bar.h
gcc -I include -c src/bar.c
#foo.o : include/foo.h src/foo.c
foo.o : foo.c foo.h
gcc -I include -c src/foo.c
main.o : bar.o foo.o
gcc -I include -c main.c
clean :
rm -rf *.o *.exe
'Build > Make' 카테고리의 다른 글
10. Target Without Recipe And Prerequiste (0) | 2020.01.22 |
---|---|
09. Phony Target (0) | 2020.01.22 |
07. Wildcard (0) | 2020.01.22 |
06. Variable (0) | 2020.01.22 |
05. Rule 의 구성 (0) | 2020.01.22 |