summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorArthur LAURENT <[email protected]>2024-10-04 17:52:17 +0200
committerArthur LAURENT <[email protected]>2024-10-08 13:47:45 +0200
commitdc73c38303b736a8dec9ac4df0ed0a3a7f55d318 (patch)
tree21b0628a75cfc86976d348c327751d7f31369610
parent593ef027feec3417cabd2825db673ee8ce656402 (diff)
fix module dependency flags update
-rw-r--r--xmake/rules/c++/modules/modules_support/builder.lua30
-rw-r--r--xmake/rules/c++/modules/modules_support/clang/builder.lua13
-rw-r--r--xmake/rules/c++/modules/modules_support/msvc/builder.lua5
3 files changed, 43 insertions, 5 deletions
diff --git a/xmake/rules/c++/modules/modules_support/builder.lua b/xmake/rules/c++/modules/modules_support/builder.lua
index f651e2b69..51e87a8a8 100644
--- a/xmake/rules/c++/modules/modules_support/builder.lua
+++ b/xmake/rules/c++/modules/modules_support/builder.lua
@@ -21,6 +21,7 @@
-- imports
import("core.base.json")
import("core.base.option")
+import("core.base.hashset")
import("async.runjobs")
import("private.async.buildjobs")
import("core.tool.compiler")
@@ -460,3 +461,32 @@ function add_headerunit_to_target_mapper(target, headerunit, bmifile)
return deduplicated and true or false
end
+-- check if dependencies changed
+function is_dependencies_changed(target, module)
+ local cachekey = target:name() .. module.name
+
+ for required, _ in table.orderpairs(module.requires) do
+ requires = requires or hashset.new()
+ requires:insert(required)
+ end
+
+ local oldrequires = compiler_support.memcache():get2(cachekey, "oldrequires")
+ or compiler_support.localcache():get2(cachekey, "oldrequires")
+
+ local changed = false
+ if oldrequires and requires then
+ oldrequires = hashset.from(oldrequires)
+ if oldrequires:size() ~= requires:size() then
+ requires_changed = true
+ else
+ for required in requires:keys() do
+ if not oldrequires:has(required) then
+ requires_changed = true
+ break
+ end
+ end
+ end
+ end
+
+ return requires:to_array(), changed
+end
diff --git a/xmake/rules/c++/modules/modules_support/clang/builder.lua b/xmake/rules/c++/modules/modules_support/clang/builder.lua
index 8981911bd..adbee51f0 100644
--- a/xmake/rules/c++/modules/modules_support/clang/builder.lua
+++ b/xmake/rules/c++/modules/modules_support/clang/builder.lua
@@ -122,10 +122,11 @@ function _get_requiresflags(target, module, opt)
local name = module.name
local cachekey = target:name() .. name
+ local requires, requires_changed = is_dependencies_changed(target, module)
local requiresflags = compiler_support.memcache():get2(cachekey, "requiresflags")
- or compiler_support.localcache():get2(cachekey, "requiresflags")
+ or compiler_support.localcache():get2(cachekey, "requiresflags")
- if not requiresflags then
+ if not requiresflags or requires_changed then
requiresflags = {}
for required, _ in table.orderpairs(module.requires) do
local dep_module = get_from_target_mapper(target, required)
@@ -146,8 +147,11 @@ function _get_requiresflags(target, module, opt)
table.join2(requiresflags, deps)
end
end
- compiler_support.memcache():set2(cachekey, "requiresflags", table.unique(requiresflags))
- compiler_support.localcache():set2(cachekey, "requiresflags", table.unique(requiresflags))
+ requiresflags = table.unique(requiresflags)
+ compiler_support.memcache():set2(cachekey, "requiresflags", requiresflags)
+ compiler_support.memcache():set2(cachekey, "oldrequires", requires)
+ compiler_support.localcache():set2(cachekey, "requiresflags", requiresflags)
+ compiler_support.localcache():set2(cachekey, "oldrequires", requires)
end
return requiresflags
end
@@ -231,6 +235,7 @@ function make_module_buildjobs(target, batchjobs, job_name, deps, opt)
build, dependinfo = should_build(target, opt.cppfile, bmifile, {name = name, objectfile = opt.objectfile, requires = opt.module.requires})
end
+ -- if build then
if build then
-- compile if it's a named module
if provide or compiler_support.has_module_extension(opt.cppfile) then
diff --git a/xmake/rules/c++/modules/modules_support/msvc/builder.lua b/xmake/rules/c++/modules/modules_support/msvc/builder.lua
index 2d17d2a39..5024a3f60 100644
--- a/xmake/rules/c++/modules/modules_support/msvc/builder.lua
+++ b/xmake/rules/c++/modules/modules_support/msvc/builder.lua
@@ -169,9 +169,10 @@ function _get_requiresflags(target, module, opt)
local name = module.name
local cachekey = target:name() .. name
+ local requires, requires_changed = is_dependencies_changed(target, module)
local requiresflags = compiler_support.memcache():get2(cachekey, "requiresflags")
or compiler_support.localcache():get2(cachekey, "requiresflags")
- if not requiresflags then
+ if not requiresflags or requires_changed then
local deps_flags = {}
for required, _ in table.orderpairs(module.requires) do
local dep_module = get_from_target_mapper(target, required)
@@ -212,7 +213,9 @@ function _get_requiresflags(target, module, opt)
end
end
compiler_support.memcache():set2(cachekey, "requiresflags", requiresflags)
+ compiler_support.memcache():set2(cachekey, "oldrequires", requires)
compiler_support.localcache():set2(cachekey, "requiresflags", requiresflags)
+ compiler_support.localcache():set2(cachekey, "oldrequires", requires)
end
return requiresflags
end