Directives
export, unexport
이 지시자는 shell 의 export 명령과 동일하게 변수를 export 하거나 unexport 할 때 사용합니다.
변수를 export 하면 sub-make 에서도 사용할 수 있게 됩니다.
한가지 특수 기능은 export 지시자를 변수명 없이 단독으로 사용하게 되면 모든 변수가 디폴트로 export 됩니다.
이때는 .EXPORT_ALL_VARIABLES:
타겟과 마찬가지로 변수명이 대, 소문자, 숫자, _
로 구성된 변수만 export 됩니다.
특수문자로 구성된 변수를 export 하려면 직접 export 지시자를 사용해야 합니다.
# Avoid funny character set dependencies // linux/Makefile 참조
unexport LC_ALL
LC_COLLATE=C
LC_NUMERIC=C
export LC_COLLATE LC_NUMERIC
# Avoid interference with shell env settings
unexport GREP_OPTIONS
define . . . endef
Multi-line 변수, 함수를 정의할 때 사용합니다.
undefine
변수를 undefined 상태로 만듭니다. 따라서 조건문에서 empty 가되어 false 가 됩니다.
이것은 단순히 변수값을 empty 로 만들어도 같은 결과가 발생하지만
flavor
, origin
함수에서는 undefined
상태가 구분되므로 필요할 경우 사용하면 됩니다.
# command line 에서 설정한 변수를 undefine 하려면 override 지시자와 함께 사용하면 됩니다.
override undefine CFLAGS
include
override
private
target-specific variables 메뉴 private 참조
vpath 지시자, VPATH 변수 기능
rule 작성시 prerequisites 에 등록한 파일이 현재 디렉토리에 없을 경우 검색할 경로를 지정할 수 있습니다.
경로를 설정할 때는 공백이나 :
문자로 구분하여 작성하고 작성된 순서대로 검색하게 됩니다.
recipe 를 작성할 때는 $<
, $^
같은 automatic 변수를 사용해서 작성해야 합니다.
VPATH 변수는 target-specific 변수로 설정해 사용할 수 없습니다.
# 먼저 현재 디렉토리를 찾고 없을 경우 module1/dir, module2/dir 순서로 찾는다.
VPATH := module1/dir module2/dir
prog : aaa.c aaa.h foo/bbb.c
@echo $^
######## 실행 결과 ########
module1/dir/aaa.c module1/dir/aaa.h module2/dir/foo/bbb.c
vpath 지시자를 이용하면 %
패턴을 사용하여 지정할 수 있습니다.
vpath %.xml resource/xml
vpath %.html resource/html
prog : foo.xml bar.xml zoo.html
@echo $^
######### 실행 결과 #########
resource/xml/foo.xml resource/xml/bar.xml resource/html/zoo.html
prerequisites 에는 -lname
형식의 라이브러리를 등록할 수도 있습니다.
그러면 .LIBPATTERNS 변수에 설정된 패턴에 따라
현재 디렉토리에서 libname.so
-> libname.a
순으로 찾고 없으면
vpath
-> VPATH
-> /lib
-> /usr/lib
-> /usr/local/lib
에서 찾게 됩니다.
다른 prerequisites 과 동일하게 라이브러리 파일이 타겟 파일 보다 최신이면 recipe 가 실행됩니다.
prog : foo.c -lcurses
@echo gcc $^ -o $@
####### 실행 결과 #######
gcc foo.c /usr/lib/libcurses.a -o prog