2010-09-16 4 views
5

Ho un progetto che costruisco utilizzando SCons (e MinGW/gcc in base alla piattaforma). Questo progetto dipende da diverse altre librerie (chiamiamole libfoo e libbar) che possono essere installate in luoghi diversi per utenti diversi.File di configurazione SCons e valori predefiniti

Attualmente, il mio file SConstruct incorpora il percorso codificato in quelle librerie (ad esempio, tipo: C:\libfoo).

Ora, vorrei aggiungere un'opzione di configurazione per il mio file SConstruct in modo che un utente che ha installato libfoo in un altro luogo (ad esempio C:\custom_path\libfoo) può fare qualcosa di simile:

> scons --configure --libfoo-prefix=C:\custom_path\libfoo 

Oppure:

> scons --configure 
scons: Reading SConscript files ... 
scons: done reading SConscript files. 
### Environment configuration ### 
Please enter location of 'libfoo' ("C:\libfoo"): C:\custom_path\libfoo 
Please enter location of 'libbar' ("C:\libfoo"): C:\custom_path\libbar 
### Configuration over ### 

Una volta scelte, quelle opzioni di configurazione devono essere scritte su un file e essere rilette automaticamente ogni volta che viene eseguito scons.

scons fornisce un tale meccanismo? Come potrei ottenere questo comportamento? Non sono esattamente padrone di Python quindi anche le soluzioni più ovvie (ma complete) sono benvenute.

Grazie.

risposta

5

SCons ha una funzionalità denominata "Variables". Puoi impostarlo in modo che legga abbastanza facilmente le variabili argomento da riga di comando. Quindi nel tuo caso dovresti fare qualcosa di simile dalla riga di comando:

scons LIBFOO=C:\custom_path\libfoo 

... e la variabile dovrebbe essere memorizzata tra le corse. Quindi la prossima volta esegui semplicemente scons e usa il valore precedente di LIBFOO.

Nel codice si utilizza in questo modo:

# read variables from the cache, a user's custom.py file or command line 
# arguments 
var = Variables(['variables.cache', 'custom.py'], ARGUMENTS) 
# add a path variable 
var.AddVariables(PathVariable('LIBFOO', 
     'where the foo library is installed', 
     r'C:\default\libfoo', PathVariable.PathIsDir)) 

env = Environment(variables=var) 
env.Program('test', 'main.c', LIBPATH='$LIBFOO') 

# save variables to a file 
var.Save('variables.cache', env) 

se si voleva davvero usare "-" opzioni di stile, allora si potrebbe combinare il sopra con la funzione AddOption, ma è più complicato.

This SO question parla dei problemi relativi all'ottenere valori dall'oggetto Variables senza passarli attraverso un Ambiente.

+0

Grazie, sembra che faccia il trucco;) C'è un altro modo per ottenere il valore di una variabile? Qualcosa come 'print var.getVariable ('LIBFOO')'? – ereOn

+0

@ereOn Ho setacciato la documentazione, ma ci * non * sembra essere un modo per farlo. Abbastanza asimmetrico. Devi spingere le variabili in un ambiente e leggerlo. Aggiornerò il post se mai lo scoprirò. – richq