안녕하세요. 이번 시간에는 make의 phony target과 .phony에 대해서 알아봅시다.

 


 Makefile에서 이런 것은 흔히 보셨을 거에요. clean 이라는 목표가 있고, 명령어로 rm *.txt를 수행합니다. 그리고 여태까지 이것을 목표 정도로 설명했을 거에요. 이 clean은 action이거나 파일일 수 있습니다. 여기서 하나 반전. 만약에 Makefile이 있는 위치에 clean 이라는 파일이 있으면 어떻게 될까요?

 

 clean이라는 파일을 생성했습니다.

 

 

 make clean을 실행했더니, 'clean' is up to date가 뜨게 됩니다. 그러면서 clean이 실행되지 않게 됩니다. 왜 그럴까요? 이 문제는 결론적으로 clean 이라는 파일 때문에 생긴 문제입니다. 그런데, 왜 up to date가 떴을까요?

 

 Makefile입니다. 1을 수행하는데 2와 3이 필요하다고 합니다.

 

 

 그런데 1이 2, 3보다 최신입니다. 그렇기에, 1이 필요 조건인 2와 3보다 최신이라는 정보가 뜨면서 echo 1이 실행되지 않습니다.

 

 '1' is up to date라고 뜨는 것을 보면 알 수 있어요. 그런데, 2가 더 최신이면 상황이 달라지게 됩니다.

 

 

 1은 0시 5분에 생성되었는데 2는 0시 8분에 생성되었어요. 1이 2에 비해 최신이 아니기 때문에, make 1을 하면 echo 1이 실행됩니다. 그런지 볼까요?

 

 그렇다는 것을 알 수 있어요. 이것은 이 에서 언급했던 적이 있었으니 참고하시면 되겠습니다. clean 이라는 파일이 있었고, 단순히 clean: 이라는 목표만 붙어있었다면 어떨까요? 필요 조건들이 없는 경우에, clean은 항상 up to date일 수 밖에 없습니다. 고로, 실행되지 않을 겁니다.

 


 이를 해결하기 위해 .PHONY로 phony target을 만듭니다. 위 예에서는 clean을 포니 타겟으로 만듭니다. 문서에 따르면, 포니 타겟은 파일 이름이 아니라 딸려나오는 명렁어를 수행하기 위한 이름이라고 언급되어 있어요. 그래서 명시적인 요청을 할 때 쓰인다고 되어 있어요.

 

 1.txt와 2.txt를 생성하겠습니다.

 

 다음에 make clean을 해 봅시다. 그랬더니, rm *.txt가 실행되었는데요. 이는 clean이 파일 이름이 아니라 recipe의 이름, 즉 요청의 이름으로 make가 인식했기 때문입니다.

 

 다시 ls로 확인해 보면, 1.txt와 2.txt가 없어졌음을 알 수 있습니다. 그러면, 이런 경우에는 어떨까요?

 

 

 superclean과 clean이 있습니다. superclean을 수행하기 위해서, clean을 필요로 합니다. 그리고 이 둘은 phony target으로 설정되어 있습니다. 이 경우, clean은 superclean의 서브 루틴이 됩니다. 함수 안에 함수를 부르는 것처럼.

 

 다시 1.o와 1.txt를 생성해 보겠습니다.

 

 make superclean을 하면, txt 파일과 o 파일을 사라지게 하는 명령어들을 수행합니다. ls를 입력해 보면, 1.txt와 1.o가 사라졌음을 알 수 있습니다.