3. VPATH(vpath), conditional and include 지시자
Program Lang./Makefile 2013. 5. 9. 13:231. VPATH, vpath 란?
make가 Target과 Prerequisite를 찾을 위치를 현재 디렉토리 뿐만 아니라 VPATH에 명시된 위치에서
추가적으로 찾아보도록 지시할 수 있다. VPATH는 Target과 Prerequisite에 대해서 찾을 위치를 추가적으로 명시하는
것이지 command line에 있는 파일의 위치는 명시하지 않는다.
첫번째에서 소개한 예제를 아래와 같이 소스 파일은 src 디렉토리에 header파일은 include에 Makefile과 main.c파일
은 exam 상위 폴더에 위치하도록 수정하고 Makefile을 수정하였다.
예제 파일 :
아래 Makefile에서 주석처리된 부분을 풀면 VPATH를 활성화하고 VPATH에 대한 동작을 확인할 수 있다.
#***********************************************************************# # ---------------------------------------------------------------------- # Copyright(c) 2012-2013 by hee-soon kim # # All rights are reserved # # ----------------------------------------------------------------------# # # FILE NAME : Makefile # VERSION : 1.0 # AUTHOR : heesoon,kim(김희순), chipmaker.tistory.com) # DATE : 2012/12/21 # #***********************************************************************# #VPATH = src 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
VPATH는 찾을 디렉토리만을 설정한다. 따라서 어떤 소스파일을 찾기 위해서 VPATH를 모두 찾아봐야 한다.
소스의 리스트가 적으면 그리 큰 문제가 되지 않지만 소스파일이 많으면 부하가 걸리는 문제가 있다.
이를 좀 개선한 것이 vpath 구문이다. 사용법과 수정된 Makefile은 아래와 같다.
아래에서 header의 위치까지 포함시키면서 Prerequisite에서 include폴더의 명시를 제거할 수 있다.
#***********************************************************************# # ---------------------------------------------------------------------- # Copyright(c) 2012-2013 by hee-soon kim # # All rights are reserved # # ----------------------------------------------------------------------# # # FILE NAME : Makefile # VERSION : 1.0 # AUTHOR : heesoon,kim(김희순), chipmaker.tistory.com) # DATE : 2012/12/21 # #***********************************************************************# 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
마지막으로 command line를 더 Makefile의 일반적인 표현으로 수정하려면 makefile variable 편에서
Automatic variable을 숙지한 후 더 간단한 makefile을 만들 수 있다.
2. Conditional Processing
Makefile에서 코드를 선택적으로 포함시키거나 배제할 수 있다. 형식은 아래와 같다.
ifdef variable-name # variable-name : $( )로 정의되면 안된다.
ifndef variable-name
ifeq test # test : (a, b), "a" "b", 'a' 'b' 가 될 수 있다.
ifneq test
예제는 아래와 같다.
libGui.a : $(gui_objects)
$(AR) $(ARFLAGS) $@ $<
ifdef RANLIB
$(RANLIB) $@
endif
3. Include Directive (Include 지시자)
makefile 하나에 모든 rule을 기술할 수 있다. 하지만 공통으로 사용되는 makefile은 별도로 분리하여 필요할 때
현재 makefile에 포함시켜 사용하면 구조적으로 이해하기 쉽고 일반적으로 대형 프로젝트에서는 그렇게 한다.
사용법은 아래와 같다. 자세한 예제는 생략하고 차 후 어느정도 형식을 갖쳐진 makefile에서 소개할 것이다.
include [상위위치] definitions.mk # makefile 상에서
make --include-dir [찾을 디렉토리 위치] (-I) # command 상에서 include 디렉토리 위치 지정법
include 지시자는 C언어의 #include문과 유사하게 동작하며, make에서 rule 처리 과정 중에 include를 만나면
그 makefile까지 포함하여 rule에 대한 전반적인 2단계 스캔을 수행한다. 이 부분은 rule 소개 부분을 참조 바람.
'Program Lang. > Makefile' 카테고리의 다른 글
5. Makefile Rules (0) | 2013.05.13 |
---|---|
1. basic makefile structure syntax (0) | 2013.05.11 |
4. variable and macros (0) | 2013.05.09 |
9. makefile structure for large project (0) | 2012.12.27 |
7. Automatic Dependency Generation (0) | 2012.12.26 |