いくつかのサブディレクトリ(root_dir
)を含むディレクトリ(subdir1, subdir2, ...
)があります。
Makefileを使用して、root_dir
の各ディレクトリでmake
を実行します。 (明らかに、subdir...
のそれぞれが独自のMakefile内にあると想定されていました)。
したがって、本質的に2つの質問があります。
特定のディレクトリでmakeを実行するために知っているので、次のことを行うことに注意してください。
$(MAKE) -C subdir
単一のレシピでforループ内でサブメイクを実行すると、さまざまな問題が発生します。複数のサブディレクトリを作成する最良の方法は次のとおりです。
SUBDIRS := $(wildcard */.)
all: $(SUBDIRS)
$(SUBDIRS):
$(MAKE) -C $@
.PHONY: all $(SUBDIRS)
(これを指摘するためにGNU make specific;使用しているmakeのバージョンに関する制限について言及していませんでした)。
[〜#〜] eta [〜#〜]これは、複数のトップレベルのターゲットをサポートするバージョンです。
TOPTARGETS := all clean
SUBDIRS := $(wildcard */.)
$(TOPTARGETS): $(SUBDIRS)
$(SUBDIRS):
$(MAKE) -C $@ $(MAKECMDGOALS)
.PHONY: $(TOPTARGETS) $(SUBDIRS)
これを試して :
SUBDIRS = foo bar baz
subdirs:
for dir in $(SUBDIRS); do \
$(MAKE) -C $$dir; \
done
これはあなたを助けるかもしれません link
編集:あなたも行うことができます:
最も簡単な方法は次のとおりです。
CODE_DIR = code
.PHONY: project_code
project_code:
$(MAKE) -C $(CODE_DIR)
.PHONYルールは、project_codeがビルドする必要のあるファイルではないことを意味し、-Cフラグはディレクトリの変更を示します(makeを呼び出す前にcdコードを実行するのと同じです)。コードMakefileで他のターゲットを呼び出すために同じアプローチを使用できます。
例えば:
clean:
$(MAKE) -C $(CODE_DIR) clean
私はMAKECMDGOALS変数を知らず、MadScientistが複数のトップレベルターゲットの独自の実装を持っていることを見落としていたため、別の実装を作成しました。誰かが役に立つと思うかもしれません。
SUBDIRS := $(wildcard */.)
define submake
for d in $(SUBDIRS); \
do \
$(MAKE) $(1) --directory=$$d; \
done
endef
all:
$(call submake,$@)
install:
$(call submake,$@)
.PHONY: all install $(SUBDIRS)
prorabというライブラリがあります。GNU makeは、サブディレクトリにスタンドアロンのメイクファイルを含めることをサポートします。
Githubに関するいくつかの情報: https://github.com/igagis/prorab/blob/master/wiki/HomePage.md
基本的に、prorabを使用してサブディレクトリ内のすべてのmakefileを呼び出すと、次のようになります。
include prorab.mk
$(eval $(prorab-build-subdirs))