2012-08-13 2 views
0

make은 추적 헤더가 변경된 디렉토리의 .cpp을 모두 빌드하려고합니다. 그러나 어떻게 든이 스크립트 형태GNU 예기치 않은 동작이 발생합니다.

의 통화를 발행

OPTIONS = -std=c++11 -Wall 

export 

all : $(patsubst %.cpp, %.o, $(wildcard *.cpp)) 


%.o : %.mkt 
    make -f $*.mkt 

%.mkt : %.cpp 
    gcc $(OPTIONS) -MM $*.cpp > $&.mkt1 
    echo gcc $(OPTIONS) -c %.cpp > $*.mkt2 
    cat $*.mkt1 $*.mkt2 > $*.mkt 

: 내가 먼저 -MM 옵션으로 의존성 GCC 출력에게 대상을함으로써 그것을하고 실제로 컴파일을 호출하는 대상에 대한 신체를 추가하려고 시도

g++ -c -o something.o something.cpp 

.cpp 디렉토리의 파일. 임시 파일 .mkt1, .mkt2.mkt은 생성되지 않습니다. 왜 이런 일이 생길까요? 원하는 행동을 어떻게 달성합니까? 나는 mingw와 함께 창문에서 이것을하고있다. 방법을 검색 할 때, 먼저 발견 할 것이다 - (>%.o%.cpp)가 이미 하나의 묵시적 규칙이 있지만, 확인

+0

'patsubst' 호출에서 쉼표 뒤에 공백을 제거하는 것이 도움이됩니까? – tripleee

+0

어쨌든'mkt' 파일을 Makefile로 사용하려는 경우 들여 쓰기 용 탭이 없어야합니까? – tripleee

+0

@ 삼자가 공백을 제거해도 아무 효과가 없습니다. '.mkt' 파일은 참으로 나쁘지 만 탭이 있어야합니다. 그러나 여기에도 생성되지 않았습니다. –

답변

2

는 두 가지 패턴 규칙의 체인 (>%.o - ->%.mkt, %.mkt%.cpp)를 공급하고 있습니다 something.o을 빌드하십시오.

가장 간단한 방법은 make -r (또는 make --no-builtin-rules)을 사용하여 내장 된 암시 적 규칙을 비활성화하는 것입니다.

+0

[사용자 정의 규칙은 내장 규칙보다 우선합니다.] (http://www.gnu.org/software/make/manual/make.html#Canceling-Rules). 이것이 옳은 대답이라고 생각하지 마십시오. –

+0

@MaximYegorushkin, 사용자 정의 * 규칙 *이 내장 된 * 규칙 *을 재정의합니다. 그러나 OP는'% .o : % .cpp'에 대한 규칙을 정의하지 않았습니다. make가'something.o '를 빌드하는 방법을 찾으면 내장 규칙 (사용자 정의 규칙 없음)을 찾고 더 이상 보이지 않습니다. 기본 제공 규칙이 비활성화 된 경우 Make는 더 이상 보이는 체인을 찾아 사용합니다. 나는 이것을 GNU Make 3.81로 테스트했지만, 내가 틀렸다는 것을 나에게 보여줄 수 있다면 나는 감사 할 것이다. – Beta

+0

'-MM' 플래그는 gcc가'x.o : x.cpp' 형식으로 라인을 생성하도록합니다. 저자의 의도는 그러한 의존성에 레서피를 추가하는 것이지만, 그는 '% .mkt' 레시피의 두 번째 라인에서 탭을 놓친 것입니다. –

관련 문제