2012-04-10 16 views
10

Estoy tratando de configurar SCons para que siga las dependencias en los archivos que se generan automáticamente durante la compilación, y funciona correctamente con una compilación multiproceso.SCons depende de los archivos generados en tiempo de compilación

El proyecto que estoy construyendo es un proveedor CIM, que consiste en archivos MOF que definen las estructuras de datos, origen autogenerado y archivos de encabezado que provienen de los archivos MOF y fuente manuscrita y encabezado que hacen referencia a los archivos autogenerados. Para que la compilación tenga éxito, el paso de autogeneración debe completarse antes de compilar cualquiera de los archivos escritos a mano, de lo contrario, los encabezados de los que dependen los archivos manuscritos no existirán aún y fallarán. Los archivos .cpp que se crean mediante el paso de autogeneración también se deben agregar a la lista fuente y compilarse en la compilación final.

Al ejecutar una compilación de un solo subproceso, todo funciona bien, porque el paso de autogeneración siempre se completa antes del paso de compilación, por lo que los encabezados generados están en su lugar. Sin embargo, al ejecutar la compilación de subprocesos múltiples, intenta compilar los archivos escritos a mano antes de que el paso de autogeneración haya finalizado y la compilación falla. He especificado una dependencia explícita, pero SCons no la está siguiendo.

Aquí está la parte relevante de mi archivo SConscript, eliminé nombres de archivo individuales de cim_targets [] porque la lista es MUY larga, pero para resumir, cim_targets [] es la lista de archivos de salida de destino para el paso de autogeneración, provider_sources [ ] es la lista de fuentes devuelta después de completar el paso de autogen, sources [] es la lista de archivos fuente manuscrita, GenProvider() es un constructor de comandos definido externamente que ejecuta el paso de autogeneración, y SharedLibrary() es un constructor definido externamente que hace lo que suena, utiliza el constructor de bibliotecas de SCons con algunas extensiones

# Define directory paths for the CIM schema 
cim_dir = 'cim-schema-2.26.0' 

var_smis_dir = Dir('.').abspath # src/lib/XXX in variant 

cim_sources = [ 
    Glob(os.path.join(cim_dir, '*qualifiers*.mof')), 
    Glob(os.path.join(cim_dir, 'Core')  + '/CIM_*.mof'), 
    Glob(os.path.join(cim_dir, 'Device') + '/CIM_*.mof'), 
    Glob(os.path.join(cim_dir, 'Event') + '/CIM_*.mof'), 
    Glob(os.path.join(cim_dir, 'XXXXXX') + '/XXX_*.mof'), 
    Glob(os.path.join(cim_dir, 'Interop') + '/CIM_*.mof'), 
    Glob(os.path.join(cim_dir, 'Physical') + '/CIM_*.mof'), 
    Glob(os.path.join(cim_dir, 'System') + '/CIM_*.mof'), 
] 

cim_sources_flat = [] 
for cim in cim_sources: 
    for src in cim: 
     cim_sources_flat.append(src) 

cim_targets = [ 
    ...... 
] 

sources = [ 
    'driver.cpp', 
    'device.cpp', 
    'cim_static_data.cpp', 
    'module.cpp', 
    'diag_log.cpp', 
    'profile_element.cpp', 
] 

staticlibs = [ 
    ...... 
    ] 


dynamiclibs = [ 
    ..... 
    ] 

var_cim_sources = this_env.Install(var_smis_dir, cim_sources_flat) 

cim_mof = 'cimv226.mof' 

cim_linux_mof = os.path.join(cim_dir, 'cimv226-gen-flat.mof') 

var_cim_sources.extend(this_env.Command(cim_mof, cim_linux_mof, Copy('$TARGET', '$SOURCE'))) 

# first generate the provider infrastructure using cimple 
provider_sources = this_env.GenProvider(cim_targets, var_cim_sources, name, var_smis_dir) 

# make sure these files don't build until AFTER the provider files have been created 
this_env.Depends(sources, provider_sources) 

sources_full = provider_sources + sources 

# now we can compile the provider 
this_env.SharedLibrary(libname, source=sources_full, staticlibs=staticlibs, dynamiclibs=dynamiclibs, installpath=install_dir) 

he intentado establecer una dependencia explícita de manera que las fuentes escritas a mano no se compilaría hasta que se hayan creado todas las fuentes generadas (this_env.Depends (sources, provider_sources)) pero al ejecutar múltiples subprocesos, SCons ignora esta dependencia e intenta compilar los archivos manuscritos antes de que se complete el paso de autogeneración.

Respuesta

3

¿Ha intentado utilizar la función de efecto secundario() como se define aquí:

SCons Wiki: SideEffect

No estoy seguro de si se creó precisamente para su necesidad, pero puede ayudar.

+0

El paso de autogeneración crea un archivo de manifiesto, así que intenté usarlo como objetivo de SideEffect: pero desafortunadamente el problema persiste, gracias por la sugerencia – rdowell

Cuestiones relacionadas