2012-04-10 3 views
10

Próbuję skonfigurować SCons tak, aby śledzić zależności od plików generowanych automatycznie podczas kompilacji i działać poprawnie z kompilacją wielowątkową.Zależność SCons od plików generowanych podczas kompilacji

Projekt, który buduję, jest dostawcą CIM, składającym się z plików MOF definiujących struktury danych, automatycznie generowane pliki źródłowe i nagłówkowe pochodzące z plików MOF oraz odręczne pliki źródłowe i nagłówkowe, które odwołują się do automatycznie wygenerowanych plików. Aby kompilacja się powiodła, etap autogeneracji musi zostać ukończony przed skompilowaniem jakiegokolwiek ręcznie pisanego pliku, w przeciwnym razie nagłówki, od których zależą odręczne pliki, nie będą jeszcze istniały i zakończy się niepowodzeniem. Pliki .cpp utworzone przez etap autogeneracji muszą również zostać dodane do listy źródłowej i skompilowane w ostatecznej wersji.

Podczas pracy z kompilacją z jednym wątkiem wszystko działa poprawnie, ponieważ krok autogeneracji jest zawsze zakończony przed krokiem kompilacji, więc wygenerowane nagłówki są na miejscu. Jednak podczas uruchamiania wielowątkowej kompilacji próbuje skompilować ręcznie napisane pliki, zanim zakończy się etap autogeneracji, a kompilacja się nie powiedzie. Podałem wyraźną zależność, ale SCons jej nie śledzi.

Oto odpowiednia część mojego pliku SConscript, usunąłem pojedyncze nazwy plików z cim_targets [], ponieważ lista jest BARDZO długa, ale podsumowując, cim_targets [] jest listą docelowych plików wyjściowych dla etapu autogeneracji, provider_sources [ ] jest zwróconą listą źródeł po zakończeniu kroku autogen, źródło [] jest listą odręcznych plików źródłowych, GenProvider() jest zewnętrznie definiowanym konstruktorem Komend, który wykonuje etap autogeneracji, a SharedLibrary() jest zewnętrznie zdefiniowanym konstruktorem, który robi co brzmi jak, wykorzystuje budowniczy biblioteki sCons z kilkoma rozszerzeniami

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

próbowałem ustawienie wyraźną zależność tak, że źródła odręczny nie będzie się kompilował, dopóki nie zostaną utworzone wszystkie wygenerowane źródła (this_env.Depends (sources, sources_sources)), ale podczas uruchamiania wielowątkowego, SCons ignoruje tę zależność i próbuje skompilować odręczne pliki przed zakończeniem etapu autogeneracji.

Odpowiedz

3

Czy próbowali za pomocą funkcji SideEffect() jak zdefiniowano tutaj:

SCons Wiki: SideEffect

Nie jestem pewien, czy to został stworzony dokładnie do potrzeb użytkownika, ale może pomóc.

+0

Krok autogeneracji tworzy plik manifestu, więc próbowałem użyć go jako celu SideEffect: , ale niestety problem nadal występuje, dzięki za sugestię – rdowell