Makefile 学习GNUMake的资源?

Makefile 学习GNUMake的资源?,makefile,gnu-make,Makefile,Gnu Make,我正在为一个小项目学习GNUMake。到目前为止,即使是“基本”教程看起来也相当粗糙,我还没有弄清楚makefile语法 有没有人有一些好的资源让初学者熟悉GNUMake?权威指南是 有一本o'reilly的书“使用GNU Make管理项目”,其中有更多的解释。 您也可以使用早期版本,它们没有专门介绍GnuMake,但要薄得多 Make在开发人员中是一个肮脏的秘密——我们没有人理解它,我们只是从其他人那里借用Make脚本并对其进行更改。我想只有一个脚本是从零开始编写的(可能是由该工具的创建者编写

我正在为一个小项目学习GNUMake。到目前为止,即使是“基本”教程看起来也相当粗糙,我还没有弄清楚makefile语法

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

权威指南是
有一本o'reilly的书“使用GNU Make管理项目”,其中有更多的解释。 您也可以使用早期版本,它们没有专门介绍GnuMake,但要薄得多

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


当您需要做比简单示例更多的事情时,大多数人要么切换到更现代的构建系统,如Ant,要么使用Perl/Python/等实现自己的构建系统。

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


但那是多年前的事了。你知道我今天是怎么写的吗?和你描述的一样。它非常精细,语法细节也非常模糊,除非你经常这样做,否则你就记不住细节了。我想,就像任何其他语法不直观、规则古怪的语言一样。

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

目标是您想要构建的东西,但目标下的命令可以是编译器命令或脚本。通常,每个目标都引用代码中的一个模块,但您可以根据自己的项目将其细化

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

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

以下是一些更一般的提示和技巧:

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

    • 我同意奥雷利书的建议


      有关制作的一些有用提示、技巧和见解,请看一下

      我不是GNU信息系统的狂热爱好者,但我发现GNU制作信息页面非常有用。一旦你知道了最基本的概念,大致知道了什么样的东西是可用的,我发现信息页面是引用诸如预构建函数之类的信息的最快方式


      (忘记GNU
      info
      程序,改用例如。)

      将“使用GNU Make管理项目,第三版”置于“GNU免费文档许可证”之下,可以合法地在线免费阅读:。

      我听说Make文件的族谱看起来非常乱伦DI从来没有“滚动”过自己的Perl/Python/ect。用于复杂或“比简单”构建场景的系统。实际上,像Python的SCon这样的构建工具需要大量复杂的代码库。但我同意,你可以通过“借用”别人的make脚本来生存。@Tom-make中的“什么改变了/需要重建”部分不太重要,更多的是用于设置DBs、生成序列号和刻录CD的额外工具,以便为Martin的帖子添加一个示例,对于非常复杂的构建,人们倾向于使用GNU/之类的工具来生成makefile。然而,这更多的是为了使构建可移植和处理依赖项更改,而不是复杂的makefile语法。我不认为有人会切换到autoconf来简化makefile的生成!如果您想要一个MakefileMakerAnything教程,那么Qt qmake/.pro系统非常简单?我理解GNUMake的一般概念,但是makefile语法有点晦涩难懂。对不起,Dana,上面列表中的一些语句是错误的。例如,Makefile和Makefile都是可接受的,make不查找“all”目标。通常,“全部”放在文件的顶部,即全部。另外,命令前面必须有一个制表符,而不是任何字符。我再加上这些corrections@gisenberg. 我在脑海中写下了这一点,但你最好的选择是在谷歌上搜索一些关于Make的学院或大学实验室笔记。那就是