包含生成的生成文件,不带警告消息
对于我的一个项目,我会自动生成makefile并包含它们,如下所示:
all:
@echo 'SUCCESS is $(SUCCESS)'
clean:
rm depend.mk
depend.mk:
@echo 'Creating $@'
@echo 'SUCCESS := 1' > $@
.PHONY: all clean
include depend.mk
这可以工作,但包含行会生成一条警告消息:
$ make
Makefile:13: depend.mk: No such file or directory
Creating depend.mk
SUCCESS is 1
我想沉默那第一条警告线,说depend.mk不存在。 我知道它不存在,因为我有一条规则来生成它,所以警告是不必要的(除非它没有规则)。 我不想忽略包含文件不存在的错误,并且没有规则,所以前缀include
一个-
忽略该错误对我不起作用。 我希望类似于将some_cmd 2>/dev/null
的管道stderr约定为/ dev / null,类似于some_cmd 2>/dev/null
但包含在make中。
上面的例子是这种情况的一个非常简单的例子。 在我的实际项目中,包含了很多自动生成的makefile(通过clang的自动依赖关系生成),这意味着make
的全新运行会使用这些警告消息泛滥我的屏幕。
是否有这样的可能,或者我只需要处理恼人的警告信息?
我遇到过并且(重新重新重新)自己多次解决了这个问题。 真的,问题在于围绕什么时候生成和使用依赖文件。
这个链接有“决议”的详细描述:http://make.mad-scientist.net/papers/advanced-auto-dependency-generation/
基本上归结为依赖文件实际上只是重建所必需的,而不是您的库/可执行文件的初始构建。 因此,您不需要事先生成依赖文件的规则(实际上效率较低),您应该在对象文件步骤中生成它们作为标记为珍贵的中间文件(以便它们被创建并跟踪为边 - 不应该自动清理的影响文件)。 随后的版本会提供可用的文件,这正是您试图实现的整体目标。 然后,您可以将它作为依赖文件的“-include”,并且预先知道如果依赖文件生成失败,则您的目标文件构建步骤将失败,并提供一个直接的错误,因为您提到的是首选,而不是一个模糊的间接的很晚。
实际上,我已经完成了一些实现此方法的相当大的构建系统,并且它工作得非常好,包括使用非GNU工具链的构建系统。 对于外部用户来说,它看起来是相同的,但内部它的执行效率更高,并且不会隐藏潜在的重要错误。
我尝试了很多(很多!)的东西,看看我是否可以阻止或重定向错误消息。 没有运气。
但是,当我试图-include
(包括与前导破折号),它并没有给出一个错误,并且make
与clean
, all
, depend.mk
和“默认”一切工作正常,并符合市场预期。
有没有特别的原因你不想使用-include
变体? 似乎完全按照您要查找的内容执行,并且不会以任何方式更改Makefile的工作方式,只是在首次传递Makefile时不显示错误。