Makefile中空格语法的原理是什么?

22

在伦敦SO DevDay上,Michael Sparks精彩地讲解了Peter Norvig的Python拼写检查器,这促使我重新学习Python。

他强调的一点是Python很干净整洁。不像其他语言为了控制作用域而拥有大量的大括号,Python使用空格来表示代码块的作用域。

这让我想到一个问题:是否正是这种清晰性导致了需要缩进TAB来构建make目标命令所需的命令之间的区分?

同样出于清晰性考虑?以便轻松区分目标和构建目标所需的命令?


1
我总是有点担心重新标记10k+用户...您能否就此帖子提供一些反馈意见?http://meta.stackexchange.com/questions/24030/why-do-they-specify-makefile-tag-instead-of-make/26567#26567 - P Shved
@Pavel,刚刚发布了一个答案。顺便说一句,评论点赞+1。 - Rob Wells
2个回答

53

这段话来自于《Unix编程艺术》一书:

为什么在第一列使用制表符?当时Yacc刚出,Lex更是崭新的工具。我两个都没用过,所以我想这会是一个很好的借口去学习一下。在我的第一次尝试中,我被Lex搞得很糊涂,所以我就使用了一个简单的模式,即换行符加制表符。它起作用了,就一直沿用至今。之后几周,我的用户数量约为十几人,他们大多是我的朋友,我不想破坏我的基础用户群。其余的,就成了历史。
-- Stuart Feldman

3

我认为Makefiles犯了一个错误,坚持使用一个制表符作为缩进。允许使用空格有什么问题?没有精度损失,因为Shell命令无法以空格开头,并且目标行和命令行之间也不会混淆。


@Ned,我同意你的观点。我猜通过使其成为“必须使用制表符!” 我们就不必担心像讨论Pythonic一样的问题了!(-: - Rob Wells
@Ned,我认为Makefile可以接受多个空格,而不仅限于一个TAB字符。 - Rob Wells
2
Makefiles 要求配方行以一个 TAB 开始。在 TAB 后,您可以使用任意数量的其他 TAB 或空格。如果使用任何空白(而不仅仅是 TAB),将会破坏成千上万个 makefile,因为许多 makefile 会使用空格缩进变量赋值或其他非命令行。请注意,GNU make 的较新版本定义了一个名为 .RECIPEPREFIX 的变量,您可以使用它来将配方行引入字符从默认值 (TAB) 更改为其他单个字符。这会使您的 makefile 不太具可移植性,但可能更易读。 - MadScientist

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接