diff options
| author | SnowinterCat <[email protected]> | 2025-11-29 10:31:22 +0800 |
|---|---|---|
| committer | SnowinterCat <[email protected]> | 2025-11-29 10:31:22 +0800 |
| commit | 4d1579d05f0b59be3f70a258603e34da4131373a (patch) | |
| tree | e5dc1d173e550cb4d21dfc80fac1be195fc93212 | |
| parent | 315ddb090acfb4cac9737ac60efce7d79d8bc261 (diff) | |
try_two_methods
| -rw-r--r-- | xmake/rules/c++/modules/clang/support.lua | 41 |
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) |
