读书人

Makefile学习(八)

发布时间: 2012-06-26 10:04:13 作者: rapoo

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

读书人网 >移动开发

热点推荐