4

私は次のようなことをしたい

for i in *
do
    if test -d $i
    then
        cd $i; make clean; make; cd -;
    fi;
done

forこれは問題なく機能しますが、ビルドが壊れた場合にループを「壊す」必要があります。

これを行う方法はありますか?ifたぶん、成功をチェックできるある種のステートメントmake

4

2 に答える 2

19

Make自体を使用して、探しているものを実現できます。

SUBDIRS := $(wildcard */.)

.PHONY : all $(SUBDIRS)
all : $(SUBDIRS)

$(SUBDIRS) :
    $(MAKE) -C $@ clean all

ターゲットのいずれかが失敗した場合、Makeは実行を中断します。

UPD。

任意のターゲットをサポートするには:

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:.%=%)
于 2012-06-26T11:49:46.107 に答える
4

変数makeを介して終了コードを調べることにより、が正常に終了したかどうかを確認してから、次のステートメントを作成できます。$?break

...
make

if [ $? -ne 0 ]; then
    break
fi
于 2012-06-26T11:42:48.597 に答える