You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 02:23:13