我正在尝试为我正在进行的一个小项目学习 GNUMake。到目前为止,即使是“基本”教程也显得相当粗糙,而且我还没有理解 makefile 语法。

有没有人有一些好的资源可以帮助绝对的初学者熟悉 GNUMake?

有帮助吗?

解决方案

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

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

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

其他提示

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

目标是您想要构建的东西,但目标下的命令可以是编译器命令或脚本。一般来说,每个目标都指代代码中的一个模块,但您可以根据您的项目需要进行细化。

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

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

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

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

“使用GNU Make管理项目,第3版”被置于“GNU自由文档许可证”之下并且可以在线免费在线阅读:链接

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

有关一些有用的提示,技巧和见解请查看 Mr 。制作文章

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

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

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

(忘记GNU info 程序,并使用例如 pinfo 而不是。)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top