diff options
| author | Arthur LAURENT <[email protected]> | 2025-09-15 03:34:34 +0200 |
|---|---|---|
| committer | Arthur LAURENT <[email protected]> | 2025-09-18 07:07:25 +0200 |
| commit | 2ec98bd08913bf172b27f642f3751dd12eb10825 (patch) | |
| tree | 11d5ecd94360462729ba286a0182b816a1b0bf5a /xmake/rules/c++/modules/support.lua | |
| parent | 0d92314dcb782bd460a1f1771acb4deb71152e73 (diff) | |
fix(C++ modules) fix stdmodule detection when multiple runtimes are used
Diffstat (limited to 'xmake/rules/c++/modules/support.lua')
| -rw-r--r-- | xmake/rules/c++/modules/support.lua | 27 |
1 files changed, 23 insertions, 4 deletions
diff --git a/xmake/rules/c++/modules/support.lua b/xmake/rules/c++/modules/support.lua index ef1d1f9dd..5ba12adef 100644 --- a/xmake/rules/c++/modules/support.lua +++ b/xmake/rules/c++/modules/support.lua @@ -69,6 +69,24 @@ function load(target) _support(target).load(target) end +function get_cpplibrary_name(target) + -- libc++ come first because on windows, if we use libc++ clang will still use msvc crt so MD / MT / MDd / MTd can be set + if target:has_runtime("c++_shared", "c++_static") then + return "c++" + elseif target:has_runtime("stdc++_shared", "stdc++_static") then + return "stdc++" + elseif target:has_runtime("MD", "MT", "MDd", "MTd") then + return "msstl" + end + if target:is_plat("macosx", "iphoneos", "appletvos") then + return "c++" + elseif target:is_plat("linux") then + return "stdc++" + elseif target:is_plat("windows") then + return "msstl" + end +end + function has_two_phase_compilation_support(target) return _support(target).has_two_phase_compilation_support(target) end @@ -282,13 +300,14 @@ end -- get stdmodules function get_stdmodules(target) - local stdmodules = memcache():get("c++.modules.stdmodules") - local stdmodules_set = memcache():get("c++.modules.stdmodules_set") + local cpplib = get_cpplibrary_name(target) + local stdmodules = memcache():get2(cpplib, "c++.modules.stdmodules") + local stdmodules_set = memcache():get2(cpplib, "c++.modules.stdmodules_set") if not stdmodules or not stdmodules_set then stdmodules = _support(target).get_stdmodules(target) stdmodules_set = hashset.from(stdmodules or {}) - memcache():set("c++.modules.stdmodules", stdmodules) - memcache():set("c++.modules.stdmodules_set", stdmodules_set) + memcache():set2(cpplib, "c++.modules.stdmodules", stdmodules) + memcache():set2(cpplib, "c++.modules.stdmodules_set", stdmodules_set) end return stdmodules, stdmodules_set end |
