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

在GNU make中如何复用函数执行结果,避免每次引用都重复调用?

GNU Make 避免shell宏重复调用的解决方案

问题根源

你当前使用的=是GNU Make的递归展开变量赋值符,赋值时不会立刻解析右侧的shell函数,只有每次引用变量V时才会触发展开,导致每用一次V就会重新执行一次date命令,额外启动shell进程浪费资源。

解决方法

有两种通用方案可以实现shell命令仅执行一次,后续复用缓存结果:


方案1:使用立即展开变量赋值符 :=

将变量赋值改为立即展开模式,赋值阶段就执行shell函数并把结果固化到变量中,后续引用不会重新触发执行:

# := 赋值时立刻执行shell,结果缓存到V中
V:= $(shell set -x; date)

all:
    @echo 1 $V
    @echo 2 $V
    @echo 3 $V

该方案兼容所有主流GNU Make版本。


方案2:使用BSD风格的!=赋值符

GNU Make 3.82及以上版本原生支持BSD Make的!=赋值语法,效果和方案1完全一致,可直接复用BSD Make的写法:

# != 直接执行右侧shell命令,结果缓存到V中
V!= set -x; date

all:
    @echo 1 $V
    @echo 2 $V
    @echo 3 $V

该方案写法更简洁,同时兼容BSD Make和高版本GNU Make。


验证效果

使用以上任意一种方案执行make,只会看到一次set -x的调试输出,证明shell命令仅被调用1次。

内容的提问来源于stack exchange,提问作者Mikhail T.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 03:27:01