我正在创建一个使用条件 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 的其余部分是not配方中是用 makefile 语法编写的。
为了让 make 能够区分配方和非配方的内容,它使用制表符。因此,以 TAB 开头的行被假定为配方的一部分(因此它们是 shell 脚本并传递到 shell 进行解析),以及不以 TAB 开头的行cannot是配方的一部分(因此它们不能是 shell 脚本:它们必须是 make 语法)。
在你的例子中,if [ -d ...
是 shell 语法。如果它出现在 makefile 中,它必须是配方的一部分,因此前面必须有一个 TAB;如果 make 尝试将其解释为 makefile 语法,则会出现错误。ifneq
是 makefile 语法:如果 shell 尝试将其解释为 shell 脚本,则会出现语法错误,因此它不能是配方的一部分,并且必须NOT前面有一个 TAB。
缩进的所有其他用途都是可选且无关的(例如,在上面的第一个示例中,您说“下一行应该用空格缩进”;这只是一个约定,无论您是否将其缩进,脚本都会以完全相同的方式工作全部)。
现在,有一些细节变得棘手:反斜杠转义的换行符、规则上下文等。但是如果您坚持所有配方行都用 TAB 缩进并且没有非配方行都用 TAB 缩进的规则,那么您'会没事的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)