




已阅读5页,还剩5页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
make概述,本讲大纲:,Makefile里有什么?,Makefile的文件名,包含其它makefile文件,变量MAKEFILES,变量MAKEFILE_LIST,其他特殊变量,makefile文件的重建,重载另外一个makefile,make如何解析makefile文件,总结,Makefile里有什么?,Makefile里主要包含了五个东西:显式规则、隐含规则、变量定义、文件指示和注释。(1)显式规则。显式规则说明了如何生成一个或多的的目标文件。这是由Makefile的书写者明显指出,要生成的文件,文件的依赖文件,生成的命令。(2)隐含规则。有一些规则不需要明确说明,make会自动按这些些隐含规则执行,所以隐含的规则可以让我们比较粗糙地简略地书写Makefile。(3)变量的定义。在Makefile中我们要定义一系列的变量,变量一般都是字符串,这个有点你C语言中的宏,当Makefile被执行时,其中的变量都会被扩展到相应的引用位置上。例如:(4)文件指示。其包括了三个部分,一个是在一个Makefile中引用另一个Makefile,就像C语言中的include一样;另一个是指根据某些情况指定Makefile中的有效部分,就像C语言中的预编译#if一样;还有就是定义一个多行的命令。有关这一部分的内容,参见13.2.3。(5)注释。Makefile中只有行注释,和UNIX的Shell脚本一样,其注释是用“#”字符,这个就像C/C+中的“/”一样。如果你要在你的Makefile中使用“#”字符,可以用反斜框进行转义,如:“#”。注意:在Makefile中的命令,必须要以Tab键开始。,Makefile的文件名,默认的情况下,make命令会在当前目录下按顺序找寻文件名为“GNUmakefile”、“makefile”、“Makefile”的文件,找到了解释这个文件。在这三个文件名中,最好使用“Makefile”这个文件名,因为,这个文件名第一个字符为大写,这样有一种显目的感觉。最好不要用“GNUmakefile”,这个文件是GNU的make识别的。有另外一些make只对全小写的“makefile”文件名敏感,但是基本上来说,大多数的make都支持“makefile”和“Makefile”这两种默认文件名。当然,你可以使用别的文件名来书写Makefile,比如:“Make.Linux”,“Make.Solaris”,“Make.AIX”等,如果要指定特定的Makefile,你可以使用make的“-f”和“-file”参数,如:make-fMake.Linux或make-fileMake.AIX。,包含其它makefile文件,本节讨论如何在一个Makefile中包含其它的makefile文件。Makefile中包含其它文件的关键字是“include”,和C语言对头文件的包含方式一致。“include”指示符告诉make暂停读取当前的Makefile,而转去读取“include”指定的一个或者多个文件,完成以后再继续当前Makefile的读取。Makefile中指示符“include”书写在独立的一行,其形式如下:includeFILENAMES.FILENAMES是shell所支持的文件名(可以使用通配符)。,变量MAKEFILES,如果当前环境定义了一个“MAKEFILES”的环境变量,make执行时首先将此变量的值作为需要读入的Makefile文件,多个文件之间使用空格分开。类似使用指示符“include”包含其它Makefile文件一样,如果文件名非绝对路径而且当前目录也不存在此文件,make会在一些默认的目录去寻找。此情况和使用“include”的区别:环境变量指定的makefile文件中的“目标”不会被作为make执行的“终极目标”。就是说,这些文件中所定义规则的目标,make不会将其作为“终极目标”来看待。如果在make的工作目录下没有一个名为“Makefile”、“makefile”或者“GNUmakefile”的文件,make同样会提示“make:*没有规则可以创建目标”calc/subdir.mk”。停止。”;而在make的工作目录下存在这样一个文件(“Makefile”、“makefile”或者“GNUmakefile”),那么make执行时的“终极目标”就是当前目录下这个文件中指定义的“终极目标”。环境变量所定义的文件列表,在执行make时,如果不能找到其中某一个文件(不存在或者无法创建)。make不会提示错误,也不退出。就是说环境变量“MAKEFILES”定义的包含文件是否存在不会导致make错误(这是比较隐蔽的地方)。make在执行时,首先读取的是环境变量“MAKEFILES”所指定的文件列表,之后才是工作目录下的makefile文件,“include”所指定的文件是在make发现此关键字的时、暂停正在读取的文件而转去读取“include”所指定的文件。变量“MAKEFILES”主要用在“make”的递归调用过程中的通信。实际应用中很少设置此变量。一旦设置了此变量,在多层make调用时;由于每一级make都会读取“MAKEFILES”变量所指定的文件,这样可能导致执行的混乱(可能不是你想看到的执行结果)。不过,我们可以使用此环境变量来指定一个定义通用的“隐含规则”和用的变量的文件,比如设置默认搜索路径;通过这种方式设置的“隐含规则”和定义的变量可以被任何make进程使用(有点象C语言中的全局变量)。也有人想让login程序自动的在自己的工作环境中设置此环境变量,编写的Makefile建立在此环境变量的基础上。此想法可以肯定地说不是一个好主意。规劝大家千万不要这么干,否则你所编写的Makefile在其人的工作环境中肯定不能正常工作。因为别人的工作环境中可能没有设置相同的环境变量“MAKEFILES”。推荐的做法实:在需要包含其它makefile文件时使用指示符“include”来实现。,变量MAKEFILE_LIST,make程序在读取多个makefile文件时,包括由环境变量“MAKEFILES”指定、命令行指定、当前工作下的默认的以及使用指示符“include”指定包含的,在对这些文件进行解析执行之前make读取的文件名将会被自动的追加到变量“MAKEFILE_LIST”的定义域中。这样我们就可以通过测试此变量的最后一个字来得知当前make程序正在处理的是具体的那个makefile文件。具体地说就是一个makefile文件中当使用指示符“include”包含另外一个文件之后,变量“MAKEFILE_LIST”的最后一个只可能是指示符“include”指定所要包含的那个文件的名字。如果一个makefile的内容如下:name1:=$(word$(words$(MAKEFILE_LIST),$(MAKEFILE_LIST)includeinc.mkname2:=$(word$(words$(MAKEFILE_LIST),$(MAKEFILE_LIST)all:echoname1=$(name1)echoname2=$(name2)执行make,则看到的将是如下的结果:name1=Makefilename2=inc.mk此例子中涉及到了make的函数的和变量定义的方式,words返回单词个数,word返回列表中的第i个单词,因此整体函数的功能是返回MAKEFILE_LIST中最后一个单词,这些将在13.8节中有详细的讲述。,其他特殊变量,GNUmake支持一个特殊的变量,此变量不能通过任何途经给它赋值。此变量展开以后是一个特定的值。第一个重要的特殊的变量是.VARIABLES”。它被展开以后是此引用点之前、makefile文件中所定义的所有全局变量列表。包括:空变量(未赋值的变量)和make的内嵌变量,但不包含目标指定的变量,目标指定变量值在特定目标的上下文有效。,makefile文件的重建,重载另外一个makefile,有些情况下存在两个比较类似的makefile文件。其中一个(makefile-A)需要使用另外一个文件(makefile-B)中所定义的变量和规则。我们可以在“makefile-A”中使用指示符“include”来包含“mkaefile-B”来达到目的,这种情况下,如果两个makefile文件中存在相同目标,而其描述规则中使用不同的命令。相同目标有两个不同的规则命令,这是makefile所不允许的。遇到这种情况,使用指示符“include”显然是行不通的。GNUmake提供另外一种途径来达到此目的。具体的做法如下:在需要包含的makefile文件(makefile-A)中,我们可以使用一个称之为“所有匹配模式(参考13.8.5模式规则)的规则来描述在“makefile-A”中没有明确定义的目标,make将会在给定的makefile文件中寻找没有在当前Makefile中给出的目标更新规则。看一个例子,如果存在一个命名为“Makefile”的makefile文件,其中描述目标“foo”的规则和其他的一些规则,我们也可以书写一个内容如下命名为“GNUmakefile”的文件。#sampleGNUmakefilefoo:frobnicatefoo%:force$(MAKE)-fMakefile$force:;执行命令“makefoo”,make将使用工作目录下命名为“GNUmakefile”的文件并执行目标“foo”所在的规则,创建它的命令是:“frobnicatefoo”。如果我们执行另外一个命令“makebar”,“GUNmakefile”中没有此目标的更新规则。那么,make将会使用“所有匹配模式”规则,执行命令“$(MAKE)-fMakefilebar”。如果文件“Makefile”中存在此目标更新规则的定义,那么这个规则会被执行。此过程同样适用于其它“GNUmakefile”中没有给出的目标更新规则。此方式的灵活之处在于:如果在“Makefile”文件中存在同样一一个目标“foo”的重建规则,由于make执行时首先读取文件“GUNmakefile”并在其中能够找到目标“foo”的重建规则,所以make就不会去执行这个“所有模式匹配规则”(上例中的目标是“%”的规则)。这样就避免了使用指示符“include”包含一个makefile文件时所带来的目标规则的重复定义问题。此种方式,模式规则的模式只使用了单独的“%”(我们才称他为“所有模式匹配规则”),它可以匹配任何一个目标;它的依赖是“force”,保证了即使目标文件已经存在也会执行这个规则(文件已存在时,需要根据它的依赖文件的修改情况决定是否需要重建这个目标文件);“force”规则中使用空命令是为了防止make程序试图寻找一个规则去创建目标“force”时,又使用了模式规则“%:force”而陷入无限循环。,make如何解析makefile文件,GUNmake的执行过程分为两个阶段。第一阶段:读取所有的makefile文件(包括“MAKIFILES”变量指定的、指示符“include”指定的、以及命令行选项“-f(-file)”指定的makefile文件),内建所有的变量、明确规则和隐含规则,并建立所有目标和依赖之间的依赖关系结构链表。在第二阶段:根据第一阶段已经建立的依赖关系结构链表决定哪些目标需要更新,并使用对应的规则来重建这些目标。理解make执行过程的两个阶段是很重要的。它能帮助我们更深入的了解执行过程中变量以及函数是如何被展开的。变量和函数的展开问题是书写Makefile时容易犯错和引起大家迷惑的地方之一。本节将对这些不同的结构的展开阶段进行简单的总结(明确变量的函数的展开阶段,对正确的使用变量非常有帮助)。首先,明确以下基
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年小学英语能力测试试题及答案
- 2025年粮食安全与农业发展考试试题及答案
- 2025年国家安全法相关知识测试卷及答案
- 2025年公共英语等级考试试卷及答案
- 2025年供应链金融理论与实践考试试题及答案
- 物资管理计划管理制度
- 物资验收安全管理制度
- 特殊员工工时管理制度
- 特殊学生安全管理制度
- 特殊气体存放管理制度
- CDCC婴幼儿智能发育量表
- 了解中医心理学在临床中的应用
- 《人本主义学习理论》课件
- 彩钢板消防安全培训课件
- 2023年洪江市社区工作者招聘考试真题
- 基层领导干部的官德修养(zk-1)课件
- 责任与担当班会课件
- 烟草公司设施安装施工方案
- 解毒药及机理(动物药理学课件)
- 新修订《土地管理法》考试题库及答案
- 小老虎过生日
评论
0/150
提交评论