• 隐含规则一览

    隐含规则一览

    这里我们将讲述所有预先设置(也就是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 也是同样的规则。