[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
:

make가 현재 디렉토리에서 


적당한 makefile을 찾지 못한다면, 


make는 커맨드 명령 argument에 명시된 액션에 대한 묵시적 룰을 실행한다. 


쉽게 예를 들면 



make main.o 


라고 커맨드 명령을 줄 시 


makefile이 없어도 make는 main.o에 대한 묵시적 룰인 

${CC} -o main.o -c main.c 

명령을 실행한다. 


위와 같이 간단한 컴파일이라면, makefile이 없어도 make로 컴파일 수행이 가능하다. 


실효성은 .. 


잘 모르겠다. 

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

[MAKE] Secondary Expansion  (0) 2018.12.17
[make] makefile의 명칭  (0) 2018.12.03
[make] make의 묵시적 룰  (0) 2018.11.29
Posted by $Zero
:

[make] makefile의 명칭

정리/Make 2018. 12. 3. 11:42 |

make는 기본적으로 현재 디렉토리에서 


GNUmakefile, makefile, Makefile 을 읽는다. 


셋 중 어떤 이름을 써도 상관은 없으나, 


GNUmakefile은 GNU 외의 make에서는 참조하지 않으므로 추천되지 않는다.


공식 Doc 에선 대문자로 시작하는 이름이 디렉토리 리스팅에서 가장 먼저 발견되며 눈에 띄기 때문에 Makefile을 추천하고 있다. 


makefile의 이름을 부득이하게 변경해야 할 경우 


-f , --file 명령줄 옵션을 통해 명시할 수 있다. 


make -fmyMakeFile 

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

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