为什么 makefile 的行为不像食谱中的 shell 脚本?
Why don't makefiles behave more like shell scripts within recipes?
我发现 makefile 非常有用,每个食谱的 header
<target> : [dependencies]
很有帮助。在菜谱中,前缀 @ 和 - 以及 automatically-defined 变量(如 $@ 和 $?)很有用。然而,除此之外,我发现对实际配方进行编码的方式很奇怪而且没有帮助。 Whosebug 上有很多关于“如何在 makefile 中执行此操作”的问题,用于在 bash.
中做一些简单(或至少更熟悉)的事情
食谱内容不只是解释为常规 shell 脚本有什么原因吗?阅读手册页,似乎有许多工具具有与 shell 脚本相同的功能,但语法不同。我最终指定 .ONESHELL 并用 $$ 转义 $,或者有时当我无法弄清楚如何使它在 makefile 中工作时,只是调用配方中的脚本。我的问题是,这是否只是不幸的设计,还是 makefile 的某些重要特性迫使它们以这种方式设计?
我真的不知道怎么回答你的问题。可能这意味着它不太适合 Whosebug。
使用 $$
而不是 $
的要求是显而易见的。对 makefile 的每个逻辑行使用单独的 shell 而不是将整个配方传递给单个 shell 的原因不太清楚。它可以以任何一种方式工作,这就是它被选择的方式。
它现在的工作方式有一个优点,尽管可能大多数人并不关心它:如果您使用反斜杠换行符来继续每一行,则只需使用 TAB 缩进第一行食谱。如果你不使用反斜杠换行,那么每一行都必须用 TAB 缩进,否则你不知道配方在哪里结束。
如果您的问题是,Stuart Feldman 是否可以做出非常不同的语法决定,从而使在 makefile 中编写 long/complex 配方更容易,那么当然可以。选择一个比 $
更晦涩的字符作为变量引入器会减少转义的数量(尽管 shell 脚本在某处几乎使用了每个特殊字符,所以“减少”是你能做的最好的)。为菜谱选择明确的“start/stop”字符序列将使编写长菜谱变得更简单,但可能会牺牲一些可读性。
但事实并非如此。
我发现 makefile 非常有用,每个食谱的 header
<target> : [dependencies]
很有帮助。在菜谱中,前缀 @ 和 - 以及 automatically-defined 变量(如 $@ 和 $?)很有用。然而,除此之外,我发现对实际配方进行编码的方式很奇怪而且没有帮助。 Whosebug 上有很多关于“如何在 makefile 中执行此操作”的问题,用于在 bash.
中做一些简单(或至少更熟悉)的事情食谱内容不只是解释为常规 shell 脚本有什么原因吗?阅读手册页,似乎有许多工具具有与 shell 脚本相同的功能,但语法不同。我最终指定 .ONESHELL 并用 $$ 转义 $,或者有时当我无法弄清楚如何使它在 makefile 中工作时,只是调用配方中的脚本。我的问题是,这是否只是不幸的设计,还是 makefile 的某些重要特性迫使它们以这种方式设计?
我真的不知道怎么回答你的问题。可能这意味着它不太适合 Whosebug。
使用 $$
而不是 $
的要求是显而易见的。对 makefile 的每个逻辑行使用单独的 shell 而不是将整个配方传递给单个 shell 的原因不太清楚。它可以以任何一种方式工作,这就是它被选择的方式。
它现在的工作方式有一个优点,尽管可能大多数人并不关心它:如果您使用反斜杠换行符来继续每一行,则只需使用 TAB 缩进第一行食谱。如果你不使用反斜杠换行,那么每一行都必须用 TAB 缩进,否则你不知道配方在哪里结束。
如果您的问题是,Stuart Feldman 是否可以做出非常不同的语法决定,从而使在 makefile 中编写 long/complex 配方更容易,那么当然可以。选择一个比 $
更晦涩的字符作为变量引入器会减少转义的数量(尽管 shell 脚本在某处几乎使用了每个特殊字符,所以“减少”是你能做的最好的)。为菜谱选择明确的“start/stop”字符序列将使编写长菜谱变得更简单,但可能会牺牲一些可读性。
但事实并非如此。