我有两个目录a
和b
,而另一个目录应该在另一个目录中用作输入。为此,我使用哈希标记语法(例如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
,并有两个目录。 a
将a.txt
复制到构建目录a2.txt
。 b
尝试将其复制到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
答案 0 :(得分:1)
您应该使用相对路径,如下所示:
% cat b/SConscript
Command("b.txt", "../a/a2.txt", Copy("$TARGET", "$SOURCE"))
,而不是#
的绝对规范。
答案 1 :(得分:1)
尽管@ dirkbaechle的答案是正确的,但它有一个很大的限制 - 这意味着b
隐含了对a
路径的依赖。这意味着您无法在不破坏构建的情况下移动a
或b
,对于较大的项目而言,这并不比您在原始问题中的帮助更有用。
考虑变体目录的另一种方法就是作为在部署/安装之前使用的暂存区域。在构建完最终产品之后,您需要对它们执行某些操作(安装头文件/库/二进制文件)。运行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.