获取Scons根目录

9

作为自定义生成器的一部分,我需要按顺序运行两个程序。

其中一个程序会使用chdir=1选项来保证其在与目标相同的目录中运行,因为我无法处理绝对/相对路径。

第二个程序是位于项目的tools子目录中的脚本,而SConstruct文件位于项目的根目录中。我需要创建一个操作来运行这个脚本,但由于我既没有项目的绝对路径,也没有从目标所在目录返回到tools子目录的相对路径,所以遇到了麻烦。如果我可以得到我的项目根目录的绝对路径,那么我只需要连接 `tools/myscript.bar' 就可以完成它。

以下是我的代码,或者说是大致的代码:

env['BUILDERS']['FooBar'] = Builder(action = [
    'c:/bin/foo.exe ${SOURCE.filebase}',
    'c:/bin/bar-interpreter.exe myscript.bar ${SOURCE.filebase}',
    ], chdir=1);

问题是我需要改变相关操作,以便能够找到"myscript.bar",类似于:
env['BUILDERS']['FooBar'] = Builder(action = [
    'c:/bin/foo.exe ${SOURCE.filebase}',
    'c:/bin/bar-interpreter.exe $PATHTOHERE/tools/myscript.bar ${SOURCE.filebase}',
    ], chdir=1);

这似乎很简单,但我无法弄清楚如何做。
2个回答

19

你应该使用"#"来指示源目录的顶部。

print Dir('#').abspath

如果你也使用了变量目录,那么这个版本可以工作。例如在SConstruct中:

SConscript('main.scons', variant_dir="build")

然后在 main.scons 中:

print Dir('.').abspath
print Dir('#').abspath

第一个将打印/path/to/project/build,而第二个将显示正确的/path/to/project


2

哼。这很简单;看起来这个方法有效。

env['BUILD_ROOT'] = Dir('.');
Builder(action = ['somecmd ${BUILD_ROOT.abspath}/tools/myscript.bar ...']);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接