summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorruki <[email protected]>2025-04-06 20:58:25 +0800
committerruki <[email protected]>2025-04-08 15:31:57 +0800
commit99f68b5c58d822170c84e2b6c0b3f7f974e009be (patch)
treec8c56bda3847417b66ca747eab722107847a7f86
parent406b9d08d56eae4893082d75e84f016f4619f66c (diff)
remove unused prepare jobs
-rw-r--r--xmake/rules/c++/modules/modules_support/builder.lua46
-rw-r--r--xmake/rules/c++/modules/modules_support/compiler_support.lua14
-rw-r--r--xmake/rules/c++/modules/modules_support/dependency_scanner.lua60
-rw-r--r--xmake/rules/c++/modules/xmake.lua84
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