9

作为自定义构建器的一部分,我需要依次运行两个程序。

其中之一是我坚持使用并且无法处理绝对/相对路径的程序,因此我必须使用chdir=1Builder 的选项,以便其操作在与目标相同的目录中运行。

第二个是位于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);

这看起来很简单,但我不知道怎么做。

4

2 回答 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

于 2009-09-22T19:32:14.143 回答
2

嗯。很简单; 这似乎有效。

env['BUILD_ROOT'] = Dir('.');
Builder(action = ['somecmd ${BUILD_ROOT.abspath}/tools/myscript.bar ...']);
于 2009-09-22T19:03:04.597 回答