你可以使没有制表符的有效的Makefiles?

target: dependencies command1 command2 

在我的系统(Mac OS X)上,似乎要求Makefiles在每个command行的内容之前都有一个制表符,否则会引发语法错误。

创build或编辑Makefiles时,这是一个烦恼,因为我的编辑器设置为全空白。

你可以使没有制表符的有效的Makefiles?

这是一个语法怪异/要求,它与Mac OS X没有任何关系。不幸的是,如果你打算使用make ,那么你无能为力。

编辑 :GNU Make现在支持一个自定义的配方前缀。 看到这个答案 。

你不是第一个不喜欢这个方面的人。 引用Unix Haters的手册 :

Dennis的Makefile的问题是,当他添加注释行时,他无意中在第2行开头的制表符之前插入了一个空格。制表符是Makefiles语法的一个非常重要的部分。 所有的命令行(在我们的例子中以cc开头的行)必须以选项卡开始。 在他做出改变之后,第二行没有发生错误。

“那又怎么样?”你问,“那有什么问题?

它本身没有什么不妥。 只是,当你考虑其他编程工具在Unix上的工作方式时,使用制表符作为语法的一部分,就像“绿色贝雷帽”中那些蹦极陷阱之一:来自堪萨斯州的可怜的孩子是约翰·韦恩面前的走路点,不要看旅行线。 毕竟,在堪萨斯州的玉米田里没有旅行线路。 开个唱!

有一个令人费解的方式有一个有效的生成文件没有选项卡。

如果你把你的makefile改成:

 target: dependencies; command1; command2 

如果能工作。 如果你想要多于一行,那么你可以这样做:

 target: dependencies; \ command1; \ command2 

凌乱,但它的作品。

自从这个问题最初被问到的时候,GNU Make的一个版本已经发布了,它允许你使用Tab以外的东西作为前缀字符。 从邮件列表公告 :

新的特殊variables:.RECIPEPREFIX允许您将配方介绍字符从默认(TAB)重置为其他。 这个variables值的第一个字符是新配方引入字符。 如果variables设置为空string,则再次使用TAB。 可以随意设置和重置; 食谱将在首次分析时使用活动值。 要检测此function,请检查$(。RECIPEPREFIX)的值。

这个特性是在2010年7月发布的GNU Make 3.82(在这个问题的原始提出date之后的六个月)中添加的。 由于它已经有三年了,而且从那以后就有了变化,所以其他Make口味可能跟随了GNU Make。

如果你的configuration文件中有一个vimrc,你可以添加这一行来防止vim改变为空格:

 autocmd FileType make setlocal noexpandtab 

我也一直在为此而苦苦挣扎,这为我修好了。 传播好词!

在vim的插入模式下,即使已经设置了tab键来插入空格,也可以使用Ctrl-v <TAB>插入一个文字标签。 这当然不能回答你的问题,但可能是可用的方法的替代方法,以避免需要文字标签。

这对我来说,如果你想使用空格

 .RECIPEPREFIX += 

如果使用的是EditorConfig ,则可以.editorconfig添加到.editorconfig文件中,以强制IDE使用制表符缩进而不是Makefile的空格:

 [Makefile] indent_style = tab 

不便携。 某些口味的制作绝对需要制表符。 偏好空格的另一个原因是:-)