2012년 9월 11일 화요일

make: phony target

Phony Targets


"make의 타겟과 동일한 이름을 가진 파일과 충돌을 피하고, 퍼포먼스 개선을 하기 위해서 사용한다. " 라고 하는데 말이 어렵다. 하나 하나 뜯어 보자

make에서 타겟이란?
make를 구성하는 기본적인 형태는 다음과 같다.

target: prerequisite1 prerequisite2 ...
        command


make는 target을 생성하기 위해 prerequisite들이 update되었는지를 확인한 후 command를 사용하여 target파일을 update한다. 실제 예를 들어 설명해보겠다.

test: test.c
      cc -o test test.c

위의 예제에서 target은 test가 되고 prerequisite는 test.c가 된다. 그리고 command는 cc -o test test.c가 된다.  make는 test.c가 변했는지를 확인한 후 test.c에 변경된 내용이 있다면 cc -o test test.c를 사용하여 test라는 파일을 새롭게 작성할 것이다.

타겟과 동일한 이름을 가진 파일과 충돌을 피하고?

clean:
      rm *.o

위의 예제에서는 target과 command는 있지만 prerequisite가 존제하지 않는다. 이럴 경우 만약 clean이라는 파일이 있다면 prerequisite가 존제하지 않기 때문에(prerequisite가 변경되었는지 판단을 할 수 없기 때문에) make는 update된 내용이 없다고 판단하고 command를 수행하지 않는다. 어려운 말로 묵시적 규칙(Using Implicit Rules)이라고 한다.

그래서 다음과 같이 clean이 가짜 목적물(target 파일이 생성되지 않는 목적물)이라는  규칙을 사용하여야 된다 .

.PHONY: clean
clean:
      rm *.o

퍼포먼스 개선은?

실제 파일의 존재 여부를 신경쓰지 않고 command를 수행하기 때문에 실제 파일이 존재 하는지 않하는지 검사하는 루틴이 make에서 제거된다. 따라서  성능적 효과를 볼 수 있다는 이야기...

댓글 없음:

댓글 쓰기