2012-02-15 1 views
2

생성 된 헤더를 자동으로 생성 한 다음 depency (.d) 파일을 자동으로 생성하려고합니다. 그러나 나는 올바른 방법과 올바른 순서로 두 목표를 수행하는 방법을 확신하지 못합니다. 생성 된 헤더가 포함되어있을 때 make가 올바르게 의존성을 생성하는 방법

all: test 

test: test.o 
    g++ test.o -o test 

test.o: test.cc test.d external-headers 
    g++ test.cc -c -o test.o 

test.d: test.cc external-headers 
    g++ -MM -MT [email protected] $< -o [email protected] 

external/some_header.hh: 
    mkdir -p external 
    touch external/some_header.hh 

.PHONY: external-headers 

-include test.d 

external-headers: external/some_header.hh 

이 올바른 보이는 종속성을 보면, 내가 어떤 .d 파일을 만들 수 있습니다 전에 외부 헤더를 확인해야하기 때문에 : 여기

는 내가 지금까지 가지고있는 것입니다. 또한 외부 헤더가 누락 된 경우 다시 생성해야합니다. 그러나이 작은 Makefile은 GNU make를 끝없는 반복으로 만듭니다. 알아 내기 위해 디버깅 옵션을 사용했습니다. 이유는 무엇입니까?

내가 볼 수있는 것은, 포함 된 파일을 재생성 할 때마다 make가 계속 다시 시작한다는 것입니다. 이것은 괜찮습니다. 그리고 내가 기대하는 바입니다. 그러나 다시 시작할 때마다 external-headers 대상이 다시 만들어지기 때문에 가짜입니다. 그러나 후속 대상에서 아무 것도 만들 필요는 없지만 마지막 호출 이후에 inclues에 대한 종속 대상이 다시 작성되었으므로 포함 대상을 다시 작성한 다음 다시 시작합니다.

이 문제에 대한 좋은 해결책이 있습니까? 내가 가진 가장 간단한 아이디어는 .d 파일을 헤더 external/some_header.hh에 직접 종속시키고 중간에 대상을 건너 뛰는 것입니다. 테스트 할 때 이것은 정상적으로 작동합니다. 그러나 실제 상황에서는 생성 된 헤더가 한꺼번에 있으며 모든 것을 즉시 재구성 할 수 있기를 원합니다.

내가 가지고있는 또 다른 아이디어는 실제적으로 external-headers라고하는 어딘가에 파일을 추가하고이 대상이 호출 될 때마다이 파일을 터치하는 것이 었습니다. 이 방법은 대상을 마지막으로 다시 빌드 할 때 저장할 수 있으며 실제로 아무 것도 할 필요가 없다는 것을 알 수 있습니다.

더 좋은 방법이 있나요?

+1

"[모든 외부 헤더 파일]을 한 번에 쉽게 다시 빌드 할 수 있습니다."원하는 경우 '.d' 파일을 특정 헤더 파일에 종속시키지 말고 PHONY 대상을 유지하십시오. 모두 재건하기 위해? – Beta

+0

@ 베타 : 이것은 실제로 현재 사용하고있는 솔루션입니다. make가 더 나은 대안을 제공하는 것 같지 않기 때문에 나는 지금 그것을 그대로 남겨 둘 것입니다. – LiKao

+0

관련 질문 : http://stackoverflow.com/questions/5229561/gnu-make-generating-automatic-dependencies-with-generated-header-files – kostmo

답변

1

주위의 골치 거리는 file.tmp으로 파일을 생성하고 다른 경우 을 file.tmp으로 바꿉니다. 그런 식으로 make은 새 파일을 보지 않으며 모든 것을 다시 시작하지 않습니다. 이 의 autotools가 ./configure 댄스와 함께 생성되는 모습을 보시면 광범위하게 사용됩니다.

관련 문제