2017-10-03 7 views
1

이 간단한 규칙을 고려하십시오.종속성 파일에서 파일의 타임 스탬프를 확인하는 방법을 알려주시겠습니까? foo.o에 대한 조리법이 실행되지 않습니다 - foo.d 및 foo.o 모두 foo.c를보다 최신 인 경우</p>이 <pre><code>foo.o: foo.c foo.d gcc -c ... foo.d: foo.c gcc -M ... </code></pre> <p>지금, :

그러나 foo.c에 포함 된 헤더 중 하나가 변경되었을 수 있으므로 실행하려면 제조법이 필요합니다.

그래서 foo.d에 나열된 파일 중 하나가 foo.o보다 최신 파일 인 경우 foo.o에 대한 레서피를 실행해야한다는 것을 알려주는 것이 좋습니다.

감사합니다.

답변

2

종속 파일의 요점은 목표 종속성이 아니라는 것입니다. 은 올바른 종속성을 가진 대상을 완료한다는 것입니다. 실제로는 Makefile에서 포함시켜야합니다. 여기

는 기본 예입니다

SRC = foo.c main.c 
OBJ = $(SRC:.c=.o) 
DEPS = $(SRC:.c=.d) 

-include $(DEPS) 

all: myapp.o 

myapp.o: foo.o main.o 
    gcc -c main.o foo.o -o myapp.o 
main.o: main.c 
    gcc -M ... 
foo.o: foo.c 
    gcc -M ... 

.PHONY: all 

지금 무슨 일하는 $에있는 각 파일의 내용 (DEPS)이 Makefile의 복사 - 붙여 넣기 할 것입니다.

SRC = foo.c main.c 
OBJ = $(SRC:.c=.o) 
DEPS = $(SRC:.c=.d) 

-include $(DEPS) 

all: myapp.o 

myapp.o: foo.o main.o 
    gcc -c main.o foo.o -o myapp.o 
main.o: main.c foo.c foo.h 
    gcc -M ... 
foo.o: foo.c 
    gcc -M ... 

.PHONY: all 

방법 관찰 : 우리는 메이크 파일에서 포함을 적용하는 경우

가 여기에 GNU 마지막으로 분석 할 무엇
main.o: \ 
foo.c \ 
foo.h 

: main.c 아마 foo.c를 사용하므로 여기에, foo.h이 포함되어 있기 때문에 main.d의 모습거야 foo.c와 foo.h는 이제 main.o의 전제 조건입니다. 즉, 그 중 하나가 변경되면 main.o를 다시 빌드해야합니다.