GNU Make如何从变量提取字符并拼接为指定格式字符串?
在GNU Make中拆分字符串字符并重新格式化
确实,GNU Make本身没有直接提取单个字符的内置函数,但我们可以通过两种常见方法实现你想要的格式转换——一种是纯Makefile的递归处理,另一种借助shell命令简化代码,下面分别说明:
方法一:纯Makefile递归实现(跨平台友好)
这种方法完全依赖Make的内置函数,不需要调用外部命令,适合所有支持GNU Make的环境:
VAR=DDC # 定义递归函数,把字符串拆分为单个字符的空格分隔列表 define split_chars $(if $(1),$(word 1,$(subst ,, ,$(1))) $(call split_chars,$(wordlist 2,$(words $(subst ,, ,$(1))),$(subst ,, ,$(1))))) endef # 拆分VAR为单个字符列表 CHARS_LIST := $(call split_chars,$(VAR)) # 给每个字符添加单引号 FORMATTED_CHARS := $(foreach char,$(CHARS_LIST),'$(char)') # 把空格替换为逗号,得到目标字符格式 FINAL_CHARS := $(subst ' ','','$(FORMATTED_CHARS)') # 组装最终变量 TOT_VAR := --$(FINAL_CHARS)-- # 测试目标,运行`make test`查看结果 test: @echo "TOT_VAR = $(TOT_VAR)"
步骤解释:
split_chars递归函数:通过拆分字符串为空格分隔的单词列表,逐个提取字符,最终把DDC转换成D D C。foreach遍历字符列表,给每个字符加上单引号,得到'D' 'D' 'C'。- 用
subst替换空格为逗号,拼接成'D','D','C',最后加上前后的--完成格式转换。
方法二:借助Shell命令(代码更简洁)
如果你的环境可以调用shell工具(比如sed),这种方法代码更短,容易理解:
VAR=DDC # 用sed处理字符串:给每个字符加单引号并逗号分隔,再去掉末尾多余的逗号 TOT_VAR := --$(shell echo $(VAR) | sed -e "s/./'&',/g" -e "s/,$$//")-- # 测试目标 test: @echo "TOT_VAR = $(TOT_VAR)"
步骤解释:
echo $(VAR)输出原始字符串DDC。- 第一个
sed命令s/./'&',/g:把每个字符替换为'字符',,&代表匹配到的单个字符,所以DDC变成'D','D','C',。 - 第二个
sed命令s/,$$//:去掉末尾多余的逗号,得到'D','D','C'。 - 最后加上前后的
--,得到你需要的--'D','D','C'--。
两种方法都能实现你的需求,你可以根据自己的环境和偏好选择~
内容的提问来源于stack exchange,提问作者Sharky
相关产品推荐
相关产品推荐

