Makefile中变量的特征:
Makefile中变量的特征:
1.Makefile中变量和函数的展开(除规则的命令行以外),是在make读取makefile文件时进行的。这里的变量包括了使用"="定义和使用指示符"define"定义的。
2.变量可以用来代表一个文件名列表、编译选项列表、程序运行的选项参数列表、搜索源文件的目录列表、便以输出的目录列表等等。
3.变量名是不包括":"、"#"、"="前置空白和尾空白的任何字符串。
4.变量名是大小写敏感的。
5.另外有一些变量名只包含了一个或者很少的几个特殊的字符。
变量的引用:
$(VARIABLE_NAME) 或 ${VARIABLE_NAME}来引用一个变量的定义。
所有在命令或者文件名中使用"$"时需要用"$$"来表示。
变量的定义:
1.递归展开式变量:
变量的定义是通过"="或者使用指示符"define"定义的变量。对这种变量的引用,在引用的地方是严格的文本替换过程,此变量值的字符串原模原样的出现在引用它的地方。(变量在引用它的地方进行替换展开的同时,它说引用的其它变量才会被替换展开)
优点:在定义时,可以引用其它的之前没有定义的变量
缺点:
1.可能会由于出现变量的递归定义而导致make陷入到无限的变量展开过程中,最终使make执行失败.
2.风格变量的定义中如果使引用了某一个函数,那么函数总会在其被引用的地方被执行。
2.直接展开式变量
通过":="来定义变量。变量值中对另外变量的引用或者函数的引用在定义时被展开。所以在变量定义后就是一个实际所需要定义的文本串,其中不再包含任何对其它变量的引用。
3.定义一个空格
nullstring =
space := $(nullstring) #end of the line
4.条件赋值
条件赋值操作符"?=", 只有此变量在之前没有赋值的情况下才会对这个变量进行赋值。
例如: FOO ?= bar 等价于:
ifeq(&(origin FOO), undefined)
FOO = bar
endif
变量的替换引用:
$(VAR:A=B):替换变量"VAR"中所有"A"字符结尾的字为"B"结尾的字。“结尾”的含义是空格之前。