diff options
| author | Arthur LAURENT <[email protected]> | 2024-10-04 17:52:17 +0200 |
|---|---|---|
| committer | Arthur LAURENT <[email protected]> | 2024-10-08 13:47:45 +0200 |
| commit | dc73c38303b736a8dec9ac4df0ed0a3a7f55d318 (patch) | |
| tree | 21b0628a75cfc86976d348c327751d7f31369610 | |
| parent | 593ef027feec3417cabd2825db673ee8ce656402 (diff) | |
fix module dependency flags update
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 |
