본문 바로가기

Build/Make

08. VPATH, vpath

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