6

我有一个带有 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;

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

4

2 回答 2

10

|| exit 1要么在每个可能失败的调用中添加 a ,要么set -e在规则的开头执行 a:

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
于 2013-04-17T12:52:16.143 回答
4

@Micheal 提供了 shell 解决方案。不过,您确实应该使用 make (然后它将与-jn一起使用)。

.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™),因此在配方中$*是模式中匹配的任何内容%(在本例中为子目录)。

于 2013-04-17T13:42:35.903 回答