2012-03-30 15 views
10

Così Ho letto le domande sul qui circa gerarchica costruisce come: Creating a Hierarchical Build with SConsReal Hierarchical Builds con SCons?

voglio fare costruzione reale gerarchica dei due pronti contro termine standalone che utilizzano entrambi scons che ho impostato come sub-repos utilizzando mercuriale. Di seguito è riportato il layout del file che illustra ciò che voglio fare.

layout desiderato:

project_root/ (new project that builds bar app using the libfoo built from source) 

    libfoo_subrepo/ (standalone project repo from bitbucket) 
     src/ 
      SConscript 
      libfoo.c 
      libfoo.h 
     test/ 
      SConscript 
      test_foo.c 
     SConstruct 

    barapp_subrepo/ (standalone project repo from bitbucket that uses libfoo) 
     src/ 
      SConscript 
      bar.c 
      bar.h 
     test/ 
      SConscript 
      test_bar.c 
     SConstruct 

    test/ 
     SConscript 
     test_bar_with_foo.c 
    SConstruct 

Così ho due pronti contro termine separati, entrambi con scons. Il primo, libfoo, può essere clonato standalone e costruito usando scons. Quando si eseguono scons nella directory root libfoo, costruisce una libreria statica di libfoo in src/e crea un test eseguibile unit test in test/che si collega alla libreria statica in src /.

Il secondo repo ha l'app bar che dipende da libfoo. Anch'esso può essere clonato autonomamente e se libfoo è installato sul sistema di build, può essere costruito usando scons.

Quello che voglio fare è impostare un nuovo repository (project_root) che abbia sia il repository di libfoo che quello di bar impostati come subrepos usando mercurial. Quindi, quando clonate questo nuovo repository, esso automaticamente estrae la barra app e la sua dipendenza, libfoo. Quindi voglio essere in grado di eseguire scons nella root di questo nuovo repository e farlo eseguire scons nel libfoo_subrepo/root per creare libfoo ed è unit test. Quindi voglio eseguire scons nel barapp_subrepo/root per costruire la barra e dirgli di collegarsi alla libreria statica libfoo in libfoo_subrepo/src /. Infine, desidero creare alcuni nuovi test unitari nei test/che utilizzano sia la libreria statica libfoo che i file sorgente dall'app bar alla test bar app e libfoo quando combinati insieme.

Per quanto ne so dalla lettura della documentazione di scons è che avrei bisogno di creare un Builder personalizzato per "subrepo" che avrebbe eseguito scons in una sotto-shell. Quindi potrei aggiungere libfoo.subrepo e barapp.subrepo alla directory project_root/e alcuni come rig in modo che quando il builder va a eseguire il comando per creare libfoo.subrepo che traduce il nome sorgente in un percorso che esegue scons in

building 'libfoo.subrepo' translates into executing 'cd libfoo_subrepo; scons' 

Mi sembra che gli scons non possano ricorsivamente creare progetti di scons autonomi. Tutto ciò che ho letto presuppone che tu abbia la possibilità di creare file SConscript nelle sottocartelle e quindi che il file SConstruct di root dipenda dai file SConscript. Per favore dimmi che c'è un modo per fare quello che voglio con gli scons. Non voglio tornare a fare.

Grazie.

risposta

9

Non sono sicuro del motivo per cui avresti bisogno di creare un costruttore personalizzato, se ti capisco bene, penso che tutto ciò che ti serve possa essere fatto con SCons e i suoi costruttori integrati.

Per fare ciò che spieghi, avresti davvero bisogno di 3 file Seperate SConsctruct, per poter eseguire 3 build separati.Vorrei anche aggiungere 3 file SConscript e fare di loro nel modo seguente:

Edit: In questo esempio, il suo meglio per creare l'ambiente() negli script di SConstruct

project_root/SConstruct

# This SConstruct orchestrates building 3 subdirs 

import os 

subdirs = ['libfoo_subrepo', 'barapp_subrepo', 'test'] 
env = Environment() 

for subdir in subdirs: 
    SConscript(os.path.join(subdir, 'SConscript'), exports = ['env']) 

libfoo_subrepo/SConstruct

# This SConstruct does nothing more than load the SConscript in this dir 
# The Environment() is created in the SConstruct script 
# This dir can be built standalone by executing scons here, or together 
# by executing scons in the parent directory 
env = Environment() 
SConscript('SConscript', exports = ['env']) 

libfoo_subrepo/SConscript

# This SConstruct orchestrates building 2 subdirs 
import os 

Import('env') 
subdirs = ['src', 'test'] 

for subdir in subdirs: 
    SConscript(os.path.join(subdir, 'SConscript'), exports = ['env']) 

barapp_subrepo/SConstruct

# This SConstruct does nothing more than load the SConscript in this dir 
# The Environment() is created in the SConstruct script 
# This dir can be build standalone by executing scons here, or together 
# by executing scons in the parent directory 
env = Environment() 
SConscript('SConscript', exports = ['env']) 

barapp_subrepo/SConscript

# This SConstruct orchestrates building 2 subdirs 
import os 

Import('env') 
subdirs = ['src', 'test'] 

for subdir in subdirs: 
    SConscript(os.path.join(subdir, 'SConscript'), exports = ['env']) 

spero che i commenti in ogni file, spiega il suo scopo.

Spero che questo aiuti.

+0

Se si è creata una compilazione in una sottodirectory utilizzando questa soluzione, e quindi è stata eseguita una ricostruzione dal livello superiore, non sarebbe stata ricostruita nuovamente l'intera sottodirectory? –

+0

@GeoffreyIrving, buon punto. A seconda delle dimensioni del progetto, potrebbe non essere importante. Ma potrebbe essere possibile evitare ciò che si menziona specificando il file db scons per una build di root e build di sottodirectory, oppure usando diverse dirs di varianti. – Brady

-4
SConscript(dirs=['src', 'doc']) 
+0

Questo non fornisce una risposta alla domanda. Per criticare o richiedere chiarimenti da un autore, lascia un commento sotto il loro post - puoi sempre commentare i tuoi post, e una volta che hai [reputazione] sufficiente (http://stackoverflow.com/help/whats-reputation) essere in grado di [commentare qualsiasi post] (http://stackoverflow.com/help/privileges/comment). –

+0

@CTravel Perché pensi che questa sia una chiarezza o una critica, non (almeno un tentativo di) una risposta? –

+0

@ MathiasMüller è più un commento che una risposta, ha bisogno di spiegare le sue risposte invece di pubblicare semplicemente del codice. –