我希望可以选择在有/没有详细模式的情况下运行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
答案 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
可能包含逗号,则必须将它们隐藏起来。