2

我有一个包含通用设置的主生成文件和一个具有项目特定设置的子生成文件。

从我关于在 makefile 中覆盖变量的另一个问题中,我了解到我可以在我的主 makefile 中使用以下代码:

CC ?= avr-gcc
CXX ?= avr-g++

在子 makefile 中,我使用colorgcc并覆盖这些变量:

CC ?= color-avr-gcc
CXX ?= color-avr-g++

一切正常。

但是,如果我从我的子 makefile 中删除上述行,make 开始使用gccandg++而不是avr-gccand avr-g++

我猜两者都被区别对待,CC并且CXX它们由 make 提供了默认值,我无法使用以下语句为它们分配默认值:

CC ?= avr-gcc
CXX ?= avr-g++

我的问题:

  • 我的假设正确吗?
  • 如果是,是否有任何其他方法可以在主 makefile 中提供默认值CCCXX让 make 使用它,如果我不在子 makefile 中覆盖它们?

编辑

根据Chrono Kitsune的建议,我做了以下

主生成文件

CC = avr-gcc
CXX = avr-g++
# Add other master macros here.
# Add other master targets here.

子生成文件

CC ?= color-avr-gcc
CXX ?= color-avr-g++
# There are no child macros or targets

include master.mk

不幸的是,即使这样也没有用。当我运行make child.mk它时,它会拾取CCCXX在 master.xml 中定义。

PS:顺便说一句,我的主 makefile 是 Arduino 的 makefile,完整的源代码可在github中找到。

4

2 回答 2

3

将主 makefile 拆分为两个文件:master.macros 和 master.targets。.macros 文件将包含任何宏,例如 CC 和 CXX,而 .targets 文件将包含要创建的实际目标。

子生成文件:

CC ?= color-avr-gcc
CXX ?= color-avr-g++
# Add other child macros here.

include master.macros

# Add child targets here.

include master.targets

主宏:

CC = avr-gcc
CXX = avr-g++
# Add other master macros here.

主控目标:

# Add master targets here.

如果在命令行上设置 CC,整个项目都会使用它。否则,如果在子 makefile 中设置了 CC,则整个项目将使用该 CC。如果两者都不使用,则整个项目将使用 master.macros 中的 CC 宏。

如果您需要更复杂的东西,例如仅在构建主目标时使用不同的 CC,您将需要使用不同的 CC 变量,例如默认为 $(CC) 的 MASTER_CC,但您可以根据需要使用命令行,例如make MASTER_CC=avr-gcc如果您不想使用子 makefile 中的任何 CC。您将使用 ?= 分配,并且所有规则都需要明确,并且您当然可以将规则中的任何 $(CC) 替换为 $(MASTER_CC) :

主宏:

MASTER_CC ?= $(CC)
MASTER_CXX ?= $(CXX)

例如,如果这是 CC 的值,它将使用 color-avr-gcc。否则,您需要make MASTER_CC=avr-gcc改用 avr-gcc 。我没有测试最后一点,这意味着可能存在错误,但我想第一个解决方案是您需要的:将主 makefile 拆分为两个文件,并CC ?= ...在仅包含主宏和子 makefile 的部分中使用。

于 2013-09-19T20:45:34.573 回答
0

使用origin功能调试后,我终于使用了以下组合。

主生成文件

CC = avr-gcc
CXX = avr-g++
# Add other master macros here.
# Add other master targets here.

子生成文件

include master.mk

CC = color-avr-gcc
CXX = color-avr-g++
# There are no child macros or targets

现在,当我这样做时,make child.mk它会捡起来color-avr-gcc。如果我在子 makefile 中评论它,那么它使用avr-gcc来自主 makefile。

于 2013-09-20T06:01:24.667 回答