makefile学习之路——变量

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了makefile学习之路——变量相关的知识,希望对你有一定的参考价值。

        在makefile中,支持程序设计语言中变量的概念,所有的变量只代表文本数据。

一、变量的定义和使用

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

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

        

二、变量的赋值方式

    1. 简单赋值        :=

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

    技术分享图片


    2. 递归赋值        =

    赋值操作可能影响多个其他变量,所有与目标变量相关的其他变量都将受到影响

技术分享图片

    3. 条件赋值        ?=

    如果变量未定义,使用赋值符号中的值定义变量,如果已定义,赋值无效

技术分享图片


    4. 追加赋值        +=

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

技术分享图片


三、预定义变量

1、自动变量

[email protected]   当前规则中触发命令被执行的目标

$^    当前规则中的所有依赖  

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

1.1  自动变量的使用

技术分享图片

技术分享图片


2、特殊变量

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


四、变量的高级用法

   1、变量值的替换

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

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

技术分享图片


   2. 变量的模式替换

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

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

技术分享图片

    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)"

    技术分享图片


4、规则中的模式替换

技术分享图片

示例如下:


技术分享图片

可以看成下面的代码

func.o main.o : %.o : %.c
    gcc -o [email protected] -c $^

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


5、变量值的嵌套引用

    5.1 一个变量名之中可以包含对其他变量的引用

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

技术分享图片


6、命令行变量

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

技术分享图片

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

技术分享图片


7. override关键字

        使用override关键字以后,makefile中定义的变量不会因为make的命令行变量而改变

技术分享图片

8、define关键字

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

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

技术分享图片


9、环境变量

    环境变量是操作系统本身的变量,makefile可以直接使用这些变量,但如果在makefile中定义了同名变量,那么将在当前的makefile中覆盖环境变量。运行make时。指定-e选项,可以优先使用环境变量



10、变量在不同makefile之间的传递方式

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

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

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


11、目标变量

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

技术分享图片

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)"

运行结果如下:

技术分享图片

由于another和test存在依赖关系,因此,定义的局部变量也会对another生效


12、模式变量

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

技术分享图片





以上是关于makefile学习之路——变量的主要内容,如果未能解决你的问题,请参考以下文章

makefile学习之路——变量和函数调用小结

makefile学习之路——函数调用

makefile学习之路——makefile简介

makefile学习之路——伪目标

Makefile学习之路5——通过函数增强功能

CMake学习之路