16

我正在尝试为我正在从事的一个小项目学习 GNUMake。到目前为止,即使是“基本”教程看起来也很粗糙,我还没有理解 makefile 的语法。

有没有人有一些好的资源让绝对初学者熟悉 GNUMake?

4

6 回答 6

15

权威指南是http://www.gnu.org/software/make/manual/make.html
有一本 o'reilly 书“使用 GNU Make 管理项目”有更多解释。您也可以使用早期版本,它们没有专门涵盖 GnuMake,但更薄。

Make 在开发人员中是一个肮脏的秘密——我们没有人理解它,我们只是从别人那里借了一个 make 脚本并更改它。我想只有一个脚本是从头开始编写的(可能是由该工具的创建者编写的)。

当您需要做的不仅仅是简单的示例时,大多数人要么切换到更现代的构建系统,如 Ant,要么在 Perl/Python/etc 中推出自己的构建系统。

于 2008-10-20T22:32:23.663 回答
4

make 最常用的功能可以分解为几个简单的概念、目标、依赖项和变量。

目标是您要构建的东西,但目标下的命令可以是编译器命令或脚本。通常,每个目标都指代代码中的一个模块,但您可以根据您的项目使这些目标更细化。

依赖项是项目中的文件或其他目标。最好的例子是一个 C 项目,你从一堆目标文件中构建一个二进制文件。在构建二进制文件之前,每个目标文件都需要存在,因此 make 将遍历您的目标,直到完成所有依赖项,然后为整个目标运行命令。

变量并不总是必需的,但对于处理编译器标志之类的东西非常方便。典型的示例是 CC 和 CCFLAG,它们将引用您使用的编译器,即 gcc 和 -ansi -Wall -o2 等标志。

一些更一般的提示和技巧:

  • 命令必须以 [tab] 字符开头,否则将不会执行,这只是 make 的旧遗物,我不记得为什么会这样。
  • 按照惯例,您可能希望包含一个 all 目标来指定默认值,哪个目标应该是默认值。当您有一个复杂的 makefile 并且有一个您总是希望成为默认目标的特定目标时,这很有用。
  • 你的 makefile 应该叫做 makefile 或 Makefile,但是如果你想叫它别的名字,使用 $make -f [makefilename]
  • 始终使用完整的变量扩展语法,即 $(VARIABLE) 或 make 可能不会输出您想要的命令。
  • make 可以递归地工作,因此如果您的项目中有一堆子模块位于目录中,您可以在 make 中调用子目录 makefile 上的 make 来构建每个子模块。
  • 如果您有一个需要安装脚本等的非常复杂的项目,您可能还想研究自动工具,它会为您生成 makefile 并执行一系列技巧来检查库的存在和其他可移植性问题。
于 2008-10-20T22:59:17.930 回答
4

“使用 GNU Make 管理项目,第 3 版”属于“GNU 自由文档许可证”,可以合法免费在线阅读:链接

于 2015-06-25T21:10:15.447 回答
2

我同意 O'Reilly 的书建议。

有关 Make 的一些有用提示、技巧和见解,请查看Mr. Make 文章

于 2008-10-20T23:21:56.667 回答
0

mgb:那更糟。我曾经从头写过一个复杂的 make 系统(几千个文件,五十或一百个目录,四五个编译器和交叉编译目标,2 个操作系统等)。我坐下来学习了从里到外的 gnu make,设计了系统,首先玩了一个原型。我们都对结果非常满意。

但那是几年前的事了。你知道我今天是怎么写的吗?和你描述的一样。它足够繁琐,语法细节也足够模糊,除非你经常这样做,否则你无法记住细节。就像任何其他具有非直观语法和一些古怪规则的语言一样,我猜。

于 2008-10-20T22:50:19.507 回答
0

我不是 GNU 信息系统的忠实粉丝,但我发现 GNU 制作信息页面非常有用。一旦您了解了非常基本的概念以及大致有哪些可用的东西,我发现信息页面是引用诸如预建函数之类的信息的最快方式。

(忘记 GNUinfo程序,改用 eg pinfo。)

于 2012-07-06T04:37:21.890 回答