[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 $? |
위 예는 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 |