私は次のようなことをしたい:
for i in *
do
if test -d $i
then
cd $i; make clean; make; cd -;
fi;
done
for
これは問題なく機能しますが、ビルドが壊れた場合にループを「壊す」必要があります。
これを行う方法はありますか?if
たぶん、成功をチェックできるある種のステートメントmake
?
Make自体を使用して、探しているものを実現できます。
SUBDIRS := $(wildcard */.)
.PHONY : all $(SUBDIRS)
all : $(SUBDIRS)
$(SUBDIRS) :
$(MAKE) -C $@ clean all
ターゲットのいずれかが失敗した場合、Makeは実行を中断します。
任意のターゲットをサポートするには:
SUBDIRS := $(wildcard */.) # e.g. "foo/. bar/."
TARGETS := all clean # whatever else, but must not contain '/'
# foo/.all bar/.all foo/.clean bar/.clean
SUBDIRS_TARGETS := \
$(foreach t,$(TARGETS),$(addsuffix $t,$(SUBDIRS)))
.PHONY : $(TARGETS) $(SUBDIRS_TARGETS)
# static pattern rule, expands into:
# all clean : % : foo/.% bar/.%
$(TARGETS) : % : $(addsuffix %,$(SUBDIRS))
@echo 'Done "$*" target'
# here, for foo/.all:
# $(@D) is foo
# $(@F) is .all, with leading period
# $(@F:.%=%) is just all
$(SUBDIRS_TARGETS) :
$(MAKE) -C $(@D) $(@F:.%=%)
変数make
を介して終了コードを調べることにより、が正常に終了したかどうかを確認してから、次のステートメントを作成できます。$?
break
...
make
if [ $? -ne 0 ]; then
break
fi