Makefile中override的使用

  • 时间:
  • 来源:互联网
  • 文章标签:
通常在执行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”去掉,使用相同的命令将得到不同的结果。大家试试看!

本文链接http://www.taodudu.cc/news/show-647490.html