重写makefiles中的'CC'和'CXX'变量

重写makefiles中的'CC'和'CXX'变量,makefile,gnu-make,Makefile,Gnu Make,我有一个主makefile,它包含常规设置,还有一个子makefile,它具有特定于项目的设置 从关于的另一个问题中,我了解到我可以在主makefile中使用以下代码: CC ?= avr-gcc CXX ?= avr-g++ CC ?= color-avr-gcc CXX ?= color-avr-g++ # Add other child macros here. include master.macros # Add child targets here. include mast

我有一个主makefile,它包含常规设置,还有一个子makefile,它具有特定于项目的设置

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

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

include master.macros

# Add child targets here.

include master.targets
在子makefile中,我使用并覆盖以下变量:

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中重写它们,是否有其他方法为主makefile中的
    CC
    CXX
    提供默认值并让我们使用它
编辑

根据他的建议,我做了以下工作

主生成文件

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
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
子生成文件

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
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
时,它将拾取master中定义的
CC
CXX


顺便说一句,我的主makefile是Arduino的一个makefile,完整的源代码在中提供。

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

子生成文件:

CC ?= avr-gcc
CXX ?= avr-g++
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_CC ?= $(CC)
MASTER_CXX ?= $(CXX)
硕士学位课程目标:

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

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

master.macros:

CC = avr-gcc
CXX = avr-g++
# Add other master macros here.
MASTER_CC ?= $(CC)
MASTER_CXX ?= $(CXX)

它将使用颜色avr gcc,例如,如果这是CC的值。否则,您需要使用
makemaster\u CC=avr-gcc
来代替avr-gcc。我还没有测试这最后一点,这意味着可能存在bug,但我想第一个解决方案就是您所需要的:将主生成文件拆分为两个文件,并在仅包含主宏和子生成文件的部分中使用
CC?=…

使用该函数调试后,我最终决定使用以下组合

主生成文件

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
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
子生成文件

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
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

现在,当我做
makechild.mk
时,它会选择
color avr gcc
。如果我在子makefile中对其进行注释,那么它将使用主makefile中的
avr gcc

?=
设置尚未设置的变量。因此,这实际上与“覆盖”变量相反;如果变量值已设置,则它不会显式重写该值。如果您想覆盖,您应该只使用
=
,而不是
?=
。我刚刚尝试过,但即使这样也不起作用。我已经用我尝试过的内容和新代码更新了这个问题。无论如何,谢谢你的帮助。