如何在Makefile中仅调用一次PowerShell读取YAML文件提升效率
解决Makefile单次调用PowerShell读取YAML配置的问题
我在Makefile中通过shell命令读取一个最多20行的YAML配置文件,但读取数据耗时较长,经排查是多次调用PowerShell带来的时间开销导致的。
我曾尝试单次调用PowerShell读取整个配置,但无法正确获取对应属性值:
CONFIG := $(shell powershell '(Get-Content -Path "config.yaml" -Raw | ConvertFrom-Yaml)') AS := $(CONFIG).assembly.assembler
目前只能退回到多次调用的方式,但执行make时耗时约2-3秒,效率低下:
AS := $(shell powershell '(Get-Content -Path "config.yaml" -Raw | ConvertFrom-Yaml).assembly.assembler') LD := $(shell powershell '(Get-Content -Path "config.yaml" -Raw | ConvertFrom-Yaml).assembly.linker') ASFLAGS := $(shell powershell '(Get-Content -Path "config.yaml" -Raw | ConvertFrom-Yaml).assembly.asflags') LDFLAGS := $(shell powershell '(Get-Content -Path "config.yaml" -Raw | ConvertFrom-Yaml).assembly.ldflags')
需求:仅调用一次PowerShell,快速获取YAML文件中assembly节点下的assembler、linker、asflags、ldflags等值,且仅使用已安装的powershell-yaml模块,不安装其他工具。
我的config.yaml内容如下:
System: Windows assembly: assembler: as linker: gcc ldflags: asflags: -Iinclude --64 cflags: -Wall -m64 directories: - src - lib - bin - scripts - include
解决方案
方法1:通过分隔符一次性输出属性值再拆分
让PowerShell一次性输出所有需要的属性,用不会出现在值中的分隔符(比如|)连接,再在Makefile中拆分赋值:
# 单次调用PowerShell,输出目标属性并用|分隔 CONFIG_VALUES := $(shell powershell '$conf = Get-Content -Path "config.yaml" -Raw | ConvertFrom-Yaml; Write-Output "$($conf.assembly.assembler)|$($conf.assembly.linker)|$($conf.assembly.asflags)|$($conf.assembly.ldflags)"') # 替换分隔符为空格,再提取对应位置的值 AS := $(word 1, $(subst |, ,$(CONFIG_VALUES))) LD := $(word 2, $(subst |, ,$(CONFIG_VALUES))) ASFLAGS := $(word 3, $(subst |, ,$(CONFIG_VALUES))) LDFLAGS := $(word 4, $(subst |, ,$(CONFIG_VALUES)))
方法2:直接生成Makefile变量定义语句
让PowerShell输出符合Makefile语法的变量赋值语句,再用$(eval)执行,直接完成变量定义:
# 调用PowerShell生成变量定义语句 define CONFIG_VARS $(shell powershell '$conf = Get-Content -Path "config.yaml" -Raw | ConvertFrom-Yaml; ` Write-Output "AS := $($conf.assembly.assembler)"; ` Write-Output "LD := $($conf.assembly.linker)"; ` Write-Output "ASFLAGS := $($conf.assembly.asflags)"; ` Write-Output "LDFLAGS := $($conf.assembly.ldflags)"') endef # 执行生成的变量定义 $(eval $(CONFIG_VARS))
这两种方法都只需要调用一次PowerShell,能大幅降低执行耗时,且完全依赖已安装的powershell-yaml模块,无需额外工具。
内容的提问来源于stack exchange,提问作者ASMAZREG
相关产品推荐
相关产品推荐

