diff options
| author | ruki <[email protected]> | 2025-04-06 20:58:25 +0800 |
|---|---|---|
| committer | ruki <[email protected]> | 2025-04-08 15:31:57 +0800 |
| commit | 99f68b5c58d822170c84e2b6c0b3f7f974e009be (patch) | |
| tree | c8c56bda3847417b66ca747eab722107847a7f86 | |
| parent | 406b9d08d56eae4893082d75e84f016f4619f66c (diff) | |
remove unused prepare jobs
4 files changed, 96 insertions, 108 deletions
diff --git a/xmake/rules/c++/modules/modules_support/builder.lua b/xmake/rules/c++/modules/modules_support/builder.lua index 7d5ebd0c8..2a0977524 100644 --- a/xmake/rules/c++/modules/modules_support/builder.lua +++ b/xmake/rules/c++/modules/modules_support/builder.lua @@ -457,7 +457,10 @@ function build_modules_and_headerunits(target, jobgraph, sourcebatch, modules, o jobgraph:add_orders(build_headerunits_group, build_modules_group) end end - else -- deprecated + elseif jobgraph.runcmds then + build_headerunits_for_batchcmds(target, jobgraph, sourcebatch, modules, opt) + build_modules_for_batchcmds(target, jobgraph, sourcebatch, modules, opt) + elseif jobgraph.newjob then -- deprecated build_modules_for_batchjobs(target, jobgraph, sourcebatch, modules, opt) build_headerunits_for_batchjobs(target, jobgraph, sourcebatch, modules, opt) end @@ -571,3 +574,44 @@ function is_dependencies_changed(target, module) end return requires, changed end + +-- patch sourcebatch +function patch_sourcebatch(target, sourcebatch, opt) + + -- add target deps modules + if target:orderdeps() then + local deps_sourcefiles = dependency_scanner.get_targetdeps_modules(target) + if deps_sourcefiles then + table.join2(sourcebatch.sourcefiles, deps_sourcefiles) + end + end + + -- append std module + local std_modules = compiler_support.get_stdmodules(target) + if std_modules then + table.join2(sourcebatch.sourcefiles, std_modules) + end + + -- extract packages modules dependencies + local package_modules_data = dependency_scanner.get_all_packages_modules(target, opt) + if package_modules_data then + -- append to sourcebatch + for _, package_module_data in table.orderpairs(package_modules_data) do + table.insert(sourcebatch.sourcefiles, package_module_data.file) + target:fileconfig_set(package_module_data.file, {external = package_module_data.external, defines = package_module_data.metadata.defines}) + end + end + + -- patch objectfiles and dependencies + sourcebatch.sourcekind = "cxx" + sourcebatch.objectfiles = {} + sourcebatch.dependfiles = {} + for _, sourcefile in ipairs(sourcebatch.sourcefiles) do + local objectfile = target:objectfile(sourcefile) + table.insert(sourcebatch.objectfiles, objectfile) + + local dependfile = target:dependfile(sourcefile or objectfile) + table.insert(sourcebatch.dependfiles, dependfile) + end +end + diff --git a/xmake/rules/c++/modules/modules_support/compiler_support.lua b/xmake/rules/c++/modules/modules_support/compiler_support.lua index a5a32e2c5..eed30a320 100644 --- a/xmake/rules/c++/modules/modules_support/compiler_support.lua +++ b/xmake/rules/c++/modules/modules_support/compiler_support.lua @@ -69,20 +69,6 @@ function strip_flags(target, flags) return _compiler_support(target).strip_flags(target, flags) end --- patch sourcebatch -function patch_sourcebatch(target, sourcebatch) - sourcebatch.sourcekind = "cxx" - sourcebatch.objectfiles = {} - sourcebatch.dependfiles = {} - for _, sourcefile in ipairs(sourcebatch.sourcefiles) do - local objectfile = target:objectfile(sourcefile) - table.insert(sourcebatch.objectfiles, objectfile) - - local dependfile = target:dependfile(sourcefile or objectfile) - table.insert(sourcebatch.dependfiles, dependfile) - end -end - -- get bmi extension function get_bmi_extension(target) return _compiler_support(target).get_bmi_extension() diff --git a/xmake/rules/c++/modules/modules_support/dependency_scanner.lua b/xmake/rules/c++/modules/modules_support/dependency_scanner.lua index 4a8f08909..94b8a4804 100644 --- a/xmake/rules/c++/modules/modules_support/dependency_scanner.lua +++ b/xmake/rules/c++/modules/modules_support/dependency_scanner.lua @@ -202,9 +202,8 @@ function _get_edges(nodes, modules) return edges end -function _get_package_modules(target, package, opt) +function _get_package_modules(target, package) local package_modules - local modulesdir = path.join(package:installdir(), "modules") local metafiles = os.files(path.join(modulesdir, "*", "*.meta-info")) for _, metafile in ipairs(metafiles) do @@ -213,42 +212,39 @@ function _get_package_modules(target, package, opt) local moduleonly = not package:libraryfiles() package_modules[name] = {file = path.join(modulesdir, modulefile), metadata = metadata, external = {moduleonly = moduleonly}} end - return package_modules end --- generate dependency files -function _generate_dependencies(target, sourcebatch, opt) - local changed = false - if opt.jobgraph then - local jobs = option.get("jobs") or os.default_njob() - runjobs(target:fullname() .. "/module_dependency_scanner", function(index) - local sourcefile = sourcebatch.sourcefiles[index] - changed = _dependency_scanner(target).generate_dependency_for(target, sourcefile, opt) or changed - end, {comax = jobs, total = #sourcebatch.sourcefiles}) - else - for _, sourcefile in ipairs(sourcebatch.sourcefiles) do - changed = _dependency_scanner(target).generate_dependency_for(target, sourcefile, opt) or changed - end - end - return changed -end --- get module dependencies -function get_module_dependencies(target, sourcebatch, opt) - local cachekey = target:fullname() .. "/" .. sourcebatch.rulename - local modules = compiler_support.memcache():get2("modules", cachekey) - if modules == nil then - modules = compiler_support.localcache():get2("modules", cachekey) - opt.progress = opt.progress or 0 - local changed = _generate_dependencies(target, sourcebatch, opt) - if changed or modules == nil then +-- generate module dependencies +function generate_module_dependencies(target, jobgraph, sourcebatch, opt) + local parsejob = target:fullname() .. "/parse_module_dependencies" + jobgraph:add(parsejob, function (index, total, opt) + local changed = compiler_support.memcache():get2("modules", "dependencies_changed") + if changed then + local cachekey = target:fullname() .. "/" .. sourcebatch.rulename local moduleinfos = compiler_support.load_moduleinfos(target, sourcebatch) - modules = _parse_dependencies_data(target, moduleinfos) + local modules = _parse_dependencies_data(target, moduleinfos) compiler_support.localcache():set2("modules", cachekey, modules) compiler_support.localcache():save() end - compiler_support.memcache():set2("modules", cachekey, modules) + end) + for _, sourcefile in ipairs(sourcebatch.sourcefiles) do + local jobname = target:fullname() .. "/generate_module_dependencies/" .. sourcefile + jobgraph:add(jobname, function (index, total, opt) + local changed = _dependency_scanner(target).generate_dependency_for(target, sourcefile, opt) + if changed then + compiler_support.memcache():set2("modules", "dependencies_changed", true) + end + end) + jobgraph:add_orders(jobname, parsejob) end +end + +-- get module dependencies +function get_module_dependencies(target, sourcebatch) + local cachekey = target:fullname() .. "/" .. sourcebatch.rulename + local modules = compiler_support.localcache():get2("modules", cachekey) + assert(modules, "no module dependencies!") return modules end @@ -387,7 +383,7 @@ function fallback_generate_dependencies(target, jsonfile, sourcefile, preprocess end -- extract packages modules dependencies -function get_all_packages_modules(target, opt) +function get_all_packages_modules(target) -- parse all meta-info and append their informations to the package store local packages = target:pkgs() or {} @@ -397,7 +393,7 @@ function get_all_packages_modules(target, opt) local packages_modules for _, package in table.orderpairs(packages) do - local package_modules = _get_package_modules(target, package, opt) + local package_modules = _get_package_modules(target, package) if package_modules then packages_modules = packages_modules or {} table.join2(packages_modules, package_modules) diff --git a/xmake/rules/c++/modules/xmake.lua b/xmake/rules/c++/modules/xmake.lua index 5f17e2099..87429f90c 100644 --- a/xmake/rules/c++/modules/xmake.lua +++ b/xmake/rules/c++/modules/xmake.lua @@ -70,6 +70,20 @@ rule("c++.build.modules.builder") set_sourcekinds("cxx") set_extensions(".mpp", ".mxx", ".cppm", ".ixx") + -- generate module dependencies + on_prepare_files(function (target, jobgraph, sourcebatch, opt) + if target:data("cxx.has_modules") then + import("modules_support.builder") + import("modules_support.dependency_scanner") + + -- patch sourcebatch + builder.patch_sourcebatch(target, sourcebatch) + + -- generate module dependencies + dependency_scanner.generate_module_dependencies(target, jobgraph, sourcebatch, opt) + end + end, {jobgraph = true}) + -- parallel build support to accelerate `xmake build` to build modules before_build_files(function(target, jobgraph, sourcebatch, opt) if target:data("cxx.has_modules") then @@ -77,36 +91,11 @@ rule("c++.build.modules.builder") import("modules_support.dependency_scanner") import("modules_support.builder") - -- add target deps modules - if target:orderdeps() then - local deps_sourcefiles = dependency_scanner.get_targetdeps_modules(target) - if deps_sourcefiles then - table.join2(sourcebatch.sourcefiles, deps_sourcefiles) - end - end - - -- append std module - local std_modules = compiler_support.get_stdmodules(target) - if std_modules then - table.join2(sourcebatch.sourcefiles, std_modules) - end - - -- extract packages modules dependencies - local package_modules_data = dependency_scanner.get_all_packages_modules(target, opt) - if package_modules_data then - -- append to sourcebatch - for _, package_module_data in table.orderpairs(package_modules_data) do - table.insert(sourcebatch.sourcefiles, package_module_data.file) - target:fileconfig_set(package_module_data.file, {external = package_module_data.external, defines = package_module_data.metadata.defines}) - end - end - - opt = opt or {} - opt.jobgraph = true - - compiler_support.patch_sourcebatch(target, sourcebatch, opt) - local modules = dependency_scanner.get_module_dependencies(target, sourcebatch, opt) + -- patch sourcebatch + builder.patch_sourcebatch(target, sourcebatch) + -- get module dependencies + local modules = dependency_scanner.get_module_dependencies(target, sourcebatch) if not target:is_moduleonly() then -- avoid building non referenced modules local build_objectfiles, link_objectfiles = dependency_scanner.sort_modules_by_dependencies(target, sourcebatch.objectfiles, modules) @@ -134,45 +123,18 @@ rule("c++.build.modules.builder") import("modules_support.dependency_scanner") import("modules_support.builder") - -- add target deps modules - if target:orderdeps() then - local deps_sourcefiles = dependency_scanner.get_targetdeps_modules(target) - if deps_sourcefiles then - table.join2(sourcebatch.sourcefiles, deps_sourcefiles) - end - end - - -- append std module - local std_modules = compiler_support.get_stdmodules(target) - if std_modules then - table.join2(sourcebatch.sourcefiles, std_modules) - end - - -- extract packages modules dependencies - local package_modules_data = dependency_scanner.get_all_packages_modules(target, opt) - if package_modules_data then - -- append to sourcebatch - for _, package_module_data in table.orderpairs(package_modules_data) do - table.insert(sourcebatch.sourcefiles, package_module_data.file) - target:fileconfig_set(package_module_data.file, {external = package_module_data.external, defines = package_module_data.metadata.defines}) - end - end - - opt = opt or {} - opt.jobgraph = false - - compiler_support.patch_sourcebatch(target, sourcebatch, opt) - local modules = dependency_scanner.get_module_dependencies(target, sourcebatch, opt) + -- patch sourcebatch + builder.patch_sourcebatch(target, sourcebatch) + -- get module dependencies + local modules = dependency_scanner.get_module_dependencies(target, sourcebatch) if not target:is_moduleonly() then -- avoid building non referenced modules local build_objectfiles, link_objectfiles = dependency_scanner.sort_modules_by_dependencies(target, sourcebatch.objectfiles, modules) sourcebatch.objectfiles = build_objectfiles -- build headerunits and modules - builder.build_headerunits_for_batchcmds(target, batchcmds, sourcebatch, modules, opt) - builder.build_modules_for_batchcmds(target, batchcmds, sourcebatch, modules, opt) - + builder.build_modules_and_headerunits(target, batchcmds, sourcebatch, modules, opt) sourcebatch.objectfiles = link_objectfiles else -- avoid duplicate linking of object files of non-module programs |
