何时在Makefile中使用空格或制表符?

时间:2015-02-25 06:27:06

标签: makefile

我正在创建一个使用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中,空格和制表符有区别?

1 个答案:

答案 0 :(得分:16)

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

Recipes(运行编译器,echo等的命令)是用shell脚本语法编写的。

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

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

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

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

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