Зависимость SCons от файлов, сгенерированных во время компиляции -

Я пытаюсь настроить SCons, чтобы они следовали зависимостям от файлов, которые автоматически генерируются во время сборки, и правильно работали с многопоточной -сборкой.

Проект, который я создаю, представляет собой CIM-провайдер, состоящий из MOF-файлов, определяющих структуры данных, автоматически сгенерированных исходных файлов и файлов заголовков, полученных из MOF-файлов, а также рукописных исходных файлов и файлов заголовков, которые ссылаются на автоматически сгенерированные файлы. Чтобы сборка прошла успешно, этап автогенерации должен быть завершен до завершения компиляции любого из рукописных файлов, в противном случае заголовки, на которые опираются рукописные файлы, еще не будут существовать, и произойдет сбой. Файлы.cpp, созданные на этапе автоматического создания, также должны быть добавлены в исходный список и скомпилированы в окончательной сборке.

При выполнении однопоточной сборки все работает нормально, поскольку этап автогенерации всегда завершается до этапа компиляции, поэтому сгенерированные заголовки находятся на своих местах. Однако при выполнении многопоточной сборки -она пытается скомпилировать рукописные файлы до завершения этапа автогенерации, и сборка завершается сбоем. Я указал явную зависимость, но SCons не следует ей.

Вот соответствующая часть моего файла SConscript, я удалил отдельные имена файлов из cim _target[], потому что список ОЧЕНЬ длинный, но, подытоживая, cim _target[] — это список целевых выходных файлов. для этапа автогенерации поставщик _sources[] — это возвращаемый список источников после завершения этапа автогенерации, sources[] — это список рукописных исходных файлов, GenProvider ()— это построитель команд, определенный извне, который выполняет этап автогенерации,и 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 игнорирует эту зависимость и пытается скомпилировать рукописные файлы до завершения этапа автогенерации.

10
задан rdowell 10 April 2012 в 16:47
поделиться