在makefile中使用空格缩进的方法

 
Category: Linux-Shell

写在前面

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

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

或者:

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

一开始看Stack 好像这个问题无解了, 但是后来一个人的回答让我眼前一亮, 在gnu make4.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 -f makefile-name, 输出如下:

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