6

我正在尝试将两个构建系统粘合在一起。两者都是递归的(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。

4

4 回答 4

3

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

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

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

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

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

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

于 2009-06-03T18:06:31.023 回答
0

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

于 2009-06-01T15:53:45.063 回答
0

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 '-').

于 2009-06-03T18:37:14.940 回答
0

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

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

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

于 2011-11-09T22:10:31.333 回答