我们已经将大型 GNU Make 构建系统转换为 SCons。
一切运行良好,只是我们在 Environment.Clone()
中花费了 7 秒的启动时间。我们使用 Clone()
因为它的功能风格很好,不会修改现有的全局状态。
有没有人想出一种方法来不复制 99% 的环境
数据,并且在克隆中永远不会改变
无论如何?
删除字典中未使用的键会缩短 Clone()
时间吗?
最佳答案
根据您的意见,您可以考虑将构建划分为几个较小的构建,每个构建都由其单独的 SConstruct 构建脚本控制,同时维护完整构建的当前 SConstruct。我可以想象,更改 C++ 代码的开发人员只需要构建一次完整的项目即可获得非 C++ 依赖项。然后,在处理 C++ 功能时,他/她只需要构建 C++。 ada 和 fortran 也是如此。
例如,假设您有类似于以下目录结构的内容:
root_dir
|
+--- src_ada
|
+--- src_cpp
|
+--- src_fortran
您可以为每种类型的构建拥有一个根级别 SConstruct,如下所示:
SConstruct # performs a complete build
SConstruct.ada # builds just the ada
SConstruct.cpp # builds just the cpp
SConstruct.fortran # builds just the fortran
如果正确创建了这些 SConstruct 脚本,则可能不需要修改辅助 SConscript 构建脚本。
您甚至可以通过创建一个可以采用以下命令行参数的构建包装脚本来更进一步:
build [complete (default arg) | ada | cpp | fortran]
在内部,脚本将使用适当的 SConstruct 调用 scons,该 SConstruct 可能是以下之一:
scons -f SConstruct
scons -f SConstruct.ada
scons -f SConstruct.cpp
scons -f SConstruct.fortran
注意选项 -f file、--file=file、--makefile=file、--sconstruct=file
都具有相同的作用:让您指定用于构建的 SConstruct,如 SCons man pages 中所述.
关于performance - Environment.Clone 窃取启动时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22866893/