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

如何在Makefile的目标中引入另一个Makefile?

这种在Makefile目标中引入其他Makefile的方式不可行

你的写法有两个核心问题:

  1. Make的执行阶段不处理include指令
    Make的运行分两个阶段:先做全量解析(处理所有include、变量、规则定义),再执行目标的shell命令。你把include Makefile.from_tarball写在目标的命令列表里,这部分会被当作普通shell命令传给终端执行——shell根本不认识Make的include语法,直接会抛出错误。

  2. 变量展开时机不匹配
    就算忽略include的问题,${VAR_ONLY_EXIST_IN_TARBALL_MAKEFILE}在Make的解析阶段就已经被尝试展开了,此时你还没下载解压那个Makefile,变量根本不存在,最终会被展开成空字符串,达不到你想要的效果。

正确的实现方式

根据你的需求,有两种常用方案:

方案1:在解析阶段提前获取并引入Makefile

利用Make的条件判断和$(shell)函数,在解析阶段就完成下载解压,确保include能正常加载变量:

# 检查目标Makefile是否存在,不存在则自动下载解压
ifeq ($(wildcard Makefile.from_tarball),)
    $(shell wget <tarball with another Makefile>.tar.gz)
    $(shell tar -zxvf <tarball with another Makefile>.tar.gz)
endif

# 引入解压后的Makefile
include Makefile.from_tarball

# 定义目标打印变量
include_target:
    echo $(VAR_ONLY_EXIST_IN_TARBALL_MAKEFILE)

方案2:用递归Make调用子Makefile

如果不需要在当前Makefile中直接使用子Makefile的变量,只是要执行它的逻辑或打印变量,可以在目标中调用make命令指定子Makefile:

include_target:
    wget <tarball with another Makefile>.tar.gz
    tar -zxvf <tarball with another Makefile>.tar.gz
    # 调用子Makefile执行打印变量的操作
    $(MAKE) -f Makefile.from_tarball print_var

# 在子Makefile(Makefile.from_tarball)中需要定义对应的目标:
# print_var:
#     echo $(VAR_ONLY_EXIST_IN_TARBALL_MAKEFILE)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 22:32:52