1

私はメイクファイルの作成に非常に慣れていないため、この質問は些細なことかもしれません。悪いコーディング方法を使用している場合は、指摘していただければ幸いです。

入力変数に基づいてルールを作成する一般的なメイクファイルを作成しようとしています。私の投稿の最後に「最小限の」例があります。

私は2つの問題を抱えています。

  1. 35 行目で、meta_template をインスタンス化します。変数 $(Dirs) が展開され、$(Dirs) の各エントリで meta_template が呼び出されることを期待します。しかし、それは最後から2番目までしか拡大しません。make の結果は次のように終了します。

    make: *** No rule to make target 'Dir03Target01Tag01', needed by 'Dir03'. Stop.

  2. 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))))
4

0 に答える 0