Substitution References
치환 참조 ( substitution references ) 기능은 patsubst built-in 함수로도 동일한 결과를
얻을 수 있지만 다른 종류의 make implementations 과 호환성을 위해 제공하는 기능으로
일종의 patsubst
의 간단 버전으로 생각하면 됩니다.
말 그대로 치환 작업에 reference ( 변수명 ) 을 사용하기 때문에 그 자리에 파일 리스트가 온다던지
할 수 없습니다.
$( var : a = b )
var
는 space 로 분리된 단어 목록을 가지고 있는 변수 이름입니다.
각 단어의 끝부분의 스트링 a
가 b
로 변경됩니다.
이때 끝부분이 아닌 다른 위치에 존재하는 스트링 a
는 변경되지 않습니다.
files := aaa.c bbb.c ccc.c
res := $(files:.c=.o)
$(info $(res))
결과: aaa.o bbb.o ccc.o
files := aaa.c bbb.c ccc.c
res := $(files:.c=)
$(info $(res))
결과: aaa bbb ccc
files := aaa bbb ccc
res := $(files:=.c)
$(info $(res))
결과: aaa.c bbb.c ccc.c
$( var : %.a = %.b )
치환에 %
패턴 문자를 사용할 수 있습니다.
files := aaa.c bbb.c ccc.c
res := $(files:%.c=%.o)
$(info $(res))
결과: aaa.o bbb.o ccc.o
files := aaa.c bbb.c ccc.c
res := $(files:%.c=%)
$(info $(res))
결과: aaa bbb ccc
files := aaa bbb ccc
res := $(files:%=%.c)
$(info $(res))
결과: aaa.c bbb.c ccc.c
files := foo/aaa.c foo/bbb.c foo/ccc.c
res := $(files:foo/%=bar/%))
$(info $(res))
결과: bar/aaa.c bar/bbb.c bar/ccc.c
files := foo/aaa.c foo/bbb.c foo/ccc.c
res := $(files:foo/%.c=%)
$(info $(res))
결과: aaa bbb ccc
치환 참조와 patsubst 함수가 다른 점
치환 참조 ( substitution references ) 에서 참조 ( references ) 는 변수 이름을 말합니다.
따라서 변수 이름 외에 파일 리스트를 사용할수 없지만
patsubst
함수는 사용할 수 있습니다.
# $(wildcard *.c) 는 결과가 리스트로 'var' 값으로 사용될 수 없다.
$($(wildcard *.c):%.c=%.o) # Error
# 다음의 경우는 $(foo) 가 확장되면 files 변수 이름이 되므로 가능합니다.
files := $(wildcard *.c)
foo := files
$($(foo):%.c=%.o) # OK
patsubst 함수는 파일 리스트 사용이 가능
$(patsubst %.c,%.o,$(wildcard *.c)) # OK
files := $(wildcard *.c)
$(patsubst %.c,%.o,$(files)) # OK