以下内容源于C语言中文网的学习与整理,非原创,如有侵权请告知删除。
Makefile文件中的变量有很多种类,其意义各不相同。比如普通变量、环境变量,自动变量,模式指定变量等。
这里主要讲普通变量的定义与使用。
一、变量的定义与引用
定义变量的基本语法如下:
varaible_name=Var1 Var2 ……
- 变量的名称可以由大小写字母、阿拉伯数字和下划线构成。
- 等号左右的空白符没有明确的要求,因为在执行 make 的时候多余的空白符会被自动的删除。
- 至于值列表,既可以是零项,又可以是一项或者是多项。
引用变量,可以用 "$(varaible_name)" 或者 "${varaible_name}" 。
实例:
OBJ=main.o test.o test1.o test2.o test:$(OBJ)gcc -o test $(OBJ)
二、变量的赋值方式
(1)简单赋值 ( := )
编程语言中常规理解的赋值方式,只对当前语句的变量有效。
换句话说,前面你对这个变量怎么赋值的我不管,我在这里对它赋值,那它就等于我赋给它的值。
x:=foo y:=$(x)b x:=new test:@echo "y=>$(y)"@echo "x=>$(x)"
在 shell 命令行执行make test,得到:
y=>foob x=>new
(2)递归赋值 ( = )
赋值语句可能影响多个变量,所有与目标变量相关的其他变量都受影响。
换句话说,这个变量(假如为A)的值由最后一条赋值语句决定,所有引用这个变量(A)的其他变量(假如为B),就算它(B)出现在这个变量(A)的最后一条赋值语句之前,也要受到这个变量(A)最后一条赋值语句的影响。
x=foo y=$(x)b x=new test:@echo "y=>$(y)"@echo "x=>$(x)"
在 shell 命令行执行make test,得到:
y=>newb x=>new
(3)条件赋值 ( ?= )
如果变量未定义,则使用符号后的值定义变量。如果该变量已经赋值,则该赋值语句无效。
换句话说,这个变量定义没有?没有的话我就给你定义,已经定义的话,你就用原来的定义吧。
x:=foo y:=$(x)b x?=new test:@echo "y=>$(y)"@echo "x=>$(x)"
在 shell 命令行执行make test,得到:
y=>foob x=>foo
(4)追加赋值 ( += )
原变量用空格隔开的方式追加一个新值。
x:=foo y:=$(x)b x+=$(y) test:@echo "y=>$(y)"@echo "x=>$(x)"
在 shell 命令行执行make test,得到:
y=>foob x=>foo foob