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

时间:2013-09-19 05:51:09

标签: makefile gnu-make

我有一个包含通用设置的主makefile,以及一个具有项目特定设置的子makefile。

根据我关于overriding variables in a makefile的其他问题,我了解到我可以在我的主makefile中使用以下代码:

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

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

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

一切正常。

但是,如果我从我的子makefile中删除上述行,则使用gccg++代替avr-gccavr-g++开始。

我认为CCCXX的处理方式不同,并且make提供了默认值,我无法使用以下语句为其分配默认值:

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

我的问题:

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

修改

根据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:BTW,我的主makefile是Arduino的makefile,完整的源代码可以在github中找到。

2 个答案:

答案 0 :(得分: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,整个项目将使用它。否则,如果在子makefile中设置了CC,则整个项目将使用该CC。如果两者都不使用,整个项目将使用master.macros中的CC宏。

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

master.macros:

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

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

答案 1 :(得分: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中对它进行注释,那么它将使用master makefile中的avr-gcc