设为首页 加入收藏

TOP

一起写 Makefile 规则(三)
2011-04-05 10:17:21 】 浏览:6649
Tags:一起 Makefile 规则
ES”指定、命令行指、当前工作下的默认的以及使用指示符“include”指定包含的,在对这些文件进行解析执行之前make读取的文件名将会被自动依次追加到变量“MAKEFILE_LIST”的定义域中。
这样我们就可以通过测试此变量的最后一个字来获取当前make程序正在处理的makefile文件名。具体地说就是在一个makefile文件中如果使用指示符“include”包含另外一个文件之后,变量“MAKEFILE_LIST”的最后一个字只可能是指示符“include”指定所要包含的那个文件的名字。一个makefile的内容如下:
 
name1 := $(word $(words $(MAKEFILE_LIST)),$(MAKEFILE_LIST))
 
include inc.mk
 
name2 := $(word $(words $(MAKEFILE_LIST)),$(MAKEFILE_LIST))
 
all:
@echo name1 = $(name1)
@echo name2 = $(name2)
 
执行make,则看到的将是如下的结果:
name1 = Makefile
name2 = inc.mk
此例子中涉及到了make的函数的和变量定义的方式,这些将在后续的章节中有详细的讲述。 

其他特殊变量

GNU make支持一个特殊的变量,此变量不能通过任何途经给它赋值。它被展开为一个特定的值。一个重要的特殊的变量是“.VARIABLES”。它被展开以后是此引用点之前、makefile文件中所定义的所有全局变量列表。包括:空变量(未赋值的变量)和make的内嵌变量,但不包含目标指定的变量,目标指定变量值在特定目标的上下文有效。

makefile文件的重建

Makefile可由其它文件生成,例如RCS或SCCS文件。如果Makefile由其它文件重建,那么在make在开始解析这个Makefile时需要重新读取更新后的Makefile、而不是之前的Makefile。make的处理过程是这样的:
make在读入所有makefile文件之后,首先将所读取的每个makefile作为一个目标,寻找更新它们的规则。如果存在一个更新某一个makefile文件明确规则或者隐含规则,就去更新对应的makefile文件。完成对所有的makefile文件的更新之后,如果之前所读取任何一个makefile文件被更新,那么make就清除本次执行的状态重新读取一遍所有的makefile文件(此过程中,同样在读取完成以后也会去试图更新所有的已经读取的makefile文件,但是一般这些文件不会再次被重建,因为它们在时间戳上已经是最新的)。读取完成以后再开始解析已经读取的makefile文件并开始执行必要的动作。
实际应用中,我们会明确给出makefile文件,而并不需要来由make自动重建它们。但是make在每一次执行时总会自动地试图重建那些已经存在的makefile文件,如果需要处于效率考虑,可以采用一些办法来避免make在执行过程时查找重建makefile的隐含规则。例如我们可以书写一个明确的规则,以makefile文件作为目标,规则的命令定义为空。
Makefile规则中,如果使用一个没有依赖只有命令行的双冒号规则去更新一个文件,那么每次执行make时,此规则的目标文件将会被无条件的更新(此规则定义的命令会被无条件执行)。如果这样一个规则的目标是makefile文件,那么执行make时,这个makefile文件(双冒号规则的目标)就会被无条件更新,而使得make的执行陷入到一个死循环(此makefile文件被不断的更新、重新读取、更新再重新读取的过程)。为了防止这种情况的发生,make在遇到一个目标是makefile文件的双冒号规则时,将忽略对这个规则的执行(其中包括了使用“MAKEFILES”指定、命令行选项指定、指示符“include”指定的需要make读取的所有makefile文件中定义的这一类双冒号规则)。
执行make时,如果没有使用“-f(--file)”选项指定一个文件,make程序将读取缺省的文件。和使用“-f(--file)”选项不同,make无法确定工作目录下是否存在缺省名称的makefile文件。如果缺省makefile文件不存在,但可以通过一个规则来创建它(此规则是隐含规则),则会自动创建缺省makefile文件,之后重新读取它并开始执行。
因此,如果在当前目录下不存在一个缺省的makefile文件,make将会按照搜索makefile文件的名称顺序去试图创建它,直到创建成功或者超越其缺省的命名顺序。需要明确的一点是:执行make时,如果不能成功地创建缺省的makefile文件,并不一定会导致错误。一个存在(缺省命名的或者可被创建的)的makefile文件并不是make正确运行的前提(关于这一点大家会在后续的阅读过程中体会到)。
当使用“-t(--touch)”选项来更新Makefile的目标文件(更新规则目标文件的时间戳)时,对于哪些是makefile文件的目标是无效的,这些目标文件(makefile文件)的时间戳并不会被更新。就是说即使在执行make时使用了选项“-t”,那些目标是makefile文件的规则同样也会被执行(重建这些makefile文件,而其它的规则不会被执行,make只是简单的更新规则目标文件的时间戳);类似还有选项“-q(—question)”和“-n(—just-print) ”,这主要是因为一个过时的makefile文件对其它目标的重建规则在当前看来可能是错误的。
正因为如此,执行命令“make –f mfile –n foo”首先会试图重建“mfile文件”、并重新读取它,之后会打印出更新目标“foo”所要执行的命令(但不会真正的执行这些命令)。在这种情况时,如果不希望重建makefile文件。我们需要在执行make时,在命令行中将这个makefile文件作为一个最终目标,这样选项“–t”和其它的选项就对这个makefile文件目标有效,防止执行这个makefile作为目标的规则(如果是“-t”参数,则是简单的更新这个makefile文件的时间戳)。同样,命令“make –f mfile –n mfile foo”会读取文件“mfile”,打印出重建文件“mfile”的命令、重建“foo”的命令而实际不执行任何命令。并且所打印的用于更新“foo”目标的命令是选项“-f”指定的、没有被重建的“mfile”文件中所定义的命令。
3.8 重载另外一个makefile

有些情况下,存在两个比较类似的makefile文件。其中一个(makefile-A)需要使用另外一个(makefile-B)中所定义的变量和规则。通常我们会想到在“makefile-A”中使用指示符“include”包含“mkaefile-B”来达到目的。但使用这种方式,如果在两个makefile文件中存在相同目标,而在不同的文件中其描述规则使用不同的命令。这样,相同的目标文件就同时存在两个不同的规则命令,这是makefile所不允许的。遇到这种情况,使用指示符“include”显然是行不通的。GNU make提供另外一种途径来实现此目的。具体的做法如下:
在需
首页 上一页 1 2 3 4 下一页 尾页 3/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Crontab 下一篇Linux 技巧:让进程在后台可靠运..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目