12

数日前、スタック オーバーフローに階層的な make の書き方に関する回答を投稿しました (http://stackoverflow.com/questions/1498213/make-hierarchical-make-file)。回答が削除されたため、完全に間違っているか、トピックから外れている(またはその両方)と思います。

階層的な Makefile の書き方を知りたいです。これは、サブディレクトリ内のいくつかの Makefile を呼び出す Makefile です。次のようなディレクトリ構造を想定しています。

- project
  |--module1
      |--Makefile
      |--...
  |--module2
     |--Makefile
     |--module2.1
     |--module2.2  
     |--...
  |--module3
     |--Makefile
     |--...
  |--etc

また、プロジェクト メンバーは、all (デフォルト)、clean、install などの最小限の Makefile ターゲット セットについてのみ合意していると思います。したがって、make フラグを含む次のコマンドがモジュールに伝達されます。

cd project
make clean  
make -k
make install
#etc

次のプロジェクト Makefile の問題点:

PACKAGES = \
    module1 \
    module2 \
    emodule3

VIRTUAL_PACKAGES = $(addsuffix /.virtual.Makefile,${PACKAGES})

TARGETS=clean install all

.PHONY: $(TARGETS)
default: all

FLAGS = $(ifeq $(MAKEFLAGS) "","",-$(MAKEFLAGS))

$(TARGETS): $(VIRTUAL_PACKAGES)

$(VIRTUAL_PACKAGES): 
    $(MAKE) $(FLAGS) -C $(@D) $(MAKECMDGOALS)

はい、Makefile の $VIRTUAL_PACKAGES は奇妙に見えます。for ループを混在させる代替手段は少し短いですが、(bash に依存する必要があるため) より良いかどうかはわかりません: PACKAGES = \ module1 \ module2 \ emodule3

TARGETS=clean install all

.PHONY: $(TARGETS)
default: all

FLAGS = $(ifeq $(MAKEFLAGS) "","",-$(MAKEFLAGS))

$(TARGETS): 
    for p in $(PACKAGES) ; do $(MAKE) $(FLAGS) -C $$p $@ || break; done

ありがとう!

4

1 に答える 1

10

ここには「龍」がいます。実行できますが、その影響はトリッキーになる可能性があります。

Google、「再帰的なメイクは有害であると見なされる」 . あなたが望むもの (例えば、階層化) の非常に優れた (単純な) イラストと、落とし穴/懸念事項の適切な説明が得られます。「応答」の一部では、考えられる「ベスト プラクティス」と、問題を軽減する方法について説明します。次に、提起された問題がアプリケーションにとって説得力があるかどうかを判断できます。

元の論文:

http://miller.emu.id.au/pmiller/books/rmch/

その他のリンク:

http://c2.com/cgi/wiki?RecursiveMakeConsideredHarmful

http://dbaspot.com/configuration-management/194597-thoughts-recursive-make-considered-harmful.html

于 2012-07-09T14:00:06.230 に答える