Substitution References

치환 참조 ( substitution references ) 기능은 patsubst built-in 함수로도 동일한 결과를 얻을 수 있지만 다른 종류의 make implementations 과 호환성을 위해 제공하는 기능으로 일종의 patsubst 의 간단 버전으로 생각하면 됩니다. 말 그대로 치환 작업에 reference ( 변수명 ) 을 사용하기 때문에 그 자리에 파일 리스트가 온다던지 할 수 없습니다.

$( var : a = b )

var 는 space 로 분리된 단어 목록을 가지고 있는 변수 이름입니다. 각 단어의 끝부분의 스트링 ab 로 변경됩니다. 이때 끝부분이 아닌 다른 위치에 존재하는 스트링 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