如何在Makefile的目标中引入另一个Makefile?
这种在Makefile目标中引入其他Makefile的方式不可行
你的写法有两个核心问题:
Make的执行阶段不处理
include指令
Make的运行分两个阶段:先做全量解析(处理所有include、变量、规则定义),再执行目标的shell命令。你把include Makefile.from_tarball写在目标的命令列表里,这部分会被当作普通shell命令传给终端执行——shell根本不认识Make的include语法,直接会抛出错误。变量展开时机不匹配
就算忽略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
相关产品推荐
相关产品推荐

