1

同様のルールをいくつか定義したいので、それらを関数内で定義することにしました。

COMPILED_JS_FILES=$(COMPILED_JS_FILES) $(foreach m,$(notdir $(wildcard src/$(1)/*.$(2))),$(TARGET_DIR)/$(1)/$(m))


$(TARGET_DIR)/$(1)/%.$(2) : src/$(1)/%.$(2)
    $(CAT) $< > $@

endef

$(eval $(call COMPILE_JS,modules,js))
$(eval $(call COMPILE_JS,modules,jsm))
$(eval $(call COMPILE_JS,models,js))
$(eval $(call COMPILE_JS,firefox,js))
$(eval $(call COMPILE_JS,helpers,js))

ただし、ルール内の $< および $@ 変数は、ルールが評価されるまで保存されるのではなく、それらを実行する関数によって定義されているため、空の文字列として評価されます。

この質問への答えだけでなく、この問題に対する他の合理的な解決策 (ディレクトリ構造の再構築以外) にも興味があります。

4

2 に答える 2

1

私は実際に答えを見つけました(この場合、私は一般的に知りません)-$$<そして$$@. さらに、$$(CAT) は、ルールの評価まで $(CAT) の展開を遅らせます。

于 2012-09-03T04:12:10.683 に答える
0

これはmakefileの古い問題です。あなたが正しいので、Make内でそれを回避するための良い、一般的な方法は本当にありません:$<そして$@あなたがそれらを必要とするときにちょうど利用できません。

このような問題が発生した場合、Makeの外部でサポートスクリプトを作成する傾向があります。ただし、GNU Makeは.SECONDEXPANSIONターゲットを提供します。これは、あなたのようないくつかのタスクを完了できるようにすることを目的としたあいまいなハックです。私自身の経験では、.SECONDEXPANSIONは必ずしもクリーンなソリューションではないということですが、あなたはそれを調査するかもしれません。

于 2012-09-03T04:06:12.080 に答える