为什么使用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脚本中,让你已经拥有了它。