在Makefile $(info ...)中使用制表符

时间:2018-12-19 22:54:08

标签: makefile

我想为制表文件中的stdout文本专门添加标签。我尝试过将制表符直接放置在文本中以及使用\ t命令,但都无法正常工作。

我总是可以在空格处实现相同的效果,但这很烦人。

$(info test text with tabs)

选项卡在输出中被完全删除

$(info \ttest text)

成为:输出中显示“ \ ttest text”

是否有合理的方法来做到这一点?我知道我可以做到

@echo -e "\tNow the tabs work!"

但是我试图摆脱使用回声。

谢谢

编辑:

我错用空格了-就像插入的制表符一样,空格只会在输出中被删除。

1 个答案:

答案 0 :(得分:2)

make在将字符串用作各种命令或语句的参数之前先剥离字符串。因此,让我们首先定义一个不包含任何内容的变量,使用它定义一个包含制表符的变量,并在需要时使用该变量:

$ cat Makefile
NULL :=
TAB  := $(NULL)<tab>$(NULL)

all:
    $(info X$(TAB)X)

$ make
X    X
make: 'all' is up to date.

我使用<tab>来显示制表符必须去的地方。当然,请使用真实的制表符。请注意,仅NULL就足以满足您的需求:

$ cat Makefile
NULL :=

all:
    $(info $(NULL)<tab>X)

$ make
    X

但是拥有一个TAB变量也许更方便。

还要注意,make变量的名称可能很奇怪。如果您更喜欢命名变量\t而不是TAB,则可以:

$ cat Makefile
NULL :=
\t   := $(NULL)<tab>$(NULL)

all:
    $(info X$(\t)X)

$ make
X    X
make: 'all' is up to date.

您甚至可以为行尾定义\n

$ cat Makefile
NULL :=
\t   := $(NULL)<tab>$(NULL)
define \n


endef

all:
    $(info X$(\t)X$(\n)Y$(\t)Y)

$ make
X    X
Y    Y
make: 'all' is up to date.

GNU make manual中可以找到在define-endef中需要两个空行的原因:

  

普通分配中的值不能包含换行符;但是   分隔定义中值行的换行成为一部分   变量值的值(最后一个换行符除外)   endef,不被视为价值的一部分。