使用目标名称为 make 输出添加前缀 - 就像 ant 一样

zse*_*epi 6 makefile build

假设我有以下内容Makefile

.PHONY: mytarget
mytarget:
    echo "Hello World!"
Run Code Online (Sandbox Code Playgroud)

运行make mytarget给出以下输出:

echo "Hello World!"
Hello World!
Run Code Online (Sandbox Code Playgroud)

我想看到的是像下面这样的

[mytarget] echo "Hello World!"
[mytarget] Hello World!
Run Code Online (Sandbox Code Playgroud)

这可能吗?

我一直在搜索http://www.gnu.org/software/make/manual/make.html但还没有找到解决方案(当然,我还没有阅读整个手册)

Vir*_*ile 5

我不确定 GNUmake 中是否有现成的东西可以满足您的需求(根据您的链接,我认为我们正在谈论这种风格)。你可以以某种方式模仿它,但恐怕没有一个解决方案是完美的。

使用调试标志

make --debug=j mytargetmake输出有关即将启动的每个命令的信息,包括触发它的目标。在你的情况下,结果将是:

Live child 0x021d2360 (mytarget) PID 10747 
echo Hello World!
Hello World!
Reaping winning child 0x021d2360 PID 10747 
Removing child 0x021d2360 PID 10747 from chain.
Run Code Online (Sandbox Code Playgroud)

您有信息,但它并不是很漂亮,而且我猜并行运行(-j选项)不会产生正确的输出。

改变外壳

您可以设置SHELL变量来告诉make应该使用哪个解释器来启动命令。这可以(滥用)用于在实际启动命令之前执行回显。在 Makefile 中添加以下行

SHELL=/bin/sh -c 'echo -n "[$@]: " && $$@'
Run Code Online (Sandbox Code Playgroud)

我们获得

echo "Hello World!"
[mytarget]: "Hello World!"
Run Code Online (Sandbox Code Playgroud)

这并不完美,因为整条线的回声是直接完成的make,因此不受SHELL

改变命令本身

如果您可以修改命令本身,则可以make扩展它们,以便最终输出是您想要的:

echo_target=@echo -n '[$@]: ' && echo $(1) && echo -n '[$@]: ' && $(1)

.PHONY: all bla

mytarget:
    $(call echo_target, echo "Hello World!")
Run Code Online (Sandbox Code Playgroud)

将导致

[mytarget]: echo Hello World!
[mytarget]: Hello World!
Run Code Online (Sandbox Code Playgroud)

但这需要将 添加call到 Makefile 的每个命令中

更新:将其缝合在一起

正如 Natan Reisner 所提到的,SHELL上面提出的命令对于包含空格的参数是不正确的。事实上,我还想到您可以SHELL在启动命令之前进行回显:这是一个新的提案,它可以处理包含空格的参数,并以前缀回显命令$@

 SHELL=/bin/sh -c 'echo -n "[$@] " && echo "$$@" && echo -n "[$@] " && eval "$$@"'
Run Code Online (Sandbox Code Playgroud)

围绕以下目标

mytarget:
    echo 'Hello World!'
    @touch foo\ bar
    @ls -l "foo bar"
Run Code Online (Sandbox Code Playgroud)

我们得到这个结果

echo 'Hello World!'
[mytarget] echo 'Hello World!'
[mytarget] Hello World!
[mytarget] echo foo\ bar
[mytarget] foo bar
[mytarget] touch foo\ bar
[mytarget] [mytarget] ls -l "foo bar"
[mytarget] -rw-rw-r-- 1 virgile virgile 0 juil. 23 08:44 foo bar
Run Code Online (Sandbox Code Playgroud)

请注意,不产生任何输出的命令(例如 touch)仍然存在问题。这可能可以通过在变量中重定向命令的输出并仅在结果长度非零时进行回显来缓解。

  • 当参数包含空格时,“Change SHELL”版本会出现问题。它不能正确保留参数。 (2认同)