makefile学习之路——变量

        在makefile中,支持程序设计语言中变量的概念,全部的变量只表明文本数据。
ide

1、变量的定义和使用
测试

#变量的定义
CC := gcc
TARGET := hello.out

#变量的使用
$(TARGET) : func.o main.o
    $(CC) -o $(TARGET) func.o main.o

        

2、变量的赋值方式spa

    1. 简单赋值        :=操作系统

        只针对当前语句的变量有效
命令行

    image.png


    2. 递归赋值        =
设计

    赋值操做可能影响多个其余变量,全部与目标变量相关的其余变量都将受到影响
3d

image.png

    3. 条件赋值        ?=
blog

    若是变量未定义,使用赋值符号中的值定义变量,若是已定义,赋值无效递归

image.png


    4. 追加赋值        +=
作用域

    原变量值以后加上一个新值,原变量值和新值之间由空格隔开

image.png


3、预约义变量

一、自动变量

$@   当前规则中触发命令被执行的目标

$^    当前规则中的全部依赖  

$<    当前规则中的第一个依赖

1.1  自动变量的使用

image.png

image.png


二、特殊变量

这部分根据须要再去查询make手册


4、变量的高级用法

   一、变量值的替换

    1.1 使用指定字符替换变量值中的后缀字符

    1.2 语法格式:$(var:a=b)或${var:a=b}

image.png


   2. 变量的模式替换

    2.1 使用%保留变量值中的指定字符,替换其余字符

    2.2 语法格式: $(var:a=b)或${var:a=b}

image.png

    3. 测试代码

src1 := a.cc b.cc c.cc
obj1 := $(src1:cc=o)

test1 :
	@echo "obj1 => $(obj1)"
	
	
src2 := a11b.c a22b.c a33b.c
obj2 := $(src2:a%b.c=x%y)

test2 :
	@echo "obj2 => $(obj2)"

    image.png


四、规则中的模式替换

image.png

示例以下:


image.png

能够当作下面的代码

func.o main.o : %.o : %.c
    gcc -o $@ -c $^

分别进行匹配事后,就获得了图中的结果


五、变量值的嵌套引用

    5.1 一个变量名之中能够包含对其余变量的引用

    5.2 嵌套引用的本质是使用一个变量表示另一个变量

image.png


六、命令行变量

    6.1 运行make时,在命令行定义变量

image.png

    6.2 命令行变量默认覆盖makefile中定义的变量

image.png


7. override关键字

        使用override关键字之后,makefile中定义的变量不会由于make的命令行变量而改变

image.png

八、define关键字

    定义多行变量时,使用define关键字,同时能够配合override关键字防止变量被覆盖,

define定义的变量等价于使用=定义的变量

image.png


九、环境变量

    环境变量是操做系统自己的变量,makefile能够直接使用这些变量,但若是在makefile中定义了同名变量,那么将在当前的makefile中覆盖环境变量。运行make时。指定-e选项,能够优先使用环境变量



十、变量在不一样makefile之间的传递方式

    10.1 直接在外部定义环境变量进行传递

    10.2 使用export定义变量进行传递

    10.3 定义make命令行变量进行传递    


十一、目标变量

    做用域只在指定目标及连带规则中

image.png

var := D.T.Software
new := TDelphi

test : var := test-var
%e : override new := test-new

test : another
	@echo "test :"
	@echo "var => $(var)"
	@echo "new => $(new)"
	
another :
	@echo "another :"
	@echo "var => $(var)"
	@echo "new => $(new)"

运行结果以下:

image.png

因为another和test存在依赖关系,所以,定义的局部变量也会对another生效


十二、模式变量

    模式变量是目标变量的扩展,能够根据相应的规则,找到符合规则的目标

image.png




交流QQ群:199546072

相关文章
相关标签/搜索