在makefile中的定义的变量,就像是C/C++语言中的宏一样,他代表了一个文本字串,在Makefile中执行的时候其会自动原模原样地展开在所使用的地方。其与C/C++所不同的是,你可以在Makefile中改变其值
变量在声明时需要给予初值,而在使用时,需要给在变量名前 加上“$”符号,但最好用小括号“()”或是大括号“{}”把变量给包括起来。如果你要使用真实的“$”字符,那么你需要用“$$”来表示。变量可以使用在许多地方,如规则中的“目标”、“依赖”、“命令”以及新的变量中
变量的命名字可以包含字符、数字,下划线(可以是数字开头),但不应该含有“:”、“#”、“=”或是空字符(空格、回车等)。变量是区分英文字母大小写的。
更多单片机/嵌入式内容与参考资料:大叔的嵌入式小站:Makefile学习-2.变量讲解
一、创建和使用变量
变量定义的两种方式
1.递归展开方式 VAR=var
2.简单方式 VAR: =var
一般使用递归展开方式进行变量定义,递归的意思是后面对变量的修改会影响到前面。
变量的使用
示例1:
dir :=/foo/bar
FOO?=bar
以上代码的含义是:如果FOO没有定义过,那么变量FOO的值就是‘bar’,如果FOO之前被定义过,那么什么也不做。
示例2:
#为变量添加值:可以通过+=为己定义的变量添加新的值
Main=hello.o hello-1.o
Main+=hello-2.o
二、变量的类型
1. 预定义变量
预定义变量其实就是系统内已经定义好的变量,变量名已经确定了,直接使用的话,使用的是默认值,你也可以重新赋值。下面列出一些常见的:
变量名 含义
CC C编译器的名称,默认值为cc,即默认使用gcc编译器
RM 文件删除程序的名称,默认值为rm -f
CFLAGS C编译器(gcc)的选项,无默认值,如-Wall、-g、-o
AR 库文件维护程序的名称,默认值为ar
CPP C预编译器的名称,默认值为$(CC) –E
CPPFLAGS C预编译的选项,无默认值
CXXFLAGS C++编译器(g++)的选项,无默认值
2.自动变量
变量名 变量含义
- $* 不包含扩展名的目标文件名称
- $+ 所有的依赖文件,以空格分开,并以出现后的先后为序,可能包含重复依赖文件
- $< 第一个依赖文件的名称
- $? 所有时间戳比目标文件晚的依赖文件,并以空格分开目标文件的完整名称
- $@ 目标文件的完整名称
- $^ 所有不重复的目标依赖文件,以空格分开
- $% 如果目标是归档成员,则该变量表示目标的归档成员的目标名称
3.变量中的空格
下面再介绍两个定义变量时我们需要知道的,请先看一个例子,如果我们要定义一个变量,其值是一个空格,那么我们可以这样来:
nullstring :=
space := $(nullstring) # end of the line
nullstring 是一个Empty变量,其中什么也没有,而我们的space的值是一个空格。因为在操作符的右边是很难描述一个空格的,这里采用的技术很管用,先用一个 Empty变量来标明变量的值开始了,而后面采用“#”注释符来表示变量定义的终止,这样,我们可以定义出其值是一个空格的变量。请注意这里关于“#”的使用,注释符“#”的这种特性值得我们注意,如果我们这样定义一个变量:
dir := /foo/bar # directory to put the frobs in
dir这个变量的值是“/foo/bar”,后面还跟了个空格,如果我们这样使用这样变量来指定别的目录——“$(dir)/file”那么就完蛋了。