【问题标题】:Why don't makefiles behave more like shell scripts within recipes?为什么 makefile 的行为不像配方中的 shell 脚本?
【发布时间】:2020-08-11 18:06:41
【问题描述】:

我发现 makefile 非常有用,每个配方的标题

<target> : [dependencies]

很有帮助。在配方中,前缀 @ 和 - 以及自动定义的变量(如 $@ 和 $?)很有用。然而,除此之外,我发现编写实际配方的方式很奇怪而且没有帮助。 StackOverflow 上有很多关于“如何在 makefile 中执行此操作”的问题,这些问题在 bash 中很简单(或至少更熟悉)。

配方内容不只是解释为常规 shell 脚本有什么原因吗?阅读手册页,似乎有许多工具具有与 shell 脚本等效的功能,但语法不同。我最终指定 .ONESHELL 并用 $$ 转义 $,或者有时当我不知道如何使它在 makefile 中工作时,我只是从配方中调用一个脚本。我的问题是这是否只是不幸的设计,还是 makefile 的重要特性迫使它们以这种方式设计?

【问题讨论】:

  • Make 和 bash 都是简洁的语言,但它们的设计根本不同(例如 bash 是程序性的,Make 不是)。在它们之间设计一个不会阻碍任何一个的干净界面是非常困难的。

标签: makefile gnu-make


【解决方案1】:

我真的不知道如何回答你的问题。可能这意味着它并不适合 StackOverflow。

使用$$ 代替$ 的要求是显而易见的。为 makefile 的每个逻辑行使用单独的 shell 而不是将整个配方传递给单个 shell 的原因不太清楚。无论哪种方式都可以,这就是它的选择方式。

它现在的工作方式有一个优点,尽管也许大多数人并不关心它:如果你使用反斜杠换行符继续每一行,你只需要用 TAB 缩进第一行食谱。如果你不使用反斜杠换行符,那么每一行都必须用 TAB 缩进,否则你不知道配方在哪里结束。

如果您的问题是,Stuart Feldman 是否可以做出非常不同的语法决定,从而更容易在 makefile 中编写长/复杂的配方,那么可以肯定。选择一个比$ 更晦涩的字符作为变量引入器会减少转义的数量(尽管shell 脚本在某处使用了几乎所有特殊字符,所以“减少”是你能做的最好的)。为菜谱选择一个明确的“开始/停止”字符序列会使编写长菜谱变得更简单,但可能会牺牲一些可读性。

但事实并非如此。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-16
    • 2020-12-14
    • 1970-01-01
    相关资源
    最近更新 更多