に展開する必要があります。メイクレシピ(ダブル$
)の文脈で
シンプルなbashの置換(${parameter/pattern/string}
):
for i in $(MODULES:%.cpp=%); do \
g++ -c Sources/$$i.cpp -o Build/$${i//\//_}.o; \
done
警告:これはmakeが使用するシェルがbashの場合にのみ機能します。したがって、あなたのMakefileの冒頭に
SHELL := bash
を追加してください。
説明:
${i/X/_}
はX
の最初の発生が_
により置換されている変数i
の値として拡張します。
${i//X/_}
は、すべてX
の出現が_
に置き換えられた変数i
の値として展開されます。
X
は/
文字であり、エスケープする必要があります(\/
):${i//\//_}
です。
おそらく、より少ないbashがあり、より多くの方法で同じことを行うことに注意してください。ような何か:モジュールごとにルールをインスタンス化し、あなたがmake objs
を入力し、重要な利点と...同じことを行う必要があります
SRCS := $(shell find Sources -type f -name *.cpp)
OBJS :=
define OBJ_rule
obj := Build/$$(subst /,_,$$(patsubst Sources/%.cpp,%,$(1))).o
OBJS += $$(obj)
$$(obj): $(1)
g++ -c $$< -o [email protected]
endef
$(foreach s,$(SRCS),$(eval $(call OBJ_rule,$(s))))
.PHONY: objs
objs: $(OBJS)
は、だけ時代遅れのオブジェクト・ファイルが再構築されています。しかし、それはちょっと面倒です。