2012-04-10 6 views
10

Ich versuche SCONs so einzurichten, dass Abhängigkeiten von Dateien überwacht werden, die automatisch während des Builds generiert werden und korrekt mit einem Multithread-Build funktionieren. Das Projekt, das ich erstelle, ist ein CIM-Provider, bestehend aus MOF-Dateien, die die Datenstrukturen, automatisch erzeugte Quell- und Header-Dateien aus den MOF-Dateien und handgeschriebene Quell- und Header-Dateien definieren, die auf die automatisch generierten Dateien verweisen. Damit der Build erfolgreich ausgeführt werden kann, muss der Autogenerationsschritt vollständig ausgeführt werden, bevor eine der handgeschriebenen Dateien kompiliert wird. Anderenfalls werden die Header, auf die sich die handgeschriebenen Dateien stützen, noch nicht existieren und es wird fehlschlagen. Die CPP-Dateien, die durch den Schritt der automatischen Generierung erstellt werden, müssen ebenfalls der Quellliste hinzugefügt und im endgültigen Build kompiliert werden.SCons Abhängigkeit von Dateien, die zur Kompilierungszeit generiert wurden

Beim Ausführen eines einzelnen Threaded-Builds funktioniert alles einwandfrei, da der Schritt der automatischen Generierung vor dem Kompilierungsschritt immer abgeschlossen ist, sodass die generierten Header vorhanden sind. Beim Ausführen des Build-Multithreads versucht es jedoch, die handgeschriebenen Dateien zu kompilieren, bevor der Schritt der automatischen Generierung abgeschlossen ist und der Build fehlschlägt. Ich habe eine explizite Abhängigkeit angegeben, aber SCons folgt nicht.

Hier ist der relevante Teil meiner SConscript-Datei, ich entfernte einzelne Dateinamen von cim_targets [], weil die Liste sehr lang ist, aber um zusammenzufassen, cim_targets [] ist die Liste der Zielausgabedateien für den automatischen Erzeugungsschritt provider_sources [ ] ist die zurückgegebene Quellenliste nach Abschluss des Autogen-Schritts, sources [] ist die Liste der handschriftlichen Quelldateien, GenProvider() ist ein extern erstellter Command-Builder, der den automatischen Erzeugungsschritt ausführt, und SharedLibrary() ist ein extern definierter Builder, der dies tut was es klingt, verwendet den SCons Bibliothek Builder mit einigen Erweiterungen

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

ich habe versucht, eine explizite Abhängigkeit einstellen, so dass die handschriftlichen Quellen Kompilieren würde nicht, bis alle generierten Quellen erstellt wurden (this_env.Depends (sources, provider_sources)), aber beim Ausführen von Multithreading ignoriert SCons diese Abhängigkeit und versucht, die handgeschriebenen Dateien zu kompilieren, bevor der automatische Erzeugungsschritt abgeschlossen ist.

Antwort

3

Haben Sie versucht, die Nebeneffekt() Funktion wie hier definiert:

SCons Wiki: SideEffect

Ich bin nicht sicher, ob es genau für Ihren Bedarf erstellt wurde, aber helfen kann.

+0

Der automatische Erzeugungsschritt erstellt eine Manifestdatei, also habe ich versucht, diese als SideEffect-Ziel zu verwenden: , aber leider besteht das Problem weiterhin, danke für den Vorschlag – rdowell

Verwandte Themen