如何在Makefile中从YAML文件赋值变量并去除冗余空格
解决Makefile中yq解析配置后变量含多余空格的问题
核心原因分析
你遇到的问题大概率是yq输出自带换行符,或者Makefile的shell函数返回结果包含不可见的空白字符(比如换行)。$(strip)只能处理首尾空格,无法移除换行,所以放在函数内时,换行被保留,后续拼接路径时会被转换成空格,导致问题。
最优解决方案(从源头避免)
直接让yq输出无多余空白的字符串,不需要后续处理,这是最干净的方案:
1. 修正函数定义,用yq内置功能清理输出
利用yq的-r(raw输出,去掉引号)和trim函数(移除首尾空白/换行),确保输出完全干净:
# 定义解析函数,直接返回无多余空白的结果 extract_from_yaml = $(shell yq -r '.run.$(1) | trim' conf.yaml) # 赋值变量 MODE := $(extract_from_yaml mode) MODEL_VERSION := $(extract_from_yaml model_version) # 拼接路径,无多余空格 TARGET_PATH := ./output/$(MODE)/$(MODEL_VERSION)
2. 备用方案:通过shell命令移除换行
如果你的yq版本不支持trim函数,或者输出有额外换行,可在shell命令里用tr移除换行,再用strip处理空格:
extract_from_yaml = $(strip $(shell yq '.run.$(1)' conf.yaml | tr -d '\n'))
为什么之前函数内的$(strip)无效?
假设你之前的函数写法是:
# 无效的写法:strip只处理了shell输出的空格,但换行还在 extract_from_yaml = $(strip $(shell yq '.run.$(1)' conf.yaml))
yq默认输出会带换行(即使内容本身没有空格),$(strip)无法移除换行,当Makefile展开变量时,换行会被替换成空格,导致路径拼接时出现多余空格。而在函数外使用$(strip)时,相当于同时处理了变量里的换行和空格,所以有效,但这是事后补救,不如从源头解决。
验证方法
可以在Makefile里加调试语句,查看变量实际内容:
debug: @echo "MODE: '$(MODE)'" @echo "MODEL_VERSION: '$(MODEL_VERSION)'" @echo "TARGET_PATH: '$(TARGET_PATH)'"
执行make debug,如果变量内容被单引号包裹后没有多余空白,说明处理成功。
内容的提问来源于stack exchange,提问作者Areza
相关产品推荐
相关产品推荐

