`
test_angel
  • 浏览: 49980 次
  • 性别: Icon_minigender_2
  • 来自: 西安
社区版块
存档分类
最新评论

Makefile学习(8)

 
阅读更多

上周引入了隐含规则,这周继续学习学习一些理论哈!

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
文法分析器参数。
 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics