在下面的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
答案 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)
时,只会重建过时的目标文件。但这有点棘手。