【问题标题】:SCons Install ignores Default specification within scriptSCons 安装忽略脚本中的默认规范
【发布时间】: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']

- 现在它像以前一样构建和安装。我的代码没有效果。

  1. 那么为什么它完全忽略了我的默认规范,即使它甚至进入了 BUILD_TARGETS?是bug吗?

  2. 到底如何才能强制 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


【解决方案1】:

好的,我了解到“-u”会影响事物。根据选项帮助,它不会构建任何默认目标(我认为 --ignore_defaults 选项会是更好的方法,但是哦,好吧......)

所以,为了让 SCons 不忽略默认值,应该使用“-D”或“-U”。 “-D”在整个构建树中获取默认值,无论当前位置 - 这不是我想要的。但是,"-U" 遵循根据当前位置设置的默认值。

现在真正的问题原来是安装路径!我尝试将安装位置从/dst-path/a 更改为install/a(即在构建树中),现在,神奇地,一切正常!这甚至是“-u”按预期工作(没有设置额外的默认值),安装文件,当它不存在时。如果我将安装路径设置为默认值,则“-U”将改为使用。但是对于/dst-path/a 路径,“-U”表示它没有找到默认目标。如果我只改变路径,然后它会突然找到它们并构建。

基本上,如果我在树中安装了路径,这一切从一开始就可以正常工作。但是我为什么要在源子树中安装呢?这是一个疯狂的限制。我认为这是一个错误。

因此,此解决方案仅在您安装在树中时才有效,并且按预期工作,没有任何技巧。这仍然没有回答如何在树外安装。

...但事实并非如此。您必须在 scons 命令中显式调用安装目标/路径。一些例子是:

scons -u /dst-path/a  # as seen in manual and FAQ
scons -u src/a        # if you have Alias('src/a', '/dst-path/a')
                      # but "scons -u" or "scons -u '.'" from src/a won't work!

另一种说法:当涉及到外部路径时,行为会有所不同。无论您在 Install、Alias 或 Default 中做什么,SCons 都不会在顶级路径之外构建任何内容,直到该外部路径(或其别名)作为目标传递给 scons 命令。而这与-u/-U等无关

【讨论】:

  • 仅供参考:手册页中解释了 -u 和 -U 之间的区别。 "-U 与 -u 选项的工作方式完全相同,但处理默认目标的方式除外。当使用此选项并且在命令行上未指定目标时,所有在 SConscript(s) 中定义的默认目标无论生成的目标最终位于哪个目录,都会构建当前目录。”
  • 如需回答您的未决问题,您可能需要查看我们的FAQ list 中“最常见的常见问题解答”中的第 2 条,就在页面顶部。
  • 感谢您的常见问题解答指针!安装问题如此受欢迎是有充分理由的 - 实施是违反直觉的,IMO。结果完全取决于位置。不过,FAQ 并没有添加任何新内容。 scons {some-absolute-path} 的示例已经在手册中。 Alias 和 Default 示例使用子目录。我的实验表明,在顶级路径之外安装的唯一方法是将安装路径作为 scons 命令中的显式参数,无论是按字面意思、通过 Alias 还是通过 Default 完成。所以我的问题的答案似乎是 "Impossible"
  • 当我不带参数运行 scons 时,我看到它知道它正在构建的路径 (scons: building associated VariantDir targets: src/a)。但是,这与任何 *_TARGETS 变量内容都不匹配。我将此消息追溯到 Node.FS 中的 variant_dir_target_climb。如果我可以让 SCons 认为“src/a”作为命令中的参数传递,那么我可以通过使用别名来解决我的问题。但是我找不到 SCons 是如何获得那个“src/a”的,所以我不知道如何用勺子把它喂给 SCons。更改 COMMAND_LINE_TARGETS 无效。
  • 我必须道歉。看起来我的构建进入了一些不一致的状态。在我运行 scons -uc 之后,情况发生了变化,使用外部路径不再是问题。这使整个问题具有误导性。如果这里没有其他反馈,我将在一周内删除它。同时,我已经设法找到了stackoverflow.com/questions/25560291/…的解决方案,我稍后会在那里发布
猜你喜欢
  • 2020-01-23
  • 2012-07-04
  • 2011-04-30
  • 2020-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-07
相关资源
最近更新 更多