Makefile中override 指示符

时间:2021-03-06 12:42:12
通常在执行make时,如果通过命令行定义了一个变量,那么它将替代在Makefile中出现的同名变量的定义。就是说,对于一个在Makefile中使用常规方式(使用“=”、“:=”或者“define”)定义的变量,我们可以在执行make时通过命令行方式重新指定这个变量的值,命令行指定的值将替代出现在Makefile中此变量的值。如果不希望命令行指定的变量值替代在Makefile中的变量定义,那么我们需要在Makefile中使用指示符“override”来对这个变量进行声明,像下边那样:

 

override VARIABLE = VALUE

 

或者:

 

override VARIABLE := VALUE

 

也可以对变量使用追加方式:

 

override VARIABLE += MORE TEXT

 

对于追加方式需要说明的是:变量在定义时使用了“override”,则后续对它值进行追加时,也需要使用带有“override”指示符的追加方式。否则对此变量值的追加不会生效。

指示符“override”并不是用来调整Makefile和执行时命令参数的冲突,其存在的目的是为了使用户可以改变或者追加那些使用make的命令行指定的变量的定义。从另外一个角度来说,就是实现了在Makefile中增加或者修改命令行参数的一种机制。我们可能会有这样的需求;可以通过命令行来指定一些附加的编译参数,对一些通用的参数或者必需的编译参数在Makefile中指定,而在命令行中指定一些特殊的参数。对于这种需求,我们就需要使用指示符“override”来实现。

例如:无论命令行指定那些编译参数,编译时必须打开“-g”选项,那么在Makefile中编译选项“CFLAGS”应该这样定义:

 

override CFLAGS += -g

 

这样,在执行make时无论在命令行中指定了那些编译选项(“指定CFLAGS”的值),编译时“-g”参数始终存在。

同样,使用“define”定义变量时同样也可以使用“override”进行声明。例如:

 

override define foo

bar

endef

 

最后我们来看一个例子:

 

# sample Makefile

 

EXEF = foo

 

override CFLAGS += -Wall –g

 

.PHONY : all debug test

all : $(EXEF)

 

foo : foo.c

………..

………..

 

$(EXEF) : debug.h

$(CC) $(CFLAGS) $(addsuffix .c,$@) –o $@

 

debug :

       @echo ”CFLAGS = $(CFLAGS)”

 

执行:make CFLAGS=-O2 将显式编译“foo”的过程是“cc –O2 –Wall –g foo.c –o foo”。执行“make CFLAGS=-O2 debug”可以查看到变量“CFLAGS”的值为“–O2 –Wall –g”。另外,这个例子中,如果把变量“CFLAGS”之前的指示符“override”去掉,使用相同的命令将得到不同的结果。大家试试看!