2012-04-10 68 views
10

我想設置SCons以遵循在構建過程中自動生成的文件的依賴關係,並且可以正確使用多線程構建。SCons依賴於在編譯時生成的文件

我正在構建的項目是一個CIM提供程序,它由定義數據結構的MOF文件,來自MOF文件的自動生成的源文件和頭文件以及引用自動生成文件的手寫源文件和頭文件組成。爲了使構建成功,自動生成步驟必須在任何手寫文件編譯之前運行完成,否則手寫文件所依賴的標題將不存在,並且會失敗。自動生成步驟創建的.cpp文件也必須添加到源列表中並在最終版本中編譯。

當運行單線程構建時,一切正常,因爲自動生成步驟始終在編譯步驟之前完成,因此生成的頭文件已就位。但是,在運行構建多線程時,它會在自動生成步驟完成之前嘗試編譯手寫文件,並且構建失敗。我已經指定了一個明確的依賴關係,但SCons並沒有遵循它。

這裏是我的SConscript文件的相關部分,我從cim_targets []中刪除單個文件名,因爲列表非常長,但總而言之,cim_targets []是autogeneration步驟的目標輸出文件列表provider_sources [ ]是autogen步驟完成後返回的源列表,sources []是手寫源文件列表,GenProvider()是外部定義的執行autogeneration步驟的Command構建器,SharedLibrary()是外部定義的構建器這聽起來像,使用利用Scons庫建設者一些擴展

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

我試着設置一個明確的依賴性,使得手寫來源在創建所有生成的源代碼之前(this_env.Depends(sources,provider_sources)),編譯器不會編譯,但在運行多線程時,SCons將忽略此依賴性並嘗試在自動生成步驟完成之前編譯手寫文件。

回答

3

有如下定義你嘗試過使用SideEffect()函數:如果

SCons Wiki: SideEffect

林不知道它究竟是創造了你的需要,但可能會有幫助。

+0

自動生成步驟確實會創建一個清單文件,因此我試圖將其用作SideEffect目標: ,但不幸的是問題仍然存在,儘管感謝您的建議 – rdowell 2012-04-13 15:36:35