《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》第六章——变量” 的相关文章

    拷贝构造函数

    class A{ public: A(const A&){}; }A a;A b = a;//will call copy constructor拷贝构造函数的作用就是按值传递,如果要防止按值传递可以:class A{ private: A(const A&);//N...

    C语言

    以前觉得C一无是处,毕业后发现C无所不能,面试时被玩C的鄙视过若干次,从此开始讨厌C,分析过1,2个C的开源框架后,渐生好感,因工作需要又回到了原点。当我从京东买花了200多大洋买回unix网络编程等书时,老大说你用c++也可以,于是还没开始就结束了.但是钱...

    为项目重新设置git remote url

    git remote set-url origin https://xxx@github.org/hello/etl.git...

    jsp导出word

    <%@ page contentType="application/vnd.ms-word; charset=utf-8"%> <%@ page pageEncoding="utf-8"%> <% String fileName = "jsp导出wor...

    Linux设置网络代理-CSDN博客

    设置网络代理操作简介 设置临时代理仅在当前shell会话生效 # export http_proxy=http://ip:port # export https_proxy=http://ip:port 设置永久代理 # vi /etc/profile #...

    基于android 图像基本处理项目demo源码释放(jarlen)

    功能介绍图片编辑(图片添加,文字添加),实现图片编辑中的图片添加,旋转,缩放,删除;文字的添加,大小缩放,字体更换,颜色更换,删除;基本滤镜实现与接口封装; 涂鸦(画笔的样式,粗细,颜色,橡皮擦,贴图); 相框(简单相框,酷炫相框); 马赛就克(基本马赛克,酷炫马赛克,橡皮擦)及其接口封装 ;图像剪...