隐含变量
内嵌隐含规则的命令中, 所使用的变量都是预定义的变量。我们将这些变量称为“隐含变量”。这些变量允许对它进行修改:在Makefile中、通过命令行参数或者设置系统环境变量的方式来对它进行重定义。
无论是用那种方式,只要make在运行时它的定义有效,make的隐含规则都会使用这些变量。当然,也可以使用“-R”或“--no builtin-variables”选项来取消所有的隐含变量(同时将取消了所有的隐含规则)。
例如,编译.c源文件的隐含规则为:
“$(CC) -c $(CFLAGS) $(CPPFLAGS)”。
默认的编译命令是“cc”,执行的命令是: “cc –c”。我们可以同上述的任何一种方式将变量 “CC”定义为“ncc”,那么编译.c源文件所执行的命令将是“ncc -c”。
同样我们可以对变量“CFLAGS”进行重定义。对这些变量重定义后如果需要整个工程的各个子目录有效,同样需要使用关键字“export”将他们导出;否则目录间编译命令可能出现不一致。
编译.c源文件时,隐含规则使用“$(CC)”来引用编译器;
“$(CFLAGS)”引用编译选项。
隐含规则中所使用的变量(隐含变量)分为两类:
1. 代表一个程序的名字(例如:“CC”代表了编译器这个可执行程序)。
2. 代表执行这个程序使用的参数(例如:变量“CFLAGS”,多个参数使用空格分开。当然也允许在程序的名字中包含参数。但是这种方式建议不要使用。)
以下是一些作为程序名的隐含变量定义:
代表命令的变量
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文法分析器(针对于C程序)。默认命令是“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
转换Web到Pascal语言的程序。默认是“tangle”。
CTANGLE
转换C Web 到 C。默认是“ctangle”。
RM
删除命令。默认是“rm -f”。
命令参数的变量
下边的是代表命令执行参数的变量。如果没有给出默认值则默认值为空。
ARFLAGS
执行“AR”命令的命令行参数。默认值是“rv”。
ASFLAGS
执行汇编语器“AS”的命令行参数(明确指定“.s”或“.S”文件时)。
CFLAGS
执行“CC”编译器的命令行参数(编译.c源文件的选项)。
COFLAGS执行“co”的命令行参数(在RCS中提取文件的选项)。
CPPFLAGS执行C预处理器“cc -E”的命令行参数(C 和 Fortran 编译器会用到)。
FFLAGSFortran语言编译器“f77”执行的命令行参数(编译Fortran源文件的选项)。
GFLAGS
SCCS “get”程序参数。
LDFLAGS
链接器(如:“ld”)参数。
LFLAGS
Lex文法分析器参数。PFLAGS
Pascal语言编译器参数。RFLAGS
Ratfor 程序的Fortran 编译器参数。YFLAGS
Yacc文法分析器参数