重写makefiles中的'CC'和'CXX'变量
我有一个主makefile,它包含常规设置,还有一个子makefile,它具有特定于项目的设置 从关于的另一个问题中,我了解到我可以在主makefile中使用以下代码:重写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
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
。?=
设置尚未设置的变量。因此,这实际上与“覆盖”变量相反;如果变量值已设置,则它不会显式重写该值。如果您想覆盖,您应该只使用=
,而不是?=
。我刚刚尝试过,但即使这样也不起作用。我已经用我尝试过的内容和新代码更新了这个问题。无论如何,谢谢你的帮助。