如何防止SCons清理构建树的特定部分

时间:2017-11-22 06:24:16

标签: scons

我的项目包含位于不同目录中的第三方库源:

/prj
    /src
        /app
        /lib1
        /lib2
        /third-party-lib
            SConscript
            ...
    SConstruct

由于库大小很大,第三方库的编译时间很长。我永远不会更改库的来源,唯一需要重建库的情况是构建选项的更改(例如编译器标志)。

要重建项目,我发出命令:

scons -c && scons

在这种情况下,SCons删除所有构建产品,包括第三方lib和后续构建,由于第三方lib编译而消耗了大量时间,如上所述,它从未改变过。方法:

lib = env.StaticLibrary(Target, obj)
env.NoClean(lib)

没有给出期望的结果 - 这只保留了clean中的最终库文件(lib.a)。我试图保留目标文件:

obj = env.Object(Sources)
env.NoClean(obj)

但这只能部分地解决问题,因为隐式编译了一些目标文件 - 库代码包含由Qt元对象编译器(MOC)处理的Qt代码,因此这些目标文件不包含在'obj'列表中。 / p>

每次重建项目时,有没有办法阻止这样的第三方库重建?

2 个答案:

答案 0 :(得分:0)

SCons 做事方式是调用“scons -c”,但只有

scons

如果您想重建项目。 SCons 是获得所有依赖关系(隐式和显式)的主要优势,即使对于只有少数文件发生更改的迭代重建也是如此。通过使用“-c”选项,就像您可以在“make”之类的其他构建工具中使用它一样,您可以缩短此功能并创建通常没有的问题。

我假设您使用的是“make clean; make all”方法,因为您尚未正确定义项目中的所有依赖项。请先执行此操作,这将有助于您长期构建。

不,没有方法会阻止整个文件夹及其子目录的“清理”。

答案 1 :(得分:0)

使用env.Glob(),它将看到SCons知道但在运行该逻辑时尚未创建的文件。