tags: Makefile Tips

写在前面

我的编辑器默认都是通过空格代替​​Tab​​​缩进的, 这就导致在使用​​Makefile​​时候会出现下面的错误:

makefile:8: *** missing separator.  Stop.

或者:

makefile:7: *** missing separator (did you mean TAB instead of 8 spaces?).  Stop.

一开始看Stack 好像这个问题无解了, 但是后来一个人的回答让我眼前一亮​​1​​​, 在​​gnu make​​​的​​4.2​​版本之后就可以通过一条语句完成空格代替制表位了:

.RECIPEPREFIX := $(.RECIPEPREFIX)<space>

其中​​<space>​​用实际的空格代替, 即可.

在我的MacOS上测试发现, 使用​​xcode​​​自带的​​make​​​并不能支持, 原因是其版本比较低, 还是​​3.81​​​的, 而使用​​brew​​​安装的​​gmake​​​就是​​4.4​​版, 就可以顺利完成制表位到空格的替换了.

下面是一个测试:

.PHONY: all
.RECIPEPREFIX := $(.RECIPEPREFIX)
all: hello world

hello world: foo foo foo bar bar
@echo "== target: $@ =="
@echo $<
@echo $^
@echo $+

foo:
@echo "Hello foo"

bar:
@echo "Hello Bar"

使用​​gmake​​, 输出如下:

Hello foo
Hello Bar
== target: hello ==
foo
foo bar
foo foo foo bar bar
== target: world ==
foo
foo bar
foo foo foo bar bar

ref


  1. ​Can you make valid Makefiles without tab characters? - Stack Overflow​​; ↩︎