【问题标题】:When to use space or tab in Makefile?何时在 Makefile 中使用空格或制表符?
【发布时间】:2015-02-25 06:27:05
【问题描述】:

我正在创建一个使用条件 if 和 ifneq 的 makefile。 我注意到如果我使用 if,下一行应该用空格缩进。

if [-d "$$d" ]; then
<space><space><space> echo "file found";
fi;

但如果我使用 ifneq 命令,下一行必须用制表符缩进。

ifneq ($(strip $(USE_FILE)),NO)
<tab>echo "file not to be used"
endif

空格和制表符根本不重要。但是makefile怎么进来的,空格和tab有区别呢?

【问题讨论】:

    标签: makefile


    【解决方案1】:

    您必须了解,makefile 实际上是用两种完全不同的“语言”编写在一个文件中的。

    菜谱(运行编译器、回显等的命令)是用 shell 脚本语法编写的。

    配方中不是的其余部分是用makefile语法编写的。

    为了让 make 区分食谱和非食谱的东西,它使用 TAB 字符。因此,以 TAB 开头的行被假定为配方的一部分(因此它们是 shell 脚本并传递给 shell 进行解析),而不以 TAB 开头的行 不能 成为配方的一部分配方(所以它们不能是 shell 脚本:它们必须是 make 语法)。

    在您的示例中,if [ -d ... 是 shell 语法。如果它出现在 makefile 中,则它必须是配方的一部分,因此必须以 TAB 开头;如果 make 试图将其解释为 makefile 语法,那将是一个错误。 ifneq 是 makefile 语法:如果 shell 尝试将其解释为 shell 脚本,则会出现语法错误,因此它不能成为配方的一部分,并且必须 NOT 以 TAB 开头。

    缩进的所有其他用途都是可选且不相关的(例如,在上面的第一个示例中,您说“下一行应该用空格缩进”;这只是一个约定,无论您是否使用,脚本都将以完全相同的方式工作完全缩进)。

    现在,有一些细节变得棘手:反斜杠转义换行符、规则上下文等,但如果你坚持所有配方行都用 TAB 缩进并且没有非配方行用 TAB 缩进的规则,你会没事的。

    【讨论】:

    • 并且通过设置 make SHELL 变量,您可以选择让配方由与标准系统 shell 完全不同的程序解释,并用完全不同的语言编写配方。不过,配方仍然必须使用 TAB 缩进!
    • 从 GNU make 3.82 开始,您可以使用 .RECIPEPREFIX 变量将配方前缀的值从 TAB 更改为任何其他(单个)字符。
    猜你喜欢
    • 2021-04-15
    • 1970-01-01
    • 2020-08-02
    • 1970-01-01
    • 2015-02-08
    • 2011-03-06
    • 2016-05-02
    • 2011-10-05
    • 2017-07-29
    相关资源
    最近更新 更多