首页 > 解决方案 > 为什么 makefile 的行为不像配方中的 shell 脚本?

问题描述

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

<target> : [dependencies]

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

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

标签: makefilegnu-make

解决方案


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

使用$$而不是的要求$是显而易见的。为 makefile 的每个逻辑行使用单独的 shell 而不是将整个配方传递给单个 shell 的原因不太清楚。它可以以任何一种方式工作,这就是它被选择的方式。

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

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

但事实并非如此。


推荐阅读