Makefile学习(八)
上周引入了隐含规则,这周继续学习学习一些理论哈!
make的每一条隐含规则都会在隐含规则库中出现,并且有顺序,且越靠前的则是越被经常使用的。
1.常见的隐含规则:
- 编译 C 程序的隐含规则。
“<n>;.o”
的目标的依赖目标会自动推导为
“<n>;.c”
,并且其生成命令是
“$(CC) –c $(CPPFLAGS) $(CFLAGS)”
- 编译 C++ 程序的隐含规则。
“<n>;.o”
的目标的依赖目标会自动推导为
“<n>;.cc”
或是
“<n>;.C”
,并且其生成命令是
“$(CXX) –c $(CPPFLAGS) $(CFLAGS)”
。(建议使用
“.cc”
作为
C++
源文件的后缀,而不是
“.C”
)
- 编译 Pascal 程序的隐含规则。
“<n>;.o”
的目标的依赖目标会自动推导为
“<n>;.p”
,并且其生成命令是
“$(PC) –c $(PFLAGS)”
。
- 编译 Fortran/Ratfor 程序的隐含规则。
“<n>;.o”
的目标的依赖目标会自动推导为
“<n>;.r”
或
“<n>;.F”
或
“<n>;.f”
,并且其生成命令是
:
“.f” “$(FC) –c $(FFLAGS)”
“.F” “$(FC) –c $(FFLAGS) $(CPPFLAGS)”
“.f” “$(FC) –c $(FFLAGS) $(RFLAGS)”
- 预处理 Fortran/Ratfor 程序的隐含规则。
“<n>;.f”
的目标的依赖目标会自动推导为
“<n>;.r”
或
“<n>;.F”
。这个规则只是转换
Ratfor
或有预处理的
Fortran
程序到一个标准的
Fortran
程序。其使用的命令是:
“.F” “$(FC) –F $(CPPFLAGS) $(FFLAGS)”
“.r” “$(FC) –F $(FFLAGS) $(RFLAGS)”
- 编译 Modula-2 程序的隐含规则。
“<n>;.sym”
的目标的依赖目标会自动推导为
“<n>;.def”
,并且其生成命令是:
“$(M2C) $(M2FLAGS) $(DEFFLAGS)”
。
“<n.o>;”
的目标的依赖目标会自动推导为
“<n>;.mod”
,并且其生成命令是:
“$(M2C) $(M2FLAGS) $(MODFLAGS)”
。
- 汇编和汇编预处理的隐含规则。
“<n>;.o”
的目标的依赖目标会自动推导为
“<n>;.s”
,默认使用编译品
“as”
,并且其生成命令是:
“$(AS) $(ASFLAGS)”
。
“<n>;.s”
的目标的依赖目标会自动推导为
“<n>;.S”
,默认使用
C
预编译器
“cpp”
,并且其生成命令是:
“$(AS) $(ASFLAGS)”
。
- 链接 Object 文件的隐含规则。
“<n>;”
目标依赖于
“<n>;.o”
,通过运行
C
的编译器来运行链接程序生成(一般是
“ld”
),其生成命令是:
“$(CC) $(LDFLAGS) <n>;.o $(LOADLIBES) $(LDLIBS)”
。这个规则对于只有一个源文件的工程有效,同时也对多个
Object
文件(由不同的源文件生成)的也有效。例如如下规则:
x : y.o z.o
并且
“x.c”
、
“y.c”
和
“z.c”
都存在时,隐含规则将执行如下命令:
cc -c x.c -o x.o
cc -c y.c -o y.o
cc -c z.c -o z.o
cc x.o y.o z.o -o x
rm -f x.o
rm -f y.o
rm -f z.o
如果没有一个源文件(如上例中的
x.c
)和你的目标名字(如上例中的
x
)相关联,那么,你最好写出自己的生成规则,不然,隐含规则会报错的。
- Yacc C 程序时的隐含规则。
“<n>;.c”
的依赖文件被自动推导为
“n.y”
(
Yacc
生成的文件),其生成命令是:
“$(YACC) $(YFALGS)”
。(
“Yacc”
是一个语法分析器,关于其细节请查看相关资料)
- Lex C 程序时的隐含规则。
“<n>;.c”
的依赖文件被自动推导为
“n.l”
(
Lex
生成的文件),其生成命令是:
“$(LEX) $(LFALGS)”
。(关于
“Lex”
的细节请查看相关资料)
- Lex Ratfor 程序时的隐含规则。
“<n>;.r”
的依赖文件被自动推导为
“n.l”
(
Lex
生成的文件),其生成命令是:
“$(LEX) $(LFALGS)”
。
- 从 C 程序、 Yacc 文件或 Lex 文件创建 Lint 库的隐含规则。
“<n>;.ln” ( lint 生成的文件)的依赖文件被自动推导为 “n.c” ,其生成命令是: “$(LINT) $(LINTFALGS) $(CPPFLAGS) -i” 。对于 “<n>;.y” 和 “<n>;.l” 也是同样的规则。
2.
隐含规则使用的变量
在隐含规则中的命令中,基本上都是使用了一些预先设置的变量。
我们可以把隐含规则中使用的变量分成两种:
- 一种是命令相关的,如 “CC” ;
- 一种是参数相的关,如 “CFLAGS” 。
下面是所有隐含规则中会用到的变量:
-
关于命令的变量。
AR
函数库打包程序。默认命令是
“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
或
Ratfor
)。默认命令是
“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
汇编语言编译器参数。(当明显地调用
“.s”
或
“.S”
文件时)。
CFLAGS
C
语言编译器参数。
CXXFLAGS
C++
语言编译器参数。
COFLAGS
RCS
命令参数。
CPPFLAGS
C
预处理器参数。(
C
和
Fortran
编译器也会用到)。
FFLAGS
Fortran
语言编译器参数。
GFLAGS
SCCS “get”
程序参数。
LDFLAGS
链接器参数。(如:
“ld”
)
LFLAGS
Lex
文法分析器参数。
PFLAGS
Pascal
语言编译器参数。
RFLAGS
Ratfor
程序的
Fortran
编译器参数。
YFLAGS
Yacc
文法分析器参数。