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 はシェルソリューションを提供します。ただし、実際には 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 に答える