2009-09-22 26 views
7

Necesito ejecutar dos programas en secuencia como parte de un generador personalizado.obtener el directorio raíz de scons

Uno de ellos es un programa al que estoy atascado y no puedo tratar con rutas absolutas/relativas, así que tengo que usar la opción chdir=1 del generador para que sus acciones se ejecuten en el mismo directorio que el objetivo.

El segundo es un script que se encuentra en el subdirectorio tools del proyecto; el archivo SConstruct está en la raíz del proyecto. Necesito crear una acción para ejecutar esta secuencia de comandos y estoy teniendo problemas porque no tengo la ruta absoluta al proyecto, ni una ruta relativa desde el directorio en el que se encuentra el destino hasta el subdirectorio tools donde se encuentra la secuencia de comandos . Si de alguna manera pudiera obtener la ruta absoluta al directorio raíz de mi proyecto, estaría todo listo, podría concatenar `tools/myscript.bar 'y terminarlo.

Esto es lo que tengo, más o menos:

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

El problema es que necesito para cambiar la acción en cuestión para que "myscript.bar" se puede encontrar, algo así como:

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

Esto parece tan simple pero no puedo entender cómo.

Respuesta

3

Grrr. Es simple; esto parece funcionar

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

debe usar "#" para indicar la parte superior del directorio de origen.

print Dir('#').abspath 

Esta versión funciona también si utiliza variant directory. Por ejemplo, en SConstruct:

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

Luego, en main.scons:

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

La primera imprimirá /path/to/project/build, mientras que el segundo mostrará el correcto /path/to/project.

Cuestiones relacionadas