[MAKE] Secondary Expansion

정리/Make 2018. 12. 17. 14:44 |




.SECONDEXPANSION: 


지시어는 변수확장을 지연해주는 기능을 갖고 있다. 


간단한 예제로 이해해보자 . 


1
2
3
4
5
6
7
8
9
10
11
.SECONDEXPANSION:
AVAR = main.o
 
onefile: $(AVAR)
        cc $<
 
twofile: $$(AVAR)
        cc $<
 
AVAR = test.o
 
cs



해당 예제에서 $$(AVAR) 으로 사용되어진 EXPANSION이 적용 대상이 된다. 


make는 두 개의 실행 페이즈를 가지고 있고, 첫번째 페이즈와 두번째 페이즈 사이에서 SECONDEXPANSION 처리가 이루어진다. 


해서, 최종적으로 make twofile 은 test.o 를 컴파일 하게 된다. 


이제, SECONDEXPANSION이 활용되는 실제 예를 살펴보자. 


1
2
3
4
5
6
7
.SECONDEXPANSION:
main_OBJS := main.o try.o test.o
lib_OBJS := lib.o api.o
 
main lib : $$($$@_OBJS)
        echo $?
 

cs




위 예는 recipe 에서 $@ automatic 변수를 사용한다.  


원래 recipe에선 $@와 같은 automatic 변수를 사용할 수 없으나, .SECONDEXPANSION을 선언하면 $$가 지연확장되어 

prerequisite 에서도 사용할 수 있게 된다. 


위 예제는 make에 전달된 target 에 따라 prerequisite 값이 달라지므로 .SECONDEXPANSION 을 유용하게 활용한 예가 될 수 있다. 


'정리 > Make' 카테고리의 다른 글

[make] makefile 이 없는경우 ?  (0) 2018.12.03
[make] makefile의 명칭  (0) 2018.12.03
[make] make의 묵시적 룰  (0) 2018.11.29
Posted by $Zero
: