我有一个包含通用设置的主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中删除上述行,则使用gcc
和g++
代替avr-gcc
和avr-g++
开始。
我认为CC
和CXX
的处理方式不同,并且make提供了默认值,我无法使用以下语句为其分配默认值:
CC ?= avr-gcc
CXX ?= avr-g++
我的问题:
CC
和CXX
提供默认值,如果我不在子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
时,它正在接收主服务器中定义的CC
和CXX
。
PS:BTW,我的主makefile是Arduino的makefile,完整的源代码可以在github中找到。
答案 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
。