2009-12-02 3 views
4

Makefile에 약간 문제가 있습니다. make가 작업 디렉토리에 관한 명령을 변경하기를 원합니다. 나는 현재 타겟 디렉토리 ($ (* D))를 테스트하는 규칙에 조건 지시자를 추가했다.Makefile : ifeq 지시문이 특수 변수를 상수와 비교합니다.

사실 내 파일이 mySpecialDirectory에 있고 실제로 echo가 "mySpecialDirectory"를 인쇄 할 때도 make는 항상 내 테스트의 두 번째 분기로갑니다.

.c.o .cpp.o .cc.o: 
ifeq ($(*D),mySpecialDirectory) 
    @echo "I'm in mySpecialDirectory! \o/" 
    $(CC) $(DEBUG_FLAGS) $(MYSPECIALFLAGS) -c $< -o [email protected] 
else 
    @echo "Failed! I'm in $(*D)" 
    $(CC) $(DEBUG_FLAGS) $(NOTTHATSPECIALFLAGS) -c $< -o [email protected] 
endif 

답변

7

이것은 예상되는 동작입니다.

조건문

조건부 구문의 모든 인스턴스는 그 전체가 즉시 분석된다; 여기에는 ifdef, ifeq, ifndef 및 ifneq 양식이 포함됩니다. 물론 자동 변수는 해당 규칙에 대한 명령 스크립트가 호출 될 때까지 설정되지 않기 때문에 조건문에 사용할 수 없습니다.. 조건부에서 자동 변수를 사용해야하는 경우 셸 조건부 구문을 사용해야합니다. 명령 스크립트에서이 테스트의 경우 조건부를 작성하지 말아야합니다.

$(*D)은 자동 변수입니다.

대신, 일을 고려해

.c.o .cpp.o .cc.o: 
    $(CC) $(DEBUG_FLAGS) $(if $(subst mySpecialDirectory,,$(*D)),$(NOTTHATSPECIALFLAGS),$(MYSPECIALFLAGS)) -c $< -o [email protected] 

생각은 빈 문자열로 mySpecialDirectory를 대체하여 일부 평등 테스트에 $(subst)을 남용하는 것입니다. $(*D) 확장 mySpecialDirectory에 동일한 경우 그런 다음, 그것은 완전히 빈 문자열로 대체되고 $(if)의 다른 부분은 따라 평가됩니다 :

함수는 조건부 확장에 대한 지원을 제공하는 경우

$(if condition,then-part[,else-part])

함수형 문맥 (ifeq (문법의 구문 참조)과 같은 GNU make makefile 조건과는 반대)

첫 번째 인수 인 condition은 먼저 모든 앞뒤 공백을 제거한 다음 확장합니다. 비어있는 문자열이면 조건은 consi입니다. 진실 인 것을 계시해라. 빈 문자열로 확장되면 조건은 false로 간주됩니다.

이 해킹에서 과 else-part 사이의 전환이 있음을 알 수 있습니다.

희망이 도움이됩니다.

+0

고마워, 그레고리.이게 내가하고 싶었던거야. 위대한 설명, 나는 분명히 트릭을하기 위해 if와 subst를 사용하는 것을 생각하지 않았을 것입니다. 이것은 매우 영리합니다;) – Kyone