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

时间:2017-06-26 15:49:30

标签: scons

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

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

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

我知道有一个--implicit-deps-unchanged选项可以强制scons假设隐式依赖关系没有改变,但它可以全局工作。我没有找到将此选项限制到特定目录的方法。我试图找出是否可以配置隐式C ++文件的默认Scanner,但什么也没找到。我认为可以避免使用CPPPATH,而只是直接向编译器提供-I选项,但这很麻烦。

有没有办法优化SCons,告诉他目录中的文件永远不会改变?

1 个答案:

答案 0 :(得分:1)

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

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet 
    version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:msxsl="urn:schemas-microsoft-com:xslt"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:csharp="urn:JohnLBevan/NewGuid"
    exclude-result-prefixes="xsl msxsl csharp"
>

    <xsl:template match="@* | node()">
        <xsl:copy>
            <xsl:apply-templates select="@* | node()"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="//*/text()">
        <!-- replaces all text nodes from input document with GUIDs -->
        <xsl:value-of select="csharp:NewGuid()"/>
    </xsl:template>

    <msxsl:script language="C#" implements-prefix="csharp">
        <![CDATA[
        public static string NewGuid()
        {
            return Guid.NewGuid().ToString();
        }
        ]]>
    </msxsl:script>

</xsl:stylesheet>

在这种情况下, CPPPATH 的内容将是您的源目录,而不是您断言的第三方内容不会更改。

请注意,以任何方式更改编译命令的命令行(除非参数包含在for i in list_of_third_party_header_directories: env['CCFLAGS'].append('-I' + i) 中,否则将导致源文件重新编译。