gpt4 book ai didi

makefile - 如何在递归构建中忽略命令行变量赋值?

转载 作者:行者123 更新时间:2023-12-04 15:38:05 27 4
gpt4 key购买 nike

我正在尝试将两个构建系统粘合在一起。两者都是递归的(makefile 中的规则使用 make 调用其他 makefile 来构建项目的组件)。

我将它们称为“A”和“B”,其中“A”构建应用程序,“B”构建“A”使用的库。

A 中的顶级 makefile 调用“make TARGET=whatever”,这意味着构建的所有递归调用位都将 TARGET 的值作为只读变量继承,包括来自 B 的构建系统,它作为递归构建。

我不希望这种情况发生在“B”(来自不同项目)的构建系统中,因为那里的 makefile 将 TARGET 用于自己的目的,并且构建失败,因为 TARGET 具有错误的值并且是只读的。

我只能看到两种解决方案,都不是可调色的;

1) 将 TARGET 重命名为 A 中设置它的 makefile 和使用它的 A 中的 makefile 中的其他内容,以避免与构建系统的较低级别发生冲突。

2) 在 B 中设置了 TARGET 变量的 makefile 中随处使用“覆盖”指令,以覆盖其只读状态。

有人有更好的想法吗? - 理想情况下,我不希望 B 的构建系统从 A 继承任何东西,除了我从 A 明确传递给 B 构建系统的那些选项。

顺便说一下,我使用的是 GNU Make v3.80。

最佳答案

您可以在 A 中的二级 makefile 中将 MAKEOVERRIDES 设置为空。

callb:
cd subdir && $(MAKE) MAKEOVERRIDES=

这会传递正常的命令行参数,如 -k 和 -s,但不会传递命令行变量定义。

或者您使用与 MAKEFLAGS 相同的历史 MFLAGS,但 MFLAGS 不包含命令行变量定义。
callb:
cd subdir && $(MAKE) $(MFLAGS)

关于这两个选项的详细信息可以在这里阅读: The GNU Make Manual

关于makefile - 如何在递归构建中忽略命令行变量赋值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/934953/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com