学习GNUMake的资源?

16

我正在尝试学习GNUMake,为我正在进行的一个小项目做准备。目前为止,即使是“基础”教程也显得相当困难,我还没有理解makefile语法。

有没有什么好的资源可以帮助绝对初学者熟悉GNUMake呢?

Translated text:

我正在尝试学习 GNUMake,以便为我正在进行的小型项目做准备。到目前为止,即使是“基础”的教程也似乎非常复杂,我还无法理解 makefile 语法。

是否有一些适合绝对初学者的良好资源,可以帮助他们熟悉 GNUMake 呢?

6个回答

16

《GNU Make手册》是权威指南,网址为http://www.gnu.org/software/make/manual/make.html
此外还有一本 O'Reilly 出版的书《使用GNU Make管理项目》,内容更详细。 早期版本也可以使用,虽然没有特别针对 GNU Make,但内容较为精简。

Make 是开发者们的秘密武器——我们都不太理解它,只会从别人那里借用一个 make 脚本并进行修改。我想只有少数人写过完全原创的脚本(可能是该工具的创建者)。

当需要完成比简单例子更多的任务时,大部分人要么转向更现代化的构建系统如 Ant,要么自己使用 Perl/Python 等语言编写构建系统。


我曾听说,一个Makefile的家谱看起来会很乱。 :D - Gabriel Isenberg
1
我从未听说过有人为复杂或“不仅仅是简单”的构建场景“滚动”他们自己的Perl/Python等系统。实际上,像Python的SCon这样的构建工具在处理非常大的复杂代码库时会失败。但我同意你可以通过“借用”其他人的make脚本来解决问题。 - Tom
@Tom - 不是因为 make 的“有什么变化/需要重建”的部分,而是因为它提供了额外的工具来设置数据库、生成序列号和刻录 CD。 - Martin Beckett
为了给马丁的帖子添加一个例子,在构建非平凡复杂度的项目时,人们倾向于使用像GNU Autoconf/Automake这样的工具来生成makefile。然而,这更多是为了使构建可移植并处理依赖关系变化,而不是为了处理makefile语法的复杂性。 - Dana the Sane
我认为没有人会转向autoconf来简化makefile的制作!如果你想要一个makefile生成器,Qt qmake/.pro系统非常简单。 - Martin Beckett

4
"

使用GNU Make管理项目,第三版"是根据"GNU自由文档许可证"发布的,可以合法地免费在线阅读:链接

"

4
make 最常用的功能可以分解成几个简单的概念,目标、依赖和变量。
目标是你想要构建的内容,但目标下面的命令可以是编译器命令或脚本。通常每个目标都对应着代码中的一个模块,但你可以根据项目需要将其细分为更小的部分。
依赖是你的项目中的文件或其他目标。最好的例子是 C 项目,其中你正在从一堆对象文件中构建一个二进制文件。在构建二进制文件之前,每个对象文件都必须存在,因此 make 将遍历你的目标,直到所有依赖项都已完成,然后运行整个目标的命令。
变量并不总是必需的,但对于处理编译器标志等事情非常方便。典型的示例是 CC 和 CCFLAGs,它们将引用你使用的编译器,例如 gcc,以及像-ansi -Wall -o2 这样的标志。
还有一些通用的技巧:
- 命令必须以 [tab] 字符开头,否则它们将不会被执行。这只是 make 的一个旧习惯,我不记得为什么了。 - 按照惯例,你可能希望包含一个 all 目标来指定默认的目标。当你有一个复杂的 makefile 时,这非常有用,因为你总是希望特定的目标成为默认值。 - 你的 makefile 应该被称为 makefile 或 Makefile,但如果你想给它取其他名字,请使用 $make -f [makefilename]。 - 始终使用完整的变量扩展语法,即 $(VARIABLE),否则 make 可能无法输出你想要的命令。 - make 可以递归工作,因此如果你的项目中有许多子模块位于目录中,你可以在 make 中调用子目录 makefile 来构建每个子模块。 - 如果你有一个非常复杂的项目需要安装脚本等,你可能还需要研究 autotools,它会为你生成 makefile,并执行一些检查库存在性和其他可移植性问题的技巧。

有没有任何类似教程的东西可以提供?我理解GNUMake的一般概念,但是makefile的语法有点晦涩。 - Gabriel Isenberg
很抱歉,Dana,但上面列表中的几个语句是错误的。例如,Makefile和makefile都是可以接受的,而make不会寻找“all”目标。通常,“all”放在文件顶部,仅此而已。此外,命令必须以制表符而不是任何字符开头。 - Account deleted
注意,Jeff的HTML清理器吃掉了我的制表符注释。我会添加这些更正。 - Dana the Sane
@gisenberg。我是凭记忆写的,但你最好去谷歌上搜索一些大学实验室关于Make的笔记。那是我学习的地方,如果没有人写出一个非常好的概述,我会感到惊讶的。 - Dana the Sane

2

我同意使用O'Reilly书籍进行学习参考。

如果想要了解一些有用的技巧、诀窍以及关于Make的见解,请查看Mr. Make文章


0

mgb: 更糟糕的是,我曾经从零开始编写过一个复杂的make系统(几千个文件,五十到一百个目录,四到五个编译器和交叉编译目标,两个操作系统等)。我坐下来先彻底学习了gnu make,设计了系统,并先尝试了原型。我们都对结果非常满意。

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


我们放弃了,用Python编写了自己的简单系统,它必须在Windows/Linux/Sparc上构建,比试图理解make更容易。 - Martin Beckett
我曾考虑过这个问题,但是一旦我理解了make,它并不那么糟糕。当时还没有Python和Ruby,我想我可能会使用早期的Perl。 - simon

0

我不是 GNU 信息系统的忠实拥护者,但我发现 GNU make 信息页面非常有用。一旦您了解了基本概念和可用的大致内容,我发现 info 页面是查找预构建函数等信息最快捷的方式。

(忘记 GNU info 程序,改用 pinfo 等其他选项。)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接