同様のルールをいくつか定義したいので、それらを関数内で定義することにしました。
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))
ただし、ルール内の $< および $@ 変数は、ルールが評価されるまで保存されるのではなく、それらを実行する関数によって定義されているため、空の文字列として評価されます。
この質問への答えだけでなく、この問題に対する他の合理的な解決策 (ディレクトリ構造の再構築以外) にも興味があります。