彩色打印配方命令

时间:2019-07-31 21:50:25

标签: gnu-make

我希望可以选择在有/没有详细模式的情况下运行Makefile,并为配方中命令的打印着色。

经过一番研究,我发现实现“详细模式”的典型方法是引入变量VERBOSE,该变量可以在命令行上进行设置,如下例所示。

SHELL=/bin/bash

.PHONY: all hack

red = \033[31;1m
green = \033[32;1m
reset = \033[0m

VERBOSE ?= 0
export VERBOSE
AT_0 := @
AT_1 :=
AT    = $(AT_$(VERBOSE))

all:
    $(AT) printf '$(green)%s\n$(reset)' "GNU Is Not UNIX"

hack:
    @\
    if [[ $${VERBOSE} -eq 1 ]]; then \
      printf '$(red)%s\n$(reset)' "printf '$(green)%s\n$(reset)' \"GNU Is Not UNIX\""; \
    fi; \
    printf '$(green)%s\n$(reset)' "GNU Is Not UNIX"

您可以看到,现在可以选择在配方中显示关键命令:

usr@cmptr $ make
GNU Is Not UNIX
usr@cmptr $ make VERBOSE=1
printf '\033[32;1m%s\n\033[0m' "GNU Is Not UNIX"
GNU Is Not UNIX

现在回到开头。有人对我如何修改此方法有何建议,以便它也可以使配方的命令着色而无需修改命令本身输出的颜色?

期望的结果显示在hack目标中

usr@cmptr $ make VERBOSE=1 hack
printf '\033[32;1m%s\n\033[0m' "GNU Is Not UNIX"
GNU Is Not UNIX

1 个答案:

答案 0 :(得分:1)

这不是处理冗长模式的最佳方法。看看http://make.mad-scientist.net/managing-recipe-echoing/

您通过在开头添加@来抑制的输出是由make打印的,而不是由shell打印的。无法获得使make的输出着色的方法(缺少编辑make的源代码)。

如果您想看到彩色的命令,则必须自己打印出来。如果这样做,您将一直想使用@,而不允许通过VERBOSE或其他方式覆盖它。您的规则都必须具有以下格式:

foo:
        @ printf '$(green)%s$(reset)\n' 'my command'; my command

如果要使用详细模式AS WELL,那么除非启用它,否则它将不会打印命令,因此必须将它们组合在一起。一种选择是使用您可以调用的宏,如下所示:

ifeq ($(VERBOSE),)
    run = @ $1
else
    run = @ printf '$(green)%s$(reset)\n' '$(subst ','\'',$1)'; $1
endif

foo:
        $(call run,my command)

请注意,如果my command可能包含逗号,则必须将它们隐藏起来。