diff options
Diffstat (limited to 'xmake/rules/c++/modules/builder.lua')
| -rw-r--r-- | xmake/rules/c++/modules/builder.lua | 43 |
1 files changed, 34 insertions, 9 deletions
diff --git a/xmake/rules/c++/modules/builder.lua b/xmake/rules/c++/modules/builder.lua index d0863ad98..b988ff152 100644 --- a/xmake/rules/c++/modules/builder.lua +++ b/xmake/rules/c++/modules/builder.lua @@ -194,6 +194,10 @@ function should_build(target, module) local dependinfo = {} dependinfo.files = {module.sourcefile} dependinfo.values = {compinst:program(), compflags} + if module.bmifile and not module.headerunit and support.has_two_phase_compilation_support(target) then + local bmi_mode = support.has_precompile_reduced_bmi_support(target) and support.get_modulesprecompilereducedbmiflag(target) or "--precompile" + table.insert(dependinfo.values, bmi_mode) + end local objectfile_exists = (module.headerunit or support.is_bmionly(target, module.sourcefile)) and true or os.isfile(module.objectfile) dependinfo.lastmtime = (os.isfile(module.bmifile or module.objectfile) and objectfile_exists) and os.mtime(dependfile) or 0 @@ -241,6 +245,7 @@ function build_modules_for_jobgraph(target, jobgraph, built_modules) profiler.enter(target:fullname(), "c++ modules", "builder", "schedule module bmi build jobs") local builder = _builder(target) local has_two_phase_compilation_support = support.has_two_phase_compilation_support(target) + local has_precompile_reduced_bmi = support.has_precompile_reduced_bmi_support(target) local jobdeps = {} local buildfilejobs = {} @@ -272,19 +277,24 @@ function build_modules_for_jobgraph(target, jobgraph, built_modules) local buildfilejob = _get_module_buildfilejob_for(target, sourcefile, moduletype) table.insert(buildfilejobs, buildfilejob) jobgraph:add(buildfilejob, function(_, _, jobopt) - progress.set_target(jobopt.progress, target) + local moduleopt = table.clone(jobopt) + progress.set_target(moduleopt.progress, target) -- build bmi if named job - jobopt.bmi = module.name + moduleopt.bmi = module.name -- build objectfile here if two phase compilation is not supported - jobopt.objectfile = not has_two_phase_compilation_support and not bmionly - builder.make_module_job(target, module, jobopt) + moduleopt.objectfile = not has_two_phase_compilation_support and not bmionly + builder.make_module_job(target, module, moduleopt) end) _merge_jobdeps(jobdeps, _get_jobdeps(target, module, jobgraph, buildfilejob)) -- if two phase compilation supported set jobdeps for objectfile job if has_two_phase_compilation_support and not bmionly then local objbuildfilejob = _get_module_buildfilejob_for(target, sourcefile, "objectfile") - _merge_jobdeps(jobdeps, {[objbuildfilejob] = {buildfilejob}}) + if has_precompile_reduced_bmi then + _merge_jobdeps(jobdeps, _get_jobdeps(target, module, jobgraph, objbuildfilejob)) + else + _merge_jobdeps(jobdeps, {[objbuildfilejob] = {buildfilejob}}) + end end end end) @@ -327,10 +337,11 @@ function build_objectfiles_for_jobgraph(target, jobgraph, built_modules) local module = mapper.get(target, sourcefile) local buildfilejob = _get_module_buildfilejob_for(target, sourcefile, "objectfile") jobgraph:add(buildfilejob, function(_, _, jobopt) - progress.set_target(jobopt.progress, target) - jobopt.bmi = false - jobopt.objectfile = true - builder.make_module_job(target, module, jobopt) + local moduleopt = table.clone(jobopt) + progress.set_target(moduleopt.progress, target) + moduleopt.bmi = false + moduleopt.objectfile = true + builder.make_module_job(target, module, moduleopt) end) end end @@ -719,6 +730,16 @@ function build_bmis(target, jobgraph, _, opt) local built_modules, built_headerunits, _ = scanner.sort_modules_by_dependencies(target, modules, {jobgraph = target:policy("build.jobgraph")}) local headerunits, stlheaderunits = scanner.sort_headerunits(target, built_headerunits) if jobgraph.add_orders then -- jobgraph + if support.has_precompile_reduced_bmi_support(target) then + -- schedule object jobs in the BMI stage so both jobs can run concurrently + -- after their imported BMIs are ready + local append_requires_flags = _builder(target).append_requires_flags + if append_requires_flags then + append_requires_flags(target, built_modules) + end + build_objectfiles_for_jobgraph(target, jobgraph, built_modules) + end + -- build headerunits if stlheaderunits or headerunits then build_headerunits_for_jobgraph(target, jobgraph, stlheaderunits, headerunits) @@ -760,6 +781,10 @@ function build_objectfiles(target, jobgraph, _, opt) if target:is_moduleonly() and not target:data("cxx.modules.reused") or target:is_phony() then return end + if jobgraph.add_orders and support.has_precompile_reduced_bmi_support(target) then + -- object jobs have already been scheduled by build_bmis() + return + end profiler.enter(target:fullname(), "c++ modules", "builder", "objectfiles") local modules = scanner.get_modules(target) -- avoid building non referenced modules |
