1. override
的作用
override
是 make
的一个特性,它确保即使命令行中传递了一个变量,也会强制使用 Makefile
中指定的值,前提是该变量尚未在命令行中设置。
具体来说:
- 如果你在
Makefile
中使用了override sim ?= sdf
,并且执行make all sim=rtl
,那么sim
变量的值仍然会是rtl
,**而不是sdf
**,因为make
会优先使用命令行中传递的值。
所以,**如果你传递了 sim=rtl
,即使在 Makefile
中有 override sim ?= sdf
,sim
的值仍然是 rtl
**。这是因为 override
只会在变量没有被命令行赋值时才生效。
例子:
1 | override sim ?= sdf |
如果你执行:
1 | make all sim=rtl |
输出会是:
1 | rtl |
而不是 sdf
。因为 make
会使用命令行中传递的 sim=rtl
变量。
2. override
和命令行传递的变量
override
的作用是确保在 Makefile
中的变量如果没有在命令行中传递的情况下才会生效。也就是说:
- 如果命令行中没有传递
sim
变量,override sim ?= sdf
就会生效,将sim
设置为sdf
。 - 如果命令行中已经传递了
sim=rtl
,override
不会干扰命令行的赋值,所以sim
会是rtl
。
3. 解决方法
如果你希望强制 sim
的值无论如何都为 sdf
,并且不受命令行传递的影响,应该直接赋值,而不是使用 ?=
。比如:
1 | sim = sdf |
在这种情况下,无论你在命令行传递什么 sim=rtl
,sim
的值都会是 sdf
,因为 sim
是在 Makefile
中强制赋值的。
总结
override sim ?= sdf
会在sim
未被命令行赋值时才生效,但如果你执行make all sim=rtl
,那么sim
的值会是rtl
,**不会是sdf
**。- 如果你希望
sim
始终保持为sdf
,你需要直接使用sim = sdf
(而不是?=
),这样无论命令行如何传递,sim
都是sdf
。
本文作者:
ICXNM-ZLin
本文链接: https://talent-tudou.github.io/2024/12/28/makefile/Makefile-override关键字/
版权声明: 本作品采用 CC BY-NC-SA 4.0 进行许可。转载请注明出处!
本文链接: https://talent-tudou.github.io/2024/12/28/makefile/Makefile-override关键字/
版权声明: 本作品采用 CC BY-NC-SA 4.0 进行许可。转载请注明出处!