我正在尝试设置SCons以遵循在构建期间自动生成的文件的依赖关系,并使用多线程构建正常工作.
我正在构建的项目是一个CIM提供程序,包括定义数据结构的MOF文件,来自MOF文件的自动生成的源文件和头文件,以及引用自动生成文件的手写源文件和头文件.为了使构建成功,自动生成步骤必须在编译任何手写文件之前运行完成,否则手写文件所依赖的标题将不存在并且将失败.自动生成步骤创建的.cpp文件也必须添加到源列表中并在最终构建中进行编译.
当运行单线程构建时,一切正常,因为自动生成步骤总是在编译步骤之前完成,因此生成的头文件就位.但是,在运行构建多线程时,它会尝试在自动生成步骤完成之前编译手写文件,并且构建失败.我已经指定了一个显式依赖项,但SCons没有遵循它.
这是我的SConscript文件的相关部分,我从cim_targets []中删除了单个文件名,因为列表非常长,但总而言之,cim_targets []是自动生成步骤的目标输出文件列表,provider_sources []是返回的autogen步骤完成后的源列表,sources []是手写源文件列表,GenProvider()是外部定义的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 = [ …Run Code Online (Sandbox Code Playgroud)