为什么在shell脚本上使用make?

时间:2010-09-26 15:52:49

标签: shell makefile compilation

让我觉得简单的shell脚本更容易处理命令行参数。

为什么运行make代替./make.sh

是标准的

5 个答案:

答案 0 :(得分:101)

一般的想法是make支持(合理地)最小化重建 - 即,你告诉它你的程序的哪些部分依赖于其他部分。当您更新程序的某些部分时,重建依赖于该程序的部分。虽然可以使用shell脚本执行此操作,但它将是 lot 更多工作(显式检查所有文件上的最后修改日期等)唯一明显的使用shell脚本的替代方案是每次都重建所有内容。对于小型项目,这是一种非常合理的方法,但对于一个大型项目,完全重建可能需要一个小时或更长时间 - 使用make,您可以在一两分钟内轻松完成同样的事情...... / p>

答案 1 :(得分:54)

制作 expert system

使用shell脚本很难做出各种各样的事情......

  • 当然,它检查什么是过时的,以便只构建它需要构建的东西
  • 执行 topological sort 或其他类型的树分析,确定什么取决于构建过时事物的内容和顺序这样每个先决条件都是在每个依赖项之前构建的,并且只构建一次。
  • 这是 declarative programming 的语言。可以添加新元素,而无需将它们合并到命令式控制流程中。
  • 它包含 an inference engine 来处理规则,模式和日期,当与特定Makefile中的规则结合使用时,这就是进入 expert system
  • 它有一个宏处理器。
  • 另请参阅: an earlier summary of make

答案 2 :(得分:7)

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

例如:

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,它只以相反的顺序执行前2个命令。

尝试使用自己的shell脚本完成此操作将涉及大量if/else检查。

答案 3 :(得分:6)

与上面一样,Make是一种声明性(-ish)并行编程语言。

假设您有4,000个要转换的图形文件和4个CPU。尝试编写一个10行的shell脚本(我在这里很慷慨),它可以在使CPU饱和的情况下可靠地完成它。

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

答案 4 :(得分:3)

make handle dependencies:makefile描述它们:二进制文件依赖于目标文件,每个目标文件依赖于源文件和头文件...当make运行时,比较文件的日期以确定需要什么重新编译。

可以直接调用一个目标,不构建Makefile中描述的所有内容。

此外,make语法提供了substitute,vpath

所有这些都可以用shell脚本编写,让你已经拥有它。