学习GNUMake的资源?

时间:2008-10-20 22:27:52

标签: makefile gnu-make

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

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

6 个答案:

答案 0 :(得分:13)

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

Make是开发人员之间的一个肮脏的秘密 - 我们都不理解它,我们只是从其他人那里借用一个make脚本并进行更改。我想只有一个脚本是从头开始编写的(可能是工具的创建者)。

当你需要做的不仅仅是简单的例子时,大多数人都会切换到像Ant这样的更现代的构建系统,或者在Perl / Python /等中自行编译。

答案 1 :(得分:3)

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

目标是您要构建的内容,但目标下的命令可以是编译器命令或脚本。通常,每个目标都指代代码中的一个模块,但您可以根据需要将这些模块制作成适合您项目的模块。

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

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

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

  • 命令必须由[tab]字符继续,否则它们不会被执行,这只是make的遗留物,我不记得为什么会这样。
  • 按照惯例,您可能希望包含一个所有目标以指定默认哪个目标应该是默认目标。当你有一个复杂的makefile并且你总是想要一个特定的目标时,这很有用。
  • 您的makefile应该被称为makefile或Makefile,但如果您想将其称为其他内容,请使用$ make -f [makefilename]
  • 始终使用完整的可变扩展语法,即$(VARIABLE)或make可能无法输出您想要的命令。
  • make可以递归工作,所以如果你的项目中有一堆子模块存在于目录中,你可以在make中的子目录makefile上调用make来构建每个子模块。
  • 如果你有一个非常复杂的项目需要安装脚本等,你可能还想调查为你生成makefile的autotools,并做一堆技巧来检查库是否存在以及其他可移植性问题。

答案 2 :(得分:3)

"使用GNU Make管理项目,第3版"被置于" GNU自由文档许可证"并且可以免费在线合法阅读:link

答案 3 :(得分:2)

我赞同O'Reilly的书籍建议。

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

答案 4 :(得分:0)

mgb:那更糟糕的是。我曾经从头开始编写一个复杂的make系统(几千个文件,五十或一百个目录,四个或五个编译器和交叉编译目标,两个OS等)。我坐下来,先了解内外的gnu make,设计了系统,首先使用原型。我们对结果非常满意。

但那是多年前的事了。你知道我今天怎么写的吗?你描述的方式相同。它只是非常繁琐,语法细节也不够明显,除非你经常这样做,否则你不记得细节了。就像任何其他使用非直观语法和一些古怪规则的语言一样,我想。

答案 5 :(得分:0)

我不是GNU信息系统的忠实粉丝,但我发现GNU make info页面非常有用。一旦你知道了非常基本的概念和大致可用的东西,我发现信息页面是引用信息的最快方式,例如预建函数。

(忘记GNU info计划,然后使用例如pinfo。)