summaryrefslogtreecommitdiff
path: root/xmake/rules/c++/modules
diff options
context:
space:
mode:
authorArthur LAURENT <[email protected]>2025-09-15 03:34:34 +0200
committerArthur LAURENT <[email protected]>2025-09-18 07:07:25 +0200
commit2ec98bd08913bf172b27f642f3751dd12eb10825 (patch)
tree11d5ecd94360462729ba286a0182b816a1b0bf5a /xmake/rules/c++/modules
parent0d92314dcb782bd460a1f1771acb4deb71152e73 (diff)
fix(C++ modules) fix stdmodule detection when multiple runtimes are used
Diffstat (limited to 'xmake/rules/c++/modules')
-rw-r--r--xmake/rules/c++/modules/clang/support.lua24
-rw-r--r--xmake/rules/c++/modules/support.lua27
2 files changed, 26 insertions, 25 deletions
diff --git a/xmake/rules/c++/modules/clang/support.lua b/xmake/rules/c++/modules/clang/support.lua
index c1684a1b9..fd952d6ee 100644
--- a/xmake/rules/c++/modules/clang/support.lua
+++ b/xmake/rules/c++/modules/clang/support.lua
@@ -38,7 +38,7 @@ function _get_toolchain_includedirs_for_stlheaders(target, includedirs, clang)
local tmpfile = os.tmpfile() .. ".cc"
io.writefile(tmpfile, "#include <vector>")
local argv = {"-E", "-x", "c++", tmpfile}
- local cpplib = _get_cpplibrary_name(target)
+ local cpplib = get_cpplibrary_name(target)
if cpplib then
if cpplib == "c++" then
table.insert(argv, 1, "-stdlib=libc++")
@@ -62,24 +62,6 @@ function _get_toolchain_includedirs_for_stlheaders(target, includedirs, clang)
os.tryrm(tmpfile)
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 _get_std_module_manifest_path(target)
local print_module_manifest_flag = get_print_library_module_manifest_path_flag(target)
local clang_path = path.directory(get_clang_path(target))
@@ -168,7 +150,7 @@ function toolchain_includedirs(target)
local clang, toolname = target:tool("cxx")
assert(toolname:startswith("clang"))
_get_toolchain_includedirs_for_stlheaders(target, includedirs, clang)
- local cpplib = _get_cpplibrary_name(target)
+ local cpplib = get_cpplibrary_name(target)
local runtime_flag
if cpplib then
if cpplib == "c++" then
@@ -261,7 +243,7 @@ function get_stdmodules(target)
if not target:policy("build.c++.modules.std") then
return
end
- local cpplib = _get_cpplibrary_name(target)
+ local cpplib = get_cpplibrary_name(target)
if cpplib then
if cpplib == "c++" then
-- libc++ module is found by parsing libc++.modules.json
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