2017-11-08 4 views
0

次のmakefile forループでは、文字列の途中でパターン置換を使用して、i変数が表す文字列を編集するにはどうすればよいですか?私の場合は、文字列中の/文字を_文字で置き換えたいと考えています。例えばループパターン置換のMakefile

for i in $(MODULES:%.cpp=%); do \ 
    g++ -c Sources/$$i.cpp -o Build/$$i.o; \ 
done 

MODULES =ディレクトリ/ File.cpp場合、内側のラインは、この答えは唯一GNU作り、bashの持つ有効です

g++ -c Sources/Directory/File.cpp -o Build/Directory_File.o 

答えて

1

に展開する必要があります。メイクレシピ(ダブル$)の文脈で

シンプルな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) 

は、だけ時代遅れのオブジェクト・ファイルが再構築されています。しかし、それはちょっと面倒です。