2014-01-15 5 views
2

같은 방법으로 많은 파일을 처리해야하는 프로젝트가 있습니다. 내 GNUmakefile '은 찾지은 다음과 같습니다한 번에 여러 대상에 대한 레시피 실행

$(SOURCES) = file1.a file2.a file3.a ... fileN.a 
$(TARGETS) = $(SOURCES:.a=.b) 

%.b: %.a 
    build-tool $? 

all: $(TARGETS) 

이 메이크 속도가 느립니다 각 대상에 대한 build-tool을 실행합니다. 그래서 업데이트 된 전제 조건의 목록으로 build-tool을 한 번만 실행하기를 원합니다.
나는 다음과 같은 규칙을 추가하려고 :

$(TARGETS): $(SOURCES) 

을 그리고 그런 첫번째 빌드에 도움이 :

$ make all 
build-tool file1.a file2.a ... fileN.a 

그러나 이후에 build-tool가 여러 번 내가 가지고있는 많은 목표 실행 된 빌드 :

$ touch file1.a && make all 
build-tool file1.a 
build-tool file1.a 
... 
build-tool file1.a 

반면에 build-tool [email protected]으로 제조법을 변경하면 빌드 도구가 한 번 실행됩니다. 모든 경우의 모든 전제 조건은 바람직하지 않습니다.
모든 대상에 대해 한 번만 레시피를 실행할 수있는 방법이 있습니까? 즉, 첫 번째 빌드의 모든 전제 조건과 이후 빌드에서만 수정됩니다.

답변

3

이 경우 패턴 규칙을 사용할 수 없습니다. 그래서 모든 것을 여러 번 볼 수 있습니다. 마지막으로 작성한 이후에 변경된 파일을 판별하는 데 사용할 수있는 "센티넬"파일을 사용해야합니다. '

$(SOURCES) = file1.a file2.a file3.a ... fileN.a 
$(TARGETS) = $(SOURCES:.a=.b) 

.PHONY: all 
all: .ran-build-tool2 

.ran-build-tool2: $(TARGETS) | .ran-build-tool 
     build-tool2 $? 
     @touch [email protected] 

.ran-build-tool: $(SOURCES) 
     build-tool $? 
     @touch [email protected] 
+0

그것은 내 문제를 해결,하지만 난 할 수 있습니다 다른 레벨을해야하는 경우처럼 당신이 뭔가를 할 수 있습니다

$(SOURCES) = file1.a file2.a file3.a ... fileN.a $(TARGETS) = $(SOURCES:.a=.b) .PHONY: all all: .ran-build-tool .ran-build-tool: $(SOURCES) build-tool $? @touch [email protected] 

ETA을 :

예를 들어, 다음과 같이 작동합니다 더 복잡한 경우에 그것을 사용하는 방법을 찾아 내지 마십시오. 예를 들어 위에서 언급 한 것과 같은 방식으로'.c' 파일을'build-tools2' 파일로'.b' 파일로 만들 필요가있는 경우입니다. – insanedeveloper

+1

죄송합니다. "더 복잡한 경우"를 정확히 설명하기 전까지는 귀하의 질문에 대답하기가 어렵습니다. 그래서 어디서나 당신이 묻는 질문에 대한 답을 얻습니다. 당신이 묻고 싶은 질문에 대한 대답이 아닙니다. 'build-tool2'가 어떻게 작동하는지에 대한 자세한 내용이 없으면 나는 대답에 대한 가능한 해결책을 추가했다. – MadScientist

+0

누군가가'$ (TARGETS)'중 하나를 만지면 작동하지 않습니다. 이 파일이 수정되거나 삭제되면 Make는 탐지하지 않습니다. – nowox

관련 문제