summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSnowinterCat <[email protected]>2025-11-29 10:31:22 +0800
committerSnowinterCat <[email protected]>2025-11-29 10:31:22 +0800
commit4d1579d05f0b59be3f70a258603e34da4131373a (patch)
treee5dc1d173e550cb4d21dfc80fac1be195fc93212
parent315ddb090acfb4cac9737ac60efce7d79d8bc261 (diff)
try_two_methods
-rw-r--r--xmake/rules/c++/modules/clang/support.lua41
1 files changed, 29 insertions, 12 deletions
diff --git a/xmake/rules/c++/modules/clang/support.lua b/xmake/rules/c++/modules/clang/support.lua
index e0d3792b7..90225f632 100644
--- a/xmake/rules/c++/modules/clang/support.lua
+++ b/xmake/rules/c++/modules/clang/support.lua
@@ -255,25 +255,42 @@ function parse_link_files(filepath)
end
function get_stdmodules(target)
-
local cpplib = get_cpplibrary_name(target)
if cpplib then
if cpplib == "c++" then
-- libc++ module is found by parsing libc++.modules.json
local modules_json_path = _get_std_module_manifest_path(target)
- if modules_json_path then
- local modules_json = json.decode(io.readfile(modules_json_path))
- if modules_json and modules_json.modules and #modules_json.modules > 0 then
- local std_module_directory = path.directory(modules_json.modules[1]["source-path"])
- if not path.is_absolute(std_module_directory) then
- local clang_dir = path.directory(parse_link_files(get_clang_path(target)))
- std_module_directory = path.join(clang_dir, std_module_directory)
- end
- if os.isdir(std_module_directory) then
- return {path.normalize(path.join(std_module_directory, "std.cppm")), path.normalize(path.join(std_module_directory, "std.compat.cppm"))}
- end
+ if not modules_json_path then
+ wprint("libc++.modules.json not found! maybe try to add --sdk=<PATH/TO/LLVM> or install libc++")
+ return
+ end
+ local modules_json = json.decode(io.readfile(modules_json_path))
+ if not (modules_json and modules_json.modules and #modules_json.modules > 0) then
+ wprint("libc++.modules.json is invalid! path: %s", path.normalize(modules_json_path))
+ return
+ end
+ local std_module_directory = path.directory(modules_json.modules[1]["source-path"])
+ -- check absolute path first
+ if path.is_absolute(std_module_directory) then
+ if os.isdir(std_module_directory) then
+ return {path.normalize(path.join(std_module_directory, "std.cppm")), path.normalize(path.join(std_module_directory, "std.compat.cppm"))}
+ else
+ wprint("std module directory not found: %s which defined in %s", path.normalize(std_module_directory), path.normalize(modules_json_path))
+ return
end
end
+ -- otherwise try to resolve relative path
+ local try_std_module_directory
+ -- first try the directory relative to libc++.modules.json
+ try_std_module_directory = path.join(path.directory(modules_json_path), std_module_directory)
+ if os.isdir(try_std_module_directory) then
+ return {path.normalize(path.join(try_std_module_directory, "std.cppm")), path.normalize(path.join(try_std_module_directory, "std.compat.cppm"))}
+ end
+ -- then try the directory relative to clang bin directory
+ try_std_module_directory = path.join(path.directory(parse_link_files(get_clang_path(target))), std_module_directory)
+ if os.isdir(try_std_module_directory) then
+ return {path.normalize(path.join(try_std_module_directory, "std.cppm")), path.normalize(path.join(try_std_module_directory, "std.compat.cppm"))}
+ end
elseif cpplib == "stdc++" then
-- dont be greedy and don't enable stdc++ std module support for llvm < 19
local clang_version = get_clang_version(target)