Scons 如何告诉SCON停止计算特定目录中的隐式依赖项?

Scons 如何告诉SCON停止计算特定目录中的隐式依赖项?,scons,Scons,我的SCons项目依赖于许多第三方LIB,每个LIB提供几十个或数百个包含文件 我对SCons工作原理的理解是,在每个构建中,它解析项目的源文件以查找#include指令,并使用env['CPPPATH']的值来查找这些文件并计算它们的md5和 这种扫描成本很高,因此我想通过教导SCON我的第三方文件的所有头永远不会改变来优化这个过程。此属性实际上由管理第三方LIB的工具强制执行 我知道有一个——implicit deps unchanged选项,它迫使SCON假设隐式依赖项没有改变,但它在全局

我的SCons项目依赖于许多第三方LIB,每个LIB提供几十个或数百个包含文件

我对SCons工作原理的理解是,在每个构建中,它解析项目的源文件以查找
#include
指令,并使用
env['CPPPATH']
的值来查找这些文件并计算它们的md5和

这种扫描成本很高,因此我想通过教导SCON我的第三方文件的所有头永远不会改变来优化这个过程。此属性实际上由管理第三方LIB的工具强制执行

我知道有一个
——implicit deps unchanged
选项,它迫使SCON假设隐式依赖项没有改变,但它在全局范围内起作用。我没有找到将此选项限制到特定目录的方法。我试图找到默认的C++代码>扫描器< /C>是否可以配置,但是什么也没找到。我认为可以避免使用
CPPPATH
,而只直接将
-I
选项提供给编译器,但这很麻烦


有没有办法通过告诉SCons目录中的文件永远不会更改来优化SCons?

您可以尝试将头文件路径列表预先扩展为CCFLAGS。 请注意,这样做意味着它们不会被扫描

for i in list_of_third_party_header_directories: 
  env['CCFLAGS'].append('-I' + i)
在这种情况下,CPPPATH的内容将是您的源目录,而不是您断言不会更改的第三方目录


请注意,以任何方式更改编译命令的命令行(除非参数包含在
$($)
中)都会导致源文件重新编译。

您能否详细介绍一下如何分析生成过程,以确保头的扫描是一个大问题?您是否尝试过重新排列include路径的顺序,以便在第一次尝试时直接找到大多数头文件?除此之外,除了编写自己的自定义C/CPP扫描仪之外,我看不到太多的优化潜力…@dirkbaechle“你能告诉我一点关于如何分析构建过程的更多信息吗[…]”。我知道在最新的构建中添加参数
--max drift=1--implicit deps unchanged
(即不计算任何文件的md5),会使项目的执行时间从59秒下降到13秒。此外,我们依赖约30个第三方LIB,包括页眉重的Boost。Boost应首先在
CPPPATH
中列出您可能希望使用
--debug=time
选项检查读取SConscripts与实际建筑的时间。如果你今天觉得很有冒险精神的话,试试看……但是要考虑到免责声明页面。我现在可以分享一些数字。我实现了两种解决方案:原始解决方案,其中所有内容都在
CPPPATH
中,第三方包含的解决方案都是使用
CCFLAGS
中的
-I
选项指定的。noop构建的SConc执行时间对于原始解决方案需要168s,对于
CCFLAGS
解决方案需要35s。这确实是我在说“我认为可以避免使用
CPPPATH
,而只直接将
-I
选项提供给编译器时提到的解决方案,但这很麻烦”。这就是我最终实现的解决方案。此外,通过GCC,我可以使用
-isystem
而不是
-I
来消除来自第三方包含文件的警告。