Makefile 简洁地将详细输出添加到GNU make

Makefile 简洁地将详细输出添加到GNU make,makefile,gnu-make,Makefile,Gnu Make,如果在命令行上传递了V=1,我想将详细输出添加到gnu生成文件中 我已经可以用三行代码来完成,如下所示: ifeq ($(V),1) $(info SRC_FILES=$(SRC_FILES)) endif 是否有更简洁的习语,例如,全部出现在一行中?理想情况下,我想要的是: $(verbose SRC_FILES=$(SRC_FILES)) 这可能是不可能的,或者至少是一个类似于: $(if $(V) $(info SRC_FILES=$(SRC_FILES))) $(info$(如果$

如果在命令行上传递了
V=1
,我想将详细输出添加到gnu生成文件中

我已经可以用三行代码来完成,如下所示:

ifeq ($(V),1)
$(info SRC_FILES=$(SRC_FILES))
endif
是否有更简洁的习语,例如,全部出现在一行中?理想情况下,我想要的是:

$(verbose SRC_FILES=$(SRC_FILES))
这可能是不可能的,或者至少是一个类似于:

$(if $(V) $(info SRC_FILES=$(SRC_FILES)))
$(info$(如果$(V),SRC_文件=$(SRC_文件))
几乎可以满足您的需要。它唯一的缺点是,当V未定义时,它会输出一个空行

编辑:根据疯狂科学家的评论,正如BeeOnRope最初建议的那样,
$(如果$(V),$(info SRC_FILES=$(SRC_FILES))
完全按照预期工作,当V未定义时没有空行

当且仅当定义了
V
时,您还可以定义一个宏来打印有关变量的信息消息:

define verbose
$(if $(V),$(info $(1) = $($(1))))
endef

$(call verbose,SRC_FILES)
当然,如果您想要更通用的宏,可以将文本传递给它进行打印:

define verbose
$(if $(V),$(info $(1)))
endef

$(call verbose,SRC_FILES = $(SRC_FILES))
请注意,您可能希望使用详细级别变量控制其他类型的信息。对于回音命令、命令输出和静音命令选项,我经常使用以下选项:

# Verbosity
ifeq ($(V),)
Q     := @
MQ    := --quiet
ECHO  := echo
OUT   := &> /dev/null
else ifeq ($(V),1)
Q     :=
MQ    :=
ECHO  := echo
OUT   :=
else
$(error V: invalid value ($(V)))
endif

foo:
    $(Q)$(ECHO) 'making $@' && \
    some-command $@ $(OUT)

bar: cuz
    $(Q)$(MAKE) $(MQ) $@

...

也许这是可行的:

verbose = $(if $(VERBOSITY),$(info $(-verbose)))
-verbose = $(if $(findstring 0,$(VERBOSITY)),$1 )$(if $(findstring 1,$(VERBOSITY)),$2 )$(if $(findstring 2,$(VERBOSITY)),$3 )$(if $(findstring 3,$(VERBOSITY)),$4 )$(if $(findstring 4,$(VERBOSITY)),$5 )$(if $(findstring 5,$(VERBOSITY)),$6 )$(if $(findstring 6,$(VERBOSITY)),$7 )$(if $(findstring 7,$(VERBOSITY)),$8 )$(if $(findstring 8,$(VERBOSITY)),$9 )$(if $(findstring 9,$(VERBOSITY)),$(10) )

VERBOSITY = 0

$(call verbose,warninglevel 1,warninglevel 2,warninglevel 3,info 1,info 2,info 3)

VERBOSITY = 2

$(call verbose,warninglevel 1,warninglevel 2,warninglevel 3,info 1,info 2,info 3)


VERBOSITY = 012345

$(call verbose,warninglevel 1,warninglevel 2,warninglevel 3,info 1,info 2,info 3)
输出:

warninglevel 1
warninglevel 3
warninglevel 1 warninglevel 2 warninglevel 3 info 1 info 2 info 3

我已经把它添加到了。

你检查过可用的工具是否可以让你的船漂浮吗?@DevSolar-是的,他们没有。我也使用了它们,但这里我需要
V
来控制makefile特定的输出,如上图所示。为了清楚起见,如果语法正确的话,上面的一行就可以了:条件和then子句之间需要一个逗号,而不是空格…@Mad-yup就可以了!回答这个问题已经足够好了…为什么不
$(如果$(V),$(info…)
?如果为false,则不会生成空行。。。?