如何在Makefile(含子Makefile)中无条件重分配变量?
解决Makefile变量CLI覆盖后子Makefile继承初始值的问题
问题场景
文件结构:
Makefile subdir/ - Makefile-sub
主Makefile初始代码:
export ARCH:=good_value all: @echo In main makefile, ARCH=$(ARCH) @make --no-print-directory -C subdir
子Makefile代码:
all: @echo In sub makefile, ARCH=$(ARCH)
直接执行make时输出符合预期:
In main makefile, ARCH=good_value In sub makefile, ARCH=good_value
但执行make ARCH=bad_value时,主、子Makefile都会使用bad_value;使用-E参数时,主Makefile保留good_value但子Makefile仍用bad_value,均不符合需求。逐个传递变量的方式(@make ... ARCH=$(ARCH))因变量多、子Makefile层级多而不够高效。
解决方案:使用override关键字强制锁定变量值
在主Makefile中,用override关键字定义变量,确保CLI传入的值不会覆盖Makefile中的初始定义,再导出变量供子Makefile继承。
修改后的主Makefile:
override ARCH := good_value export ARCH all: @echo In main makefile, ARCH=$(ARCH) @make --no-print-directory -C subdir
此时执行make ARCH=bad_value,输出会符合预期:
In main makefile, ARCH=good_value In sub makefile, ARCH=good_value
原理说明
override关键字的作用是:强制让Makefile中的变量赋值覆盖CLI或环境变量传入的值,确保变量始终使用Makefile中定义的初始值。export会将当前Makefile中已锁定的变量值传递给子Makefile,子Makefile无需额外处理即可继承该值,避免了逐个传递变量的繁琐。
批量变量处理
如果有多个变量需要锁定,只需对每个变量添加override关键字后导出即可:
override ARCH := good_value override PLATFORM := x86 override VERSION := 1.0 export ARCH PLATFORM VERSION
这样所有子Makefile都会继承这些锁定后的变量值,不受CLI传入值的影响。
内容的提问来源于stack exchange,提问作者Magyar_57
相关产品推荐
相关产品推荐

