使用哈希标记时获取variant_dir下的路径

时间:2015-11-01 10:23:12

标签: scons

问题

我有两个目录ab,而另一个目录应该在另一个目录中用作输入。为此,我使用哈希标记语法(例如b/SConscript引用#a/a2.txt) 我使用variant_dir构建到build目录中(因此a2.txt创建/home/build/a/a2.txt)。
这种组合无效 - #a/a2.txt已解决为/home/a/a2.txt,但我需要/home/build/a/a2.txt

我可以手动添加build#/build/a/a2.txt)但不喜欢它。首先,它可能会在某些情况下发生变化。其次,SCons总是添加variant_dir本身,所以我不想在某些地方手动添加它。

实施例

我构建到build,并有两个目录。 aa.txt复制到构建目录a2.txtb尝试将其复制到b.txt。显然,复制只是为了举例 - 实际上我做了一些真正的处理 我想基于b.txt构建a2.txt% cat SConstruct SConscript("SConscript", variant_dir="build", duplicate=0) % cat SConscript SConscript("a/SConscript") SConscript("b/SConscript") % cat a/SConscript Command("a2.txt", File("a.txt").srcnode(), Copy("$TARGET", "$SOURCE")) % cat b/SConscript Command("b.txt", "#a/a2.txt", Copy("$TARGET", "$SOURCE")) 仅存在于构建目录中。但它试图从源头使用它,而失败。

%  scons
scons: Reading SConscript files ...
scons: done reading SConscript files.
scons: Building targets ...
scons: building associated VariantDir targets: build
scons: *** [build/b/b.txt] Source `a/a2.txt' not found, needed by target `build/b/b.txt'.
scons: building terminated because of errors.

输出:

{{1}}

P.S。 SCons 2.3.4

2 个答案:

答案 0 :(得分:1)

您应该使用相对路径,如下所示:

% cat b/SConscript
Command("b.txt", "../a/a2.txt", Copy("$TARGET", "$SOURCE"))

,而不是#的绝对规范。

答案 1 :(得分:1)

尽管@ dirkbaechle的答案是正确的,但它有一个很大的限制 - 这意味着b隐含了对a路径的依赖。这意味着您无法在不破坏构建的情况下移动ab,对于较大的项目而言,这并不比您在原始问题中的帮助更有用。

考虑变体目录的另一种方法就是作为在部署/安装之前使用的暂存区域。在构建完最终产品之后,您需要对它们执行某些操作(安装头文件/库/二进制文件)。运行autotools configure脚本时可以看到此模式 - 您可以选择指定前缀 - 最终构建工件将存在的位置。

您可以通过向环境添加(可能可配置的)$ PREFIX变量来在SCons中模仿这个。当你需要依赖项中的东西时,你会查看前缀下面的目录,而不是遍历目录树。

SConstruct

env = Environment()
# project local PREFIX, but could have equally 
# been /usr/local/, /home or some other path
env['PREFIX'] = '#/prefix' 
env.SConscript("SConscript",
                variant_dir="build",
                exports=['env'],
                duplicate=0)

SConscript

Import('env')
SConscript("a/SConscript", exports=['env'])
SConscript("b/SConscript", exports=['env'])

A / SConscript

Import('env')

cmd = env.Command('a2.txt', 'a.txt', Copy('$TARGET', '$SOURCE'))
env.Install('$PREFIX', 'a2.txt')

B / SConscript

Import('env')

env.Command('b.txt', '$PREFIX/a2.txt', Copy('$TARGET', '$SOURCE'))
env.Install('$PREFIX', 'b.txt')

运行SCons然后给出:

$ scons
scons: Reading SConscript files ...
scons: done reading SConscript files.
scons: Building targets ...
scons: building associated VariantDir targets: build
Copy("build/a/a2.txt", "a/a.txt")
Install file: "build/a/a2.txt" as "prefix/a2.txt"
Copy("build/b/b.txt", "prefix/a2.txt")
Install file: "build/b/b.txt" as "prefix/b.txt"
scons: done building targets.