2016-02-24 25 views
0

内这是有关scons - always install after buildSCons的安装忽略默认规格脚本

有了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/ascons -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,运行scons -usrc/a,看到

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?这是一个错误吗?

  2. 我怎么会迫使SCons安装它一步到位的东西呢?

顺便说一句,不知道是否它很重要,但我也使用VariantDir从源头分离中间文件。

+0

从您的构建的顶级文件夹中调用它时,SCons是否为您做了正确的事情?在讨论这个问题时,我们能否摆脱所有'-u'的东西?如果是,请相应编辑您的问题。它看起来好像这个问题也是相关的http://stackoverflow.com/questions/25560291/how-to-get-scons-install-to-behave-the-same-way-as-build-at-different-层次。 – dirkbaechle

+0

是的,相关 - 我正在采取另一个刺。我需要能够构建(并安装)一个子树,所以我需要使用-u,-U或-D。我在这里发布了一个试探性的答案,但它还不令人满意。 –

+0

如果更改为:install_nodes = env.Install('/ dst-path/a',result)会发生什么情况。 env.Default(install_nodes) – bdbaddog

回答

0

好吧,我已经了解到“-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! 

另一种说法是:当涉及到外部路径时,行为会有所不同。无论您在“安装”,“别名”或“默认”中做什么,SCons都不会在顶层路径之外构建任何内容,直到将外部路径(或其别名)作为目标传递给scons命令为止。这与-u/-U等无关。

+0

供参考:-u和-U之间的区别在手册页中有解释。 “-U 与-u选项完全相同,除了处理默认目标的方式之外。使用此选项并且在命令行上未指定目标时,SConscript中定义的所有默认目标(s )建立在当前目录中,而不管目标结果是以什么目录结束。“ – bdbaddog

+0

对于您的未解决问题的答案,您可能需要查看我们的[常见问题列表](http://scons.org/faq.html)中的“常见问题解答”中的#2,即顶部的页面。 – dirkbaechle

+0

感谢FAQ指针!安装问题非常受欢迎,原因很简单 - 实施与IMO不兼容。结果完全取决于位置。虽然常见问题解答并没有增加任何新内容。 'scons {some-absolute-path}'的例子已经在手册中了。别名和默认示例使用子目录。我的实验显示**在顶部路径之外安装的唯一方法是将安装路径作为scons命令**中的明确参数,无论是通过Alias还是通过默认值完成。所以,我的问题的答案似乎是_“不可能”_ –