3. VPATH(vpath), conditional and include 지시자

Program Lang./Makefile 2013. 5. 9. 13:23

1. VPATH, vpath 란?

 

make가 Target과 Prerequisite를 찾을 위치를 현재 디렉토리 뿐만 아니라 VPATH에 명시된 위치에서 

추가적으로 찾아보도록 지시할 수 있다. VPATH는 Target과 Prerequisite에 대해서 찾을 위치를 추가적으로 명시하는

것이지 command line에 있는 파일의 위치는 명시하지 않는다.

 

첫번째에서 소개한 예제를 아래와 같이 소스 파일은 src 디렉토리에 header파일은 include에 Makefile과 main.c파일

은 exam 상위 폴더에 위치하도록 수정하고 Makefile을 수정하였다.

 

예제 파일 : 

exam2.zip

 

 

아래 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은 아래와 같다.

 

vpath pattern directory-list

 

아래에서 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
: