隐含规则一览
这里我们将讲述所有预先设置(也就是make内建)的隐含规则,如果我们不明确地写下规则,那么,make就会在这些规则中寻找所需要规则和命令。当然,我们也可以使用make的参数 -r
或 —no-builtin-rules
选项来取消所有的预设置的隐含规则。
当然,即使是我们指定了 -r
参数,某些隐含规则还是会生效,因为有许多的隐含规则都是使用了“后缀规则”来定义的,所以,只要隐含规则中有 “后缀列表”(也就一系统定义在目标 .SUFFIXES
的依赖目标),那么隐含规则就会生效。默认的后缀列表是:.out, .a, .ln, .o, .c, .cc, .C, .p, .f, .F, .r, .y, .l, .s, .S, .mod, .sym,.def, .h, .info, .dvi, .tex, .texinfo, .texi, .txinfo, .w, .ch .web, .sh, .elc, .el。具体的细节,我们会在后面讲述。
还是先来看一看常用的隐含规则吧。
- 编译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
也是同样的规则。