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

发布于 2024-07-22 09:33:18 字数 653 浏览 14 评论 0原文

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

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

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

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

我只能看到两种解决方案,但都不是令人满意的;

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

2) 在 B 中设置 TARGET 变量的 makefile 中的任何位置使用“override”指令来覆盖其只读状态。

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

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

I'm trying to glue two build systems together. Both are recursive (rules in the makefile use make to call other makefiles to build components of the project).

I'll call them 'A' and 'B' where 'A' builds the application and 'B' builds libraries used by 'A'.

The top level makefile in A calls 'make TARGET=whatever' which means that all the recursively-invoked bits of the build inherit the value of TARGET as a read-only variable, including the build system from B, which is called as part of the recursive build.

I don't want this to happen in the build system for 'B' (which come from a different project) as the makefiles there use TARGET for their own purposes and the build fails since TARGET has the wrong value and is read-only.

I can only see two solutions to this, neither of which is palettable;

1) Rename TARGET to something else in the makefile in A that sets it and in the makefiles in A that use it, to avoid the clash with the lower levels of the build system.

2) Use the 'override' directive everywhere in the makefiles in B where the TARGET variable is set, to override its read-only status.

Anyone got any better ideas? - ideally, I want nothing to be inherited by the B's build system from A's, except those options I explicitly pass to the B build system from A.

Incidentally, I'm using GNU Make v3.80.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

篱下浅笙歌 2024-07-29 09:33:18

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

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

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

或者您使用历史 MFLAGS,它与 MAKEFLAGS 相同,但 MFLAGS 不包含命令行变量定义。

callb:
     cd subdir && $(MAKE) $(MFLAGS)

有关这两个选项的详细信息可以在此处阅读: GNU Make 手册

You could set MAKEOVERRIDES to nothing in the second-level makefile in A.

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

This passes down the normal commandline parameters like -k and -s but not commandline variable definitions.

Or you use the historical MFLAGS which is the same as MAKEFLAGS except MFLAGS doesn't contain the commandline variable definitions.

callb:
     cd subdir && $(MAKE) $(MFLAGS)

Details about this two options can be read here: The GNU Make Manual

∝单色的世界 2024-07-29 09:33:18

也许您可以使用“unexport”指令来防止 TARGET 传播到 B 的 makefile?

Perhaps you can use the "unexport" directive to prevent TARGET from being propagated to B's makefile?

谈情不如逗狗 2024-07-29 09:33:18

在构建系统A调用构建系统B时,不要直接使用'${MAKE}'; 调用一个 shell 脚本来调用构建系统 B(可能在清理环境之后)。

要实现通过“make -n”执行命令的行为,请在 makefile 中的命令行前添加“+”前缀(类似于在该行前添加“<代码>@'或'-')。

At the point where build system A invokes build system B, do not use '${MAKE}' directly; invoke a shell script that invokes build system B (possibly after sanitizing the environment).

To achieve the behaviour where the commands are executed by 'make -n', prefix the command line in the makefile with '+' (similar to prefixing the line with '@' or '-').

月下凄凉 2024-07-29 09:33:18

听起来您已经修改了 A makefile 以递归调用 B makefile,从而解决了您的问题。 为什么不引入一个新的顶级 makefile,它递归地调用 B makefile,然后递归调用 A makefile? 例如,combined.mk:

all:
    $(MAKE) -f Makefile.B
    $(MAKE) -f Makefile.A

这样 B makefile 不会从 A makefile 继承任何内容。

It sounds like you have modified the A makefile to recursively invoke the B makefile, and thus your problem. Why not instead introduce a new toplevel makefile which recursively invokes the B makefile, and then recursively invokes the A makefile? For example, combined.mk:

all:
    $(MAKE) -f Makefile.B
    $(MAKE) -f Makefile.A

That way the B makefile inherits nothing from the A makefile.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文