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

include 메뉴 참조

override

origin 함수의 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