.PHONY로 정의한 target들은 phony target이라 하여, 실제 파일 이름이 아니고, 가상의 이름이라는 것을 나타냅니다. 예를 들어 Makefile에 흔히 쓰이는 target 이름인 all이나 clean은 그 자체가 파일 이름을 의미하지 않습니다. 단지 make all 또는 make clean 식으로 어떤 이름을 나타낼 뿐이죠. 따라서 이런 target 이름과 같은 파일이 현재 디렉토리에 존재하면 make가 오 동작을 일으킬 수 있습니다. 그래서 .PHONY로 지정하며, 실제 파일과는 아무런 상관이 없다는 것을 알려줍니다.
make에서 변수는 크게 두가지로 나눌 수 있습니다.
하나는 "recursively expanded" variable이고, 또 하나는 "simply expanded" variable입니다. 각각 재귀적으로 확장되는 변수, 간단히 확장되는 변수라고 할까요? -_-;
아뭏든, "="로 정의한 것이 recursive한 놈이고, ":="로 정의한 것이 simple한 놈입니다.
recursive한 놈은 말 그대로 변수 값으로 대체될 때, 다른 변수를 참조하고 있으면, 계속 확장해 나가는 방식입니다. (recursive expansion)
.PHONY로 정의한 target들은 phony target이라 하여,
.PHONY로 정의한 target들은 phony target이라 하여, 실제 파일 이름이 아니고, 가상의 이름이라는 것을 나타냅니다. 예를 들어 Makefile에 흔히 쓰이는 target 이름인 all이나 clean은 그 자체가 파일 이름을 의미하지 않습니다. 단지 make all 또는 make clean 식으로 어떤 이름을 나타낼 뿐이죠. 따라서 이런 target 이름과 같은 파일이 현재 디렉토리에 존재하면 make가 오 동작을 일으킬 수 있습니다. 그래서 .PHONY로 지정하며, 실제 파일과는 아무런 상관이 없다는 것을 알려줍니다.
make에서 변수는 크게 두가지로 나눌 수 있습니다.
하나는 "recursively expanded" variable이고, 또 하나는 "simply expanded" variable입니다. 각각 재귀적으로 확장되는 변수, 간단히 확장되는 변수라고 할까요? -_-;
아뭏든, "="로 정의한 것이 recursive한 놈이고, ":="로 정의한 것이 simple한 놈입니다.
recursive한 놈은 말 그대로 변수 값으로 대체될 때, 다른 변수를 참조하고 있으면, 계속 확장해 나가는 방식입니다. (recursive expansion)
예를 들면:
이거 실행하면 "Huh?"가 출력되겠죠.
일반적으로는 "="를 많이 씁니다. 그러나 재귀적으로 계속 확장되기 때문에 다음과 같이 쓰면 안됩니다:
CFLAGS = $(CFLAGS) -O
그리고 변수 값은 변수가 쓰여졌을 때마다 확장됩니다. 따라서 약간 느리죠.
Simply expanded 변수들은 ":="로 정의되고, 정의될 때 그 변수값을 만들어 놓고 계속 씁니다.
따라서 다른 변수값이 바뀌던 말던 정의한 시점에서 확장되기 때문에, 빠릅니다.
즉,
는 아래와 완전히 같습니다:
C FAQ: http://www.eskimo.com/~scs/C-faq/top.html
Korean Ver: http://cinsk.github.io/cfaqs/
참고로.. 이 모든 것은 info page에 다 나와 있습니다.i
참고로.. 이 모든 것은 info page에 다 나와 있습니다.
info를 생활화 합시다!!!!!!!!!!!!!!!!!!!!!
$ info make
C FAQ: http://www.eskimo.com/~scs/C-faq/top.html
Korean Ver: http://cinsk.github.io/cfaqs/
감사합니다!!(마지막 라인 y := foo bar 인것 같구요)많
감사합니다!!
(마지막 라인 y := foo bar 인것 같구요)
많은 도움이 되었습니다!! ^^
[quote="cinsk"]Korean Ver: http://pcrc
와우! 멋집니다! 잘 읽겠습니다. make 관련 내용도 알기 쉽게 설명해주셔서 고맙습니다.
댓글 달기