包含生成的makefile而不显示警告消息

时间:2014-07-16 03:31:08

标签: makefile gnu-make

对于我的项目,我会自动生成makefile并包含它们,如下所示:

all:
    @echo 'SUCCESS is $(SUCCESS)'

clean:
    rm depend.mk

depend.mk:
    @echo 'Creating $@'
    @echo 'SUCCESS := 1' > $@

.PHONY: all clean

include depend.mk

这样可行,但include行会生成一条警告消息:

$ make
Makefile:13: depend.mk: No such file or directory
Creating depend.mk
SUCCESS is 1

我想沉默第一条警告线说依赖.mk不存在。我知道它不存在,因为我有一个规则来生成它,所以警告是不必要的(除非当然没有规则)。我不希望make忽略包含文件不存在的错误,并且没有规则,因此在include前加-来忽略错误对我不起作用。我喜欢类似bash的管道stderr到/ dev / null的约定,如some_cmd 2>/dev/null,但包含在make中。

上面的示例是此案例的一个非常简单的示例。在我的实际项目中,包含了很多自动生成的makefile(通过clang的自动依赖关系生成),这意味着make的全新运行会在屏幕上显示这些警告消息。

这样的事情是否可能,或者我只是要处理烦人的警告信息?

2 个答案:

答案 0 :(得分:2)

我自己遇到过多次(并重新重新尝试)解决这个问题。实际上,问题在于围绕何时生成和使用依赖文件。

此链接详细说明了“解决方案”:http://make.mad-scientist.net/papers/advanced-auto-dependency-generation/

基本上,它归结为依赖文件实际上只是重建所必需的事实,而不是库/可执行文件的初始构建。结果你不需要预先生成依赖文件的规则(事实上效率较低),你应该在目标文件步骤中生成它们作为标记为珍贵的中间文件(因此它们被创建和跟踪作为一面) - 影响永远不应自动清理的文件)。然后,后续构建将提供可用文件,这正是您试图实现的整体目标。然后,您可以在依赖项文件上将其作为“-include”,前提是您的目标文件构建步骤将失败,如果依赖项文件生成失败,立即出现错误,正如您所提到的那样是首选,而不是模糊和间接的很久以后。

我实际上已经完成了一些相当大的构建系统来实现这个方法,它确实运行得很好,包括那些使用非GNU工具链的系统。对于外部用户来说,它看起来是相同的,但在内部它可以更有效地执行,并且不会隐藏潜在的重要错误。

答案 1 :(得分:1)

我尝试了很多(很多!)事情,看看我是否可以阻止或重定向错误消息。没有运气。

但是,当我尝试-include(包含一个主要短划线)时,它没有出错,而make带有cleanall,{{1并且'默认'都正常工作并且符合预期。

您是否有特殊原因想要使用depend.mk变体?似乎完全按照您的要求进行操作,并且不会以任何方式改变Makefile的工作方式,只是在第一次通过Makefile时不显示错误。