2009-09-22 14 views
7

Ho bisogno di eseguire due programmi in sequenza come parte di un builder personalizzato.ottenere la directory root di scons

Uno di questi è un programma con cui sono bloccato e non è in grado di gestire percorsi assoluti/relativi, quindi devo utilizzare l'opzione chdir=1 del generatore in modo che le sue azioni vengano eseguite nella stessa directory della destinazione.

Il secondo è uno script che si trova nella sottodirectory tools del progetto; il file SConstruct è nella radice del progetto. Devo creare un'azione per eseguire questo script e sto avendo problemi perché non ho né il percorso assoluto del progetto, né un percorso relativo dalla directory in cui si trova il target nella sottodirectory tools in cui si trova lo script . Se potessi in qualche modo ottenere il percorso assoluto verso la directory radice del mio progetto, sarei tutto pronto, potrei semplicemente concatenare `tools/myscript.bar 'e farla finita.

Ecco quello che ho, più o meno:

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

Il problema è che ho bisogno di cambiare l'azione in questione, in modo che "myscript.bar" si possono trovare, qualcosa di simile:

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

Questo sembra così semplice ma non riesco a capire come.

risposta

3

Grrr. È semplice; questo sembra funzionare.

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

È necessario utilizzare "#" per indicare la parte superiore della directory di origine.

print Dir('#').abspath 

Questa versione funziona anche se si utilizza uno variant directory. Ad esempio in SConstruct:

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

Poi in main.scons:

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

La prima stamperà /path/to/project/build, mentre il secondo mostra la corretta /path/to/project.

Problemi correlati