2013-04-17 39 views
3

我有一個for循環的Makefile。問題是當循環內發生錯誤時,執行繼續。Makefile:for循環和錯誤中斷

SUBDIRS += $(shell ls -d */ | grep amore) 

# breaks because can't write in /, stop execution, return 2 
test: 
    mkdir/
    touch /tmp/zxcv 

# error because can't write in/but carry on, finally return 0 
tests: 
    @for dir in $(SUBDIRS); do \ 
      mkdir/; \ 
      touch /tmp/zxcv ; \ 
    done; 

如何在遇到錯誤時停止循環?

回答

3

@Micheal給出了外殼的解決方案。你應該真的使用make雖然(然後它將與-jn)。

.PHONY: tests 
tests: ${SUBDIRS} 
    echo [email protected] Success 

${SUBDIRS}: 
    mkdir/
    touch /tmp/zxcv 

編輯

clean目標可能的解決方案:

clean-subdirs := $(addprefix clean-,${SUBDIRS}) 

.PHONY: ${clean-subdirs} 
${clean-subdirs}: clean-%: 
    echo Subdir is $* 
    do some stuff with $* 

這裏我用一個靜態模式規則(好東西™),因此,在配方$*是不管%匹配的模式(在這種情況下的子目錄)。

+0

是的,我也在考慮這個問題,但不確定依賴關係在哪裏以及什麼語義應該是這樣的;-) –

+1

我明白你的意思了。我有一個問題,但。在我的Makefile中,我有幾個目標(clean,install,...),每個循環遍歷子文件夾並在子目錄中調用相應的目標。我看不出如何調整你對這個用例的建議。 – Barth

+0

@Barth有很多玩這個的方法。我會在我的答案中加一個。 – bobbogo

9

要麼你加|| exit 1到每一個潛在失敗呼叫,或者你在規則的開頭做一個set -e

tests1: 
    @dir in $(SUBDIRS); do \ 
     mkdir/\ 
     && touch /tmp/zxcv \ 
     || exit 1; \ 
    done 

tests2: 
    @set -e; \ 
    for dir in $(SUBDIRS); do \ 
     mkdir/; \ 
     touch /tmp/zxcv ; \ 
    done 
+0

你可以用'&&'和'||'稍微縮短一些東西,比如'mkdir/&& touch/tmp/zxcv ||出口1' – MadScientist

+0

啊,是的。更新即將到來。 –