2010-05-23 3 views
3

필자가 작성한 프로그램에 대한 요구 사항은 구성 파일을 신뢰할 수 있어야한다는 것입니다. 이를 위해 여러 종류의 해시 알고리즘을 사용하여 컴파일 할 때 파일의 해시를 생성합니다. 이렇게하면 해시가 상수로 된 헤더가 생성됩니다.GNU make - 프로그램이 아닌 코드에 대한 종속성

내 의존 관계는 매우 간단합니다. 내 프로그램은 config_hash.h를 사용합니다. config_hash.h에는 대상을 생성하는 대상이 있습니다. 나는 의존성을 처리에 좋은 곳입니다 GCC에 -M 옵션을 사용하고

config_hash.h: 
    $(SH) genhash config/config_file.cfg > $(srcdir)/config_hash.h 

$(PROGRAM): config_hash.h $(PROGRAM_DEPS) 
    $(CC) ... ... ... 

:

makefile은 다음과 같이 보입니다. 헤더가 변경되면 프로그램이 다시 작성됩니다.

내 문제는 config_hash.h가 다시 생성되도록 구성 파일이 변경되었는지 여부를 알 수 있어야합니다. GNU에 대한 그런 의존성을 어떻게 설명하는지 잘 모르겠습니다.

config_hash.h에 대한 종속성으로 config/config_file.cfg를 나열하고 config_file.cfg에 대해 .PHONY 대상을 성공 적으로 제공하려고 시도했습니다. 분명히, 설정 파일이 어떤 목적 코드의 일부가 아니기 때문에 gcc에 -M 스위치를 사용하여 나를 도와 줄 수는 없습니다.

제안 사항? 불행히도 Makefile을 많이 게시 할 수 없거나 모든 것을 게시했을 것입니다.

+1

"make -d"를 실행 해 보셨습니까? 많은 출력을 얻을 것이다. (출력은 적지 만 충분하다. make --help를 보라.). config_hash.h를 사용하면 config_file.cfg를 의존성으로 나열한다. 내 생각 엔 대상 이름이 올바르게 일치하지 않는다는 것입니다. 대상은 config/config_file.cfg에 따라 $ (srcdir) /config_hash.h가되어야 할 수도 있습니다. 예를 들어 make -d는이를 분명하게 만들어야합니다. (또한 gcc -M이 생성하는 .d 파일을 검사하면 문제가 해결 될 수도 있습니다.) – leander

답변

5

같은 메이크 잘못이있다. 거기에 나열된 모든 종속성은 파일 시스템에서 검사되지 않습니다. 그냥 해시 헤더에 대한 종속성으로 나열하고 거기에서 이동하십시오.

+0

감사합니다. 나는 PHYYY가 의존성을 소외 시켰는데, 나는 실제로 그것들에 의존하는 다른 타겟이 있다고하더라도 실제로 아무것도 만들지 않는 타겟에서 사용해야한다고 생각했다. –

3

config_hash.h의 종속성에 config/config_file.cfg을 추가하면 어떻게 되었을까요? 왜 예상하지 않았습니까? config/config_file.cfg가 최근 인 경우

config_hash.h:config/config_file.cfg 
    $(SH) genhash $< > [email protected] 

같은 규칙은 config_hash.h를 다시 생성합니다. gcc에서 생성 한 종속성은 config_hash.h에 따라 아무 것도 다시 컴파일하지 않습니다.

[email protected] 변수 (srcdir가 정의 된 경우 규칙이 ./config_hash.h를 생성합니다라고하지만, 실제로 ./$(srcdir)/config_hash.h을 생성합니다, 귀하의 질문에)이 당신이 요청 파일을 만드는 보장 사용하여 대상입니다. 마찬가지로 $<$^은 첫 번째 및 모든 전제 조건을 각각 제공합니다. 내가 믿고있어

당신은 .PHONY에서 파일을 선언

CPPFLAGS+=-MMD -MP 
all: 
# etc. 
config_hash.h:config/config_file.cfg 
    $(SH) genhash $< > [email protected] 
%.d %.o:%.c 
    $(CC) $(CPPFLAGS) $(CFLAGS) -c -o $*.o $< 
%.d %.o:%.cpp 
    $(CXX) $(CPPFLAGS) $(CXXFLAGS) -c -o $*.o $< 
-include $(wildcard *.d) /dev/null 
관련 문제