zoukankan      html  css  js  c++  java
  • 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”去掉,使用相同的命令将得到不同的结果。大家试试看!

  • 相关阅读:
    《ActionScript 3 CookBook 简体中文完整版》下载
    打开组件服务超慢,打不开属性窗口。
    无法引用Microsoft.Office.Interop.Excel的解决
    HttpWebResponse类
    反射性能优化 标记个
    配置文件入门 WebConfig.config常用配置节点介绍
    配置文件的读写
    HTTP权威指南阅读记录 第一章
    IIS
    锁机制与原子操作 <第四篇>
  • 原文地址:https://www.cnblogs.com/liulaolaiu/p/11744523.html
Copyright © 2011-2022 走看看