如何在GNU Makefile中生成带引号的逗号分隔列表
问题:Makefile中格式化文件路径输出需求
我编写了如下简单的Makefile:
MARKDOWNS = $(shell find . -type f -name "*.md" ! -name "index.md" ! -name "README.md") all: list list: echo $(MARKDOWNS)
我的目录下有以下.md文件:
$ ls *.md foo.md bla.md ra.md
当前该Makefile的输出为:
./foo.md ./bla.md ./ra.md
但我期望的输出是:
"./foo.md", "./bla.md", "./ra.md"
我使用的是GNU Make 4.4.1,请问如何转换$(MARKDOWNS)以实现该需求?
解决方案
可以借助GNU Make的内置字符串处理函数或shell命令实现,以下是两种实用方法:
方法1:用Make内置函数处理
直接对变量做格式化转换,修改后的Makefile如下:
MARKDOWNS = $(shell find . -type f -name "*.md" ! -name "index.md" ! -name "README.md") # 先给每个路径加引号,再替换分隔符为", " FORMATTED_PATHS = "$(subst ", ", ", ",$(patsubst %,"%",$(MARKDOWNS)))" all: list list: echo $(FORMATTED_PATHS)
patsubst %,"%",$(MARKDOWNS):给每个文件路径前后添加双引号subst ", ", ", ",...:把原本的空格分隔符替换成,(逗号加空格)- 最外层的双引号保证输出格式完全符合预期
方法2:借助shell命令处理
如果更习惯用shell工具,可修改list目标的执行语句:
MARKDOWNS = $(shell find . -type f -name "*.md" ! -name "index.md" ! -name "README.md") all: list list: printf '"%s", ' $(MARKDOWNS) | sed 's/, $//'
printf '"%s", ' $(MARKDOWNS):给每个路径加引号并以,结尾sed 's/, $//':移除最后多余的,
两种方法都能生成你需要的输出格式,可根据使用习惯选择。
内容的提问来源于stack exchange,提问作者somenxavier
相关产品推荐
相关产品推荐

