数日前、スタック オーバーフローに階層的な 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
ありがとう!