我有一个主Makefile,其中包含通用设置,还有一个子Makefile,其中包含特定项目的设置。
从我关于在Makefile中覆盖变量的另一个问题中,我学到可以在我的主Makefile中使用以下代码:
在子Makefile中,我使用colorgcc并覆盖了这些变量:
一切正常。但是,如果我从我的子makefile中删除上述行,make就开始使用gcc和g ++而不是avr-gcc和avr-g ++。我猜CC和CXX都被视为不同的变量,并且它们由make提供默认值,我无法使用以下语句为它们分配默认值:
我的问题:
子Makefile
不幸的是,即使这样也没有起作用。当我运行
PS:顺便提一下,我的主要Makefile是Arduino的Makefile,并且完整的源代码可以在github上找到。
从我关于在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 中提供默认值给
CC
和CXX
,并让 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
时,它会使用主文件中定义的CC
和CXX
。PS:顺便提一下,我的主要Makefile是Arduino的Makefile,并且完整的源代码可以在github上找到。
?=
会设置该变量。因此,它实际上与“覆盖”变量的操作相反;如果变量已经设置,它明确地不会覆盖变量的值。如果您想要覆盖变量,应该使用=
而不是?=
。 - MadScientist