6

makeが多数のサブディレクトリを通過し、それらのディレクトリ内で作成する設定があります。失敗した場合はすぐにビルドを停止したいと思います。以下のコードスニペットはこれを示しています。誰かが私にmakefileの設定方法や、トップレベルからサブディレクトリまでの構築に関するドキュメントを正しい方向に向けることができますか?

SUBDIRS = \
test1 \
test2 

all clean check :
    @for dir in $(SUBDIRS); do \
        if [ -d $$dir ]; then (cd $$dir; $(MAKE) $@) fi \
    done
4

2 に答える 2

10

私は(明らかに)少数派であり、「再帰的に有害と見なされる」に同意しません。私は大規模で乱雑なコードベース用の再帰的なMakeシステムを作成しましたが、それらは非常にうまく機能します。

方法は次のとおりです。

all: $(SUBDIRS)

$(SUBDIRS): force
    @ $(MAKE) -s -C $@

.PHONY: force
force :;

(物事を静かにするために-sを追加しました。)

編集:ターゲットをサブメイクに渡すには(以前にこれを行う必要がありました):

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

all: TARGET=all
check: TARGET=check
clean: TARGET=clean
# No, you can't do TARGET=$@, or at least I don't know how to.

# recursive call to make
$(SUBDIRS): force
    @ $(MAKE) -s -C $@ $(TARGET)

.PHONY: force
    force :;
于 2010-03-17T16:00:02.433 に答える
1

再帰的なmakeアプローチを放棄することをお勧めします。その後、Makefileが大きくなるにつれて、無限の問題が発生する可能性があります。makeを再帰的に呼び出すことが悪い考えである理由の非常に良い説明については、論文Recursive MakeThoughtHarmfulを参照してください。

非再帰的なmakeに切り替えることですぐにわかるメリットは、現在発生しているこの問題が単純に解消されることです。非再帰的なMakefileではこの問題は発生しません。

また、私が作成したこの定型的な非再帰的なMakefileを自由にチェックしてください。GNU Make 3.81が必要ですが、本当に使いやすいです。少なくとも、独自のMakefileを作成する場合は、非再帰的なMakefileの良い例として機能します。

于 2010-03-17T15:17:19.953 に答える