默认情况下,GNUMake工具在当前的工作目录中按如下顺序搜索Makefile。
Makefile用来告诉Make如何编译和链接成一个程序。Makefile里主要包含了5个方面的内容,即显式规则、隐式规则、变量定义、文件指示和注释。
1.显式规则
显式规则说明了如何生成一个或多个目标。一条显式规则指明了目标文件,目标文件的依赖文件,以及生成或更新目标文件所使用的命令。显式规则的一般形式为
其中,target是需要由Make工具创建的目标体(target)。目标体通常可以是由空格分开的多个文件名,也可以是一个标签。目标文件列表的文件名可以使用通配符,格式“A(M)”表示档案文件(Linux下的静态库.a文件)的成员“M”。通常,规则只有一个目标文件。dependency_files是要创建的目标体所依赖的文件;command是创建每个目标体时需要运行的命令。例如,在Makefile中有一个规则:
在第一行中,文件“test.o”是规则需要重建的文件,而“test.c”和“test.h”是重建“test.o”所要使用的文件。把规则所需要重建的文件称为规则的“目标”(test.o),而把重建目标所需要的文件称为规则的“依赖”(或者目标的依赖)。规则中的第二行“gcc-c-g test.c”是规则的“命令”,它描述了如何使用规则中的依赖文件重建目标。
书写规则时需要注意以下几点。
1)规则的命令部分有两种书写方式:命令可以和目标、依赖描述放在同一行。命令在依赖文件列表后,并使用分号(;)和依赖文件列表分开。命令在依赖文件列表的下一行,作为独立的命令行。当做为独立的命令行时,此行必须以[Tab]字符开始。在Makefile中,所有以[Tab]字符开始的行都会被当做命令来处理。
2)Makefile中的符号“$”有特殊的含义,它表示变量或函数的引用。规则中使用符号“$”的地方,需要书写为“$$”。
3)对于Makefile中一个较长的行,可以使用反斜线“\”将其书写到几个独立的物理行上。
规则的中心思想是:目标文件的内容是由依赖文件决定的。依赖文件的任何一处被改动,都将导致目前已经存在的目标文件的内容过期。规则的命令为重建目标提供了方法。这些命令运行在系统Shell之上。
2.隐式规则(www.xing528.com)
由于Make有自动推导的功能,可以根据目标文件的文件名自动产生目标的依赖文件和生成目标的命令。表5-11给出了Makefile中常见的隐式规则目录。
表5-11 Makefile中常见的隐式规则目录
在隐式规则中只能查找到相同文件名的不同后缀文件,如“kang.o”文件必须由“kang.c”文件生成等。
隐式规则仅仅能够用Make默认的变量来进行操作。
隐式规则的格式类似于普通规则,在这个规则中的相关文件前必须用“%”标明。
3.变量定义
在Makefile中需要定义一系列的变量,一般都是字符串,它类似于C语言中的宏。当Makefile被执行时,其中的变量都会被扩展到相应的引用位置上。
4.文件指示
文件指示包括3个部分:第一部分是指在一个Makefile中引用另一个Makefile,就像C语言中的include一样;第二部分是指根据某些情况指定Makefile中的有效部分,就像C语言中的预编译宏一样;第三部分是指定义一个多行的命令。
5.注释
Makefile中的#符号后的内容被当做注释处理。如果某行以#符号开头,那么此行就是注释行。一般地,在书写Makefile时建议将注释作为独立的行,而不要和Makefile中其他有意义的内容放在同一行。如果需要在Makefile中使用"#"字符,可以用反斜杠进行转义,如"\\#"等。
Makefile中的第一个规则之后的所有以[Tab]字符开始的行,Make程序都会将其交给系统Shell程序去解释执行。因此,以[Tab]字符开始的注释行也会交给Shell来处理,此命令行是否需要被执行(Shell执行或者忽略),是由系统Shell程序来决定的。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。