如何在GNU Makefile目标前置条件中使用花括号扩展?
原因说明
- Bash的大括号扩展是shell的特性,GNU Make本身不原生支持该语法
- Makefile中的目标、依赖列表由Make自身直接解析,只有目标下方缩进的执行命令(recipe)才会调用指定的SHELL执行,因此仅设置
SHELL:=/bin/bash不会对依赖列表的大括号生效。
解决方案
方案1:主动调用shell扩展(写法最贴近原有习惯)
通过Make的shell函数手动调用bash完成大括号扩展,示例代码如下:
SHELL:=/bin/bash # 调用shell完成大括号展开,生成目标文件列表 OBJS := $(shell echo src/{foo/{one,two},bar/{three,four}}.o) all: $(OBJS) @echo "$(^)" # 补充.o文件的生成规则,根据你的实际源文件后缀调整即可 src/%.o: src/%.c $(CC) -c $< -o $@
方案2:使用Make原生函数实现(兼容性最优)
如果不想依赖shell,可使用Make内置的字符串处理函数生成文件列表,跨平台性更好,性能也更高:
# 分别生成不同目录下的.o文件列表 FOO_OBJS := $(addprefix src/foo/, one.o two.o) BAR_OBJS := $(addprefix src/bar/, three.o four.o) OBJS := $(FOO_OBJS) $(BAR_OBJS) all: $(OBJS) @echo "$(^)" # 同样补充.o文件的生成规则 src/%.o: src/%.c $(CC) -c $< -o $@
补充说明
如果只是做功能测试不需要真实编译生成.o文件,可以添加对应的空规则或者将目标声明为.PHONY即可避免报"无规则生成目标"的错误。
内容的提问来源于stack exchange,提问作者onlycparra
相关产品推荐
相关产品推荐

