前言
前面我们说了makefile的作用,以及构成。它有着自己的规则,可以说makefile就是一门脚本语言,抛开这么细的分类,它的本质还是一门程序设计语言,那么肯定会有程序设计语言中的各个元素或者元素的影子,这篇文章要将的就是程序设计中最基础的知识—变量。
引申
我是从C语言学习的,在我的印象中定义变量就是:type varName[= val],使用一个变量前必须要定义,引用未定义的变量就是error。
接下来我们对比学习。首先定义的时候后,我们不在需要类型,原因是在makefile中没有那么多类型,只有一种,就是字符串的文本类型,所以我们不用通过类型去区分。其次makefile引入了一个概念就是赋值方式,不同的赋值方式对变量的作用有很大的不同。最后说明一点就是在makefile中未定义的变量是空字符串,所以我们可以引用未定义的字符串。
变量的定义
v1 := var1
exp1 :
@echo "v1 is $(v1)"
@echo "v2 is $(v2)" #引用未定义的变量
make exp1
v1 is var1
v2 is
变量名字 赋值方式 初始值,这就是在makefile中定义变量的方式,引用变量的方式比较特别,习惯就好,都是一些语法。
变量的赋值方式
#简单赋值
v3 := var3
#递归赋值
v4 = var4
v5 = $(v4)
v4 = new var4
#条件赋值
v3 ?= new var3
v6 ?= var6
#追加赋值
v7 := Hello
v8 := $(v7)Makefile
v7 += Makefile
exp2 :
@echo "v3 is $(v3)"
@echo "v4 is $(v4)"
@echo "v5 is $(v5)"
@echo "v3 is $(v3)"
@echo "v6 is $(v6)"
@echo "v7 is $(v7)"
@echo "v8 is $(v8)"
$ make exp2
v3 is var3
v4 is new var4
v5 is new var4
v3 is var3
v6 is var6
v7 is Hello Makefile
v8 is HelloMakefile
赋值方式分为四种:简单赋值,递归赋值,条件赋值,追加赋值。
简单赋值:赋值的操作只针对当前赋值语句中的变量有效。
递归赋值:赋值操作可能影响许多变量的值,只要跟目标变量相关的变量都会被改变。
条件赋值:如果变量已经被定义,则此处无效。否则变量的值就是我们指定的初始值。
追加赋值:就是字符串的拼接,需要注意的是,拼接后的空格。
四种赋值方式结合上面给出的例子和总结可以比较好的理解。这里再多说一点关于递归赋值的认识,我们可以这么去理解,如果一个变量是递归赋值方式的,那么这个变量的值是makefile中这个变量最后一次被赋值后的那个值。而且在makefile中,只要变量存在,我们就可以在任何位置引用这个变量的值,不分前后。
exp1 :
@echo "v1 is $(v1)"
@echo "v2 is $(v2)" #引用为定义的变量
v1 := var1
$ make exp1
v1 is var1
v2 is