target: dependencies
command1
command2
在我的系统(Mac OS X)上,make
似乎要求Makefile在每个command
行的内容之前都有一个制表符,否则会引发语法错误。
创建或编辑Makefile时,这是一个烦恼,因为我的编辑器设置为全时空间。
您可以制作没有制表符的有效Makefile吗?
答案 0 :(得分:100)
这是make
的语法奇怪/要求,它与Mac OS X无关。不幸的是,如果你打算使用make
,你无能为力。
编辑:GNU Make现在支持自定义配方前缀。请参阅this answer。
你不是第一个不喜欢make
这方面的人。引用Unix Haters' Handbook:
Dennis的Makefile的问题在于,当他添加注释行时,他无意中在第2行开头的制表符前插入了一个空格。制表符是Makefile语法中非常重要的一部分。所有命令行(在我们的示例中以cc开头的行)必须以制表符开头。在他做出改变后,第2行没有,因此错误。
“那又怎么样?”你问,“这有什么问题?”它本身没有任何问题。只是当你考虑其他编程工具如何在Unix中工作时,使用制表符作为语法的一部分就像是绿色贝雷帽中的一个蹦极陷阱:来自堪萨斯州的可怜孩子就在约翰韦恩前面的行走点并且没有看到行程电线。毕竟,在堪萨斯玉米田里没有值得注意的绊网。个唱!
答案 1 :(得分:48)
有一种令人费解的方法是拥有一个没有标签的有效makefile。
如果您将makefile更改为:
target: dependencies; command1; command2
如果可行的话。如果你想要它在多行上,那么你可以这样做:
target: dependencies; \
command1; \
command2
凌乱,但它确实有效。
答案 2 :(得分:47)
在最初询问此问题以来,已发布GNU Make版本,允许您使用 Tab 以外的其他内容作为前缀字符。 From the mailing list announcement:
新的特殊变量:.RECIPEPREFIX允许您重置配方 从默认(TAB)到其他东西的引入字符。该 此变量值的第一个字符是新配方介绍 字符。如果变量设置为空字符串,则再次使用TAB。 它可以随意设置和重置;食谱将使用值激活时 他们首先被解析了。要检测此功能,请检查$(。RECIPEPREFIX)的值。
此功能已于2010年7月发布的GNU Make 3.82中添加(此问题的原始提问日期后六个月)。由于它已经过了三年而且从那以后发生了变化,其他的Make口味很可能跟随GNU Make。
答案 3 :(得分:30)
如果您的个人资料中有vimrc,您可以添加此行以防止vim更改为空格:
autocmd FileType make setlocal noexpandtab
我也在努力解决这个问题,而且这个问题已经解决了。传播好话!
答案 4 :(得分:14)
答案 5 :(得分:11)
在vim的插入模式下,即使您已设置tab键以插入空格,也可以使用Ctrl-v <TAB>
插入文字选项卡。当然,这不能回答您的问题,但可能是可用方法的替代方法,以避免需要文字标签。
答案 6 :(得分:5)
如果您使用的是EditorConfig,则可以将以下行添加到.editorconfig
文件中,以强制IDE使用制表符缩进而不是Makefile
中的空格:
[Makefile]
indent_style = tab
答案 7 :(得分:4)
直到GNU Make 4.2
.RECIPEPREFIX +=
my comment中对此进行了说明。
自GNU Make 4.3起(于2020年1月19日发布)
+=
运算符的行为已经以向后不兼容的方式changed了。如果左侧操作数的值为空,则不再添加空格。
您可以改用
.RECIPEPREFIX := $(.RECIPEPREFIX)<space>
,其中<space>
是单个空格。尽管$(.RECIPEPREFIX)
被扩展为一个空值,但这不是让GNU Make忽略<space>
所必需的。请注意,即使在版本低于4.3的GNU Make上,此代码也可以使用。
答案 8 :(得分:1)
在ubuntu中:vi Makefiles 用制表符(或其他任何所需的空格)替换空间:
:%s/<space chars>/^I/g
例如,用制表符替换8个空格:
:%s/ /^I/g
请注意: ^ I 用Tab键而不是 ^ 和 I 字符插入:D
答案 9 :(得分:-6)
不便携。某些类型的make绝对需要制表符。选择标签而不是空格的另一个原因是: - )