2012-04-10 11 views
10

Sto provando ad impostare SCons per seguire dipendenze sui file che vengono generati automaticamente durante la compilazione e funzionare correttamente con una build multi-thread.Dipendenza SCons sui file generati in fase di compilazione

Il progetto che sto creando è un provider CIM, composto da file MOF che definiscono le strutture dati, i file di origine e di intestazione generati automaticamente dai file MOF e file di origine e di intestazione scritti a mano che fanno riferimento ai file generati automaticamente. Affinché la compilazione abbia esito positivo, la fase di autogenerazione deve essere eseguita fino al completamento prima che uno qualsiasi dei file scritti a mano venga compilato, altrimenti le intestazioni su cui i file scritti a mano si basano non saranno ancora disponibili e non riusciranno. I file .cpp creati dal passaggio di autogenerazione devono anche essere aggiunti all'elenco dei sorgenti e compilati nella compilazione finale.

Quando si esegue una generazione a thread singolo, tutto funziona correttamente, perché il passaggio di autogenerazione è sempre completo prima del passaggio della compilazione, quindi le intestazioni generate sono a posto. Tuttavia, quando si esegue la generazione multi-thread, tenta di compilare i file scritti a mano prima che il passaggio dell'autogenerazione sia terminato e la compilazione fallisce. Ho specificato una dipendenza esplicita ma SCons non la sta seguendo.

Ecco la quota di competenza del mio file SConscript, ho rimosso i singoli nomi di file da cim_targets [] perché la lista è molto lunga, ma per riassumere, cim_targets [] l 'elenco dei file di output di destinazione per il passo autogenerazione, provider_sources [ ] è la lista restituita delle fonti dopo il completamento del passo autogen, sources [] è l'elenco dei file sorgente scritti a mano, GenProvider() è un builder Comando definito esternamente che esegue il passo di autogenerazione e SharedLibrary() è un builder definito esternamente che quello che sembra, usa il costruttore libreria SCons con alcune estensioni

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

ho provato a installare una dipendenza esplicita in modo che le fonti scritte a mano non viene compilato fino a quando non sono state create tutte le origini generate (this_env.Depends (sources, provider_sources)), ma quando è in esecuzione multi-thread, SCons ignora questa dipendenza e tenta di compilare i file scritti a mano prima del completamento del passaggio di autogenerazione.

risposta

3

Hai provato a usare la funzione di effetto collaterale(), come definito qui:

SCons Wiki: SideEffect

Non sono sicuro se è stato creato esattamente per il vostro bisogno, ma può aiutare.

+0

passo La generazione automatica fa creare un file manifesto, così ho tentato di utilizzare che come effetto collaterale l'obiettivo: ma purtroppo il problema persiste, grazie per il suggerimento, però – rdowell

Problemi correlati