【发布时间】:2016-02-20 09:08:09
【问题描述】:
我将一个项目的不同版本保存在不同的目录中。 (这确实在这个项目中有意义。可悲的是。)由于版本之间只有微小的差异,我希望我可以通过为所有构建使用公共缓存目录来加快第一个构建之后的所有构建。
不幸的是,我不得不意识到,当从不同目录中的相同源构建目标文件时,SCons 2.3.3 将结果存储在缓存中的不同位置。 (我假设该位置等于构建签名。)为每个目录重新编译相同的源。那么为什么 SCons 会确定不同的构建签名虽然
- 编译命令是相同的并且
- 源文件和包含文件相同(预处理器阶段的相同输出,
gcc -E ...) - 我正在使用判定器“MD5-timestamp”
甚至生成的目标文件都是相同的!
举一个简单的例子(来自 SCons 文档的helloworld),重用缓存是可行的。虽然在我正在从事的大项目中,但事实并非如此。也许“SCons 构建环境”会影响构建签名,即使它对编译命令没有任何影响?
除了--cache-debug=- 之外,还有什么调试选项可以提供帮助吗? SCons 的哪种方法确定构建签名?
文件夹看起来有点像这样:
<basedir1>/
SConstruct
src/something.cpp …
include/header.hpp …
<basedir2>/
SConstruct
src/something.cpp …
include/header.hpp …
/SharedCache/
0/ 1/ 2/ … F/
我在 basedir1 和 basedir2 中都检查了该项目,并在这两个中都调用了scons --build-cache-dir=/SharedCache。 (编辑:--build-cache-dir 是一个自定义选项,在该项目的SConstruct 文件中实现。它映射到env.CacheDir('/SharedCache')。
EDIT2:在我意识到这个问题之前,我做了一些测试来评估使用--cache-implicit 或 SCons 2.4.0 的效果。
【问题讨论】:
-
你能粘贴一个示例编译命令行吗?尝试 --debug=explain 也。可能您在命令行中有部分路径,其中包含的路径多于相对路径。因此命令行是不同的。 (我注意到你在 scons 用户邮件列表上也有一个关于这个问题的活跃问题)
-
我重新验证了编译命令是相同的。每一点。这是一个简写示例:
g++ -o <target>.o -c -m64 -I<global_include_path> -fmessage-length=0 -D_LARGEFILE64_SOURCE … -fno-strict-aliasing -Wall -Werror -Wsign-promo … -DXOC_FILE_ID=\"ProtocolUnitTester:ate_ext_td_ProtocolFrameworkTests_generated.cpp\" -fPIC -Iinclude -Iinclude-uda -I. <src>.cpp. -
通过“当从不同目录中的相同源构建目标文件时,SCons 2.3.3 将结果存储在缓存中的不同位置。”您的意思是源位于 SConstruct 下的不同目录中吗?或者您的意思是 SConstruct 下的目录结构相同,但 SConstruct 的基本目录是唯一不同的东西?所以
/a/b/c/abc.c 和 /a/b/d/abc.c 或 /a/b/c/abc.c 和 /a/b /c/abc.c 其中 SConstruct 在 basedir 中。 -
@bdbaddog 这是
/a/b/c/abc.c 和 /a/b/c/abc.c。 -
SCons 中不存在命令行参数
--build-cache-dir,无论是在 v2.3.5 中还是在最新的主干中。当我在每个 SConstruct 中明确指定缓存目录时,一切都会按预期工作。根据您迄今为止提供的信息和示例,我无法重现我这边的问题...
标签: scons