您好,欢迎访问三七文档
当前位置:首页 > 建筑/环境 > 工程监理 > 整理后的makefile中文手册
1GNUmake中文手册ver-3.8翻译整理:徐海兵2004-09-112关于本书本文瑾献给所有热爱Linux的程序员!本中文文档版权所有。本文比较完整的讲述GNUmake工具,涵盖GNUmake的用法、语法。同时重点讨论如何为一个工程编写Makefile。作为一个Linux程序员,make工具的使用以及编写Makefile是必需的。系统、详细讲述make的中文资料比较少,出于对广大中文Linuxer的支持,本人在工作之余,花了18个多月时间完成对“infomake”的翻译整理,完成这个中文版手册。本书不是一个纯粹的语言翻译版本,其中对GNUmake的一些语法和用法根据我个人的工作经验进行了一些详细分析和说明,也加入了一些个人的观点和实践总结。本书的所有的例子都可以在支持V3.8版本的GNUmake的系统中正确执行。由于个人水平限制,本文在一些地方存在描述不准确之处。恳请大家在阅读过程中,提出您宝贵的意见,也是对我个人的帮助。我的个人电子邮箱地址:xhbdahai@126.com。非常愿意和大家交流!共同学习。阅读本书之前,读者应该对GNU的工具链和Linux的一些常用编程工具有一定的了解。诸如:gcc、as、ar、ld、yacc等;同时在书写Makefile时,需要能够进行一些基本的shell编程。这些工具是维护一个工程的基础。如果大家对这些工具的用法不是很熟悉,可参考项目资料。阅读本文的几点建议:1.如果之前你对GNUmake没有了解、当前也不想深入的学习GNUmake的读者。可只阅读本文各章节前半部分的内容(作为各章节的基础知识)。2.如果你已经对GNUmake比较熟悉,你更需要关心此版本的新增特点、功能、和之前版本不兼容之处;也可以作为开发过程过程的参考手册。3.之前你对GNUmake没有概念、或者刚开始接触,本身又想成为一个Linux下的专业程序员,那么建议:完整学习本文的各个章节,包括了基础知识和高级用法、技巧。它会为你在Linux下的工程开发、工程管理提供非常有用的帮助。4.此中文文档当前版本v1.5,本文的所有勘误和最新版本可在主页上获取!!3目录第一章:概述1.1概述1.2准备知识第二章:GNUmake介绍2.1Makefile简介2.2Makefile规则介绍2.3简单的示例2.4make如何工作2.5指定变量2.6自动推导规则2.7另类风格的makefile2.8清除工作目录过程文件第三章:Makefile总述3.1Makefile的内容3.2makefile文件的命名3.3包含其它makefile文件3.4变量MAKEFILES3.5变量MAKEFILE_LIST3.6其他特殊变量3.7makefile文件的重建3.8重载另外一个makefile3.9make如何解析makefile文件3.9.1变量取值3.9.2条件语句3.9.3规则的定义3.10总结第四章:Makefile的规则4.1一个例子4.2规则语法4.3依赖的类型4.4文件名使用通配符4.4.1统配符使用举例4.4.2通配符存在的缺陷4.4.3函数wildcard4.5目录搜寻4.5.1一般搜索(变量VPATH)4.5.2选择性搜索(关键字vpath)4.5.3目录搜索的机制4.5.4命令行和搜索目录4.5.5隐含规则和搜索目录4.5.6库文件和搜索目录44.6Makefile伪目标4.7强制目标(没有命令或依赖的规则)4.8空目标文件4.9Makefile的特殊目标4.10多目标4.11多规则目标4.12静态模式4.12.1静态模式规则的语法4.12.2静态模式和隐含规则4.13双冒号规则4.14自动产生依赖第五章:规则的命令5.1命令回显5.2命令的执行5.3并发执行命令5.4命令执行的错误5.5中断make的执行5.6make的递归执行5.6.1变量MAKE5.6.2变量和递归5.6.3命令行选项和递归5.6.4-w选项5.7定义命令包5.8空命令第六章:Makefile中的变量6.1变量的引用6.2两种变量定义(赋值)6.2.1递归展开式变量6.2.2直接展开式变量6.2.3如何定义一个空格6.2.4“?=”操作符6.3变量的高级用法6.3.1变量的替换引用6.3.2变量的套嵌引用6.4变量取值6.5如何设置变量6.6追加变量值6.7override指示符6.8多行定义6.9系统环境变量6.10目标指定变量6.11模式指定变量5第七章:Makefile的条件执行7.1一个例子7.2条件判断的基本语法7.2.1关键字“ifeq”7.2.2关键字“ifneq”7.2.3关键字“ifdef”7.2.4关键字“ifndef”7.3标记测试的条件语句第八章:make的内嵌函数8.1函数的调用语法8.2文本处理函数8.2.1$(substFROM,TO,TEXT)8.2.2$(patsubstPATTERN,REPLACEMENT,TEXT)8.2.3$(stripSTRINT)8.2.4$(findstringFIND,IN)8.2.5$(filterPATTERN…,TEXT)8.2.6$(filter-outPATTERN...,TEXT)8.2.7$(sortLIST)8.2.8$(wordN,TEXT)8.2.9$(wordlistS,E,TEXT)8.2.10$(wordsTEXT)8.2.11$(firstwordNAMES…)8.3文件名处理函数8.3.1$(dirNAMES…)8.3.2$(notdirNAMES…)8.3.3$(suffixNAMES…)8.3.4$(basenameNAMES…)8.3.5$(addsuffixSUFFIX,NAMES…)8.3.6$(addprefixPREFIX,NAMES…)8.3.7$(joinLIST1,LIST2)8.3.8$(wildcardPATTERN)8.4foreach函数8.5if函数8.6call函数8.7value函数8.8eval函数8.9origin函数8.10shell函数8.11make的控制函数8.11.1$(errorTEXT…)8.11.2$(warningTEXT…)第九章:执行make9.1指定makefile文件69.2指定终极目标9.3替代命令的执行9.4防止特定文件重建9.5替换变量定义9.6使用make进行编译测试9.7make的命令行选项第十章:make的隐含规则10.1隐含规则的使用10.2make的隐含规则一览10.3隐含变量10.3.1代表命令的变量10.3.2命令参数的变量10.4make隐含规则链10.5模式规则10.5.1模式规则介绍10.5.2模式规则示例10.5.3自动化变量10.5.4模式的匹配10.5.5万用规则10.5.6重建内嵌隐含规则10.6缺省规则10.7后缀规则10.8隐含规则搜索算法第十一章:使用make更新静态库文件11.1库成员作为目标11.2静态库的更新11.2.1更新静态库的符号索引表11.3make静态库的注意事项11.4静态库的后缀规则第十二章:GNUmake的特点12.1源自Systemv的特点12.2源自其他版本的特点12.3GNUmake自身的特点第十三章和其它版本的兼容第十四章Makefile的约定14.1基本的约定14.2规则命令行的约定14.3代表命令变量14.4安装目录变量14.5Makefile的标准目标名14.6安装命令分类第十五章make的常见错误信息7附录:关键字索引1.GNUmake可识别的指示符2.GNUmake函数3.GNUmake的自动化变量4.GNUmake环境变量后序下一章8第一章:概述1.1make概述Linux环境下的程序员如果不会使用GNUmake来构建和管理自己的工程,应该不能算是一个合格的专业程序员,至少不能称得上是Unix程序员。在Linux(unix)环境下使用GNU的make工具能够比较容易的构建一个属于你自己的工程,整个工程的编译只需要一个命令就可以完成编译、连接以至于最后的执行。不过这需要我们投入一些时间去完成一个或者多个称之为Makefile文件的编写。此文件正是make正常工作的基础。所要完成的Makefile文件描述了整个工程的编译、连接等规则。其中包括:工程中的哪些源文件需要编译以及如何编译、需要创建那些库文件以及如何创建这些库文件、如何最后产生我们想要得可执行文件。尽管看起来可能是很复杂的事情,但是为工程编写Makefile的好处是能够使用一行命令来完成“自动化编译”,一旦提供一个(通常对于一个工程来说会是多个)正确的Makefile。编译整个工程你所要做的唯一的一件事就是在shell提示符下输入make命令。整个工程完全自动编译,极大提高了效率。make是一个命令工具,它解释Makefile中的指令(应该说是规则)。在Makefile文件中描述了整个工程所有文件的编译顺序、编译规则。Makefile有自己的书写格式、关键字、函数。像C语言有自己的格式、关键字和函数一样。而且在Makefile中可以使用系统shell所提供的任何命令来完成想要的工作。Makefile(在其它的系统上可能是另外的文件名)在绝大多数的IDE开发环境中都在使用,已经成为一种工程的编译方法。目前,系统完整的介绍make工具和如何编写Makefile的中文文档比较少。我整理这个文档就是希望能使众多的Linux环境下的程序员能够比较容易的掌握和学会使用GNUmake。本文所要介绍的是GNU的make,采用RedHatFC3(包括最新发布的GNULinux系统)所集成的GUNmake工具。本文中所有示例均采用C语言的源程序,因为它是目前最普遍使用的一种语言。当然make工具不仅仅是用来管理C语言工程的,那些编译器只要能够在shell下运行的语言所构建的工程都可以使用make工具来管理。Make工作不仅仅可以用来编译源代码,它也可以完成一些其它的功能。例如,有这样的需求:当我们修改了某个或者某些文件后,需要能够根据修改的文件来自动对相关文件进行重建或者更新。那么应该考虑使用GNUmake工具。GNUmake工具为我们实现这个目的提供了非常有利的支持。工程中根据源文件的修改情况来进行代码的编译正是使用了make的这个特征。make执行时,根据Makefile的规则检查文件的修改情况,决定是否执行定义的动作(那些修改过的文件将会被重新编译)。这是GNUmake的执行依据。1.2准备知识在开始我们关于make的讨论之前,首先需要明确一些基本概念:编译:把高级语言书写的代码转换为机器可识别的机器指令。编译高级语言后生成的指令虽然可被机器识别,但是还不能被执行。编译时,编译器检查高级语言的语法、函数与变量的声明是否正确。只有所有的语法正确、相关变量定义正确编译器就可以编译出9中间目标文件。通常,一个高级语言的源文件都可对应一个目标文件。目标文件在Linux中默认后缀为“.o”(如“foo.c”的目标文件为“foo.o”)。为了和规则的目标文件相区别。本文将编译高级语言后生成的目标文件成为.o文件。链接:将多.o文件,或者.o文件和库文件链接成为可被操作系统执行的可执行程序(Linux环境下,可执行文件的格式为“ELF”格式)。链接器不检查函数所在的源文件,只检查所有.o文件中的定义的符号。将.o文件中使用的函数和其它.o或者库文件中的相关符号进行合并,对所有文件中的符号进行重新安排(重定位),并链接系统相关文件(程序启动文件等)最终生成可执行程序。链接过程使用GNU的“ld”工具。静态库:又称为文档文件(ArchiveFile)。它是多个.o文件的集合。Linux中静态库文件的后缀为“.a”。静态库中的各个成员(.o文件)没有特殊的存在格式,仅仅是一个.o文件的集合。使用“ar”工具维护和管理静态库。共享库:也是多个.o文件的集合,但是这些.o文件时有编译器按照一种特殊的方式生成(Linux中,共享库文件
本文标题:整理后的makefile中文手册
链接地址:https://www.777doc.com/doc-7490215 .html