在Makefile中使用“-include”有什么实际原因吗?

在Makefile中使用“-include”有什么实际原因吗?,makefile,include,gnu-make,Makefile,Include,Gnu Make,我最近调试了一个模糊的问题,该问题是由放置错误的子Makefile引起的,该子Makefile被-include指令有条件地包含到主Makefile中。注意开头的减号。根据GNU Make: 如果您想让make忽略一个不存在或不存在的makefile 无法重新制作,如果没有错误消息,请使用-include指令 而不是像这样包括: -include filenames… 这在各个方面都像include一样,只是没有错误(没有错误) 即使是警告)如果任何文件名(或任何 文件名)不存在或无法重新生成

我最近调试了一个模糊的问题,该问题是由放置错误的子Makefile引起的,该子Makefile被
-include
指令有条件地包含到主Makefile中。注意开头的减号。根据GNU Make:

如果您想让make忽略一个不存在或不存在的makefile 无法重新制作,如果没有错误消息,请使用
-include
指令 而不是像这样包括:

-include filenames…
这在各个方面都像include一样,只是没有错误(没有错误) 即使是警告)如果任何文件名(或任何 文件名)不存在或无法重新生成

为了与其他一些make实现兼容,
sinclude
的另一个名称-包括

该指令最糟糕的问题是,当无法找到子Makefile时,不会给出任何诊断。不用说,这会使调试复杂很多

事实上,没有真正需要在那里使用它,一个常规的
include
工作得很好,而且更加健壮。我理解原作者使用
-include
的意图。该子Makefile包含一些“秘密”内容,不打算与第三方工程师共享。但这一功能最终从未被使用过,它本可以以更透明的方式实现


我想知道当
-include
有用时,是否还有其他实际情况。可能在某些情况下,在构建过程中动态生成一个或多个makefile?

当然,
-include
最有用的应用程序是make自身自动生成include文件


请记住,所有包含文件也会自动成为make的目标。因此,
-include-generated_文件
不会使make过早失败,但意味着将使用当前Makefile中的其他规则(重新)构建
生成的_文件
。例如,可以在自动依赖项生成中利用这一点


顺便说一句,“include”的另一个技巧是
include$(empty\u var)
也可以正常工作(即没有操作)。

如果子makefile是必需的(因此它的缺失会导致问题),那么
-include
是作业的错误工具。如果目标是为第三方工程师提供一个有效的makefile,但不给他们机密的东西,那么makefile是错误的。如果makefile编写正确,
-include
将是该作业的正确工具。对于较新版本的GNU make,这一技巧应该是不必要的。即使您使用
include
“记住,所有include文件也会自动成为make的目标”,它也会推迟对不存在的makefile的投诉,直到它确定它们无法重新生成。这是我从来没有想过的事情,但在你提到它之后,它是有意义的。