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

如何让Makefile变量在多个目标/命令间持久生效

问题描述

示例Makefile代码:

PLATFORM=wrongName

debug:
    @echo debug $(PLATFORM)

debug-android: android debug

android:PLATFORM=android
android:
    @echo set PLATFORM to $(PLATFORM)

执行make debug-android后的终端输出:

user:~/Project/maketest$ make debug-android
set PLATFORM to android
debug wrongName

执行make debug-android时,期望android目标中设置的PLATFORM=android能在后续依赖的debug目标中生效,但实际debug目标仍使用了全局默认值wrongName,需要让变量赋值在不同目标/命令间持久生效。

解决方案

方法1:使用递归Make调用(推荐)

通过启动子Make进程并传递变量,确保后续目标能读取到修改后的变量值。修改后的Makefile如下:

PLATFORM=wrongName

debug:
    @echo debug $(PLATFORM)

# 调用子Make进程并传递PLATFORM变量
debug-android:
    $(MAKE) PLATFORM=android android debug

android:
    @echo set PLATFORM to $(PLATFORM)

执行make debug-android后,输出会变成:

set PLATFORM to android
debug android

方法2:使用$(eval)修改全局变量

通过$(eval)函数在目标执行阶段直接修改全局变量,让后续目标读取到更新后的值:

PLATFORM=wrongName

debug:
    @echo debug $(PLATFORM)

debug-android: android debug

android:
    # 用eval修改全局PLATFORM变量
    $(eval PLATFORM := android)
    @echo set PLATFORM to $(PLATFORM)

执行make debug-android后,同样会得到符合预期的输出。

内容的提问来源于stack exchange,提问作者WeezyKrush

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 23:01:24