隐含规则一览

这里我们将讲述所有预先设置(也就是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文件(由不同的源文件生成)的也有效。例如如下规则:

  1. x : y.o z.o

并且 x.cy.cz.c 都存在时,隐含规则将执行如下命令:

  1. cc -c x.c -o x.o
  2. cc -c y.c -o y.o
  3. cc -c z.c -o z.o
  4. cc x.o y.o z.o -o x
  5. rm -f x.o
  6. rm -f y.o
  7. 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 也是同样的规则。