在Makefile中抑制输出的第一部分

时间:2017-05-26 12:10:48

标签: makefile

DEPRECATED_CHECK := $(shell grep "test454" tex/*.tex)

ifneq ($(DEPRECATED_CHECK), )
$(warning \test454 is deprecated. Use \test2 instead)
endif

当我跑步时,我得到:

../common/Makefile.include:133: \test454 is deprecated. Use \test2 instead

那很好,但我很乐意只有:

\test454 is deprecated. Use \test2 instead

这可能吗?某种awk功能?我想我需要一些东西:

@echo \text454 is deprecated ...

但我不知道如何使用MWE的基本目的,因为它一直在抱怨缺少分隔符。

非常感谢

1 个答案:

答案 0 :(得分:2)

您可以使用$(info ...)代替$(warning ...)info不会添加文件和行号。

撇开 - 我通常会尝试将这些检查作为理智规则的一部分,并使一切都依赖于该规则而不是在顶层执行。它以这种方式为您提供更多灵活性。例如,如果您不想在构建清理时运行检查,则会变得简单,或者如果您想在检查失败时使构建失败,它也会变得简单。

编辑 (在旁边添加更多细节)

您可以添加目标,而不是在最高级别制作ifneq

sanity_check: 
   @ ! grep -q "test454" tex/*.txt || echo "test454 is depricated"

.PHONY: sanity check

将主要目标添加到完整性检查的依赖关系:

all maintarg1 maintarg2: sanity_check

这样,完整性检查将在任何主要目标之前运行,并将根据需要输出。在我看来,这是一种更干净的测试方式。这样,只有在构建任何目标时才会运行测试,并且如果您正在创建clean,或者如果您的makefile包含在父makefile中,或者在一堆其他可能在将来出现的角落案例。

关于配方​​语法的快速说明:@是一个make指令,告诉make不要在命令运行时回显该命令。 !是用于反转grep返回的bash语法(因此! grep如果找到文本则返回false,从而导致语句的||部分被评估。)。 .PHONY: sanity_check告诉make运行规则,即使名为sanity_check的文件已存在