私はメイクファイルの作成に非常に慣れていないため、この質問は些細なことかもしれません。悪いコーディング方法を使用している場合は、指摘していただければ幸いです。
入力変数に基づいてルールを作成する一般的なメイクファイルを作成しようとしています。私の投稿の最後に「最小限の」例があります。
私は2つの問題を抱えています。
35 行目で、meta_template をインスタンス化します。変数 $(Dirs) が展開され、$(Dirs) の各エントリで meta_template が呼び出されることを期待します。しかし、それは最後から2番目までしか拡大しません。make の結果は次のように終了します。
make: *** No rule to make target 'Dir03Target01Tag01', needed by 'Dir03'. Stop.
21 行目では、ショートカット ルールを作成します。これは、すべてのタグを特定の例に前提条件とするルールです。例えば:
Dir01Target02: Dir01Target02Tag04 Dir01Target02Tag05
まず、使用できないことに戸惑いましたが、対応するタグにアクセスする
$($$(1)Tags)
ために使用する必要がありました。$$($$(1)Tags)
(たとえば、Target01Tags に格納されます)。Using
$(addprefix)
は、私が期待したように展開していないようです。つまり、の結果make Dir01Target01
は次のとおりです。Create Rule Dir01Target01 with Dir01Target01Tag01 Tag02 Tag03
私が期待していた場所:
Create Rule Dir01Target01 with Dir01Target01Tag01 Dir01Target01Tag02 Dir01Target01Tag03
編集:質問 2 への回答が見つかりまし$(addprefix $(1)$$(1),$$($$(1)Tags))
た$$(addprefix $(1)$$(1),$$($$(1)Tags))
。これは2回の実行で拡張する必要があるためだと思います。したがって、最初の実行後は$(addprefix Dirxx$(1),$($(1)Tags))
残ります。
前もって感謝します。
# Targets to compile
Targets = Target01 Target02
# Tags to add to Targets
Target01Tags = Tag01 Tag02 Tag03
Target02Tags = Tag04 Tag05
# Some List (in the actual makefile a list of directories $(wildcard NumeratedDir*))
Dirs = Dir01 Dir02 Dir03
all: $(Dirs)
define meta_template
$(1): $(foreach target,$(Targets),$(foreach tag,$($(target)Tags),$(1)$(target)$(tag)))
define compile_meta
# $(1) 1st argument of meta_compile (<Dirs>xx, eg Dir03)
# $$(1) 1st argument of compile_template (<Targets>, eg Target01)
$(1)$$(1): #$(addprefix $(1)$$(1),$($$(1)Tags))
@echo Create Rule $(1)$$(1) with $(addprefix $(1)$$(1),$$($$(1)Tags)) <---- Line21
endef
$(foreach target,$(Targets),$(eval $(call compile_meta,$(target))))
define compile_template
# $(1) 1st argument of meta_compile (<Dirs>xx, eg Dir03)
# $$(1) 1st argument of compile_template (<Targets>, eg Target01)
# $$(2) 2nd argument of compile_template (<Targets>Tags, eg Tag01)
# create rule using arguments (eg Dir03Target01Tag01)
$(1)$$(1)$$(2):
@echo Create Rule $(1)$$(1)$$(2)
endef
$(foreach target,$(Targets),$(foreach tag,$($(target)Tags),$(eval $(call compile_template,$(target),$(tag))))) <--- Line35
endef
$(foreach prog,$(Dirs),$(eval $(call meta_template,$(prog))))