Makefile:for循环并在出错时中断

时间:2013-04-17 12:41:19

标签: for-loop makefile

我有一个带有for循环的Makefile。问题是当循环内发生错误时,执行继续进行。

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;

如何在遇到错误时让循环停止?

2 个答案:

答案 0 :(得分:10)

您可以在每次可能失败的通话中添加|| 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

答案 1 :(得分:4)

@Micheal提供了shell解决方案。你应该真的使用make(然后它将适用于-j n )。

.PHONY: tests
tests: ${SUBDIRS}
    echo $@ 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 $*

这里我使用静态模式规则(good stuff™),因此在配方中$*是模式中匹配的%(在这种情况下是子目录)。