我有一个带有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;
如何在遇到错误时让循环停止?
答案 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™),因此在配方中$*
是模式中匹配的%
(在这种情况下是子目录)。