SCons Install忽略scrip中的默认规范

2024-04-16 07:49:15 发布

您现在位置:Python中文网/ 问答频道 /正文

这与scons - always install after build有关

使用scons 2.3.2,我试图让scons安装目标,该目标被内置到其预定义的位置,而无需运行额外的命令。上面链接中提出的解决方案对我不起作用。所以我试着用默认目标来代替。 假设我的源代码在src/a中,我安装到/dst-path/a。在src/aSConscript(从父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. 那么,为什么它完全忽略了我的默认规范,尽管它甚至将其纳入了构建目标?是虫子吗?

  2. 我究竟怎样才能强迫SCons一步到位地安装它构建的东西呢?

顺便说一句,不确定它是否重要,但我也使用VariantDir将中间文件与源文件分开。你知道吗


Tags: installpathinbuildsrcenvdefaultsource
1条回答
网友
1楼 · 发布于 2024-04-16 07:49:15

好吧,我知道“-u”会影响事情。根据选项帮助,它不构建任何默认目标(我认为忽略默认选项是更好的方法,但是哦,好吧…)

因此,要使scon不忽略默认值,应该使用“-D”或“-U”-D“在构建树中选择所有默认值,不管当前位置如何-这不是我想要的。”-但是,U将根据当前位置设置默认值。你知道吗

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

基本上,如果我在树中安装了路径,从一开始就可以很好地工作。但是我为什么要在源子树中安装呢?这是一个疯狂的限制。我叫它虫子。你知道吗

因此,这个解决方案只有在树内安装时才有效,并且它可以按预期工作,没有任何欺骗。这仍然不能回答如何在树外安装。你知道吗

……但事实并非如此。必须在scons命令中显式调用install target/path。例如:

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命令之前,无论您在Install、Alias或Default中执行什么操作,SCons都不会在top path之外生成任何内容。这与-u/-u等无关

相关问题 更多 >