有没有办法阻止Boost.Build递归扫描#include指令的头文件?

时间:2009-04-15 22:50:52

标签: c++ dependencies boost-build

有没有办法限制Boost.Build递归扫描#include指令到特定目录或目录集的头文件?即我希望它只递归扫描项目中的头文件。我知道他们的外部依赖关系不会改变(并且Boost和Qt他们相当大)。我最终在依赖树中有大约50,000个目标需要一段时间来处理(即使没有实际更改文件,也会导致1-2分钟的构建时间。)

到目前为止我发现的唯一解决方案是利用INCLUDE环境变量(我正在使用MSVC) - 这意味着Boost.Build不需要被告知包含路径(我正在使用该功能)因此不会扫描它们。这看起来有点像黑客。

我觉得我必须错过一些明显的东西,因为我无法找到遇到类似问题的其他人,即使我几乎立即遇到了这个问题。我最接近的是here

从调试输出(bjam -d 3)判断它还会多次扫描大多数头文件...我不知道这是否意味着它们被多次添加为依赖项,但肯定是成本加载文件和扫描整个内容必须加起来?

如果我可以告诉它不要打扰扫描特定的目录或目录集,我可以保证头文件不会改变,这将是完美的。

2 个答案:

答案 0 :(得分:3)

这个问题也发布在Boost邮件列表上,我们在这里得到了答案:http://lists.boost.org/boost-build/2009/04/21734.php

所以到目前为止似乎答案是,至少开箱即用,Boost.Build没有此功能,解决方案是根据您的需要自定义Boost.Build,这使得一定数量的感。

然而,我仍然很好奇为什么这对人们来说不是一个更常见的问题。我看到缓存依赖项会减少时间,但是如果我们扫描所有外部库,我们最终会得到一个巨大的依赖树,其中大部分是多余的?当我在一个项目上工作时,我根本不会经常更改第三方库,为它们进行依赖性检查似乎是一种耻辱。

答案 1 :(得分:1)

您可能希望查看其他构建工具,例如SCons。 SCons有一个模式 - implicit-cache ,它缓存隐式依赖项。这应该有助于你描述的场景。

以下是man page的摘录。

  

- 隐式高速缓存
   缓存隐式依赖项。这会导致scons使用上次运行时的隐式(扫描)依赖项,而不是扫描文件中的隐式依赖项。这可以显着加快SCons,但有以下限制:   scons不会检测对隐式依赖搜索路径(例如CPPPATH,LIBPATH)的更改,这些路径通常会导致使用不同版本的同名文件。   如果在隐式依赖关系搜索路径(例如CPPPATH,LIBPATH)中添加新的隐式依赖关系而不是具有相同名称的当前隐式依赖关系,则scons将错过隐式依赖关系中的更改。

     

- 隐式DEPS-改变
   强制SCons忽略缓存的隐式依赖项。这会导致重新扫描和重新捕获隐式依赖项。这意味着--implicit-cache。

     

- 隐式DEPS-不变
   强制SCons忽略隐式依赖项中的更改。这会导致始终使用缓存的隐式依赖项。这意味着--implicit-cache。