2014-10-01 2 views
1

모든 통화 당 파일은, 내가 _와/교체, separetly bin/디렉토리에 모든 .cpp 파일을 컴파일 할메이크 - 와일드 카드로 대체 내 프로젝트에서

Classes/ 
Classes/Something/ 
Classes/Something/Else 
... 

에 저장되도록되어 있습니다

Classes/First.cpp -> Bin/Classes_First.o 
Classes/Foo/Bar.cpp -> Bin/Classes_Foo_Bar.o 
는 지금은 컴파일에 대한 규칙을 만들고 싶었 :

Bin/%.o: $(subst _,/,%.cpp) 
    $(COMPILER)g++ $(COMPILE_FLAGS) -c -o [email protected] $^ 

내가 시도 :

빈/Classes_Test.o

하지만 컴파일에 실패했습니다.

%.cpp: 
    @echo CPP: [email protected] 

는 이제 인쇄 :

그래서 나는 디버깅 패턴 생성

CPP: Classes_Test.cpp 

왜?!

그래서 나는 내 패턴을 변경 :

Bin/%.o: $(subst _,/,Test1_Test2.cpp) 

나는 보았다

CPP: Test1/Test2.cpp 

이 나는 ​​소스로 와일드 카드를 사용하는 경우 SUBST이 작동하지 않는 이유를 조금 혼란 스러워요 ...

답변

0

평가 순서 문제입니다.

메이크업이는 $(subst) 호출하지만 그 시점에서 $(subst)의 인수를 평가 메이크 파일을 구문 분석

아무것도하지 않습니다 그래서에서 대체 아무 상관이없고 리터럴 문자열 %.cpp입니다.

대상 평가/실행 시간에 대상 패턴과 사전 요구 패턴의 %이 채워지지만 $(subst)은 오래 동안 사라져 버렸습니다.

이렇게하려면 출력 파일을 입력 파일에 수동으로 (일방적으로 또는 다른 방법으로) 매핑해야합니다. 이를 수행하고 %.o 실제 규칙이 실행되도록 패턴 규칙 타겟을 유지할 수 있습니다 (따라서 일련의 Bin/Test1_Test2.o: Test1/Test2.cpp 라인을 생성해야 함).

.SECONDEXPANSION: 
Bin/%.o: $$(subst _,/,%.cpp) 
: 또는

, 난 당신이 할 secondary expansion을 사용할 수있을 수 있다고 생각