【发布时间】:2016-02-24 05:02:09
【问题描述】:
这与scons - always install after build有关
使用 scons 2.3.2,我试图让 SCons 安装内置到其预定义位置的目标,而无需运行额外的命令。上面链接中提出的解决方案对我不起作用。所以我试图改用默认目标。
假设我的源在src/a 中,我安装到/dst-path/a 中。在src/a SConscript(从父 SConscript 调用)我有:
result = env.MyBuild(some_tgt, some_src)
env.Install('/dst-path/a', result)
如果我在src/a 中输入scons -u,它会构建但不会安装。如果我在同一位置键入scons -u /dst-path/a,它会构建并安装。我可以添加env.Alias('install', '/dst-path/a'),然后安装scons -u install。这在用户指南中有很多描述。但我只想运行 scons -u 来构建和安装。
所以我的想法是将/dst-path/a 添加到默认目标中,并且仅在可以为该位置生成内容的位置。所以,在src/a 的那个 SConscript 中,我愿意
env.Default('/dst-path/a')
from SCons.Script import DEFAULT_TARGETS, BUILD_TARGETS
print "DEFAULT_TARGETS in %s is %s" % (env['MY_SOURCE_DIR'], map(str, DEFAULT_TARGETS))
print " BUILD_TARGETS in %s is %s" % (env['MY_SOURCE_DIR'], map(str, BUILD_TARGETS))
# env['MY_SOURCE_DIR'] tracks current source path and evaluates to 'src/a' in this case
大概,这相当于我调用scons -u /dst-path/a 现在我删除/dst-path/a,在src/a 中运行scons -u 并查看
DEFAULT_TARGETS in src is []
BUILD_TARGETS in src is []
DEFAULT_TARGETS in src/a is ['/dst-path/a']
BUILD_TARGETS in src/a is ['/dst-path/a']
- 但什么也没发生!但是如果我运行scons -u /dst-path/a,我会看到
DEFAULT_TARGETS in src is []
BUILD_TARGETS in src is ['/dst-path/a']
DEFAULT_TARGETS in src/a is ['/dst-path/a']
BUILD_TARGETS in src/a is ['/dst-path/a']
- 现在它像以前一样构建和安装。我的代码没有效果。
那么为什么它完全忽略了我的默认规范,即使它甚至进入了 BUILD_TARGETS?是bug吗?
到底如何才能强制 SCons 一步安装它构建的东西?
顺便说一句,不确定它是否重要,但我也使用 VariantDir 将中间文件与源文件分开。
【问题讨论】:
-
从构建的顶级文件夹调用 SCons 时,它是否为您做正确的事情?我们可以在讨论这个问题时摆脱所有
-u的东西吗?如果是,请相应地编辑您的问题。看起来这个问题也与stackoverflow.com/questions/25560291/…有关。 -
是的,相关的 - 我正在尝试另一次尝试。我确实需要构建(和安装)子树的能力,所以我需要使用 -u、-U 或 -D。我在这里发布一个试探性的答案,但我还不满意。
-
如果更改为:install_nodes = env.Install('/dst-path/a', result) 会发生什么。 env.Default(install_nodes)
-
如果我这样做,我会在 DEFAULT 和 BUILD TARGETS 中获得所有安装节点名称,但没有构建任何内容(使用
scons -U)(scons: *** 没有指定目标,也没有 Default()找到目标。停止。)这可能是因为同样的问题 - 我在子树中构建,但安装在外面。
标签: python installation scons