2012-07-20 2 views
7

Makefile의 "허위"규칙이 대상인으로 ".PHONY"인 이유는 아직도 이해할 수 없습니다. 그것은 훨씬 더 논리적 일 것입니다 전제 조건.왜 .PHONY : 목표가 아닌 대상 : .PHONY?

이 부분을 자세히 설명해야합니까? AB이고, B이 가짜 인 경우 A도 허위입니다. 따라서 종속 그래프 .PHONYBA.PHONYBA보다 놀랍습니다. (또 다른 논거는 make의 구현이 .PHONY 대상을 매우 특별하게 처리해야한다는 것입니다.)

이 비평은 오히려 이론적으로 (무의미하게) 보일 수도 있지만 - "make는 너무 고대 적이기 때문에 구문이 그대로 남아 있습니다".

은 GNU와

는 (적어도) 확인, 다음 메이크가 target_A 가짜 선언 :이 너무입니다 :

target_A: _PHONY 
     touch target_A 

_PHONY: 
     #noop 

질문 1는하지만 구문의 변화를 제안하고 있지 않다, 대안이 간단하고 깨끗한, 분명히 나는 ​​그 첫 번째 발명가가 아닙니다. 사실,이 대안을 고려하면 make에 특수 구문이 필요한 이유는 무엇입니까?

이것은 초보자가 의심 할 때 wildcards in phony targets에 대한 질문을 매우 훌륭하게 해결하고 심지어 shed some light on .PHONY's meaning 일 수도 있습니다.

질문 2 : 이 접근법이 열악한 환경을 생각해 볼 수 있습니까? (? 어떤 사용의 make .PHONY를 호출하는)

은 (내가 다른 make의 호출 반면, GNU 만들 언급해야하는 것은 내가 어떤 경험을 가지고있는 유일한 구현 -. 읽기와 메이크 파일을 작성)를

+0

(RTFM을 가지고 있어야 함) GNU Make 매뉴얼은 실제로 [이 제조법에 대해 언급합니다] (http://www.gnu.org/software/make/manual/html_node/Force-Targets.html#Force- Target)를 효율적이면서 더 휴대 가능합니다. 나는 속도 증가가 무시할 수 없다고 추측한다. 이것은 질문 2에 대한 부정적인 대답을 제시합니다. (?) – tiwo

답변

3

target_A: .PHONY을 사용할 때의 큰 문제점 중 하나는 make의 내장 변수를 많이 사용하는 것이 훨씬 어렵다는 것입니다. 예를 들어이 일반적인 조리법을 가지고 :

%.a: $(OBJ_FILES) 
    $(LD) $(LFLAGS) -o [email protected] $^ 

$^ 변수 당긴를 전제 조건으로 열거 된 모든에. .PHONY도 거기에 나열되어 있다면 명령 행에서 링커로 전달되어 아무 일도 일어나지 않을 것입니다. .PHONY과 같은 메타 타겟을 전제 조건으로 사용하면 매번 $(filter-out .PHONY,$^)과 같은 많은 추가 처리가 필요하기 때문에 이러한 기본 제공 변수가 상당히 유용하지 않게됩니다. 관계를 바꾸고 대신 .PHONY을 대상으로 지정하면 종속성 트리를 생각하기에 다소 어색하지만 makefile의 나머지 부분은 정리됩니다.

+0

아, 알겠습니다. 그리고 [다른 "특별한"표적의] 존재 (http://www.gnu.org/software/make/manual/html_node/Special-Targets.html # Special-Targets) - 의존성 그래프에 잘 들어 맞지 않는 것을 포함하여 (의미 상으로) 왜 "그렇게 특별한 이유"에 대한 이의를 줄이는 것처럼 보입니다. – tiwo