为什么使用make shell脚本?

在我看来,只是一个简单的处理命令行参数的shell脚本。

为什么运行make而不是./make.sh是标准的

一般的想法是,支持(合理)最小的重build – 即,你告诉它你的程序的哪些部分依赖于其他部分。 当你更新程序的某个部分时,它只会重build那些依靠它的部分。 虽然你可以使用shell脚本完成这个工作,但是要做更多的工作(明确地检查所有文件的最后修改date等等)。shell脚本唯一明显的select是每次重build所有内容。 对于小型项目来说,这是一个完全合理的方法,但对于一个大项目来说,完整的重build可能需要一个小时甚至更长的时间 – 使用make ,你可能会在一两分钟内轻松完成同样的任务。

Make是一个专家系统

有很多事情是很难用shell脚本做的…

  • 当然,它会检查什么是过时的,以便只构build它需要构build的东西
  • 它执行拓扑sorting或其他types的树分析,它决定什么取决于什么和什么顺序来构build过时的事情,使得每个先决条件都build立在每个依赖之前,并且只build立一次。
  • 这是一种声明性编程语言。 新的元素可以被添加,而不需要将它们合并成命令性的控制stream程。
  • 它包含一个推理引擎,用于处理规则,模式和date,并且在与特定的Makefile中的规则相结合时,这将成为专家系统
  • 它有一个macros处理器。
  • 另见: make的更早的摘要

和上面一样,Make是一个声明式(-ish)并行编程语言。

假设你有4,000个graphics文件可以转换,4个CPU。 尝试编写一个10行的shell脚本(我在这里是慷慨的),这将可靠地做到这一点,同时饱和你的CPU。

也许真正的问题是人们为什么会打扰编写shell脚本。

确保在更改源文件时只重新编译所需的文件。

例如:

 final : 1.o 2.o gcc -o final 1.o 2.o 1.o : 1.c 2.h gcc -c 1.c 2.o : 2.c 2.h gcc -c 2.c 

如果我只更改文件2.h并运行make ,它将以相反的顺序执行所有3个命令。

如果我只更改文件1.c并运行make ,它只会以相反的顺序执行前两个命令。

试图用你自己的shell脚本来完成这个过程将涉及很多if/else检查。

make处理依赖关系:makefile描述它们:二进制文件依赖于对象文件,每个对象文件都依赖于源文件和头文件…当make运行时,比较文件的date以确定需要重新编译的内容。

我们可以直接调用一个目标而不是构buildMakefile中描述的所有东西。

而且,make语法提供了替代,vpath

所有这些都可以写在shell脚本中,让你已经拥有了它。