2016-08-10 3 views
0

Paul Smith의 가이드 here을 사용하여 GNU make 4.0 용 makefile을 설정했습니다. .d 파일이 삭제 된 경우를 제외하고는 모두 작동하는 것으로 보이며 다음 파일로 다시 생성되지 않습니다. make all. 자동 생성 된 종속 파일이 대상의 종속성으로 나열되어있는 경우가 빠진 경우 가이드에 따르면, 다음 make는 다시 작성됩니다`make`가 빠진 의존성 파일을 자동 생성하도록하는 방법은 무엇입니까?

%.o : %.c $(DEPDIR)/%.d 
     $(COMPILE.c) $(OUTPUT_OPTION) $< 
     $(POSTCOMPILE) 

바울의 설명 :

... $(DEPDIR)/%.d

선언을 생성 된 종속성 파일은 대상의 전제 조건이므로 누락 된 경우 대상은 으로 다시 작성됩니다.

이것은 내 경험이 아닙니다. .d 파일을 삭제하고 make all을 다시 발행하면 모든 것이 최신이라고 결정됩니다. .c의 재 컴파일을 강요하면 물론 종속 파일을 다시 만들지 만 누락 될 때마다 다시 빌드해야하는 종속 파일이 아닙니까? 제 메이크에서

발췌 (이 난 그래서 GCC를 사용하지 않는 것는 IBM에이지만 MAKEDEP 파라미터 종속 파일의 생성을 유발) 종속 파일을 생성하는 이러한 방법으로 대항

POSTCCOMPILE = mv -f $(DEPDIR)/$*.Td $(DEPDIR)/$*.d 

%.MODULE: %.C 
%.MODULE: %.C $(DEPDIR)/%.d 
    @system -v "crtcmod module($(OBJLIB)/$*) srcstmf('$<') MAKEDEP('$(DEPDIR)/$*.Td')" 
    @$(POSTCCOMPILE) 

. . . 

$(DEPDIR)/%.d: ; 
.PRECIOUS: $(DEPDIR)/%.d 

. . . 

-include $(wildcard $(DEPDIR)/*.d) 

, make은 (모든 C 파일에 포함되는 것은 아닐 가능성을 염두에두고) .d 파일을 다시 만들도록해야합니까?

답변

0

두 줄을 모두 갖고 계셨습니까?

%.MODULE: %.C 
%.MODULE: %.C $(DEPDIR)/%.d 

나는 두 번째 줄이 충분해야한다 생각하고, 첫 번째 줄은 $(DEPDIR)/%.d을 필요로하지 않습니다 %.MODULE 구축을위한 규칙을 찾을 make의 원인이 될 수 있습니다.

+0

링크 된 아티클에 따르면 첫 번째 줄은 해당 항목에 대한 기본 제공 규칙을 제거합니다. 필자의 경우에는 아마 GNU make가 모듈을위한 내장 규칙을 가지고 있지 않기 때문에 필요하지 않을 것이다. 그냥 안전을 위해서, 나는 그것을 꺼냈다. 아무런 효과가 없었다. – smeep

2

흠. 누락 된 패턴 전제 조건은 패턴 대상을 강제로 다시 작성하지 않는 것으로 보입니다. 즉, make가 전제 조건을 빌드하기위한 패턴 j을 찾았지만 해당 j이 전제 조건 파일 작성을 끝내지 않으면 패턴 대상은 오래된 것으로 간주되지 않습니다. 그것은 나에게 실제로 놀라운 일이며 기대하지도 않습니다. 이것에 대한 문서화 된 정당성이 있는지 또는 사용을위한 정당성이 있는지, 아니면 단지 감독인지는 확실하지 않습니다. 그것이 버그라면 그것은 꽤 오래되었습니다. 나는 그것에 대해 더 생각해야 할 것이다.

즉각적인 문제를 해결하려면 패턴 규칙을 명시 적 규칙으로 변경하면 문제가 해결됩니다. 이는 제반 사항이 전제 조건 파일을 작성하지 않는 명시 적 규칙에 의해 작성된 경우에도 여전히 갱신 된 것으로 간주되고 목표가 오래된 것으로 간주되기 때문입니다. 이 대신에

$(DEPDIR)/%.d : ; 
.PRECIOUS: $(DEPDIR)/%.d 

:

$(SRCS:%.C=$(DEPDIR)/%.d) : ; 

는 것입니다 당신이 변수가 예를 들어

그런 다음이 라인을 변경하는 경우, 모든 소스 파일의 목록을 포함 SRCS 말 모두 예상대로 작동합니다.

개체 목록이있는 경우 동일한 유형의 작업을 수행 할 수 있습니다. 대체 작업을 적절하게 수정하면됩니다.