Makefile总述

Makefile总述

1. Makefile的内容
在一个完整的Makefile中,包含显式规则、隐式规则、变量定义、指示符和注释。

1.1 显式规则
它描诉了在何种情况下如何更新一个或者多个被称为目标的文件,即Makefile的目标文件。书写Makefile时需要明确地给出目标文件、目标的依赖文件列表以及更新目标文件所需要的命令。
1.2 隐式规则
它是make根据一类目标文件而自动推倒出来的规则。make根据目标文件的名,自动产生目标的依赖文件并使用默认的命令来对目标进行更新。
1.3 变量定义
使用一个字符或字符串代表一段文本串,当定义了一个变量以后,Makefile后续在需要使用此字符串的地方,通过引用这个变量来实现对文本串的使用。
1.4 Makefile指示符
指示符表明在make程序读取makefile文件过程中所要执行的一个动作。
1)读取一个文件或给定的文件名,将其内容作为makefile文件的一部分。
2)决定处理或者忽略Makefile中的某一特定部分。
3)定义一个多行变量。
1.5 注释
Makefile中“#”字符后的内容被作为是注释内容。

2. makefile文件的命名
默认的情况下,make会在工作目录下按照文件名顺序寻找makefile文件读取并执行,查找的文件名顺序为:GNUmakefile、makefile、Makefile。
通常来说是使用makefile或Makefile作为一个makefile的文件名,推荐使用Makefile,首字母大写而比较显著,一般在一个目录中和当前目录的一些重要文件等靠近,而GNUmakefile不推荐使用,因为以此命名的文件只有GNU make才可以识别,而其他版本的make程序只会在工作目录下寻找makefile和Makefile这两个文件。
如果make程序在工作目录下无法找到以上三个文件中的任何一个,它将不读取任何文件作为解析对象。但是根据make隐式规则的特性,我们可以通过命令行指定一个目标,如果当前目录下存在此目标的依赖文件,那么这个命令行所指定的目标将会被创建或者更新。

3. 包含其它makefile文件
Makefile中包含其他文件所用的关键字是“include”,告诉make暂停读取当前的Makefile,而转去读取“include”指定的一个或者多个文件,完成以后再继续当前Makefile的读取。Makefile中指示符“include”书写在独立的一行。
include filenames
其中filenames是shell所支持的文件名,也可以使用通配符。指示符“include”所在的行可以一个或多个空格开始,但是不能以[Tab]字符开始。指示符和文件名之间、多个文件之间使用空格或者[Tab]键隔开。
通常在Makefile中可以使用“-include”来代替“include”,来忽略由于包含文件不存在或者无法创建时的错误提示,“-”即忽略此操作的错误。
-include filenames
使用这种方式时,当所要包含的文件不存在时不会提示错误、make也不会退出。为了和其他的make程序进行兼容。也可以使用“sinclude”来代替“-include”。

4. 变量MAKEFILES
如果在当前环境定义了一个“MAKEFILE”环境变量,make执行时首先将此变量的值作为需要读入的Makefile文件,多个文件之间使用空格分开。类似使用指示符“include”包含其他Makefile文件一样,如果文件名非绝对路径而且当前目录也不存在此文件,make会在一些默认的目录去寻找。

5. 变量MAKEFILE_LIST
make程序在读取多个makefile文件时,包括由环境变量“MAKEFILES”指定、命令行指定、当前工作下的默认的以及使用指示符“include”指定包含的,在对这些文件进行解析执行之前make读取的文件名将会自动依次追加到变量“MAKEFILE_LIST”的定义域中。这样就可以通过测试次变量的最后一个字来获取当前make程序正在处理的makefile文件名。具体的说就是在一个Makefile文件中如果使用指示符“include”包含另一个文件之后,变量“MAKEFILE_LIST”的最后一个字只可能是指示符“include”指定所要包含的那个文件的名字。

6. 其他特殊变量
GNU make支持一个特殊的变量,此变量不能通过任何途径给它赋值。它被展开为一个特定的值。一个重要的特殊变量是“.VARIABLES”。它被展开以后是此引用点之前、makefile文件中所定义的所有全局变量列表。

7. makefile文件的重建
Makefile可由其它文件生成,例如RCS或SCCS文件。如果Makefile由其他文件重建,那么在make开始解析这个Makefile时需要重新读取更新后的Makefile、而不是之前的Makefile。make的处理过程是这样的:
make在读入所有makefile文件之后,首先将所读取的每个makefile作为一个目标,寻找它们的规则。如果存在一个更新某一个makefile文件明确规则或者隐含规则,就去更新对应的makefile文件。完成对所有的makefile文件的更新之后,如果之前所读取任何一个makefile文件被更新,那么make就清除本次执行的状态重新读取一遍所有的makefile文件。

8. 总结
make的执行过程如下:
1)依次读取变量“MAKEFILES”定义的makefile文件列表
2)读取工作目录下的makefile文件(GNU makefile、makefile、Makefile)
3)依次读取工作目录下makefile文件中使用指示符“include”包含的文件
4)查找重建所有已读取的makefile文件的规则
5)初始化变量并展开那些需要立即展开的变量和函数并根据预设条件确定执行分支
6)根据“终极目标”以及其他目标的依赖关系建立依赖关系链表
7)执行除“终极目标以外的所有的目标的规则”
8)执行“终极目标”所在的规则

2017-11-21-LR 取自GNU make中文手册

你可能感兴趣的:(Makefile,makefile)