怎么样调试makemake 工具如 GNU make、System V make 和 Berkeley make 是用来组织应用程序编译过程的基本工具,但是每个 make 工具之间又有所不同。本文将介绍 makefile 的结构,避免怎么样在创建 makefile 时出现一些共同的错误,并探索怎么样修复或解决可移植性问题,还为解决突发的问题提供了一些技巧。 大部分 UNIX® 和 Linux® 程序都是通过运行 “make 工具”这个短语可能有些容易引起误解。经常使用的 make 工具至少有 3 个变种:GNU make、System V make 和 Berkeley make。它们都是从早期 UNIX 的一个核心规范发展而来的,每个变种都增加了一些新特性。这就导致出现了一种复杂的情况:很常用的一些特性,例如在 makefile 中通过引用来包含其他文件,都不能很好地移植!简单编写程序来创建 makefile 就是一种解决方案。由于 GNU make 是免费的,并且可以广泛地发布,因此有些开发人员就简单地为它来编写代码;类似地,有很多起源于 BSD 的项目都要求我们使用 Berkeley make(这也是免费的)。 稍微逊色一点但依然相关的 make 工具是 Jörg Schilling 的 下面先来回顾一下在使用 makefile 时所遇到的最常见的一些问题。 要调试 make,需要读取 makefile。正如所了解的那样,makefile 的目标就是为编译程序提供一些指令。make 的主要特性之一就是 依赖性管理:只有在程序源码发生更新必须要重新编译程序时,make 才会真正重新编译程序。通常,这是通过一系列依赖性规则来表示的。其中一种依赖性规则如下所示: 清单 1. 依赖性规则的格式
人们在编写自己的第一个 makefile 时所碰到的主要问题在这个结构中可能看得出来,也可能看不出来:缩进使用的是制表符,而不是多少个空格。由于在这种格式中使用空格所产生的 Berkeley make 错误消息对人们也没什么帮助: 清单 2. Berkeley make 错误消息
GNU make,尽管不能对这个文件进行处理,但却会给出一个更有用的建议: 清单 3. GNU make 错误消息
请注意依赖性和指令都是可选的;只有目标和冒号才是必须的。那么既然语法是这样,语义又该怎么样呢?其语义是:如果 make 希望编译 如果在命令行中给出了一个目标(例如 清单 4. 通常使用的第一个目标约定
有些人会假设之所以使用这条规则是因为它是 “默认的”。但实际上并非如此;它之所以这样使用是因为这是该文件中的第一条规则。可以按照自己希望的方式对其进行命名,不过名字 “default” 是一个很好的选择,因为这对于读者来说意义是显而易见的。记住 makefile 是会由人来阅读的,而不是只由 make 程序来使用的。 通常我们可以说,目标的功能是从其他文件中创建一个文件。实际上并非总是如此。大部分 makefile 都至少有两条规则,它们从来都不会创建目标。请考虑下面的示例规则: 清单 5. 示例伪目标
|