2015-02-06 2 views
1

현재 유일한 방법은 그냥 호출하는 방법 루프 Makefile의 알고있는 루프 쉘의 :Makefile 수준의 "for"루프가 있습니까?

BIN_TARGETS=foo bar baz 

bin: $(BIN_TARGETS) 

run: bin 
     for FILE in $(BIN_TARGETS) ; do ./$$FILE ; done 

이 문제는 make 단지의 전체를 울리는, 쉘의 루프를 호출하는 것입니다 거기에 어떤가요

$ make run 
for FILE in foo bar baz ; do ./$FILE ; done 
output of foo 
output of bar 
output of baz 

: 루프 다음 ​​각 프로그램을 실행하고 출력을 출력 (그리고 오류가있는 경우, 그들은 단지 루프의 끝 부분 만 루프의 마지막 프로그램에 대한보고) Makefile -level for loop that that ess

$ make run 
./foo 
output of foo 
./bar 
output of bar 
./baz 
output of baz 

하고 그런 일이 같은 오류를보고 할 것 :이 출력이 것

run: bin 
     ./foo 
     ./bar 
     ./baz 

을 ?:의 entially 정확한 동등.

+0

"보고서 오류"작성자는 "중단"을 의미합니까? 쉘 루프는/etc를 출력 할 것이기 때문에. 그들이 일어날 때 make는 그들을 중단시키지 않을 것입니다. –

+0

@EtanReisner : 네, 기본적으로. "report"에 의해 나는'Makefile : XX : target '에 대한 recipe failed''make : *** [run] Error 27' 메시지를 의미했습니다. – Matt

+0

쉘 루프를 사용하면'./$FILE || exit $?'를 루프 본문으로 생각합니다. –

답변

1

make에는 루프가 있지만 원하는 것을 수행 할 수있는 루프는 없습니다.

make는 $(foreach)을 가지고 있지만 make/etc 구문을 반복 할 make 레벨 구조입니다. 껍질 수준 물건이 아닙니다.

define을 사용하면 레시피 본문을 원하는 방식으로 정의하고 레시피에서 사용할 수 있지만 make 내에서 여러 줄 정의를 생성하는 방법을 생각해 낼 수는 없습니다.

이것은 (원하는 동작면에서) 작동하지만 make를 실행하는 동안 생성되지 않습니다. ,

run: $(addsuffix .run,$(BIN_TARGETS)) 

%.run: % 
     ./$* 

foo.run 같은 여러 가능한 일치 항목이있는 경우 그러나, 지저분 : 내가 생각 해낸

define RECIPE 
./foo 
./bar 
./baz 
endef 

all: 
     $(RECIPE) 
+0

감사합니다. 'define'을 살펴보고 내가 할 수있는 것을 봅니다. – Matt

0

한 가지 방법은 만들어 낸 접미사 가짜 표적을 사용하는 것입니다. 이것이 유일한 차이점은 컴파일하고 하나의 파일을 실행 한 다음 모든 파일을 컴파일 한 다음 실행하는 것입니다.

1

이 작업을 수행 할 수 있습니다 :

BIN_TARGETS:=foo bar baz 

define CMD 
    $1 

endef 

bin: $(BIN_TARGETS) 

run: bin 
    $(foreach t, $(BIN_TARGETS), $(call CMD,./$(t))) 

CMD 변수는 명령 사이의 적절한 분리를 제공하는 것이 필요하다. 나는 그것을 더 간결하게하는 방법을 찾지 못했습니다.

foo 경우, barbaz가 포함되어

#!/bin/bash 

echo output of $0 

그런 다음 실행 make run 출력 :

./foo 
output of ./foo 
./bar 
output of ./bar 
./baz 
output of ./baz 
관련 문제