我需要按顺序运行两个程序作为自定义构建器的一部分。
其中一个是我坚持的程序,无法处理绝对/相对路径,因此我必须使用Builder的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);
这看起来很简单,但我无法弄清楚如何。
答案 0 :(得分:19)
您应该使用“#”表示源目录的顶部。
print Dir('#').abspath
如果您使用variant directory,此版本也可以使用。例如,在 SConstruct :
中SConscript('main.scons', variant_dir="build")
然后在 main.scons :
print Dir('.').abspath
print Dir('#').abspath
第一个将打印/path/to/project/build
,而第二个将显示正确的/path/to/project
。
答案 1 :(得分:2)
哎呀。很简单;这似乎有效。
env['BUILD_ROOT'] = Dir('.');
Builder(action = ['somecmd ${BUILD_ROOT.abspath}/tools/myscript.bar ...']);