《GNU_makefile》第六章——变量

  • 阿里云国际版折扣https://www.yundadi.com

  • 阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

      makefile中的变量特征和C语言中的宏一样。

      变量使用 =,:=,?= 和 define 定义

      一些特殊的自动化变量:$< $@ $^ $*

    1.变量的引用

      通过 $(VAR) 或 ${VAR} 使用变量

      变量的展开是严格的文本替换,所以

    foo = c
    prog.o : prog.$(foo)
    $(foo) $(foo) -$(foo) prog.$(foo)
    被展开后就是:
    prog.c : prog.c
    cc -c prog.c

    2.变量的赋值

      变量有两种赋值方式。

      (1)= 递归展开

      使用 = 赋值的变量,如果赋值里存在对其他变量的展开,那么其他变量的展开也会执行,也就说,使用 = 赋值时,若字符串包含对其他变量的展开,则这时其他变量不会展开,而是在该变量被展开时,其他变量才被展开

    foo = $(bar)
    bar = $(ugh)
    ugh = Huh?
    all:;echo $(foo)

       foo = $(bar),这时 $(bar)不会被展开,foo的值就是 $(bar)

      bar = $(ugh), 同样,bar的值就是$(ugh)

      ugh = Hub?

      all:;echo $(foo),这里foo被展开,首先得到$(bar),由于foo是递归展开变量,所以bar同样会被展开,得到$(ugh),同样ugh也会被展开,得到Hub?

      递归展开的好处是,同上,foo=$(bar),bar可以在后面被赋值。

      如:

    CFLAGS = $(include_dirs) -O
    include_dirs = -Ifoo -Ibar

      (2):= 直接展开变量

      赋值直接展开变量,若赋值的字符串 中有对其他变量的展开,则其他变量会立即展开。

    x := foo
    y := $(x) bar
    x := later
    就等价于:
    y := foo bar
    x := later

      推荐使用直接展开,因为变量的表现更好预测。

      (3)?= 操作符

      做变量没有赋值,则被赋值,否则忽略

    3.变量的高级用法

      $(VAR:A=B),将变量VAR中以A结尾的字符,替换成以B结尾

    foo := a.o b.o c.o
    bar := $(foo:.o=.c)

      也可以这样,这样更通用

    oo := a.o b.o c.o
    bar := $(foo:%.o=%.c)

    4.变量的取值

    一个变量可以通过以下几种方式来获得值:
    — 在运行make时通过命令行选项来取代一个已定义的变量值。参考 6.7
    override指示符 一节
    — 在makefile文件中通过赋值的方式(参考 6.5 如何设置变量 一节)或者使
    用“ define”来为一个变量赋值(参考 6.8 多行定义 一节)。
    — 将变量设置为系统环境变量。 所有系统环境变量都可以被make使用。参考
    6.9 系统环境变量 一节
    — 自动化变量,在不同的规则中自动化变量会被赋予不同的值。它们每一个都
    有单一的习惯性用法。参考 10.5.3 自动化变量 一小节
    — 一些变量具有固定的值。参考 10.3 隐含变量 一节

    5.

    6.

    7.override指示符

      如果make的命令行参数定义给一变量赋值,则会替换makefile文件中对该变量的赋值(使用 := = define),

      如果不希望替换则使用override

    override VARIABLE = VALUE
    或者:
    override VARIABLE := VALUE
    也可以对变量使用追加方式:
    override VARIABLE += MORE TEXT
    变量在定义时使用了“ override”,则后续对它值进行追
    加时,也需要使用带有“ override”指示符的追加方式。否则对此变量值的追加不会生
    效。

    8.多行定义

      使用define实现多行定义

    9.系统环境变量

      系统环境变量既然是环境变量,自然会传递给子进程make

    10.目标指定变量

      使用目标指定变量,类似于设置局部变量,该变量的赋值只会用于该目标的规则

    设置一个目标指定变量的语法为:
    TARGET ... : VARIABLE-ASSIGNMENT
    或者:
    TARGET ... : override VARIABLE-ASSIGNMENT
    # sample Makefile
    CUR_DIR = $(shell pwd)
    INCS := $(CUR_DIR)/include
    CFLAGS := -Wall –I$(INCS)
    EXEF := foo bar
    .PHONY : all clean
    all : $(EXEF)
    foo : foo.c
    foo : CFLAGS+=-O2
    bar : bar.c
    bar : CFLAGS+=-g
    ………..
    ………..
    $(EXEF) : debug.h
    $(CC) $(CFLAGS) $(addsuffix .c,$@) –o $@
    clean :
    $(RM) *.o *.d $(EXES)

    11.模式指定变量

      就是目标指定变量的合并

      如

    %.o : CFLAGS += -O
  • 阿里云国际版折扣https://www.yundadi.com

  • 阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

    “《GNU_makefile》第六章——变量” 的相关文章

    时序图

    时序图将交互关系表示为一个二维图形,垂直方向为时间轴,时间沿竖线向下延伸;水平方向为对象维,排列的是协作中各独立对象的类元角色-对象。 时序图强调的是消息发送的时间顺序。它由活动者(Actor),对象(Object),消息(Message),生命线(Life...

    包裹函数

    包裹函数:程序通常会检测调用是否正确,如果出输会将错误信息输出.包裹函数就是在完成实际的函数调用,检查返回值,并在发生错误时终止进程.约定包裹函数名是实际函数名的首字母大写形式 bool fun(int i); bool Fun(int i)//Fun包裹了...

    php怎么判断域名跳转 - 编程语言

    这篇文章主要介绍“php怎么判断域名跳转”,在日常操作中,相信很多人在php怎么判断域名跳转问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”php怎么判断域名跳转”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!...

    Vue中如何使用Teleport组件 - 编程语言

    这篇文章主要介绍“Vue中如何使用Teleport组件”,在日常操作中,相信很多人在Vue中如何使用Teleport组件问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Vue中如何使用Teleport组件”的疑惑有所帮助!接下来,请跟着小...

    Spring

    一、 @Autowired和@Resource都可以用来装配bean,都可以写在字段上,或者方法上。二、 @Autowired属于Spring的;@Resource为JSR-250标准的注释,属于J2EE的。三、 @Autowired默认按类型装配,默认情况下必须要求依赖对象必须存在,如果要允许nu...

    vulnhub靶场之CROSSROADS: 1

    准备: 攻击机:虚拟机kali、本机win10。 靶机:Crossroads: 1,下载地址:https://download.vulnhub.com/crossroads/crossroads_vh.ova,下载后直接vbox打开即可。 知识点:stegoveritas工具使用、smb服务扫描、s...