伪目标
通常我们能够说,目标的功能是从其他文档中创建一个文档。实际上并非总是如此。大部分 makefile 都至少有两条规则,他们从来都不会创建目标。请考虑下面的示例规则:
清单 5. 示例伪目标
all: hello goodbye fibonacci
|
这条规则会告诉 make —— 假如希望编译目标 all —— 首先要确保 hello、goodbye 和 fibonacci 都是最新的。然后,就什么也不做了。下面并没有提供指令。在这条规则完成之后,并不会创建名为 all 的文档。这个目标是一种假目标。在某些 make 变种中使用的技术术语称之为 “伪目标”。
伪目标是为了组织结构的目的而设计的,这在编写一个清楚的 makefile 时是种很不错的技术。举例来说,我们可能会经常看到下面的规则:
清单 6. 伪目标的灵活用法
build: clean all install
|
这指定了编译过程执行的操作顺序。
特别的目标和源
系统还定义了几个特别的目标,他们对 make 能够产生一些特别的影响,提供一种可配置的机制。具体的目标集对于每个实现来说都是不同的;其中最通用的一个是 .SUFFIXES 目标,他使用的源是一系列模式,添加在可识别的文档后缀列表中。这些特别目标并不会用作通用规则来把编译作为 makefile 中默认的第一条目标。
有些版本的 make 允许将特别源和给定目标的依赖性一起指定,例如 .IGNORE,他说明从编译这个目标所使用的命令中生成的错误都应该忽略,仿佛他们前面都有一个短线相同。这些标记的可移植性并不好,但是对于理解 makefile 来说却是必须的。
通用规则
在 make 中有一些隐式规则用来根据文档名后缀执行通用转换。举例来说,假如现在没有 makefile,能够创建一个名为 “hello.c” 的文档,并运行 make hello 命令:
清单 7. C 文档的隐式规则的例子
$ make hello
cc -O2 -o hello hello.c
|
大型程式使用的 makefile 可能会简单地指定自己需要的对象模块清单(hello.o、world.o 等),然后为如何将 .c 文档转换成 .o 文档提供一条规则:
清单 8. 将 .c 文档转换成 .o 文档的规则
.c.o:
cc $(CFLAGS) -c $<
|
实际上,大部分 make 工具都有一个早已内嵌到系统中的和此类似的规则;假如请求 make 来编译 file.o,而且现在已有 file.c 文档了,那么他就能够正确地完成编译过程。术语 "$<" 是个特别的预定义的 make 变量,代表某条规则的 “源”。这使我们能够使用一些 make 变量。
通用规则取决于 “后缀” 的声明,他然后会被识别为文档扩展名,而不是文档名的一部分。
变量
make 程式使用了一些变量来简化通用值的重用。最常见的值可能是 CFLAGS。有关 make 变量有一些东西应该澄清一下。他们不一定必须是环境变量。假如所给出的名字没有对应的 make 变量,那么 make 就会去检查环境变量;然而,这并意味着 make 变量会被导出为环境变量。优先规则很神秘;通常,他们的顺序从高到低依次为:
- 命令行变量配置
- 父 make 进程的 makefile 中的变量配置
- 本 make 进程的 makefile 中的变量配置
- 环境变量
因此,一个变量只有在没有在任何 makefile 或命令行中指定时,才会使用环境变量的配置(注意:父进程 makefile 变量有时候会传递下来,但不总会这样。正如可能已猜测到的相同,这些规则在各个 make 工具中会有所不同)。
人们在使用 make 时常常碰到的一个问题是变量被变量名的一部分替换掉了:举例来说,$CFLAGS 就被替换成了 “FLAGS”。因此要引用一个 make 变量,就请将他的名字放到括号中:$(CFLAGS)。否则,所得到的将是 $C,后面加上一个 FLAGS。
很多变量都有一些特别的意义,这是正在使用他们的规则的一种功能。最常见的用法有:
$<—— 用来构建目标所使用的源文档$*文章整理:西部数码--专业提供域名注册、虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!




