출처 : http://blog.daum.net/english_100/12
8. 텍스트 변환을 위한 함수
8.1 함수 호출 문법
함수 호출은 변수 참조와 비슷하다. 즉 :
$(function arguments)
또는
${function arguments}
여기서 function은 함수 이름으로 make가 제공하는 함수거나 사용자가 직접 만든 함수일 수 있다.
arguments는 함수의 인자로서 함수명과는 공백문자나 탭문자 등으로 분리되고 여러개의 인자가 있을 경우는 콤마로 분리한다. 함수의 인자가 또다른 함수나 변수 참조를 포함하고 있을 때 외부와 내부의 구분문자를 같게해주는 것이 명확하다. 즉 '$(subst a,b,${x}) 보다는 '$(subst a,b,$(x))'이 좋다.
공백문자를 콤마로 대체하는 예문을 보자 :
comma := ,
empty :=
space := $(empty) $(empty)
foo := a b c
bar := $(subst $(space),$(comma),$(foo))
# bar is now 'a,b,c'
8.2 문자열 치환 및 분석에 관한 함수
$(subst from,to,text)
text 안에 들어있는 from 을 to로 변환한다.
$(patsubst pattern,replacement,text)
text 안에 들어있는 공백문자로 분리된 단어들중에서 pattern에 맞는 것들을 찾아 replacement로 대치한다.
$(strip string)
string의 앞이나 뒤에 붙어있는 공백문자를 제거하고 내부에 여러개의 공백문자가 연이어 있는 것은 한개의 공백문자로 줄인다.
$(findstring find,in)
in 을 조사하여 find가 있는지를 확인한 후 있으면 find를 없으면 빈문자를 반환한다.
$(filter pattern...,text)
text를 조사하여 pattern과 맞는 단어들을 공백문자로 분리하여 반환하고 아닌 단어들은 제거한다.
$(filter-out pattern...,text)
text를 조사하여 pattern과 맞지않는 단어들을 공백문자로 분리하여 반환하고 맞는 단어들은 제거한다.
$(sort list)
list의 모든 단어들을 사전적 순서에 따라 재배치하고 각각은 공백문자로 분리한다. 중복되는 단어는 제거한다.
$(word n,text)
text 내의 n 번째 단어를 반환한다. n이 단어 갯수보다 큰수면 빈문자를 반환함. n은 1 부터 시작하는 수
$(wordlist s,e,text)
text 내의 s 번째 단어부터 e 번째까지 단어를 반환한다. s는 1 부터시작하는 수이고 e는 0 부터 시작하는 수이다. s가 text 내 단어갯수보다 크면 빈문자를 반환하고 e 가 단어갯수보다 크면 맨 끝단어까지 반환한다. s 가 e보다 크면 반환되지 않는다.
$(words text)
text 내의 단어 수를 반환한다.
$(firstword names...)
공백문자로 구분된 이름 리스트인 names 중에서 첫째 값을 반환한다.
$(lastword names...)
공백문자로 구분된 이름 리스트인 names 중에서 마지막 값을 반환한다.
8.3 파일명과 관계된 함수
$(dir
names...)
names 속에 들어있는 파일명들 중 디렉토리 부분만 뽑아서 반환. 파일명 중에 '/'가 하나도 포함되어있지 않으면 './'를 반환
$(notdir
names...)
names 속에 들어있는 파일명들 중 디렉토리 부분을 제외한 순수 파일명만 뽑아서 반환.
$(suffix
names...)
names 속에 들어있는 파일명들 중 접미사 부분만 뽑아서 반환.
$(basename
names...)
names 속에 들어있는 파일명들 중 접미사 부분을 제외한 나머지 부분만 뽑아서 반환.
$(addsuffix
suffix,
names...)
공백문자로 분리된 names 내의 이름들 끝부분에 suffix를 첨부한다.
$(addprefix
prefix,
names...)
공백문자로 분리된 names 내의 이름들 앞에에 prefix를 첨부한다.
$(join
list1,
list2)
list1의 n번째와 list2의 n번째를 연결해 새이름을 만든후 그 결과를 반환한다.
$(wildcard
pattern)
pattern과 일치하는 파일명들을 모두 반환한다.
$(realpath
names...)
names 속에 들어있는 모든 파일명에 대해 canonical 절대파일명을 반환한다.
$(abspath
names...)
names 속에 들어있는 모든 파일명에 대해 절대파일명을 반환한다.
8.3 조건문과 관련된 함수
$(if
condition,
then-part[,
else-part])
condition 부분이 참이면 then-part 처리되고 else-part가 명기되어 있고 condition이 거짓이면 else-part를 처리한다.
$(or
condition1[,
condition2[,
condition3...]])
$(and
condition1[,
condition2[,
condition3...]])
8.5 foreach 함수
$(foreach var, list,text)
처음 두개 인자 var와 list는 다른 일들 보다 먼저 펼쳐진다. list의 펼침 값중하나가 var에 할당된 다음 text가 펼쳐진다. 이때 text는 var에 따라 펼쳐지므로 매번 달리 펼쳐지게 된다. 공백문자로 구분된 list의 단어 갯수만큼 text를 반복하며 각 결과는 공백문자로 구분되어 서로 이어진다.
dirs := a b c d
files := $(foreach dir,$(dirs),$(wildcard $(dir)/*))
처음에 dir에 a 가 들어간 후 '$(wildcard a/*)'가 수행되고 이어서 ' '$(wildcard b/*)' '$(wildcard c/*)'가 수행된다. 이는 :
files := $(wildcard a/* b/* c/*)
와 동일하며 다음과 같이 이름을 부여하면 읽기가 더편해질 수 있다 :
find_files = $(wildcard $(dir)/*)
dirs := a b c d
files := $(foreach dir,$(dirs),$(find_files))
여
기서 find_files 변수는 '='를 사용해 순환펼침변수로 정의하였다. 그래야 함수 호출이 일어날 때마다 재 펼침이
이루어진다. 만약 단순펼침변수로 정의할 경우 wildcard는 find_files가 정의될 때 단 한번만 호출될 것이다.
8.6 call 함수
$(call variable,param,param,...)
reverse = $(2) $(1)
foo = $(call reverse,a,b)
결과로 foo는 'b a'를 갖는다. 또다른 예는 :
pathsearch = $(firstword $(wildcard $(addsuffix /$(1),$(subst :, ,$(PATH)))))
LS := $(call pathsearch,ls)
LS의 경과는 /bin/ls 유사한 결과를 얻을것이다.
8.7 value 함수
value 함수는 변수를 펼치지 않고 그 값을 사용할 수 있게 해준다. 용법은 :
$(value variable)
variable은 변수 참조가 아니라 변수이름이므로 일반적으로 '$'를 쓰지않는다.
FOO = $PATH
all :
@echo $(FOO)
@echo $(value FOO)
결과의 첫행에는 ATH 가 출력되다. 왜냐하면 '$P'이 make 변수로 펼쳐지려 할 것이기 때문이다. 하지만 두번째 줄에는 $PATH 환경변수의 값이 고스란히 프린트 된다.
8.8 eval 함수
8.9 origin 함수
8.10 flavor 함수
8.11 shell 함수
8.12 make를 제어하는 함수들
$(error text...)
text에 명기된 내용의 치명적 에러 메시지를 발생시킨다.
$(warning text...)
error 함수와 비슷하지만 make가 exit하지는 않는다. 메시지를 출력하고 makefile에 대한 처리는 계속된다.
$(info text...)
text를 출력하는것 외에 아무일도 안함.