用于循环模式替换的Makefile

时间:2017-11-08 12:42:50

标签: makefile

在下面的makefile for循环中,如何编辑i变量表示的字符串,并在字符串中间使用模式替换?在我的例子中,我希望用_字符替换字符串中的任何/字符。

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

例如,如果MODULES = Directory / File.cpp,则内线应扩展为

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

1 个答案:

答案 0 :(得分:1)

此答案仅适用于GNU make和bash。

make make recipe(double ${parameter/pattern/string})上下文中的简单bash替换($):

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

警告:仅当make使用的shell为bash时才有效。所以,添加一个:

SHELL := bash

在Makefile的开头。

说明:

  • ${i/X/_}展开为i的第一次出现的变量X的值。
  • _扩展为变量${i//X/_}的值,其中i的所有出现都被X替换。
  • 在您的情况下_X字符,必须对其进行转义(/):\/

请注意,可能会有更少的bash和更多的方法来做同样的事情。类似的东西:

${i//\//_}

每个模块实例化一个规则,并且应该执行相同的操作......具有明显的优势,当您键入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 $$@ endef $(foreach s,$(SRCS),$(eval $(call OBJ_rule,$(s)))) .PHONY: objs objs: $(OBJS) 时,只会重建过时的目标文件。但这有点棘手。