能否在Makefile中使用Bash脚本的复杂命令选项数组模式?
在Makefile中实现带注释的复杂命令选项模式
当然可以实现,以下分两种方案说明:
一、可移植实现(兼容所有POSIX标准Make)
POSIX Make没有数组特性,但可以用多行变量+单独行注释的方式模拟,写法如下:
# 定义命令选项,每行一个选项,换行用反斜杠结尾 PROGRAM_FLAGS = \ --someoption \ --otheropen=4 # 备选选项示例:取消注释即可启用,方便快速测试 # PROGRAM_FLAGS += --otheropen=5 # 调用命令的写法 target: program $(PROGRAM_FLAGS)
这种写法的优势是所有符合POSIX标准的Make工具都能识别,缺点是注释必须单独写在一行,不能跟在选项后面。
二、GNU Make专属方案(更接近Bash的写法)
如果只需要兼容GNU Make(绝大多数Linux系统默认的Make工具),可以用define块实现带行尾注释的选项列表,还能保留注释掉的备选选项:
# 用define块定义带注释的选项列表 define PROGRAM_FLAGS_BLOCK --someoption # 注释:启用基础功能选项 --otheropen=4 # 注释:设置并发数为4的原因 # --otheropen=5 # 注释:备选并发数,取消注释即可切换 endef # 过滤掉注释行和行内注释,转换为空格分隔的有效选项 newline := $(shell echo -e '\n') PROGRAM_FLAGS := $(strip $(foreach line,$(subst $(newline), ,$(PROGRAM_FLAGS_BLOCK)),\ $(if $(findstring #,$(line)),$(word 1,$(line)),$(line))\ )) # 调用命令 target: program $(PROGRAM_FLAGS)
这个方案的写法和你在Bash里用的数组模式几乎一致,支持行尾注释和注释掉的备选选项,缺点是只能在GNU Make环境下使用。
内容的提问来源于stack exchange,提问作者gcb
相关产品推荐
相关产品推荐

