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

Hob*_*Ben 102 shell makefile compilation

在我看来,简单的shell脚本更容易处理命令行参数.

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

Jer*_*fin 111

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


Dig*_*oss 58

Make是一个专家系统

shell脚本很难做到各种各样的事情......

  • 当然,它会检查什么是过时的,以便只构建它需要构建的内容
  • 它执行拓扑排序或其他类型的树分析,确定什么取决于构建过时事物的内容和顺序,以便在每个依赖项之前构建每个先决条件,并且只构建一次.
  • 它是声明性编程的语言.可以添加新元素,而无需将它们合并到命令式控制流中.
  • 它包含一个处理规则,模式和日期的推理引擎,当与特定Makefile中的规则结合使用时,它就变成了专家系统.
  • 它有一个宏处理器.
  • 另见:早期的make摘要.

  • 这是我第一次遇到被描述为专家系统的 Make。作为构建专家系统的人,这不是我会考虑的事情。Make 显然有一个推理引擎来推断如何通过 makefile 中指定的声明性规则构建程序,但它是一个基于知识的系统不太明显,因为(叶)规则是要执行的 shell 命令而不是事实。“专家系统”一词用于指已成功获取世界级专家专业知识的系统,但事实并非如此。陪审团对我来说还没有定论。 (3认同)
  • 不过,它作为专家系统非常有限.例如,每个推理只能使用相同的规则一次. (2认同)
  • ...我认为使用Shell脚本制作文件的麻烦类似于使用JavaScript编写CSS的麻烦。执行每个节点的时间顺序几乎不是那么明显。尽管至少使用Makefile,您仍然可以看到实际的shell命令。使用CSS甚至可以将其抽象化。 (2认同)

小智 8

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

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

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

  • 是的,您正在将总线性排序放松为更像树的排序。 (2认同)

小智 7

Make确保在对源文件进行更改时仅重新编译所需的文件.

例如:

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
Run Code Online (Sandbox Code Playgroud)

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

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

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


phi*_*ant 5

make 处理依赖关系:makefile 描述了它们:二进制文件依赖于目标文件,每个目标文件依赖于源文件和头文件...运行 make 时,会比较文件的日期以确定需要重新编译的内容。

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

此外,make 语法提供替换、vpath

所有这些都可以用 shell 脚本编写,用 make 你就已经拥有了。