ターゲットの変数は、ルールではなく、でのみ設定できます。 %.o: %b
は、%.o
がターゲットパターン(したがって、「パターン固有の名前」)であるルールです。
これを解決する通常の方法は、レシピ内の値をエーテルでハードコーディングすること、またはルール固有のフラグを使用することです(場合によってはCVAR
とBVAR
)。
編集:傷があります。回避策を思いついた。
これは、変数の再帰的評価を利用することによって実行できます。
all: a.o b.o c.o
$(shell touch a.xx b.yy c.zz)
##
# Create rule-specific variable... rules
#
# @param 1 Target.
# @param 2 Prerequisite.
# @param 3 Variable name.
# @param 4 Variable value.
#
rule-var = $(eval $(rule-var-body))
define rule-var-body
$1: private $3 = $$(if $$(<:$2=),$(or $(value rule-var-$1-$3),$(value $3)),$4)
$2: $3 = $4
rule-var-$1-$3 = $$(if $$(<:$2=),$(or $(value rule-var-$1-$3),$(value $3)),$4)
endef
VAR = $(VAR_DEFAULT)
# Declare couple of test values
$(call rule-var,%.o,%.x,VAR,x-value)
$(call rule-var,%.o,%.y,VAR,y-value)
VAR_DEFAULT := z-value
ECHO_RULE_RECIPE = @echo -e '[email protected]: $^\t(VAR = $(VAR))'
%.o: %.x
$(ECHO_RULE_RECIPE)
%.o: %.y
$(ECHO_RULE_RECIPE)
%.o: %.z
$(ECHO_RULE_RECIPE)
%.x: %.xx
$(ECHO_RULE_RECIPE)
%.y: %.yy
$(ECHO_RULE_RECIPE)
%.z: %.zz
$(ECHO_RULE_RECIPE)
出力は次のとおり
a.x: a.xx (VAR = x-value)
a.o: a.x (VAR = x-value)
b.y: b.yy (VAR = y-value)
b.o: b.y (VAR = y-value)
c.z: c.zz (VAR = z-value)
c.o: c.z (VAR = z-value)
操作の脳マクロrule-var
あります。変数の前提条件に変数値をラップします。この式は、他のルール固有の値の変数でもあるrule-var-$1-$3
に保存されます。
$$(if $$(<:$2=),$(or $(value rule-var-$1-$3),$(value $3)),$4)
解読:
$$(if $$(<:$2=),
は、それが空の文字列のパターン($2
)だ置き換えることにより第一前提値($<
)をテストします。
残念ながら
、継承されたとき、それはprivate
として宣言し、単純な二番目のルールで固定していますので、この場合は、他の怪物が正しく展開されません。
この例では、次の3つのルールが宣言されます。
%.o: private VAR = $(if $(<:%.y=),$(if $(<:%.x=),$(VAR_DEFAULT),x-value),y-value)
%.y: VAR = y-value
%.x: VAR = x-value
でも回避策に関する制限事項
、変数のグローバル対応がまだ隠されています。デフォルト値が必要な場合は、をの前に割り当て、rule-var
とします。グローバル値は、ルール固有の変数の一部としてコピーされますが、使用するまでは展開されません。
私はこの構文に従っていますが、少し苦労しています。 $$(<:$ 2 =)、$(または値の規則-var- $ 3)、$(値$ 3))、$ 4) 'という行が私を投げています。私はそれが 'prereq1:prereq1 ='ならば、私は前にその構文を見たことがない、あるいは 'or'で始まる次の構文を見たことがないと思います。あなたはもう少し詳しく説明できますか? – smeep
@smeepあなたは行きます。 –
あなたはあなたのことをはっきりと知っています。私はまだあなたの答えを通して私の方法を働いているが、そうしている間、私が投稿した別の解決策を見つけたかもしれない。 – smeep