2009-09-22 161 views
7

我需要依次运行两个程序作为自定义构建器的一部分。获取scons根目录

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

第二个脚本位于项目的tools子目录中; SConstruct文件位于项目的根目录中。我需要创建一个操作来运行这个脚本,并且遇到了麻烦,因为我既没有项目的绝对路径,也没有从目标所在目录返回到脚本所在的子目录的相对路径。如果我能以某种方式获得项目根目录的绝对路径,那么我可以全部设置,我可以连接`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); 

这似乎很简单,但我不知道如何。

回答

3

Grrr。很简单;这似乎工作。

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

您应该使用“#”来表示源目录的顶部。

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