make

编辑
本词条由“匿名用户” 建档。
make 是一个构建管理工具,它根据条件执行命令。 它主要作为编程工具用于软件开发中。 例如,它用于自动控制由许多不同的源代码文件组成的项目中的所有工作步骤(翻译、链接、复制文件等),直至完成的可执行程序。 但是,make 的设计非常灵活,它还可以控制文件的时间依赖性发挥作用的任何其他任务。 make 实用程序是 POSIX 标准的一部分,目前称为 IEEE Std 1003.1,...

make 是一个构建管理工具,它根据条件执行命令。 它主要作为编程工具用于软件开发中。

例如,它用于自动控制由许多不同的源代码文件组成的项目中的所有工作步骤(翻译、链接、复制文件等),直至完成的可执行程序。 但是,make 的设计非常灵活,它还可以控制文件的时间依赖性发挥作用的任何其他任务。

make 实用程序是 POSIX 标准的一部分,目前称为 IEEE Std 1003.1, 2008 Edition(相当于 Single UNIX Specification V3, SUSv3)。

解释

编辑

make 读取一个所谓的 Makefile(注意大小写,这在 Unix 文件系统中是不同的),其中程序编译过程的依赖关系被形式化。 这种形式化描述了哪些源文本文件编译器或其他程序以何种方式处理哪些目标文件或结果,或者哪些目标文件由链接器链接到程序库或可执行程序。 所有步骤都是根据 Makefile 中记录的依赖项完成的。

当 Makefile 由 make 程序处理时,如果源文件比结果文件的现有版本更新,或者没有可用的结果文件,则源文件仅转换为目标文件。 在开发包含许多源文件和许多可执行程序的大型程序包时,这消除了重新编译许多小改动的需要。 这种经济措施的成功取决于正确指定文件依赖性。 Makefile 中必须完整且正确地描述所有依赖项——这在大型项目中实现起来并不容易。 可能会出现新的依赖关系,尤其是在程序更改或扩展时。 这些依赖项必须输入到 Makefile 中才能正常运行。 在 80 年代初期,mkmf 或 makedepend 等实用程序被广泛用于此目的。 自 20 世纪 80 年代中期以来,make 程序已经集成了自动生成依赖列表的方法(例如在 SunPro make 中),并且 makefile 已经集成了生成它们的规则。

make 运行的命令不限于编译器或链接器。 命令行解释器提供的任何工具都可用于实现所需的文件操作。 所以你可以 自动从文本生成图像。

make 已经在软件开发的大领域确立了自己的地位,但直到 20 世纪 80 年代中期才出现问题——尤其是对于大型项目——(只要所有依赖规则的自动生成没有得到解决)(参见文献)。 因此,反复尝试寻找和建立继任者(见备选方案)。

原则

编辑

创建文件在 Makefile 中称为目标。 条目中描述了此的边界条件。

例子:

A: B C cmd_A

这一行的意思是:目标 A 依赖于源 B 和 C(“依赖于”通常意味着“将从中创建”)。 如果要创建 A,则考虑 B 和 C。 如果其中一个比 A 年轻,则运行 cmd_A 以重建 A。 如果 A 比 B 和 C 年轻,则 A 被认为是当前的,因此不执行 cmd_A。

B 或 C 作为 A 的来源现在可以反过来成为进一步制定法规的目标:

B:DE cmd_B

首先考虑A。 由于 A 依赖于 B,因此在对 A 采取进一步行动之前会考虑 B。 总体而言,这描述了向后执行指令。 起点是最终目标 A。这种考虑必须以可用的来源结束,并且没有进一步的形成规定。 这些是整代人的实际来源。 如果找不到来源,但也没有找到形成规则,制造商只能回复错误信息:不知道如何制造.... 此类错误的原因可能是 Makefile 中的错误或实际缺少源代码。

推导规则定义: 上式中,A、B等可以是带目录信息的命名文件。 但是,也可以通过指定文件扩展名来定义通用规则:

.co: $(CC) $(CFLAGS) -c -o $@ $<;

在上面的例子中有一个所谓的推理规则,它是以后缀规则的形式写成的。

示例生成文件

编辑

现在的示例仅显示了最简单的 makefile 形式。 还有方法比如使 Makefile 更强大的模式规则。

程序 prog 将从两个源文件 foo.c 和 bar.c 生成,如果只更改两个源文件之一,则需要尽可能少的编译和链接过程。

全局变量在前两行定义,其中包含编译器和链接器的程序名称。 第4行在Makefile中定义了一个跳转标签,叫做targets; 表达式 foo.o 和 bar.o 首先按指定顺序调用第 7 行和第 10 行中定义的目标,然后最终执行第 5 行中的命令。 在第 5 行,一个命令由全局变量 LD 和一些参数组成。 foo.o 和 bar.o 这两个文件可用,因为创建这些文件的其他两个目标已经执行。 下一行表明 foo.o 是从 foo.c 生成的,在第八行通过调用 C 编译器 cc。 最后两行是类似的。

跳转标签的名称与其下处理的文件之间没有强制联系。 在跳转标签下执行的语句总是以水平制表符开头。

该过程使用 make prog 在命令行上启动。 如果没有指定参数,make 运行xxx个定义的目标(这里是 prog)。 所以在上面的例子中,make 和 make prog 有同样的效果。

申请

编辑

如果没有 make 或类似工具,很难想象大型程序和程序包的开发,它们由许多单独的源文本文件组成,并且依赖于单独的库。 在开源世界中,一个项目的源代码与它的 Makefile 一起发布是很常见的,以简化编译软件。

近期发展

编辑

特别是对于较大的程序,Makefile 并不总是由开发人员直接编写,而是使用不同的程序根据更简单的规则创建,或者使用更强大的系统。 自动生成复杂 makefile 的一种方法是使用预处理器,例如 GNU autotools(autoconf 和 automake)或 mkmf、qmake 或 CMake。 降低 Makefile 复杂性的方法基于更强大的系统,例如 David Korn 的 nmake 程序。 该系统允许 makefile 简单地列出表中涉及的源文件。

make构建管理工具

make 命令的替代方法

编辑

GNU Make(简称gmake)通常用于Linux,Windows有nmake。 nmake 由 AT&T 编写,作为 UNIX-make 的继承者,它允许简单的表格 makefile。

尽管 makepp 也是 GNU make 的衍生产品,但它还提供了一个集成的可扩展命令和包括自动检测隐式依赖项的解析器。 还可以识别更改的命令选项和类似的一般条件。 可以优雅地规避递归的大 make 问题以保证正确的构造。 此外,Perl 可以在各个层次上集成。mk(9 号计划下)也是从 make 发展而来,但朝着简化的方向发展。SConsPython 实现的跨平台系统,比 make 有许多改进。 还集成了 automake/autoconf 的一些特性。 它的优势在于 Python 编程语言的全部功能可以在名为“SConstruct”的 makefile 中使用。基于 Apache Ant 和 Apache MavenXML 的系统具有相同的目的,可以使用 Java 进行扩展。Vesta 是一个 SCM带有内置构建工具的工具。来自 Boost 库的 Jamein 构建工具,C++ 标准库对 C++ 编程语言的扩展。创建计算机程序,类似于 make 或 Ant。除了创建过程的经典自动化之外,它还允许您查找、下载、安装、修改和调试计算机程序。 A-A-P 具有与 CVS 的集成连接。

内容由匿名用户提供,本内容不代表vibaike.com立场,内容投诉举报请联系vibaike.com客服。如若转载,请注明出处:https://vibaike.com/364252/

(10)
词条目录
  1. make
  2. 解释
  3. 原则
  4. 示例生成文件
  5. 申请
  6. 近期发展
  7. make 命令的替代方法

轻触这里

关闭目录

目录