GNU Make 使用手册(中译版)
gun make 工具
GUN make 工具...GUN make 工具收藏新一篇: linux 下安装j2sdk1.4.2 | 旧一篇: Linux 组织多文件的项目2.1 基本makefile 结构GNU Make 的主要工作是读进一个文本文件,makefile 。
这个文件里主要是有关哪些文件(‘target’目的文件)是从哪些别的文件(‘dependencies’依靠文件)中产生的,用什么命令来进行这个产生过程。
有了这些信息,make 会检查磁碟上的文件,如果目的文件的时间戳(该文件生成或被改动时的时间)比至少它的一个依靠文件旧的话,make 就执行相应的命令,以便更新目的文件。
(目的文件不一定是最后的可执行档,它可以是任何一个文件。
)makefile 一般被叫做“makefile”或“Makefile”。
当然你可以在make 的命令行指定别的文件名。
如果你不特别指定,它会寻找“makefile”或“Makefile”,因此使用这两个名字是最简单的。
一个makefile 主要含有一系列的规则,如下:: ... (tab)<command> (tab)<command> . . .例如,考虑以下的makefile :=== makefile 开始=== myprog : foo.o bar.o gcc foo.o bar.o -o myprogfoo.o : foo.c foo.h bar.h gcc -c foo.c -o foo.obar.o : bar.c bar.h gcc -c bar.c -o bar.o === makefile 结束===这是一个非常基本的makefile —— make 从最上面开始,把上面第一个目的,‘myprog’,做为它的主要目标(一个它需要保证其总是最新的最终目标)。
GNU make 中文手册
GNU make中文手册ver - 3.8翻译整理:徐海兵2004-09-11目录Table of ContentsGNU make中文手册 (1)ver - 3.8 (1)第一章:概述 (7)1.1概述 (7)1.2准备知识 (8)第二章 GNU make 介绍 (9)2GNU make 介绍 (9)2.1Makefile简介 (10)2.2Makefile规则介绍 (11)2.3简单的示例 (12)2.4make如何工作 (13)2.5指定变量 (15)2.6自动推导规则 (16)2.7另类风格的makefile (17)2.8清除工作目录过程文件 (18)第三章:Makefile 总述 (20)3Makefile总述 (20)3.1Makefile的内容 (20)3.2makefile文件的命名 (21)3.3包含其它makefile文件 (22)3.4变量 MAKEFILES (24)3.5变量 MAKEFILE_LIST (26)3.6其他特殊变量 (26)3.7makefile文件的重建 (27)3.8重载另外一个makefile (28)3.9make如何解析makefile文件 (30)3.9.1变量取值 (30)3.9.2条件语句 (31)3.9.3规则的定义 (31)3.10总结 (31)第四章:Makefile的规则 (33)4Makefile规则 (33)4.1一个例子 (33)4.2规则语法 (34)4.3依赖的类型 (35)4.4文件名使用通配符 (36)4.4.1统配符使用举例 (37)4.4.2通配符存在的缺陷 (38)4.4.3函数wildcard (38)4.5目录搜寻 (39)4.5.1一般搜索(变量VPATH) (39)4.5.2选择性搜索(关键字vpath) (40)4.5.3目录搜索的机制 (41)4.5.4命令行和搜索目录 (44)4.5.5隐含规则和搜索目录 (44)4.5.6库文件和搜索目录 (45)4.7强制目标(没有命令或依赖的规则) (50)4.8空目标文件 (50)4.9Makefile的特殊目标 (51)4.10多目标 (54)4.11多规则目标 (55)4.12静态模式 (56)4.12.1静态模式规则的语法 (56)4.12.2静态模式和隐含规则 (58)4.13双冒号规则 (59)4.14自动产生依赖 (60)第五章:规则的命令 (63)5为规则书写命令 (63)5.1命令回显 (63)5.2命令的执行 (64)5.3并发执行命令 (65)5.4命令执行的错误 (67)5.5中断make的执行 (68)5.6make的递归执行 (69)5.6.1变量MAKE (70)5.6.2变量和递归 (71)5.6.3命令行选项和递归 (75)5.6.4-w选项 (77)5.7定义命令包 (78)5.8空命令 (80)第六章:Makefile中的变量 (81)6使用变量 (81)6.1变量的引用 (82)6.2两种变量定义(赋值) (83)6.2.1递归展开式变量 (83)6.2.2直接展开式变量 (85)6.2.3定义一个空格 (86)6.2.4“?=”操作符 (87)6.3变量的高级用法 (88)6.3.1变量的替换引用 (88)6.3.2变量的套嵌引用 (88)6.4变量取值 (92)6.5如何设置变量 (93)6.6追加变量值 (94)6.7override 指示符 (96)6.8多行定义 (98)6.9系统环境变量 (99)6.10目标指定变量 (101)6.11模式指定变量 (103)第七章:Makefile的条件执行 (104)7Makefile的条件判断 (104)7.1一个例子 (104)7.2条件判断的基本语法 (105)7.3标记测试的条件语句 (108)第八章:make的内嵌函数 (109)8make的函数 (109)8.2文本处理函数 (110)8.2.1$(subst FROM,TO,TEXT) (110)8.2.2$(patsubst PATTERN,REPLACEMENT,TEXT) (110)8.2.3$(strip STRINT) (112)8.2.4$(findstring FIND,IN) (112)8.2.5$(filter PATTERN...,TEXT).. (112)8.2.6$(filter-out PATTERN...,TEXT).. (113)8.2.7$(sort LIST) (113)8.2.8$(word N,TEXT) (114)8.2.9$(wordlist S,E,TEXT) (114)8.2.10$(words TEXT) (114)8.2.11$(firstword NAMES...).. (115)8.3文件名处理函数 (115)8.3.1$(dir NAMES...). (115)8.3.2$(notdir NAMES...).. (116)8.3.3$(suffix NAMES...).. (116)8.3.4$(basename NAMES...) (117)8.3.5$(addsuffix SUFFIX,NAMES...) (117)8.3.6$(addprefix PREFIX,NAMES...) (118)8.3.7$(join LIST1,LIST2) (118)8.3.8$(wildcard PATTERN) (119)8.4foreach 函数 (119)8.5if 函数 (120)8.6call函数 (121)8.7value函数 (123)8.8eval函数 (124)8.9origin函数 (125)8.10shell函数 (127)8.11make的控制函数 (128)8.11.1$(error TEXT...). (128)8.11.2$(warning TEXT...).. (129)第九章:执行make (130)9执行make (130)9.1指定makefile文件 (130)9.2指定终极目标 (131)9.3替代命令的执行 (133)9.4防止特定文件重建 (135)9.5替换变量定义 (136)9.6使用make进行编译测试 (137)9.7T make的命令行选项 (138)第十章:make的隐含规则 (143)10使用隐含规则 (143)10.1隐含规则的使用 (143)10.2make的隐含规则一览 (145)10.3隐含变量 (148)10.3.1代表命令的变量 (149)10.3.2命令参数的变量 (150)10.4make隐含规则链 (151)10.5模式规则 (153)10.5.1模式规则介绍 (153)10.5.2模式规则示例 (155)10.5.3自动化变量 (156)10.5.5万用规则 (160)10.5.6重建内嵌隐含规则 (161)10.6缺省规则 (162)10.7后缀规则 (162)10.8隐含规则搜索算法 (164)第十一章:使用make更新静态库文件 (166)11更新静态库文件 (166)11.1库成员作为目标 (166)11.2静态库的更新 (167)11.2.1更新静态库的符号索引表 (168)11.3make静态库的注意事项 (168)11.4静态库的后缀规则 (169)第十二章: GNU make的特点 (170)12GNU make的一些特点 (170)12.1源自System v的特点 (170)12.2源自其他版本的特点 (171)12.3GNU make自身的特点 (172)第十三章和其它版本的兼容 (174)13不兼容性 (174)第十四章 Makefile的约定 (176)14书写约定 (176)14.1基本的约定 (176)14.2规则命令行的约定 (178)14.3代表命令变量 (179)14.4安装目录变量 (180)14.5Makefile的标准目标名 (185)14.6安装命令分类 (190)第十五章 make的常见错误信息 (193)15make产生的错误信息 (193)附录1:关键字索引 (196)GNU make可识别的指示符: (196)GNU make函数: (197)GNU make的自动化变量 (197)GNU make环境变量 (198)后序 (198)关于本书本文瑾献给所有热爱Linux的程序员!本中文文档版权所有。
makefile 中文手册 第六章 _ Makefile中的变量
第六章:Makefile中的变量在Makefile中,变量是一个名字(像是C语言中的宏),代表一个文本字符串(变量的值)。
在Makefile的目标、依赖、命令中引用变量的地方,变量会被它的值所取代(与C语言中宏引用的方式相同,因此其他版本的make也把变量称之为“宏”)。
在Makefile中变量有以下几个特征:1.Makefile中变量和函数的展开(除规则命令行中的变量和函数以外),是在make读取makefile文件时进行的,这里的变量包括了使用“=”定义和使用指示符“define”定义的。
2.变量可以用来代表一个文件名列表、编译选项列表、程序运行的选项参数列表、搜索源文件的目录列表、编译输出的目录列表和所有我们能够想到的事物。
3.变量名是不包括“:”、“#”、“=”、前置空白和尾空白的任何字符串。
需要注意的是,尽管在GNUmake中没有对变量的命名有其它的限制,但定义一个包含除字母、数字和下划线以外的变量的做法也是不可取的,因为除字母、数字和下划线以外的其它字符可能会在make的后续版本中被赋予特殊含义,并且这样命名的变量对于一些shell来说是不能被作为环境变量来使用的。
4.变量名是大小写敏感的。
变量“foo”、“Foo”和“FOO”指的是三个不同的变量。
Makefile传统做法是变量名是全采用大写的方式。
推荐的做法是在对于内部定义定义的一般变量(例如:目标文件列表objects)使用小写方式,而对于一些参数列表(例如:编译选项CFLAGS)采用大写方式,但这并不是要求的。
但需要强调一点:对于一个工程,所有Makefile中的变量命名应保持一种风格,否则会显得你是一个蹩脚的程序员(就像代码的变量命名风格一样)。
5.另外有一些变量名只包含了一个或者很少的几个特殊的字符(符号)。
称它们为自动化变量。
像“$<”、“$@”、“$?”、“$*”等。
6.1变量的引用当我们定义了一个变量之后,就可以在Makefile的很多地方使用这个变量。
Gnu Make指南
| 返回主页 | 本站地图 | 站内搜索 | 联系信箱 |您目前的位置:首页 > 自由软件 > 技术交流 > 应用编程GNU make 指南蓝森林 2000年8月10日 10:56作 者: 哈少译者按: 本文是一篇介绍 GNU Make 的文章,读完后读者应该基本掌握了make 的用法。
而 make 是所有想在 Unix (当然也包括 Linux )系统上编程的用户必须掌握的工具。
如果你写的程序中没有用到 make ,则说明你写的程序只是个人的练习程序,不具有任何实用的价值。
也许这么说有点 儿偏激,但make 实在是应该用在任何稍具规模的程序中的。
希望本文可以为中国的 Unix编程初学者提供一点儿有用的资料。
中国的 Linux 用户除了学会安装红帽子以外, 实在应该尝试写一些有用的程序。
个人想法,大家参考。
C-Scene 题目 #2多文件项目和 GNU Make 工具作者: 乔治富特 (Goerge Foot)电子邮件: george.foot@Occupation: Student at Merton College, Oxford University, England职业:学生,默尔顿学院,牛津城大学,英格兰IRC匿名: gfoot拒绝承诺:作者对于任何因此而对任何事物造成的所有损害(你所拥有或不拥有的实际的,抽象的,或者虚拟的)。
所有的损坏都是你自己的责任,而与我无关。
所有权: “多文件项目”部分属于作者的财产,版权归乔治富特1997年五月至七月。
其它部分属 CScene 财产,版权 CScene 1997年,保留所有版权。
本 CScene 文章的分发,部分或全部,应依照所有其它 CScene 的文章的条件来处理。
0) 介绍~~~~~~~~~~~~~~~本文将首先介绍为什么要将你的C源代码分离成几个合理的独立档案,什么时候需要分,怎么才能分的好。
然后将会告诉你 GNU Make 怎样使你的编译和连接步骤自动化。
GNU C编译器 中文手册
GCC 中文手册GCCSection: GNU Tools (1)Updated: 2003/12/05Index Return to Main ContentsNAMEgcc,g++-GNU工程的C和C++编译器(egcs-1.1.2)总览(SYNOPSIS)gcc[option|filename ]...g++[option|filename ]...警告(WARNING)本手册页内容摘自GNU C编译器的完整文档,仅限于解释选项的含义.除非有人自愿维护,否则本手册页不再更新.如果发现手册页和软件之间有所矛盾,请查对Info文件, Info文件是权威文档.如果我们发觉本手册页的内容由于过时而导致明显的混乱和抱怨时,我们就停止发布它.不可能有其他选择,象更新Info文件同时更新man手册,因为其他维护GNU CC的工作没有留给我们时间做这个. GNU 工程认为man手册是过时产物,应该把时间用到别的地方.如果需要完整和最新的文档,请查阅Info文件`gcc’或Using and Porting GNU CC (for version 2.0) (使用和移植GNU CC 2.0) 手册.二者均来自Texinfo原文件 gcc.texinfo.描述(DESCRIPTION)C和C++编译器是集成的.他们都要用四个步骤中的一个或多个处理输入文件: 预处理(preprocessing),编译(compilation),汇编(assembly)和连接(linking).源文件后缀名标识源文件的语言,但是对编译器来说,后缀名控制着缺省设定:gcc认为预处理后的文件(.i)是C文件,并且设定C形式的连接.g++认为预处理后的文件(.i)是C++文件,并且设定C++形式的连接.源文件后缀名指出语言种类以及后期的操作:.c C源程序;预处理,编译,汇编.C C++源程序;预处理,编译,汇编.cc C++源程序;预处理,编译,汇编.cxx C++源程序;预处理,编译,汇编.m Objective-C源程序;预处理,编译,汇编.i 预处理后的C文件;编译,汇编.ii 预处理后的C++文件;编译,汇编.s 汇编语言源程序;汇编.S 汇编语言源程序;预处理,汇编.h 预处理器文件;通常不出现在命令行上其他后缀名的文件被传递给连接器(linker).通常包括:.o 目标文件(Object file).a 归档库文件(Archive file)除非使用了-c, -S,或-E选项(或者编译错误阻止了完整的过程),否则连接总是最后的步骤.在连接阶段中,所有对应于源程序的.o文件, -l库文件,无法识别的文件名(包括指定的 .o目标文件和.a库文件)按命令行中的顺序传递给连接器.选项(OPTIONS)选项必须分立给出: `-dr’完全不同于`-d -r ’.大多数`-f’和`-W’选项有两个相反的格式: -fname和 -fno-name (或-Wname和-Wno-name).这里只列举不是默认选项的格式.下面是所有选项的摘要,按类型分组,解释放在后面的章节中.总体选项(Overall Option)-c -S -E -o file -pipe -v -x language语言选项(Language Option)-ansi -fall-virtual -fcond-mismatch -fdollars-in-identifiers -fenum-int-equiv -fexternal-templates -fno-asm -fno-builtin -fhosted -fno-hosted -ffreestanding -fno-freestanding -fno-strict-prototype -fsigned-bitfields -fsigned-char -fthis-is-variable -funsigned-bitfields -funsigned-char -fwritable-strings -traditional -traditional-cpp -trigraphs警告选项(Warning Option)-fsyntax-only -pedantic -pedantic-errors -w -W -Wall -Waggregate-return -Wcast-align -Wcast-qual -Wchar-subscript -Wcomment -Wconversion -Wenum-clash -Werror -Wformat -Wid-clash-len -Wimplicit -Wimplicit-int -Wimplicit-function-declaration -Winline -Wlong-long -Wmain -Wmissing-prototypes -Wmissing-declarations -Wnested-externs -Wno-import -Wparentheses -Wpointer-arith -Wredundant-decls -Wreturn-type -Wshadow -Wstrict-prototypes -Wswitch -Wtemplate-debugging -Wtraditional -Wtrigraphs -Wuninitialized -Wunused -Wwrite-strings调试选项(Debugging Option)-a -dletters -fpretend-float -g -glevel -gcoff -gxcoff -gxcoff+ -gdwarf -gdwarf+ -gstabs -gstabs+ -ggdb -p -pg -save-temps -print-file-name=library -print-libgcc-file-name -print-prog-name=program优化选项(Optimization Option)-fcaller-saves -fcse-follow-jumps -fcse-skip-blocks -fdelayed-branch -felide-constructors -fexpensive-optimizations -ffast-math -ffloat-store -fforce-addr -fforce-mem -finline-functions -fkeep-inline-functions -fmemoize-lookups -fno-default-inline -fno-defer-pop -fno-function-cse -fno-inline -fno-peephole -fomit-frame-pointer -frerun-cse-after-loop -fschedule-insns -fschedule-insns2 -fstrength-reduce -fthread-jumps -funroll-all-loops -funroll-loops -O -O2 -O3预处理器选项(Preprocessor Option)-Aassertion -C -dD -dM -dN -Dmacro[=defn] -E -H -idirafter dir -include file -imacros file -iprefix file -iwithprefix dir -M -MD -MM -MMD -nostdinc -P -Umacro -undef汇编器选项(Assembler Option)-Wa,option连接器选项(Linker Option)-llibrary -nostartfiles -nostdlib -static -shared -symbolic -Xlinker option -Wl,option -u symbol目录选项(Directory Option)-Bprefix -Idir -I- -Ldir目标机选项(Target Option)-b machine -V version配置相关选项(Configuration Dependent Option)M680x0 选项-m68000 -m68020 -m68020-40 -m68030 -m68040 -m68881 -mbitfield -mc68000 -mc68020 -mfpa -mnobitfield -mrtd -mshort -msoft-floatVAX选项-mg -mgnu -munixSPARC选项-mepilogue -mfpu -mhard-float -mno-fpu -mno-epilogue -msoft-float -msparclite -mv8 -msupersparc -mcypressConvex选项-margcount -mc1 -mc2 -mnoargcountAMD29K选项-m29000 -m29050 -mbw -mdw -mkernel-registers -mlarge -mnbw -mnodw -msmall -mstack-check -muser-registersM88K选项-m88000 -m88100 -m88110 -mbig-pic -mcheck-zero-division -mhandle-large-shift -midentify-revision -mno-check-zero-division -mno-ocs-debug-info -mno-ocs-frame-position -mno-optimize-arg-area -mno-serialize-volatile -mno-underscores -mocs-debug-info -mocs-frame-position -moptimize-arg-area -mserialize-volatile -mshort-data-num -msvr3 -msvr4 -mtrap-large-shift -muse-div-instruction -mversion-03.00 -mwarn-passed-structsRS6000选项-mfp-in-toc -mno-fop-in-tocRT选项-mcall-lib-mul -mfp-arg-in-fpregs -mfp-arg-in-gregs -mfull-fp-blocks -mhc-struct-return -min-line-mul -mminimum-fp-blocks -mnohc-struct-returnMIPS选项-mcpu=cpu type -mips2 -mips3 -mint64 -mlong64 -mmips-as -mgas -mrnames -mno-rnames -mgpopt -mno-gpopt -mstats -mno-stats -mmemcpy -mno-memcpy -mno-mips-tfile -mmips-tfile -msoft-float -mhard-float -mabicalls -mno-abicalls -mhalf-pic -mno-half-pic -G num -nocppi386选项-m486 -mno-486 -msoft-float -mno-fp-ret-in-387HPPA选项-mpa-risc-1-0 -mpa-risc-1-1 -mkernel -mshared-libs -mno-shared-libs -mlong-calls -mdisable-fpregs -mdisable-indexing -mtrailing-coloni960选项-mcpu-type -mnumerics -msoft-float -mleaf-procedures -mno-leaf-procedures -mtail-call -mno-tail-call -mcomplex-addr -mno-complex-addr -mcode-align -mno-code-align -mic-compat -mic2.0-compat -mic3.0-compat -masm-compat -mintel-asm -mstrict-align -mno-strict-align -mold-align -mno-old-align DEC Alpha选项-mfp-regs -mno-fp-regs -mno-soft-float -msoft-floatSystem V选项-G -Qy -Qn -YP,paths -Ym,dir代码生成选项(Code Generation Option)-fcall-saved-reg -fcall-used-reg -ffixed-reg -finhibit-size-directive -fnonnull-objects -fno-common -fno-ident -fno-gnu-linker -fpcc-struct-return -fpic -fPIC -freg-struct-return -fshared-data -fshort-enums -fshort-double -fvolatile -fvolatile-global -fverbose-asm总体选项(Overall Option)-x language明确指出后面输入文件的语言为language (而不是从文件名后缀得到的默认选择).这个选项应用于后面所有的输入文件,直到遇着下一个`-x’选项. language的可选值有`c’, `objective-c’, `c-header’, `c++’, `cpp-output’, `assembler’,和`assembler-with-cpp’.-x none关闭任何对语种的明确说明,因此依据文件名后缀处理后面的文件(就象是从未使用过`-x’选项).如果只操作四个阶段(预处理,编译,汇编,连接)中的一部分,可以使用`-x’选项(或文件名后缀)告诉 gcc从哪里开始,用`-c’, `-S’,或`-E’选项告诉gcc到哪里结束.注意,某些选项组合(例如, `-x cpp-output -E’)使gcc不作任何事情.-c编译或汇编源文件,但是不作连接.编译器输出对应于源文件的目标文件.缺省情况下, GCC通过用`.o’替换源文件名后缀`.c’, `.i’, `.s’,等等,产生目标文件名.可以使用-o选项选择其他名字.GCC忽略-c选项后面任何无法识别的输入文件(他们不需要编译或汇编).-S编译后即停止,不进行汇编.对于每个输入的非汇编语言文件,输出文件是汇编语言文件.缺省情况下, GCC通过用`.o’替换源文件名后缀`.c’, `.i’,等等,产生目标文件名.可以使用-o选项选择其他名字.GCC忽略任何不需要编译的输入文件.-E预处理后即停止,不进行编译.预处理后的代码送往标准输出.GCC忽略任何不需要预处理的输入文件.-o file指定输出文件为file.该选项不在乎GCC产生什么输出,无论是可执行文件,目标文件,汇编文件还是预处理后的C代码.由于只能指定一个输出文件,因此编译多个输入文件时,使用`-o’选项没有意义,除非输出一个可执行文件.如果没有使用`-o’选项,默认的输出结果是:可执行文件为`a.out’, `source.suffix ’的目标文件是`source.o’,汇编文件是 `source.s’,而预处理后的C源代码送往标准输出.-v(在标准错误)显示执行编译阶段的命令.同时显示编译器驱动程序,预处理器,编译器的版本号.-pipe在编译过程的不同阶段间使用管道而非临时文件进行通信.这个选项在某些系统上无法工作,因为那些系统的汇编器不能从管道读取数据. GNU的汇编器没有这个问题.语言选项(LANGUAGE OPTIONS)下列选项控制编译器能够接受的C "方言":-ansi支持符合ANSI标准的C程序.这样就会关闭GNU C中某些不兼容ANSI C的特性,例如asm, inline和 typeof关键字,以及诸如unix和vax这些表明当前系统类型的预定义宏.同时开启不受欢迎和极少使用的ANSI trigraph特性,以及禁止`$’成为标识符的一部分.尽管使用了`-ansi’选项,下面这些可选的关键字, __asm__, __extension__, __inline__和__typeof__仍然有效.你当然不会把他们用在ANSI C程序中,但可以把他们放在头文件里,因为编译包含这些头文件的程序时,可能会指定 `-ansi’选项.另外一些预定义宏,如__unix__和__vax__,无论有没有使用 `-ansi’选项,始终有效.使用`-ansi’选项不会自动拒绝编译非ANSI程序,除非增加`-pedantic’选项作为 `-ansi’选项的补充.使用`-ansi’选项的时候,预处理器会预定义一个__STRICT_ANSI__宏.有些头文件关注此宏,以避免声明某些函数,或者避免定义某些宏,这些函数和宏不被ANSI标准调用;这样就不会干扰在其他地方使用这些名字的程序了.-fno-asm不把asm, inline或typeof当作关键字,因此这些词可以用做标识符.用 __asm__, __inline__和__typeof__能够替代他们. `-ansi’ 隐含声明了`-fno-asm’.-fno-builtin不接受不是两个下划线开头的内建函数(built-in function).目前受影响的函数有_exit, abort, abs, alloca, cos, exit, fabs, labs, memcmp, memcpy, sin, sqrt, strcmp, strcpy,和strlen. `-ansi’选项能够阻止alloca和_exit成为内建函数.-fhosted按宿主环境编译;他隐含声明了`-fbuiltin’选项,而且警告不正确的main函数声明.-ffreestanding按独立环境编译;他隐含声明了`-fno-builtin’选项,而且对main函数没有特别要求.(译注:宿主环境(hosted environment)下所有的标准库可用, main函数返回一个int值,典型例子是除了内核以外几乎所有的程序.对应的独立环境(freestanding environment)不存在标准库,程序入口也不一定是 main,最明显的例子就是操作系统内核.详情参考gcc网站最近的资料)-fno-strict-prototype对于没有参数的函数声明,例如`int foo ();’,按C风格处理---即不说明参数个数或类型. (仅针对C++).正常情况下,这样的函数foo在C++中意味着参数为空.-trigraphs支持ANSI C trigraphs. `-ansi’选项隐含声明了`-trigraphs’.-traditional试图支持传统C编译器的某些方面.详见GNU C手册,我们已经把细节清单从这里删除,这样当内容过时后,人们也不会埋怨我们.除了一件事:对于C++程序(不是C), `-traditional’选项带来一个附加效应,允许对 this赋值.他和`-fthis-is-variable’选项的效果一样.-traditional-cpp试图支持传统C预处理器的某些方面.特别是上面提到有关预处理器的内容,但是不包括 `-traditional’选项的其他效应.-fdollars-in-identifiers允许在标识符(identifier)中使用`$’字符(仅针对C++).你可以指定 `-fno-dollars-in-identifiers’选项显明禁止使用`$’符. (GNU C++在某些目标系统缺省允许`$’符,但不是所有系统.)-fenum-int-equiv允许int类型到枚举类型(enumeration)的隐式转换(仅限于C++).正常情况下GNU C++允许从 enum到int的转换,反之则不行.-fexternal-templates为模板声明(template declaration)产生较小的代码(仅限于C++),方法是对于每个模板函数 (template function),只在定义他们的地方生成一个副本.想要成功使用这个选项,你必须在所有使用模板的文件中,标记`#pragma implementation’ (定义)或`#pragma interface’ (声明).当程序用`-fexternal-templates’编译时,模板实例(template instantiation) 全部是外部类型.你必须让需要的实例在实现文件中出现.可以通过typedef实现这一点,他引用所需的每个实例.相对应的,如果编译时使用缺省选项`-fno-external-templates’,所有模板实例明确的设为内置.-fall-virtual所有可能的成员函数默认为虚函数.所有的成员函数(除了构造子函数和new或delete 成员操作符)视为所在类的虚函数.这不表明每次调用成员函数都将通过内部虚函数表.有些情况下,编译器能够判断出可以直接调用某个虚函数;这时就直接调用.-fcond-mismatch允许条件表达式的第二和第三个参数的类型不匹配.这种表达式的值是void.-fthis-is-variable允许对this赋值(仅对C++).合并用户自定义的自由存储管理机制到C++后,使可赋值的 `this’显得不合时宜.因此,默认情况下,类成员函数内部对this赋值是无效操作.然而为了向后兼容,你可以通过`-fthis-is-variable’选项使这种操作有效.-funsigned-char把char定义为无符号类型,如同unsigned char.各种机器都有自己缺省的char类型.既可能是unsigned char也可能是signed char .理想情况下,当依赖于数据的符号性时,一个可移植程序总是应该使用signed char或unsigned char.但是许多程序已经写成只用简单的char,并且期待这是有符号数(或者无符号数,具体情况取决于编写程序的目标机器).这个选项,和它的反义选项,使那样的程序工作在对应的默认值上.char的类型始终应该明确定义为signed char或unsigned char,即使它表现的和其中之一完全一样.-fsigned-char把char定义为有符号类型,如同signed char.这个选项等同于`-fno-unsigned-char’,他是the negative form of `-funsigned-char’的相反选项.同样, `-fno-signed-char’等价于 `-funsigned-char’.-fsigned-bitfields-funsigned-bitfields-fno-signed-bitfields-fno-unsigned-bitfields如果没有明确声明`signed’或`unsigned’修饰符,这些选项用来定义有符号位域 (bitfield)或无符号位域.缺省情况下,位域是有符号的,因为他们继承的基本整数类型,如int,是有符号数.然而,如果指定了`-traditional’选项,位域永远是无符号数.-fwritable-strings把字符串常量存储到可写数据段,而且不做特别对待.这是为了兼容一些老程序,他们假设字符串常量是可写的. `-traditional’选项也有相同效果.篡改字符串常量是一个非常糟糕的想法; ``常量’’就应该是常量.预处理器选项(Preprocessor Option)下列选项针对C预处理器,预处理器用在正式编译以前,对C 源文件进行某种处理.如果指定了`-E’选项, GCC只进行预处理工作.下面的某些选项必须和`-E’选项一起才有意义,因为他们的输出结果不能用于编译.-include file在处理常规输入文件之前,首先处理文件file,其结果是,文件file的内容先得到编译. 命令行上任何`-D’和`-U’选项永远在`-include file’之前处理, 无论他们在命令行上的顺序如何.然而`-include’和`-imacros’选项按书写顺序处理.-imacros file在处理常规输入文件之前,首先处理文件file,但是忽略输出结果.由于丢弃了文件file的输出内容, `-imacros file’选项的唯一效果就是使文件file中的宏定义生效, 可以用于其他输入文件.在处理`-imacrosfile’选项之前,预处理器首先处理`-D’ 和`-U’选项,并不在乎他们在命令行上的顺序.然而`-include’和 `-imacros’选项按书写顺序处理.-idirafter dir把目录dir添加到第二包含路径中.如果某个头文件在主包含路径(用`-I’添加的路径)中没有找到,预处理器就搜索第二包含路径.-iprefix prefix指定prefix作为后续`-iwithprefix’选项的前缀.-iwithprefix dir把目录添加到第二包含路径中.目录名由prefix和dir合并而成,这里 prefix被先前的`-iprefix’选项指定. -nostdinc不要在标准系统目录中寻找头文件.只搜索`-I’选项指定的目录(以及当前目录,如果合适).结合使用`-nostdinc’和`-I-’选项,你可以把包含文件搜索限制在显式指定的目录.-nostdinc++不要在C++专用标准目录中寻找头文件,但是仍然搜索其他标准目录. (当建立`libg++’时使用这个选项.) -undef不要预定义任何非标准宏. (包括系统结构标志).-E仅运行C预处理器.预处理所有指定的C源文件,结果送往标准输出或指定的输出文件.-C告诉预处理器不要丢弃注释.配合`-E’选项使用.-P告诉预处理器不要产生`#line’命令.配合`-E’选项使用.-M [ -MG ]告诉预处理器输出一个适合make的规则,用于描述各目标文件的依赖关系.对于每个源文件,预处理器输出一个make规则,该规则的目标项(target)是源文件对应的目标文件名,依赖项(dependency)是源文件中 `#include引用的所有文件.生成的规则可以是单行,但如果太长,就用`\’-换行符续成多行.规则显示在标准输出,不产生预处理过的C程序.`-M’隐含了`-E’选项.`-MG’要求把缺失的头文件按存在对待,并且假定他们和源程序文件在同一目录下.必须和 `-M’选项一起用.-MM [ -MG ]和`-M’选项类似,但是输出结果仅涉及用户头文件,象这样`#include file"’.忽略系统头文件如`#include <file>’.-MD和`-M’选项类似,但是把依赖信息输出在文件中,文件名通过把输出文件名末尾的`.o’替换为 `.d’产生.同时继续指定的编译工作---`-MD’不象`-M’那样阻止正常的编译任务.Mach的实用工具`md’能够合并`.d’文件,产生适用于`make’命令的单一的依赖文件.-MMD和`-MD’选项类似,但是输出结果仅涉及用户头文件,忽略系统头文件.-H除了其他普通的操作, GCC显示引用过的头文件名.-Aquestion(answer)如果预处理器做条件测试,如`#if #question(answer)’,该选项可以断言(Assert) question的答案是answer. -A-’关闭一般用于描述目标机的标准断言.-Dmacro定义宏macro,宏的内容定义为字符串`1’.-Dmacro=defn定义宏macro的内容为defn.命令行上所有的`-D’选项在 `-U’选项之前处理.-Umacro取消宏macro. `-U’选项在所有的`-D’选项之后处理,但是优先于任何 `-include’或`-imacros’选项.-dM告诉预处理器输出有效的宏定义列表(预处理结束时仍然有效的宏定义).该选项需结合`-E’选项使用.-dD告诉预处理器把所有的宏定义传递到输出端,按照出现的顺序显示.-dN和`-dD’选项类似,但是忽略宏的参量或内容.只在输出端显示`#define name.汇编器选项(ASSEMBLER OPTION)-Wa,option把选项option传递给汇编器.如果option含有逗号,就在逗号处分割成多个选项.连接器选项(LINKER OPTION)下面的选项用于编译器连接目标文件,输出可执行文件的时候.如果编译器不进行连接,他们就毫无意义.object-file-name如果某些文件没有特别明确的后缀a special recognized suffix, GCC就认为他们是目标文件或库文件. (根据文件内容,连接器能够区分目标文件和库文件).如果GCC执行连接操作,这些目标文件将成为连接器的输入文件.-llibrary连接名为library的库文件.连接器在标准搜索目录中寻找这个库文件,库文件的真正名字是`liblibrary.a’.连接器会当做文件名得到准确说明一样引用这个文件.搜索目录除了一些系统标准目录外,还包括用户以`-L’选项指定的路径.一般说来用这个方法找到的文件是库文件---即由目标文件组成的归档文件(archive file).连接器处理归档文件的方法是:扫描归档文件,寻找某些成员,这些成员的符号目前已被引用,不过还没有被定义.但是,如果连接器找到普通的目标文件,而不是库文件,就把这个目标文件按平常方式连接进来.指定`-l’选项和指定文件名的唯一区别是, `-l选项用`lib’和`.a’把library包裹起来,而且搜索一些目录.-lobjc这个-l选项的特殊形式用于连接Objective C程序.-nostartfiles不连接系统标准启动文件,而标准库文件仍然正常使用.-nostdlib不连接系统标准启动文件和标准库文件.只把指定的文件传递给连接器.-static在支持动态连接(dynamic linking)的系统上,阻止连接共享库.该选项在其他系统上无效.-shared生成一个共享目标文件,他可以和其他目标文件连接产生可执行文件.只有部分系统支持该选项.-symbolic建立共享目标文件的时候,把引用绑定到全局符号上.对所有无法解析的引用作出警告(除非用连接编辑选项 `-Xlinker -z -Xlinker defs’取代).只有部分系统支持该选项.-Xlinker option把选项option传递给连接器.可以用他传递系统特定的连接选项, GNU CC无法识别这些选项.如果需要传递携带参数的选项,你必须使用两次`-Xlinker’,一次传递选项,另一次传递他的参数. 例如,如果传递`-assert definitions’,你必须写成`-Xlinker -assert -Xlinker definitions’,而不能写成`-Xlinker "-assert definitions"’,因为这样会把整个字符串当做一个参数传递,显然这不是连接器期待的.-Wl,option把选项option传递给连接器.如果option中含有逗号,就在逗号处分割成多个选项.-u symbol使连接器认为取消了symbol的符号定义,从而连接库模块以取得定义.你可以使用多个 `-u’选项,各自跟上不同的符号,使得连接器调入附加的库模块.目录选项(DIRECTORY OPTION)下列选项指定搜索路径,用于查找头文件,库文件,或编译器的某些成员:-Idir在头文件的搜索路径列表中添加dir 目录.-I-任何在`-I-’前面用`-I’选项指定的搜索路径只适用于`#include "file"’这种情况;他们不能用来搜索`#include <file>’包含的头文件.如果用`-I’选项指定的搜索路径位于`-I-’选项后面,就可以在这些路径中搜索所有的 `#include’指令. (一般说来-I选项就是这么用的.)还有, `-I-’选项能够阻止当前目录(存放当前输入文件的地方)成为搜索`#include "file"’的第一选择.没有办法克服`-I-’选项的这个效应.你可以指定 `-I.’搜索那个目录,它在调用编译器时是当前目录.这和预处理器的默认行为不完全一样,但是结果通常令人满意.`-I-’不影响使用系统标准目录,因此, `-I-’和`-nostdinc’是不同的选项.-Ldir在`-l’选项的搜索路径列表中添加dir目录.-Bprefix这个选项指出在何处寻找可执行文件,库文件,以及编译器自己的数据文件.编译器驱动程序需要执行某些下面的子程序: `cpp’, `cc1’ (或C++的 `cc1plus’), `as’和`ld’.他把prefix当作欲执行的程序的前缀,既可以包括也可以不包括`machine/version/’.对于要运行的子程序,编译器驱动程序首先试着加上`-B’前缀(如果存在).如果没有找到文件,或没有指定 `-B’选项,编译器接着会试验两个标准前缀`/usr/lib/gcc/’和 `/usr/local/lib/gcc-lib/’.如果仍然没能够找到所需文件,编译器就在`PATH’环境变量指定的路径中寻找没加任何前缀的文件名.如果有需要,运行时(run-time)支持文件`libgcc.a’也在`-B’前缀的搜索范围之内. 如果这里没有找到,就在上面提到的两个标准前缀中寻找,仅此而已.如果上述方法没有找到这个文件,就不连接他了.多数情况的多数机器上, `libgcc.a’并非必不可少.你可以通过环境变量GCC_EXEC_PREFIX获得近似的效果;如果定义了这个变量,其值就和上面说的一样用做前缀.如果同时指定了`-B’选项和GCC_EXEC_PREFIX变量,编译器首先使用 `-B’选项,然后才尝试环境变量值.警告选项(WARNING OPTION)警告是针对程序结构的诊断信息,程序不一定有错误,而是存在风险,或者可能存在错误.下列选项控制GNU CC产生的警告的数量和类型:-fsyntax-only检查程序中的语法错误,但是不产生输出信息.-w禁止所有警告信息.-Wno-import禁止所有关于#import的警告信息.-pedantic打开完全服从ANSI C标准所需的全部警告诊断;拒绝接受采用了被禁止的语法扩展的程序.无论有没有这个选项,符合ANSI C标准的程序应该能够被正确编译(虽然极少数程序需要`-ansi’ 选项).然而,如果没有这个选项,某些GNU扩展和传统C特性也得到支持.使用这个选项可以拒绝这些程序.没有理由使用这个选项,他存在只是为了满足一些书呆子(pedant).对于替选关键字(他们以`__’开始和结束) `-pedantic’不会产生警告信息. Pedantic 也不警告跟在__extension__后面的表达式.不过只应该在系统头文件中使用这种转义措施,应用程序最好避免.-pedantic-errors该选项和`-pedantic’类似,但是显示错误而不是警告.-W对下列事件显示额外的警告信息:*非易变自动变量(nonvolatile automatic variable)可能在调用longjmp时发生改变. 这些警告仅在优化编译时发生.编译器只知道对setjmp的调用,他不可能知道会在哪里调用longjmp,事实上一个信号处理例程可以在程序的任何地点调用他.其结果是,即使程序没有问题,你也可能会得到警告,因为无法在可能出现问题的地方调用longjmp.*既可以返回值,也可以不返回值的函数. (缺少结尾的函数体被看作不返回函数值)例如,下面的函数将导致这种警告:foo (a){if (a > 0)return a;}由于GNU CC不知道某些函数永不返回(含有abort和longjmp),因此有可能出现虚假警告.*表达式语句或逗号表达式的左侧没有产生作用(side effect).如果要防止这种警告,应该把未使用的表达式强制转换为void类型.例如,这样的表达式`x[i,j]’会导致警告,而`x[(void)i,j]’就不会.*无符号数用`>’或`<=’和零做比较.-Wimplicit-int警告没有指定类型的声明.-Wimplicit-function-declaration警告在声明之前就使用的函数.-Wimplicit同-Wimplicit-int和-Wimplicit-function-declaration.-Wmain如果把main函数声明或定义成奇怪的类型,编译器就发出警告.典型情况下,这个函数用于外部连接, 返回int数值,不需要参数,或指定两个参数.-Wreturn-type如果函数定义了返回类型,而默认类型是int型,编译器就发出警告.同时警告那些不带返回值的 return语句,如果他们所属的函数并非void类型.-Wunused如果某个局部变量除了声明就没再使用,或者声明了静态函数但是没有定义,或者某条语句的运算结果显然没有使用, 编译器就发出警告.-Wswitch如果某条switch语句的参数属于枚举类型,但是没有对应的case语句使用枚举元素,编译器就发出警告. ( default语句的出现能够防止这个警告.)超出枚举范围的case语句同样会导致这个警告.-Wcomment如果注释起始序列`/*’出现在注释中,编译器就发出警告.。
GNU Make 中文手册v3.8 学习
∙这个手册翻译整理: 徐海兵, 先表示一些尊敬. “本人在工作之余,花了18个多月时间完成对“info make”的翻译整理,完成这个中文版手册”, 工夫不负有心人.∙链接器将.o文件中使用的函数和其它.o或者库文件中的相关符号进行合并,对所有文件中的符号进行重新安排(重定位),并链接系统相关文件(程序启动文件等)最终生成可执行程序。
∙Linux中,共享库文件格式通常为“ELF”格式。
共享库已经具备了可执行条件。
∙模块中各个成员的地址(变量引用和函数调用)都是相对地址。
使用此共享库的程序在运行时,共享库被动态加载到内存并和主程序在内存中进行连接。
多个可执行程序可共享库文件的代码段(多个程序可以共享的使用库中的某一个模块,共享代码,不共享数据)。
另外共享库的成员对象可被执行(由libdl.so提供支持)。
∙在make读取Makefile以后会建立一个编译过程的描述数据库。
此数据库中记录了所有各个文件之间的相互关系,以及它们的关系描述(要是我能"看"到这个数据库,就能使用程序trace,你知道一个大型的project 的makefile有多复杂)∙当使用make工具进行编译时,工程中以下几种文件在执行make时将会被编译(重新编译):1. 所有的源文件没有被编译过,则对各个C源文件进行编译并进行链接,生成最后的可执行程序;2. 每一个在上次执行make之后修改过的C源代码文件在本次执行make时将会被重新编译;3. 头文件在上一次执行make之后被修改。
则所有包含此头文件的C源文件在本次执行make时将会被重新编译。
(这就是为什么头文件修改后,很多文件都会被重新compile的原因)∙首先书写时,可以将一个较长行使用反斜线(\)来分解为多行,这样可以使我们的Makefile书写清晰、容易阅读理解。
但需要注意:反斜线之后不能有空格(这也是大家最容易犯的错误,错误比较隐蔽)∙编译.c源文件规则的命令可以不用明确给出。
makefile基础教程-GNUmake介绍
第二章:GNU make 介绍make在执行时,需要一个命名为Makefile的文件。
这个文件告诉make以何种方式编译源代码和链接程序。
典型地,可执行文件可由一些.o文件按照一定的顺序生成或者更新。
如果在你的工程中已经存在一个活着多个正确的Makefile。
当对工程中的若干源文件修改以后,需要根据修改来更新可执行文件或者库文件,正如前面提到的你只需要在shell下执行“make”。
make会自动根据修改情况完成源文件的对应.o文件的更新、库文件的更新、最终的可执行程序的更新。
make通过比较对应文件(规则的目标和依赖,)的最后修改时间,来决定哪些文件需要更新、那些文件不需要更新。
对需要更新的文件make就执行数据库中所记录的相应命令(在make读取Makefile以后会建立一个编译过程的描述数据库。
此数据库中记录了所有各个文件之间的相互关系,以及它们的关系描述)来重建它,对于不需要重建的文件make什么也不做。
而且可以通过make的命令行选项来指定需要重新编译的文件。
Problems and Bugs=================If you have problems with GNU `make' or think you've found a bug, please report it to the developers; we cannot promise to do anything but we might well want to fix it.Before reporting a bug, make sure you've actually found a real bug.Carefully reread the documentation and see if it really says you can do what you're trying to do. If it's not clear whether you should be able to do something or not, report that too; it's a bug in the documentation!Before reporting a bug or trying to fix it yourself, try to isolate it to the smallest possible makefile that reproduces the problem. Then send us the makefile and the exact results `make' gave you, including any error or warning messages. Please don't paraphrase these messages: it's best to cut and paste them into your report. When generating this small makefile, be sure to not use any non-free or unusual tools in your commands: you can almost always emulate what such a tool would do with simple shell commands. Finally, be sure to explain what you expected to occur; this will help us decide whether the problem was really in the documentation.Once you have a precise problem you can report it in one of two ways.Either send electronic mail to:bug-make@or use our Web-based project management tool, at:/projects/make/In addition to the information above, please be careful to include the version number of `make' you are using. You can get this information with the command `make --version'. Be sure also to include the type of machine and operating system you are using. One way to obtain this information is by looking at the final lines of output from the command`make --help'.以上时GNU make的bug反馈方式。
GNU-Make-使用手册(中译版)
GNU Make 使用手册(中译版)翻译:于凤昌译者注:本人在阅读Linux源代码过程中发现如果要全面了解Linux的结构、理解Linux的编程总体设计及思想必须首先全部读通Linux源代码中各级的Makefile文件.目前,在网上虽然有一些著作,但都不能全面的解释Linux源代码中各级的Makefile文件,因此本人认真阅读了GNU Make 使用手册(3。
79)版原文,在此基础上翻译了该手册,以满足对Linux源代码有兴趣或者希望采用GCC编写程序但对缺乏GNU Make全面了解之人士的需要。
本人是业余爱好不是专业翻译人士,如果有问题请通过电子信箱与我联系共同商讨,本人的E—mail为:yfc70@public2。
注意在文章中出现的斜体加粗字表示章节。
GNU make Version 3。
79April 2000Richard M。
Stallman and Roland McGrath目录1 make概述1.1 怎样阅读本手册1.2 问题和BUG2 Makefile文件介绍2。
1 规则的格式2。
2一个简单的Makefile文件2.3make处理Makefile文件的过程2。
4使用变量简化Makefile文件2。
5让make推断命令2。
6另一种风格的Makefile文件2。
7在目录中删除文件的规则33编写Makefile文件3.1Makefile文件的内容3.2Makefile文件的命名3。
3包含其它的Makefile文件3。
4变量MAKEFILES3.5Makefile文件重新生成的过程3.6重载其它Makefile文件3。
7make读取Makefile文件的过程4 编写规则4。
1规则的语法4。
2在文件名中使用通配符4。
2.1通配符例子4。
2。
2使用通配符的常见错误4.2.3函数wildcard4.3在目录中搜寻依赖4。
3.1VPATH:所有依赖的搜寻路径4.3.2vpath指令4。
3。
3目录搜寻过程4。
使用GNUmake编辑makefile(精)
现在来看一下make做的工作:首先 make按顺序读取makefile中的规则,然后 检查该规则中的依赖文件与目标文件的时 间戳哪个更新,如果目标文件的时问戳比 依赖文件还早,就按规则中定义的命令更 新目标文件。如果该规则中的依赖文件又 是其他规则中的目标文件,那么依照规则 链不断执行这个过程,直到Makefile文件 的结束,至少可以找到一个不是规则生成 的最终依赖文件,获得此文件的时间戳, 然后从下到上依照规则链执行目标文件的 时间戳比此文件时间戳旧的规则,直到最 顶层的规则。
依靠这些信息,make会对磁盘上的文件进 行检查,如果目标文件的生成或被改动时 的时间(称为该文件时间戳)至少比它的 一个依赖文件还旧的话,make就执行相应 的命令,以更新目标文件。目标文件不一 定是最后的可执行文件,可以是任何一个 中间文件并可以作为其他目标文件的依赖 文件。
一个Makefile文件主要含有一系列的规则,每条 规则包含以下内容。 目标文件列表 :依赖文件列表
2. makefile文件的基本结构
GNU make的主要功能是读进一个文本 文件makefile并根据makefile的内容执行一 系列的工作。makefile的默认文件名为 GNUmakefile、makefile或Makefile,当 然也可以在make的命令行中指定别的文件 名。如果不特别指定,make命令在执行时 将按顺序查找默认的makefile文件。多数 Linux程序员使用第三种文件名Makefile。 因为第一个字母是大写,通常被列在一个目 录的文件列表的最前面。
但是,在检查文件prog.o和code.o的时 间戳之前,make会在下面的行中寻找以 prog.o和code.o为目标的规则,在第三行 中找到了关于prog.o的规则,该文件的依赖 文件是prog.c、prog.h和code.h。同样, make会在后面的规则行中继续查找这些依 赖文件的规则,如果找不到,则开始检查这 些依赖文件的时间戳,如果这些文件中任何 一个的时间戳比prog.o的新,make将执行 “gcc –c prog.c –o prog.o”命令,更新 prog.o文件。
Make命令完全详解教程
Make命令完全详解教程无论是在Linux还是在Unix环境中,make都是一个非常重要的编译命令。
不管是自己进行项目开发还是安装应用软件,我们都经常要用到make或make install。
利用make工具,我们可以将大型的开发项目分解成为多个更易于管理的模块,对于一个包括几百个源文件的应用程序,使用make和makefile工具就可以简洁明快地理顺各个源文件之间纷繁复杂的相互关系。
而且如此多的源文件,如果每次都要键入gcc命令进行编译的话,那对程序员来说简直就是一场灾难。
而make工具则可自动完成编译工作,并且可以只对程序员在上次编译后修改过的部分进行编译。
因此,有效的利用make和makefile工具可以大大提高项目开发的效率。
同时掌握make和makefile之后,您也不会再面对着Linux下的应用软件手足无措了。
一、Make程序的命令行选项和参数Make命令参数的典型序列如下所示:make [-f makefile文件名][选项][宏定义][目标]这里用[]括起来的表示是可选的。
命令行选项由破折号“–”指明,后面跟选项,如也可以每个选项使用一个破折号,如甚至混合使用也行,如Make命令本身的命令行选项较多,这里只介绍在开发程序时最为常用的三个,它们是:–k:如果使用该选项,即使make程序遇到错误也会继续向下运行;如果没有该选项,在遇到第一个错误时make程序马上就会停止,那么后面的错误情况就不得而知了。
我们可以利用这个选项来查出所有有编译问题的源文件。
–n:该选项使make程序进入非执行模式,也就是说将原来应该执行的命令输出,而不是执行。
–f :指定作为makefile的文件的名称。
如果不用该选项,那么make程序首先在当前目录查找名为makefile的文件,如果没有找到,它就会转而查找名为Makefile的文件。
如果您在Linux下使用GNU Make的话,它会首先查找GNUmakefile,之后再搜索makefile和Makefile。
GNU 通用公共授权 (简体中文翻译版)
(c) 附上您所收受有关发布相同源码的报价资讯。(本项选择仅在非赢利发布、且仅在您依前述b项方式自该书面报价文件收受程序目的码或可执行形式时,始有适用。)
著作的源码,是指对著作进行修改时适用的形式。对于一个可执行的著作而言,完整的源码是指著作中所包含所有模组的全部源码,加上相关介面的定义挡,还加上用以控制该著作编译与安裝的描述。然而,特別的例外情况是,所发布的源码并不需包含任何通常会随著所执行作业系统的主要组成部分(编译器、核心等等)而发布的软件(无论以源码或二进位格式),除非该部分本身即附加在可执行程序中。
11. 由于本程序是无偿授权,因此在法律许可范围內,本授权对本程序并不负担保责任。非经书面声明,著作权人与/或其他提供程序之人,无论明示或默许,均是依「现况」提供本程序而并无任何形式的担保责任,其包括但不限于,就适售性以及特定目的的适用性为默示性担保。有关本程序品质与效能的全部风险均由您承担。如本程序被证明有瑕疵,您应承担所有服务、修复或改正的费用。
本授权不适用于复制、发布与修改以外的行为;这些行为不在本授权范围内。执行本程序的行为并不受限制,而本程序的输出只有在其內容构成基于本程序所生的著作(而非只是因为执行本程序所造成)时,始受本授权拘束。至于程序的输出內容是否构成本程序的衍生著作,则取决于本程序的具体用途。
1. 您可以对所收受的本程序源代码,无论以何种媒介,复制与发布其完整的复制物,然而您必须符合以下要件:以显著及适当的方式在每一份复制物上发布适当的著作权标示及无担保声明;维持所有有关本授权以及无担保声明的原貌;并将本授权的副本连同本程序一起交付予其他任何一位本程序的收受者。
(a) 附上完整、相对应的机器可判读源码,而这些源码必须依前述第一、二条规定在经常用以作为软件交换的媒介物上发布;或
GNU 编码标准中文版
GNU 编码标准870最近更新日期: 2002/10/08 Tue 10:50:24+0800 CSTGNU 编码标准● 引用私有程序● 接受他人的奉献● 修改日志(Change Logs)● 与其它实现的兼容性● Makefile惯例r Makefile的通用惯例r Makefile中的工具r为用户提供的标准目标r为指明命令而提供的变量r为安装目录而提供的变量● 配置是如何进行的● 使用C以外的语言● 格式化你的源代码● 为你的工作写注释● 清晰地使用C语言成分● 命名变量和函数● 使用非标准的特征● 适用于所有程序的程序行为● 格式化错误信息● 库的行为● 适用于GNU的移植性● 命令行界面标准● 为程序制作文档● 制作发行包GNU编码标准GNU编码标准@author{Richard Stallman} @author{last updated 03 Feb 1993}Copyright (C) 1992, 1993 Free Software FoundationPermission is granted to make and distribute verbatim copies of this manual provided the copyright notice and this permission notice are preserved on all copies.Permission is granted to copy and distribute modified versions of this manual under the conditions for verbatim copying, provided that the entire resulting derived work is distributed under the terms of a permission notice identical to this one.Permission is granted to copy and distribute translations of this manual into another language, under the above conditions for modified versions, except that this permission notice may be stated in a translation approved by Free Software Foundation.本文由王立翻译. 1999.11.9引用私有程序不要在任何情况下,为你在的GNU中的工作或者在工作中引用Unix的源代码(或者任何其它私有程序)。
GNU Make 说明书
GNU Make 使用手冊Version 3.79繁體版更新日期 2006/08/30 校稿 ChanningLan目錄1 make概述1.1 怎樣閱讀本手冊1.2 問題和BUG2 Makefile檔案介紹2.1 規則的格式2.2一個簡單的Makefile檔案2.3mke處理Makefile檔案的過程2.4使用變數簡化Makefile檔案2.5讓make推斷命令2.6另一種風格的Makefile檔案2.7在目錄中刪除檔案的規則3编寫Makefile文件3.1Makefile檔案的內容3.2Makefile檔案的命名3.3引入(include)其它的Makefile檔案3.4變數MAKEFILES3.5Makefile檔案重新生成的過程3.6重載其它Makefile檔案3.7make讀取Makefile檔案的過程4 編寫規則4.1規則的語法4.2在檔案名中使用萬用字元4.2.1萬用字元例子4.2.2使用萬用字元的常見錯誤4.2.3函數wildcard4.3在目錄中搜尋先決條件4.3.1VPATH:所有先決條件的搜尋路俓(stem)4.3.2vpath指令4.3.3目錄搜尋過程4.3.4編寫搜尋目錄的shell命令4.3.5目錄搜尋和隱含規則4.3.6連接庫(Link Libraries)的搜尋目錄4.4假想(phony)目標4.5沒有命令或先決條件的規則4.6使用空目錄檔案記錄事件4.7內建的特殊目標名4.8具有多個目標的規則4.9具有多條規則的目標4.10靜態樣式規則4.10.1靜態樣式規則的語法4.10.2靜態樣式規則和隱含規則4.11雙冒號規則(::)4.12自動生成先決條件5 在規則中使用命令5.1命令回顯5.2執行命令5.3並行執行5.4命令錯誤5.5中斷或關閉make5.6遞迴make5.6.1變數MAKE的工作模式5.6.2與子make通訊的變數5.6.3與子make通訊的選項5.6.4`--print-directory'選項5.7定義固定次序命令5.8使用空命令6使用變數6.1變數引用基礎6.2變數的兩個特色6.3變數進階引用技術6.3.1替換引用6.3.2巢狀變數引用6.4變數取值6.5設定變數6.6為變數值附加文字(text)6.7撤銷(override)指令6.8定義多行變數6.9環境變數6.10特定目標變數的值6.11特定樣式變數的值7 Makefile檔案的條件語句7.1條件語句的例子7.2條件語句的語法7.3測試標誌的條件語句8 文字(text)轉換函數8.1函數呼叫語法8.2字元串替換和分析函數8.3檔案名函數8.4函數foreach8.5函數if8.6函數call8.7函數origin8.8函數shell8.9控制Make的函數9執行make9.1指定Makefile檔案的參數9.2指定最終目標的參數9.3代替執行命令9.4避免重新編譯檔案9.5變數重載9.6測試編譯程式9.7選項概要10 使用隱含規則10.1使用隱含規則10.2隱含規則目錄10.3隱含規則使用的變數10.4隱含規則鏈10.5定義與重新定義樣式規則10.5.1樣式規則簡介10.5.2樣式規則的例子10.5.3自動變數10.5.4樣式匹配10.5.5萬用規則10.5.6刪除隱含規則10.6定義最新類型的預設規則10.7舊式的後置規則(suffix rule)10.8隱含規則搜尋算法11 使用make更新資料庫檔案11.1資料庫成員目標11.2資料庫成員目標的隱含規則11.2.1更新資料庫成員的符號索引表11.3使用檔案的危險11.4資料庫檔案的後置規則(suffix rule)12 GNU make的特點13 不相容性和失去的特點14 Makefile檔案慣例14.1makefile檔案的通用慣例14.2makefile檔案的工具14.3指定命令的變數14.4安裝路俓(stem)變數14.5用戶標準目標14.6安裝命令分類15快速參考16make產生的錯誤17複雜的Makefile檔案例子附錄 名詞翻譯對照表1 Make 概述Make 可自動決定一個大程式中哪些檔案需要重新編譯,並發布重新編譯它們的命令。
Automake中文手册
automake中文手册收藏GNU AutomakeFor version 1.3, 3 April 1998 David MacKenzie and Tom Tromey目录·介绍·通用性概念o通用操作o深度o严格性o统一命名机制o派生变量是如何命名的·一些实例软件包o一个简单的例子,从起点到终点o一个经典的程序o创建etags和ctags·创建`Makefile.in'·扫描`configure.in'o配置需求oAutomake能够识别的其它事情o自动生成的aclocal.m4o由Automake支持的Autoconf宏 o编写你自己的aclocal宏·顶层`Makefile.am'·创建程序和库o创建一个程序o创建一个库o对LIBOBJS和ALLOCA的特别处理 o创建一个共享库o创建一个程序时使用的变量o对Yacc和Lex的支持oC++和其它语言o自动de-ANSI-ficationo自动的依赖性(dependency)跟踪·其它派生对象o可执行的脚本o头文件o与体系结构无关(Architecture-independent)的数据文件o已创建的源代码·其它GNU工具oEmacs LispoGettextoGuileoLibtooloJava·创建文档oTexinfooMan手册·安装了些什么·清除了些什么·需要发布哪些文件·对测试套件(test suites)的支持·改变Automake的行为·其它规则o与etags之间的界面o处理新的文件扩展名·条件(Conditionals)·--gnuand --gnits的效果·--cygnus的效果·什么时候Automake不够用·发布`Makefile.in'·未来的某些想法·索引@dircategory GNU admin @direntry * automake: (automake). Making Makefile.in's @dircategory Individual utilities @direntry * aclocal: (automake)Invoking aclocal. Generating aclocal.m4Copyright (C) 1995, 96 Free Software Foundation, Inc.这是GNU Automake文档的第一版,并且是针对GNU Automake 1.3的。
gnu_make_tutorial
gnu_make_tutorialGNU make ?Goerge?@Merton College.Oxford University.England@ .CASIAGNU Make make make Unix Linux make make Unix Linux CScene CScene CScene CScene1GNU Make Make22.1 ?header extern(object?les)(Library) gcc/ld( GNU C )2.2’hello world’ ’hello world’2.3i) header header headerheaderii) header header headeriii) header header #include headeriv) #include header header2.4a) (Identi?er)(global) gfx.c gfxb) header #include header#include headerheader header #include header externcounter int counter; header extern int counter;externc)#include a.h b.h a.h #include b.h b.ha.h #includeb.h b.h#de?neheader header header #de?ne header header#i f n d e f FILENAMEH#e n d i fheader FILENAMEH?/header header2.5(object?les)gcc GNU C gccgcca.out-c gcc .c .cc .o gcc a.out -o’gcc-c?lename.c’ ’gcc-o exec.o header make?le make headermake?le #include header3.2 make (Rules)#include header header #include headerheader gcc -M #include header header (‘<’,‘>’) (‘”’) header stdio.h,stdlib.h -MM -M gcc header gcc make 2.43.3Make?lemake?lesmake?le (environment variable) make makei)gccii) gcciii) -Wall-O-g= $ make?le=======make?le =======OBJS=f o o.o bar.oCC=gccCFLAGS=?Wall?O?gmyprog:$(OBJS)$(CC)$(OBJS)?o myprogf o o.o:f o o.c f o o.h bar.h$(CC)$(CFLAGS)?c f o o.c?o f o o.obar.o:bar.c bar.h$(CC)$(CFLAGS)?c bar.c?o bar.o=======make?le =======$@,$< $?( ) $@ $< $?( ) make?le=======make?le =======OBJS=f o o.o bar.oCC=gccCFLAGS=?Wall?O?gmyprog:$(OBJS)$(CC)$??o$@f o o.o:f o o.c f o o.h bar.h$(CC)$(CFLAGS)?c$<?o$@bar.o:bar.c bar.h$(CC)$(CFLAGS)?c$<?o$@=======make?le =======GNU Make (’man make’,’man make?le’) 3.4 (Implicit Rules).o .c .o makefoo.o bar.o make CC CFLAGS C C++ CXXFLAGS CPPFLAGS C TARGETARCH)?c$<?o$@gcc -M -MM make?le3.5 (Phony Targets)makemake?lea l l:exec1exec2exec1 exec2 make ’all’ ’all’ ’all’ all ’all’ make all exec1,exec2 make make?lev e r y c l e a n:rm?.orm myprog’veryclean’ ’make veryclean’ make rmveryclean make .PHONY make make?le .P H O N Y:v e r y c l e a nmake make .PHONY make3.6 (Functions)make?le $ GNU Make ’wildcard’SOURCES=$(w i l d c a r d?.c)’.c’ SOURCESpatsubst patten substitude,OBJS=$(p a t s u b s t%.c,%.o,$(SOURCES))SOURCES ’.c’ ’.o’ ’.c’ % (stem) %3.7 make?lemake?le make?lemake?le SOURCES *.cc C++SOURCES=$(w i l d c a r d?.c?.cc)patsubst .c .cc patsubstOBJS=$(p a t s u b s t%.c,%.o,$(p a t s u b st%.cc,%.o,$(SOURCES)))patsubst .cc patsubst .cmyprog:$(OBJS)gcc?o myprog$(OBJS)gcc (object?les)depends:$(SOURCES)gcc?M$(SOURCES)>depends’depends’ depends depends depends gcc -M make make?le C #include make include make?lei n c l u d e dependsGNU Make ’depends’ depends ’myprog’ myprog depends’depends’ 100% header3.8 make?lemake?le djgpp DOS gcc ’alleg’ RM-F====make?le ====########################################Generic m a k e f i l e##by George Foot#email:g e o r g e.foot@/doc/b63811303.html,##Copyright(c)1997George Foot#A l l r i g h t s r e s e r v e d.##No warranty,no l i a b i l i t y;#you use t h i s at your own r i s k.##You a r e f r e e to modify and#d i s t r i b u t e t h i s without g i v i n g#c r e d i t to the o r i g i n a l author.##########################################Customising##Adjust the f o l l o w i n g i f n e c e s s a r y;EXECUTABLE i s the t a r g e t#e x e c u t a b l e’s f i l e n a m e,and LIBS i s a l i s t o f l i b r a r i e s to l i n k i n#(e.g.a l l e g,stdcx,i o s t r,e t c).You can o v e r r i d e t h e s e on make’s#command l i n e o f course,i f you p r e f e r to do i t that way.EXECUTABLE:=mushroom.exeLIBS:=a l l e g#Now a l t e r any i m p l i c i t r u l e s’v a r i a b l e s i f you l i k e,e.g.:CFLAGS:=?g?Wall?O3?m486CXXFLAGS:=$(CFLAGS)#The next b i t checks to s e e whether rm i s i n your djgpp bin#d i r e c t o r y;i f not i t u s e s d e l i n s t e a d,but t h i s can cause(harmless)#‘F i l e not found’e r r o r messages.I f you a r e not u s i n g DOS at a l l,#s e t the v a r i a b l e to something which w i l l u n q u e s t i o n i n g l y remove#f i l e s.i f n e q($(w i l d c a r d$(DJDIR)/bin/rm.exe),)RM?F:=rm?fe l s eRM?F:=d e le n d i f#You shouldn’t need to change anything below t h i s p o i n t.SOURCE:=$(w i l d c a r d?.c)$(w i l d c a r d?.cc)OBJS:=$(p a t s u b s t%.c,%.o,$(p a t s u b s t%.cc,%.o,$(SOURCE)))DEPS:=$(p a t s u b s t%.o,%.d,$(OBJS))MISSINGDEPS DEPS))\ $(p a t s u b s t%.d,%.cc,$(MISSING@$(RM?F)$(EXECUTABLE)r e b u i l d:v e r y c l e a n e v e r y t h i n gi f n e q($(MISSINGDEPS):@$(RM?F)$(p a t s u b s t%.d,%.o,$@)e n d i fi n c l u d e$(DEPS)$(EXECUTABLE):$(OBJS)gcc?o$(EXECUTABLE)$(OBJS)$(a d d p r e f i x?l,$(LIBS))====make?le ====:= = =A=fooB=$(A)# B $(A) $(A) ’foo’A=bar# B $(A) ’bar’B:=$(A)# B ’bar’A=foo#B ’bar’make #ifneg...else...endif make?le ifeq else endif else make?le else endif make?le else ifneq’?lter-out’ DEPSCPPFLAGS -MD -M .c .cc .d DEPS DEPS ’-include’ make?le make?le .o make CPPFLAGS -MD .d’addpre?x’make?le makeeverything: ’.d’ ’.o’deps: ’.d’objs: ’.d’clean: *.d *.overyclean: ‘clean’rebuild: ‘veryclean’ ‘everything’everything clean veryclean rebuild make?le ‘make clean’ make?le4GNU MakeGNU Make (info pages, GNU info pages.)。
GNUmake中文手册
1.1make概述
Linux环境下的程序员如果不会使用GNU make来构建和管理自己的工程,应该不能算是一个合格的专业程序员,至少不能称得上是Unix程序员。在Linux(unix)环境下使用GNU的make工具能够比较容易的构建一个属于你自己的工程,整个工程的编译只需要一个命令就可以完成编译、连接以至于最后的执行。不过这需要我们投入一些时间去完成一个或者多个称之为Makefile文件的编写。此文件正是make正常工作的基础。
后两种情况是make只将修改过的C源文件重新编译生成.o文件,对于没有修改的文件不进行任何工作。重新编译过程中,任何一个源文件的修改将产生新的对应的.o文件,新的.o文件将和以前的已经存在、此次没有重新编译的.o文件重新连接生成最后的可执行程序。
首先让我们先来看一些Makefile相关的基本知识。
2.2Makefile规则介绍
1.2准备知识
在开始我们关于make的讨论之前,首先需要明确一些基本概念:
编译:把高级语言书写的代码转换为机器可识别的机器指令。编译高级语言后生成的指令虽然可被机器识别,但是还不能被执行。编译时,编译器检查高级语言的语法、函数与变量的声明是否正确。只有所有的语法正确、相关变量定义正确编译器就可以编译出中间目标文件。通常,一个高级语言的源文件都可对应一个目标文件。目标文件在Linux中默认后缀为“.o”(如“foo.c”的目标文件为“foo.o”)。
一个简单的Makefile描述规则组成:
TARGET... : PREREQUISITES...
COMMAND
...
...
target:规则的目标。通常是最后需要生成的文件名或者为了实现这个目的而必需的中间过程文件名。可以是.o文件、也可以是最后的可执行程序的文件名等。另外,目标也可以是一个make执行的动作的名称,如目标“clean”,我们称这样的目标是“伪目标”。
Automake中文手册
automake中文手册收藏GNU AutomakeFor version 1.3, 3 April 1998 David MacKenzie and Tom Tromey目录·介绍·通用性概念o通用操作o深度o严格性o统一命名机制o派生变量是如何命名的·一些实例软件包o一个简单的例子,从起点到终点o一个经典的程序o创建etags和ctags·创建`Makefile.in'·扫描`configure.in'o配置需求oAutomake能够识别的其它事情o自动生成的aclocal.m4o由Automake支持的Autoconf宏 o编写你自己的aclocal宏·顶层`Makefile.am'·创建程序和库o创建一个程序o创建一个库o对LIBOBJS和ALLOCA的特别处理 o创建一个共享库o创建一个程序时使用的变量o对Yacc和Lex的支持oC++和其它语言o自动de-ANSI-ficationo自动的依赖性(dependency)跟踪·其它派生对象o可执行的脚本o头文件o与体系结构无关(Architecture-independent)的数据文件o已创建的源代码·其它GNU工具oEmacs LispoGettextoGuileoLibtooloJava·创建文档oTexinfooMan手册·安装了些什么·清除了些什么·需要发布哪些文件·对测试套件(test suites)的支持·改变Automake的行为·其它规则o与etags之间的界面o处理新的文件扩展名·条件(Conditionals)·--gnuand --gnits的效果·--cygnus的效果·什么时候Automake不够用·发布`Makefile.in'·未来的某些想法·索引@dircategory GNU admin @direntry * automake: (automake). Making Makefile.in's @dircategory Individual utilities @direntry * aclocal: (automake)Invoking aclocal. Generating aclocal.m4Copyright (C) 1995, 96 Free Software Foundation, Inc.这是GNU Automake文档的第一版,并且是针对GNU Automake 1.3的。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
GNU Make 使用手册(中译版)翻译:于凤昌译者注:本人在阅读Linux源代码过程中发现如果要全面了解Linux的结构、理解Linux的编程总体设计及思想必须首先全部读通Linux源代码中各级的Makefile文件。
目前,在网上虽然有一些著作,但都不能全面的解释Linux源代码中各级的Makefile文件,因此本人认真阅读了GNU Make 使用手册(3.79)版原文,在此基础上翻译了该手册,以满足对Linux源代码有兴趣或者希望采用GCC编写程序但对缺乏GNU Make全面了解之人士的需要。
本人是业余爱好不是专业翻译人士,如果有问题请通过电子信箱与我联系共同商讨,本人的E-mail为:yfc70@ 。
注意在文章中出现的斜体加粗字表示章节。
GNU make Version 3.79April 2000Richard M. Stallman and Roland McGrath目录1 make概述1.1 怎样阅读本手册1.2 问题和BUG2 Makefile文件介绍2.1 规则的格式2.2一个简单的Makefile文件2.3make处理Makefile文件的过程2.4使用变量简化Makefile文件2.5让make推断命令2.6另一种风格的Makefile文件2.7在目录中删除文件的规则33编写Makefile文件3.1Makefile文件的内容3.2Makefile文件的命名3.3包含其它的Makefile文件3.4变量MAKEFILES3.5Makefile文件重新生成的过程3.6重载其它Makefile文件3.7make读取Makefile文件的过程4 编写规则4.1规则的语法4.2在文件名中使用通配符4.2.1通配符例子4.2.2使用通配符的常见错误4.2.3函数wildcard4.3在目录中搜寻依赖4.3.1VPATH:所有依赖的搜寻路径4.3.2vpath指令4.3.3目录搜寻过程4.3.4编写搜寻目录的shell命令4.3.5目录搜寻和隐含规则4.3.6连接库的搜寻目录4.4假想目标4.5没有命令或依赖的规则4.6使用空目录文件记录事件4.7内建的特殊目标名4.8具有多个目标的规则4.9具有多条规则的目标4.10静态格式规则4.10.1静态格式规则的语法4.10.2静态格式规则和隐含规则4.11双冒号规则4.12自动生成依赖5 在规则中使用命令5.1命令回显5.2执行命令5.3并行执行5.4命令错误5.5中断或关闭make5.6递归调用make5.6.1变量MAKE的工作方式5.6.2与子make通讯的变量5.6.3与子make通讯的选项5.6.4`--print-directory'选项5.7定义固定次序命令5.8使用空命令66使用变量6.1变量引用基础6.2变量的两个特色6.3变量高级引用技术6.3.1替换引用6.3.2嵌套变量引用6.4变量取值6.5设置变量6.6为变量值追加文本6.7override指令6.8定义多行变量6.9环境变量6.10特定目标变量的值6.11特定格式变量的值7 Makefile文件的条件语句7.1条件语句的例子7.2条件语句的语法7.3测试标志的条件语句8 文本转换函数8.1函数调用语法8.2字符串替换和分析函数8.3文件名函数8.4函数foreach8.5函数if8.6函数call8.7函数origin8.8函数shell8.9控制Make的函数99运行make9.1指定Makefile文件的参数9.2指定最终目标的参数9.3代替执行命令9.4避免重新编译文件9.5变量重载9.6测试编译程序9.7选项概要10 使用隐含规则10.1使用隐含规则10.2隐含规则目录10.3隐含规则使用的变量10.4隐含规则链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隐含规则搜寻算法11 使用make更新档案文件11.1档案成员目标11.2档案成员目标的隐含规则11.2.1更新档案成员的符号索引表11.3使用档案的危险11.4档案文件的后缀规则12 GNU make的特点13 不兼容性和失去的特点14 Makefile文件惯例14.1makefile文件的通用惯例14.2makefile文件的工具14.3指定命令的变量14.4安装路径变量14.5用户标准目标14.6安装命令分类15快速参考16make产生的错误17复杂的Makefile文件例子附录 名词翻译对照表1 Make 概述Make 可自动决定一个大程序中哪些文件需要重新编译,并发布重新编译它们的命令。
本版本GNU Make使用手册由Richard M. Stallman and Roland McGrath编著,是从Paul D. Smith撰写的V3.76版本发展过来的。
GNU Make符合IEEE Standard 1003.2-1992 (POSIX.2) 6.2章节的规定。
因为C语言程序更具有代表性,所以我们的例子基于C语言程序,但Make并不是仅仅能够处理C语言程序,它可以处理那些编译器能够在Shell命令下运行的的各种语言的程序。
事实上,GNU Make不仅仅限于程序,它可以适用于任何如果一些文件变化导致另外一些文件必须更新的任务。
如果要使用Make,必须先写一个称为Makefile的文件,该文件描述程序中各个文件之间的相互关系,并且提供每一个文件的更新命令。
在一个程序中,可执行程序文件的更新依靠OBJ文件,而OBJ文件是由源文件编译得来的。
一旦合适的Makefile文件存在,每次更改一些源文件,在shell命令下简单的键入: make就能执行所有的必要的重新编译任务。
Make程序根据Makefile文件中的数据和每个文件更改的时间戳决定哪些文件需要更新。
对于这些需要更新的文件,Make基于Makefile文件发布命令进行更新,进行更新的方式由提供的命令行参数控制。
具体操作请看运行Make章节。
1.1怎样阅读本手册如果您现在对Make一无所知或者您仅需要了解对make 的普通性介绍,请查阅前几章内容,略过后面的章节。
前几章节是普通介绍性内容,后面的章节是具体的专业、技术内容。
如果您对其它Make程序十分熟悉,请参阅GNU Make的特点和不兼容性和失去的特点部分,GNU Make的特点这一章列出了GNU Make对make程序的扩展,不兼容和失去的特点一章解释了其它Make程序有的特征而GNU Make缺乏的原因。
对于快速浏览者,请参阅选项概要、快速参考和内建的特殊目标名部分。
1.2问题和BUG如果您有关于GNU Make的问题或者您认为您发现了一个BUG,请向开发者报告;我们不能许诺我们能干什么,但我们会尽力修正它。
在报告BUG之前,请确定您是否真正发现了BUG,仔细研究文档后确认它是否真的按您的指令运行。
如果文档不能清楚的告诉您怎么做,也要报告它,这是文档的一个BUG。
在您报告或者自己亲自修正BUG之前,请把它分离出来,即在使问题暴露的前提下尽可能的缩小Makefile文件。
然后把这个Makefile文件和Make给出的精确结果发给我们。
同时请说明您希望得到什么,这可以帮助我们确定问题是否出在文档上。
一旦您找到一个精确的问题,请给我们发E-mail,我们的E-mail地址是:bug-make@在邮件中请包含您使用的GNU Make的版本号。
您可以利用命令‘make--version’得到版本号。
同时希望您提供您的机器型号和操作系统类型,如有可能的话,希望同时提供config.h文件(该文件有配置过程产生)。
2 Makefile文件介绍Make程序需要一个所谓的Makefile文件来告诉它干什么。
在大多数情况下,Makefile 文件告诉Make怎样编译和连接成一个程序。
本章我们将讨论一个简单的Makefile文件,该文件描述怎样将8个C源程序文件和3个头文件编译和连接成为一个文本编辑器。
Makefile文件可以同时告诉Make怎样运行所需要的杂乱无章的命令(例如,清除操作时删除特定的文件)。
如果要看更详细、复杂的Makefile文件例子,请参阅复杂的Makefile文件例子一章。
当Make重新编译这个编辑器时,所有改动的C语言源文件必须重新编译。
如果一个头文件改变,每一个包含该头文件的C语言源文件必须重新编译,这样才能保证生成的编辑器是所有源文件更新后的编辑器。
每一个C语言源文件编译后产生一个对应的OBJ文件,如果一个源文件重新编译,所有的OBJ文件无论是刚刚编译得到的或原来编译得到的必须从新连接,形成一个新的可执行文件。
2.1 规则的格式一个简单的Makefile文件包含一系列的“规则”,其样式如下:目标(target)…: 依赖(prerequiries)…<tab>命令(command)……目标(target)通常是要产生的文件的名称,目标的例子是可执行文件或OBJ文件。
目标也可是一个执行的动作名称,诸如‘clean’(详细内容请参阅假想目标一节)。
依赖是用来输入从而产生目标的文件,一个目标经常有几个依赖。
命令是Make执行的动作,一个规则可以含有几个命令,每个命令占一行。
注意:每个命令行前面必须是一个Tab字符,即命令行第一个字符是Tab。
这是不小心容易出错的地方。
通常,如果一个依赖发生变化,则需要规则调用命令对相应依赖和服务进行处理从而更新或创建目标。
但是,指定命令更新目标的规则并不都需要依赖,例如,包含和目标‘clern’相联系的删除命令的规则就没有依赖。
规则一般是用于解释怎样和何时重建特定文件的,这些特定文件是这个详尽规则的目标。
Make需首先调用命令对依赖进行处理,进而才能创建或更新目标。
当然,一个规则也可以是用于解释怎样和何时执行一个动作,详见编写规则一章。
一个Makefile文件可以包含规则以外的其它文本,但一个简单的Makefile文件仅仅需要包含规则。
虽然真正的规则比这里展示的例子复杂,但格式却是完全一样。
2.2一个简单的Makefile文件一个简单的Makefile文件,该文件描述了一个称为文本编辑器(edit)的可执行文件生成方法,该文件依靠8个OBJ文件(.o文件),它们又依靠8个C源程序文件和3个头文件。
在这个例子中,所有的C语言源文件都包含‘defs.h’ 头文件,但仅仅定义编辑命令的源文件包含‘command.h’头文件,仅仅改变编辑器缓冲区的低层文件包含‘buffer.h’头文件。
edit : main.o kbd.o command.o display.o \insert.o search.o files.o utils.occ -o edit main.o kbd.o command.o display.o \insert.o search.o files.o utils.omain.o : main.c defs.hcc -c main.ckbd.o : kbd.c defs.h command.hcc -c kbd.ccommand.o : command.c defs.h command.hcc -c command.cdisplay.o : display.c defs.h buffer.hcc -c display.cinsert.o : insert.c defs.h buffer.hcc -c insert.csearch.o : search.c defs.h buffer.hcc -c search.cfiles.o : files.c defs.h buffer.h command.hcc -c files.cutils.o : utils.c defs.hcc -c utils.cclean :rm edit main.o kbd.o command.o display.o \insert.o search.o files.o utils.o我们把每一个长行使用反斜杠-新行法分裂为两行或多行,实际上它们相当于一行,这样做的意图仅仅是为了阅读方便。