gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 04:07:54 26 4
gpt4 key购买 nike

我正在创建一个使用条件 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中怎么会有空格和制表符的区别呢?

最佳答案

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

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

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

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

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

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

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

关于makefile - 何时在 Makefile 中使用空格或制表符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28712585/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com