$@
代表规则中的目标文件名。如果目标是一个文档(Linux中,一般称.a文件为文档),那么它代表这个文档的文件名。在多目标的模式规则中,它代表的是哪个触发规则被执行的目标文件名。
$%
规则的目标文件是一个静态库文件时,代表静态库的一个成员名。例如,规则的目标是“foo.a(bar.o)”,那么,“$%”的值就为“bar.o”,“$@”的值为“foo.a”。如果目标不是函数库文件,其值为空。
$<
规则的第一个依赖文件名。如果是隐含规则,则它代表通过目标指定的第一个依赖文件。
$?
所有比目标文件更新的依赖文件列表,空格分割。如果目标是静态库文件名,代表的是库成
员(.o文件)的更新情况。
$^
规则的所有依赖文件列表,使用空格分隔。如果目标是静态库文件名,它所代表的只能是所有库成员(.o文件)名。一个文件可重复的出现在目标的依赖中,变量“$^”只记录它的一次引用情况。就是说变量“$^”会去掉重复的依赖文件。
$+
类似“$^”,但是它保留了依赖文件中重复出现的文件。主要用在程序链接时,库的交叉引用场合。
$*
在模式规则和静态模式规则中,代表“茎”。“茎”是目标模式中“%”所代表的部分(当文件名中存在目录时,“茎”也包含目录(斜杠之前)部分,可参考 9.5.4 模式的匹配 一小节)。例如:文件“dir/a.foo.b”,当目标的模式为“a.%.b”时,“$*”的值为“dir/a.foo”。“茎”对于构造相关文件名非常有用。
$(@D)
代表目标文件的目录部分(去掉目录部分的最后一个斜杠)。如果“$@”是“dir/foo.o”,
那么“$(@D)”的值为“dir”。如果“$@”不存在斜杠,其值就是“.”(当前目录)。
$(@F)
目标文件的完整文件名中除目录以外的部分(实际文件名)。如果“$@”为“dir/foo.o”,那么“$(@F)”只就是“foo.o”。“$(@F)”等价于函数“$(notdir $@)”。
$(*D)
$(*F)
分别代表目标“茎”中的目录部分和文件名部分。
$(%D)
$(%F)
当以如“archive(member)”形式静态库为目标时,分别表示库文件成员“member”名中的目录部分和文件名部分。它仅对这种形式的规则目标有效。
$(<D)
$(<F)
分别表示规则中第一个依赖文件的目录部分和文件名部分。
$(^D)
$(^F)
分别表示所有依赖文件的目录部分和文件部分(不存在同一文件)。
$(+D)
$(+F)
分别表示所有依赖文件的目录部分和文件部分(可存在重复文件)。
$(?D)
$(?F)
分别表示被更新的依赖文件的目录部分和文件部分。
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"结尾的字。“结尾”的含义是空格之前。
AR:函数库打包程序,可创建静态库.a文档。默认是"ar".
AS:汇编程序。默认是"as"。
CC:C编译程序。默认是"cc"。
CXX:C++编译程序。默认是"g++"。
CO:从RCS中提取文件的程序。默认是"CO"。
CPP:C程序的预处理器(输出是标准输出设备)。默认是"$(CC) -E"。
FC:编译器和预处理Fortran和Ratfor 原文件的编译器。默认是"f77"。
GET:从SCCS中提取文件程序。默认是"get"
LEX:将Lex语言转变为C或Ratfo的程序。默认是“lex”.
PC:Pascal语言编译器。默认是"PC"。
YACC :Yacc文法分析器。默认命令是"yacc".
YACCR:Yacc文法分析器(针对于Ratfor程序)。默认是"yacc -r"。
MAKEINFO:转换Texinfo源文件(.texi)到Info文件程序。默认"makeinfo"。
TEX:从源文件TeX创建TeX DVI文件的程序。默认是"tex".
TEXI2DVI:从Texinfo源文件创建TeX DVI文件的程序。默认"texi2dvi".
WEAVE:转换Web到TeX的程序。默认是"weave".
CWEAVE:转换C Web到TeX的程序。默认是"cweave".
TANGLE:转换C Web 到 C.默认是"ctangle"。
RM:删除命令.默认是"rm -f"。
命令参数的变量:
ARFLAGS:执行"AR"命令的命令行参数。默认是"rv"。
ASFLAGS:执行汇编语器"AS"的命令行参数(明确指定".s"或".S"文件时)。
CFLAGS:执行"CC"编辑器的命令行参数。
CXXFLAGS:执行"g++"编译器的命令行参数。
COFLAGS:执行"co"的命令行参数(在RCS中提取文件的选项)
CPPFLAGS执行C预处理器"cc -E"的命令行参数
FFLAGS:Fortran 语言编译器"f77"执行的命令行参数。
GFLAGS:SCCS "get"程序参数
LDFLAGS:链接器参数。 如"ld"
LFLAGS:Lex文法分析器参数。
PFLAGS:Pascal语言编译器参数
RFLAGS:Ratfor程序的Fortran编译器参数。
YFLAGS:Yacc文法分析器参数。