summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorruki <[email protected]>2025-08-19 00:17:05 +0800
committerGitHub <[email protected]>2025-08-19 00:17:05 +0800
commit583378709fcb5831c0f09cec9c4e227246087b23 (patch)
treef674714164ec8daca014eddd0465e2d97ce556bc
parent3fd6e799c8ec2c7203a862f4252bdbe2bcf4cb61 (diff)
parent852c1a7ddaf11540a8e9e6d778930bd72e1d4c3b (diff)
Merge pull request #6707 from Arthapz/fix-sourcebatch-caching
fix(c++ modules) fix sourcebatch caching (previously cached in localc…
-rw-r--r--xmake/rules/c++/modules/scanner.lua69
1 files changed, 22 insertions, 47 deletions
diff --git a/xmake/rules/c++/modules/scanner.lua b/xmake/rules/c++/modules/scanner.lua
index 9cf015502..294d73e21 100644
--- a/xmake/rules/c++/modules/scanner.lua
+++ b/xmake/rules/c++/modules/scanner.lua
@@ -365,31 +365,27 @@ end
function _patch_sourcebatch(target, sourcebatch)
local memcache = support.memcache()
- -- target deps modules
- local depsmodules = _get_targetdeps_modules(target) or {}
+ local cached_sourcebatch = memcache:get2(target:fullname(), "cached_sourcebatch")
+ if not cached_sourcebatch then
+ -- target deps modules
+ local depsmodules = _get_targetdeps_modules(target) or {}
- -- package modules
- local pkgmodules = _get_packages_modules(target) or {}
+ -- package modules
+ local pkgmodules = _get_packages_modules(target) or {}
- local from_depmodules = table.join(depsmodules, pkgmodules)
- local keys = #sourcebatch.sourcefiles > 0 and table.concat(sourcebatch.sourcefiles) or " "
- keys = keys .. (#from_depmodules > 0 and table.concat(table.orderkeys(from_depmodules)) or " ")
- local md5sum = hash.md5(bytes(keys))
- local localcache = support.localcache()
+ local from_depmodules = table.join(depsmodules, pkgmodules)
+ local localcache = support.localcache()
- local cached_patched_sourcebatch = localcache:get2(target:fullname(), "patched_sourcebatch")
- if not cached_patched_sourcebatch or md5sum ~= cached_patched_sourcebatch.md5sum then
local reuse = target:policy("build.c++.modules.reuse") or
- target:policy("build.c++.modules.tryreuse")
+ target:policy("build.c++.modules.tryreuse")
local reused = {}
for sourcefile, fileconfig in pairs(from_depmodules) do
if reuse and fileconfig.from_dep then
local nocheck = target:policy("build.c++.modules.reuse.nocheck")
local strict = target:policy("build.c++.modules.reuse.strict") or
- target:policy("build.c++.modules.tryreuse.discriminate_on_defines")
+ target:policy("build.c++.modules.tryreuse.discriminate_on_defines")
local dep = target:dep(fileconfig.from_dep)
assert(dep, "dep target <%s> for <%s> not found", fileconfig.from_dep, target:fullname())
-
local can_reuse = nocheck or _are_flags_compatible(target, dep, sourcefile, {strict = strict})
if can_reuse then
local _reused, from = support.is_reused(dep, sourcefile)
@@ -417,40 +413,19 @@ function _patch_sourcebatch(target, sourcebatch)
local dependfile = _target:dependfile(sourcefile or objectfile)
table.insert(sourcebatch.dependfiles, dependfile)
end
- localcache:set2(target:fullname(), "patched_sourcebatch", {sourcefiles = sourcebatch.sourcefiles, dependfiles = sourcebatch.dependfiles, reused = reused, md5sum = md5sum})
- memcache:set2(target:fullname(), "modules.changed", true)
- else
- local reused = hashset.from(cached_patched_sourcebatch.reused)
- for sourcefile, fileconfig in pairs(from_depmodules) do
- if reused:has(sourcefile) then
- local dep = target:dep(fileconfig.from_dep)
- assert(dep, "dep target <%s> for <%s> not found", fileconfig.from_dep, target:fullname())
- local _reused, from = support.is_reused(dep, sourcefile)
- if _reused then
- support.set_reused(target, from, sourcefile)
- else
- support.set_reused(target, dep, sourcefile)
- end
- if dep:is_moduleonly() then
- dep:data_set("cxx.modules.reused", true)
- end
- end
- target:fileconfig_add(sourcefile, fileconfig)
- end
- sourcebatch.sourcekind = "cxx"
- sourcebatch.objectfiles = {}
- sourcebatch.dependfiles = {}
- for _, sourcefile in ipairs(sourcebatch.sourcefiles) do
- local reused, from = support.is_reused(target, sourcefile)
- local _target = reused and from or target
- local objectfile = _target:objectfile(sourcefile)
- local dependfile = _target:dependfile(objectfile)
- table.insert(sourcebatch.dependfiles, dependfile)
- sourcebatch.sourcekind = "cxx"
- sourcebatch.dependfiles= cached_patched_sourcebatch.dependfiles
- sourcebatch.sourcefiles = cached_patched_sourcebatch.sourcefiles
- sourcebatch.objectfiles= cached_patched_sourcebatch.objectfiles
+
+ table.sort(sourcebatch.sourcefiles)
+ memcache:set2(target:fullname(), "cached_sourcebatch", sourcebatch)
+
+ local keys = #sourcebatch.sourcefiles > 0 and table.concat(sourcebatch.sourcefiles) or "_"
+ local sum = hash.strhash32(keys)
+ local cached_sum = localcache:get2(target:fullname(), "sourcebatch_sum")
+ if not cached_sum or cached_sum ~= sum then
+ localcache:set2(target:fullname(), "sourcebatch_sum", sum)
+ memcache:set2(target:fullname(), "modules.changed", true)
end
+ else
+ sourcebatch = cached_sourcebatch
end
end