您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 信息化管理 > 管理工具使用及Makefile文件编写
第5章Make及makefile文件的编写1.概述2.Makefile3.Makefile的规则4.规则的命令5.Makefile中的变量6.执行makeLinux系统下的文件编译•程序的编译和链接源程序(.c)编译(compile)链接(linker)形成目标文件形成可执行程序(1)预编译(2)汇编阶段什么是make?•Make是大型程序维护工具•Make工作时,需要名字为“makefile”的makefile文件。•根据依赖关系自动决定项目的那些部分需要重新编译。•基本原理:如果某个源程序文件被修改,那么依赖这个源程序文件的所有目标文件,都需要重新编译。MakefileRule•Rule的格式为:target…:prerequisites…command……•Target依赖prerequisites的目标•Prerequisites被依赖的源程序,例如c文件或h文件•Command需要执行的命令•当prerequisites任何一个文件的时戳新于target的时戳时,就执行command。makefile规则介绍一个简单的Makefile描述规则组成:TARGET...:PREREQUISITES...tabCOMMAND...--target:规则的目标。--通常是程序中间文件(.o)或者最后可执行文件名--目标也可以是一个make执行的动作的名称,如目标“clean”,这样的目标是“伪目标--prerequisites:规则的依赖。--生成规则目标所需要的文件名列表。通常一个目标依赖于一个或者多个文件。--command:规则的命令行--是make程序所有执行的动作(任意的shell命令或者可在shell下执行的程序)--一个规则可以有多个命令行,每一条命令占一行。注意:每一个命令行必须以[Tab]字符开始makefile文件•在makefile(Makefile)文件中,采用自顶向下到的方法来说明依赖关系network:network.osubrs.o(1)gccnetwork.osubrs.o–onetwork(2)network.o:network.cnetdefs.h(3)gcc–cnetwork.c-onetwork.o(4)subrs.o:subrs.cnetdefs.h(5)gcc–csubrs.c.PHONYcleanclean:rm-r*.o(6)执行make•在makefile(Makefile)文件所在的目录中,执行make命令•语法:make[选项][宏定义][目标文件]Make的工作过程•1.make在当前目录下找名字叫“Makefile”或“makefile”的文件•2.如果找到,它会找文件中的第一个目标文件(target),比如找到“network”这个文件,并把这个文件作为最终的目标文件。•3.如果network文件不存在,或是network所依赖的后面的.o文件的文件修改时间要比network这个文件新,那么,他就会执行后面所定义的命令来生成network这个文件。•4.如果network所依赖的.o文件也存在,那么make会在当前文件中找目标为.o文件的依赖性,如果找到则再根据那一个规则生成.o文件(使用源文件和.h文件)。(这有点像一个堆栈的过程)make时,哪些文件被重新编译•1.所有的源文件没有被编译过,则对各个C源文件进行编译并进行链接,生成最后的可执行程序;•2.每一个在上次执行make之后修改过的C源代码文件在本make时将会被重新编译;•3.头文件在上一次执行make之后被修改。则所有包含此头文件的C源文件在本次执行make时将会被重新编译。关于Makefile文件名•默认的情况下,make命令会在当前目录下按顺序找寻文件名为“GNUmakefile”、“makefile”、“Makefile”的文件,找到了解释这个文件。•也可以使用别的文件名来书写Makefile,这是执行Make命令时,需使用“-f”和“--file”参数。如:make-fMake.Linux或make--fileMake.AIX对“规则”的再认识•在Makefile中“规则”就是描述在什么情况下、如何重建规则的目标文件,•通常规则中包括了目标的依赖关系(目标的依赖文件)和重建目标的命令。•make执行重建目标的命令,来创建或者重建规则的目标(此目标文件也可以是触发这个规则的上一个规则中的依赖文件)。•规则包含了目标和依赖的关系以及更新目标所要求的命令。一个简单的例子1.注释以#开头2.一个较长行可以使用反斜线(\)分解为多行,\后不能有空格3.目标“clean”不是一个文件,它仅仅代表了执行一个动作的标识。Makefile中把那些没有任何依赖只有执行动作的目标称为“伪目标”在执行make时,它所指定的动作不会被执行。除非执行make时明确地指定它作为重建目标。而且目标“clean”没有任何依赖文件,它只有一个目的,就是通过这个目标名来执行它所定义的命令。Makefile中把执行“clean”目标所定义的命令,可在shell下输入:makeclean。使用变量•在上例的Makefile中可是添加这样一行:objects=main.okbd.ocommand.odisplay.oinsert.o\search.ofiles.outils.o•“objects”作为一个变量,它代表所有的.o文件的列表,在需要使用这些.o文件列表的地方使用“$(objects)”来表示它objects=main.okbd.ocommand.odisplay.o\insert.osearch.ofiles.outils.oedit:$(objects)gcc$(objects)-oedit…….…….clean:rmedit$(objects)使用变量的例子exe:main.oio.ogccmain.oio.o-oexemain.o:main.cgcc-g-cmain.c–omain.oio.o:io.cgcc-g-cio.c-oio.oOBJS=main.oio.oexe:$(OBJS)gcc$(OBJS)-oexemain.o:main.cCFLAGS=-ggcc$(CFLAGS)–cmain.c-omain.oio.o:io.cgcc$(CFLAGS)-cio.c-oio.o自动推导规则(隐含规则)•make中,编译.o文件时,make会认为其源程序就是同文件名的.c源文件,因此依赖列表中可以省略.c文件,这是make的隐含规则•书写Makefile时,对于一个.c文件如果使用make的隐含规则,那么它会被自动作为对应.o文件的一个依赖文件(对应是指:文件名除后缀外,其余都相同的两个文件)。因此可以在规则中省略目标的倚赖.c文件。清洗工作目录过程文件clean:rmedit$(objects)一般写为:.PHONY:cleanclean:-rmedit$(objects)两个实现有两点不同:1.通过“.PHONY”特殊目标将“clean”目标声明为伪目标。防止当磁盘上存在一个名为“clean”文件时,“clean”所在规则的命令无法执行。2.在命令行之前使用“-”,意思是忽略命令“rm”的执行错误第7章Make及makefile文件的编写1.概述2.Makefile3.Makefile的规则4.规则的命令5.Makefile中的变量6.执行makeMakefile的内容•在一个完整的Makefile中,包含了5个东东:–显式规则–隐含规则–变量的定义–指示符–注释它描述了在何种情况下如何更新一个或者多个被称为目标的文件。在书写Makefile是需要明确地给出目标文件、目标的依赖文件列表以及更新目标文件所需要的命令。它是make根据此类目标文件的命名(典型的是文件名的后缀)而自动推导出来的规则。make根据目标文件的名字,自动产生目标的依赖文件并使用默认的命令来对目标进行更新。就是使用一个字符串代表一段文本串,当定义了变量以后,Makefile后续在需要使用此文本串的地方,通过引用这个变量来实现对文本串的使用指明在make程序读取makefile文件过程中所要执行的一个动作。包括:1.读取给定文件名的文件。2.决定(通常是根据一个变量的得值)处理或忽略Makefile中的某一特定部分3.定义一个多行变量。Makefile中“#”字符后的内容被作为是注释内容注释行的结尾如果存在反斜线(\),那么下一行也被作为注释行当在Makefile中需要使用字符“#”时,可以使用反斜线加“#”(\#)来实现makefile文件的命名•执行make命令时,默认的情况下,make会在工作目录(执行make的目录)下按照文件名顺序寻找makefile文件读取并执行,查找的文件名顺序为:“GNUmakefile”、“makefile”、“Makefile”。•通常应该使用“makefile”或者“Makefile”作为一个makefile的文件名,“GNUmakefile”不推荐使用,因为以此命名的文件只有“GNUmake”才可以识别。•当makefile文件的命名不是这三个任何一个时,需要通过make的“-f”或者“--file”选项来指定make读取的makefile文件。包含其它的Makefile•includeFILENAMES...•make暂停读取当前的Makefile,转而去读取include下的Makefile,结束后,继续当前的Makefile•书写在独立的一行,不可以tab开头•可使用“-include”来代替“include”,忽略由于包含文件不存在或者无法创建时的错误提示(“-”的意思是告诉make,忽略此操作的错误。make继续执行)MAKEFILES变量•如果当前环境定义了一个“MAKEFILES”的环境变量,make执行时首先将此变量的值作为需要读入的Makefile文件,多个文件之间使用空格分开。类似使用指示符“include”包含其它Makefile文件一样•变量“MAKEFILES”主要用在“make”的递归调用过程中的的通信,实际应用中很少设置此变量。MAKEFILE_LIST变量•make程序在读取多个makefile文件时,在对这些文件进行解析执行之前,将会被自动的追加到变量“MAKEFILE_LIST”的定义域中。make如何解析Makefile•分为两个阶段•第1阶段:读取所有的Makefile文件,内建所有的变量、明确规则和隐含规则,并建立所有目标和依赖之间的依赖关系结构链表。•第2阶段:根据第1阶段建立的目标和依赖之间的依赖关系结构链表决定哪些目标需要更新,并使用响应的规则,对该目标进行更新。•理解make执行过程的两个阶段是很重要的。它能帮助我们更深入的了解执行过程中变量以及函数是如何被展开的。•在make的第1阶段,变量和函数被展开的,称为立即展开,否则为延后展开。第7章Make及makefile文件的编写1.概述2.Makefile3.Makefile的规则4.规则的命令5.Makefile中的变量6.执行makeMakefile规则•Makefile中,规则描述了何种情况下使用什么命令来重建一个特定的文件,此文件被称为规则“目标”(通常规则中的目标只有一个)。•规则所罗列的其他文件称为“目标”的依赖•规则中的命令是用来更新或者创建此规则的目标•终极目标所在的规则,应该是Makefile中的第1个规则,其余规则不分次序。终极目标•终极目标,就是执行make时,没有指明具体目标时,make默认的那个目标。•第1个规则有多个目标时,第1个目标为终极目标,除非以下两种情况–1.目标名以点号”.”隔开,其后没有斜线”/”–2.作为模式规则的目标•“终极目标“是执行make的唯一目的,其所在的规则作为第一个规则。规则的语法•通常规则的语法格式如下:•TARGETS:PREREQUISITES•COMMAND•...•或者是这样:•TARGETS:PREREQUISITES;
本文标题:管理工具使用及Makefile文件编写
链接地址:https://www.777doc.com/doc-677976 .html