2010-09-16 15 views
5

Tengo un proyecto que construyo usando SCons (y MinGW/gcc dependiendo de la plataforma). Este proyecto depende de varias otras bibliotecas (llamémoslas libfoo y libbar) que pueden instalarse en lugares diferentes para diferentes usuarios.Archivo de configuración SCons y valores predeterminados

Actualmente, mi archivo SConstruct incorpora una ruta codificada a esas bibliotecas (por ejemplo, algo así como: C:\libfoo).

Ahora, me gustaría añadir una opción de configuración a mi archivo SConstruct de modo que un usuario que instaló libfoo en otro lugar (por ejemplo C:\custom_path\libfoo) puede hacer algo como:

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

O:

> 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 vez elegido, esas opciones de configuración se deben escribir en algún archivo y volver a leer automáticamente cada vez que se ejecute scons.

¿Tiene scons este mecanismo? ¿Cómo alcanzaría este comportamiento? No domino Python exactamente, así que incluso las soluciones obvias (pero completas) son bienvenidas.

Gracias.

Respuesta

5

SCons tiene una función llamada "Variables". Puede configurarlo para que lea las variables de los argumentos de línea de comandos con bastante facilidad. Entonces, en su caso, haría algo como esto desde la línea de comando:

scons LIBFOO=C:\custom_path\libfoo 

... y la variable se recordará entre ejecuciones. Así que la próxima vez que ejecutas scons usa el valor anterior de LIBFOO.

En el código que lo utilice de esta manera:

# 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) 

Si realmente querían usar "-" opciones de estilo, entonces podrían combinar lo anterior con la función AddOption, pero es más complicado.

This SO question habla de los problemas relacionados con la obtención de valores del objeto Variables sin pasarlos por un entorno.

+0

Gracias, eso parece ser el truco;) ¿Hay alguna otra forma de obtener el valor de una variable? Algo así como 'print var.getVariable ('LIBFOO')' – ereOn

+0

@ereOn He revisado la documentación, pero parece que * no * hay alguna forma de hacer esto. Bastante asimétrico Tienes que empujar las variables en un entorno y leerlo. Actualizaré la publicación si alguna vez la descubro. – richq

Cuestiones relacionadas