在makefile中覆盖`CC`和`CXX`变量

3
我有一个主Makefile,其中包含通用设置,还有一个子Makefile,其中包含特定项目的设置。
从我关于在Makefile中覆盖变量的另一个问题中,我学到可以在我的主Makefile中使用以下代码:
CC ?= avr-gcc
CXX ?= avr-g++

在子Makefile中,我使用colorgcc并覆盖了这些变量:
CC ?= color-avr-gcc
CXX ?= color-avr-g++

一切正常。但是,如果我从我的子makefile中删除上述行,make就开始使用gcc和g ++而不是avr-gcc和avr-g ++。我猜CC和CXX都被视为不同的变量,并且它们由make提供默认值,我无法使用以下语句为它们分配默认值:
CC ?= avr-gcc
CXX ?= avr-g++

我的问题:
  • 我的假设正确吗?
  • 如果是,是否有其他方法在主 makefile 中提供默认值给 CCCXX,并让 make 在子 makefile 中不覆盖它们时使用它们?

编辑:

根据 Chrono Kitsune 的建议,我进行了以下操作

主 makefile

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

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

include master.mk

不幸的是,即使这样也没有起作用。当我运行make child.mk时,它会使用主文件中定义的CCCXX
PS:顺便提一下,我的主要Makefile是Arduino的Makefile,并且完整的源代码可以在github上找到。

如果变量尚未设置,?=会设置该变量。因此,它实际上与“覆盖”变量的操作相反;如果变量已经设置,它明确地不会覆盖变量的值。如果您想要覆盖变量,应该使用=而不是?= - MadScientist
2个回答

3

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

子Makefile:

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

include master.macros

# Add child targets here.

include master.targets

master.macros:

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

master.targets:

# Add master targets here.

如果您在命令行上设置了CC,则整个项目将使用该CC。否则,如果在子makefile中设置了CC,则整个项目将使用该CC。如果两者都没有使用,则整个项目将使用master.macros中的CC宏。
如果您需要更复杂的内容,例如仅在构建主目标时使用不同的CC,您将需要使用不同的CC变量,例如MASTER_CC,默认为$(CC),尽管您可以根据需要覆盖它,例如使用类似make MASTER_CC=avr-gcc的命令行,如果您不想使用子makefile中的任何CC。您将使用?=分配,并且所有规则都需要明确指定,并且您当然会将任何规则中的$(CC)替换为$(MASTER_CC):
master.macros:
MASTER_CC ?= $(CC)
MASTER_CXX ?= $(CXX)

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


我刚刚尝试过了,但是连这个也没起作用。我已经根据我尝试的和新的代码更新了问题。不管怎样,谢谢你的帮助。 - Sudar

0

在使用origin函数进行调试后,我终于成功地使其与以下组合配合工作。

主要的makefile文件

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

子Makefile

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中将其注释掉,那么它会使用主makefile中的avr-gcc

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接