получение корневого каталога scons - PullRequest
9 голосов
/ 22 сентября 2009

Мне нужно запустить две программы последовательно как часть пользовательского компоновщика.

Одна из них - это программа, с которой я застрял и не могу работать с абсолютными / относительными путями, поэтому мне нужно использовать опцию chdir=1 в Builder, чтобы ее действия выполнялись в том же каталоге, что и цель .

Второй - это скрипт, который находится в подкаталоге 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 голосов
/ 22 сентября 2009

Вы должны использовать "#", чтобы указать верхнюю часть исходного каталога.

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 голосов
/ 22 сентября 2009

Grrr. Это просто; это похоже на работу.

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