diff options
| author | ruki <[email protected]> | 2025-03-07 11:35:41 +0800 |
|---|---|---|
| committer | GitHub <[email protected]> | 2025-03-07 11:35:41 +0800 |
| commit | 1c6af0d56d9c6d4b6e0fc91a5c47c8ba6ed2a2c5 (patch) | |
| tree | a5ff151620d489ebc8051bea9d382d1ad883bcda /xmake/rules/c++/modules/modules_support | |
| parent | a697325de5e02b1e94e2e79bc52dae4184331136 (diff) | |
| parent | e6809b94206cb4ec9bc05baa0f09567ebb5d67e9 (diff) | |
Merge pull request #6182 from star-hengxing/clang
Support msstl modules for clang
Diffstat (limited to 'xmake/rules/c++/modules/modules_support')
4 files changed, 27 insertions, 18 deletions
diff --git a/xmake/rules/c++/modules/modules_support/builder.lua b/xmake/rules/c++/modules/modules_support/builder.lua index 60e1112d8..a71e2c392 100644 --- a/xmake/rules/c++/modules/modules_support/builder.lua +++ b/xmake/rules/c++/modules/modules_support/builder.lua @@ -235,7 +235,7 @@ function _builder(target) local cachekey = tostring(target) local builder = compiler_support.memcache():get2("builder", cachekey) if builder == nil then - if target:has_tool("cxx", "clang", "clangxx") then + if target:has_tool("cxx", "clang", "clangxx", "clang_cl") then builder = import("clang.builder", {anonymous = true}) elseif target:has_tool("cxx", "gcc", "gxx") then builder = import("gcc.builder", {anonymous = true}) diff --git a/xmake/rules/c++/modules/modules_support/clang/compiler_support.lua b/xmake/rules/c++/modules/modules_support/clang/compiler_support.lua index 56bfb5f25..6eb4f84b1 100644 --- a/xmake/rules/c++/modules/modules_support/clang/compiler_support.lua +++ b/xmake/rules/c++/modules/modules_support/clang/compiler_support.lua @@ -247,6 +247,9 @@ function get_clang_scan_deps(target) if program and toolname:startswith("clang") then local dir = path.directory(program) local basename = path.basename(program) + if basename == "clang-cl" then + basename = "clang" + end local extension = path.extension(program) program = (basename:rtrim("+"):gsub("clang", "clang-scan-deps")) .. extension if dir and dir ~= "." and os.isdir(dir) then @@ -277,26 +280,32 @@ function get_stdmodules(target) if not path.is_absolute(std_module_directory) then std_module_directory = path.join(path.directory(modules_json_path), std_module_directory) end - return {path.join(std_module_directory, "std.cppm"), path.join(std_module_directory, "std.compat.cppm")} + if os.isdir(std_module_directory) then + return {path.join(std_module_directory, "std.cppm"), path.join(std_module_directory, "std.compat.cppm")} + end end end elseif cpplib == "stdc++" then -- libstdc++ doesn't have a std module file atm elseif cpplib == "msstl" then - -- msstl std module file is not compatible with llvm <= 19 - -- local toolchain = target:toolchain("clang") - -- local msvc = import("core.tool.toolchain", {anonymous = true}).load("msvc", {plat = toolchain:plat(), arch = toolchain:arch()}) - -- if msvc then - -- local vcvars = msvc:config("vcvars") - -- if vcvars.VCInstallDir and vcvars.VCToolsVersion then - -- modules = {} - -- - -- local stdmodulesdir = path.join(vcvars.VCInstallDir, "Tools", "MSVC", vcvars.VCToolsVersion, "modules") - -- assert(stdmodulesdir, "Can't enable C++23 std modules, directory missing !") - -- - -- return {path.join(stdmodulesdir, "std.ixx"), path.join(stdmodulesdir, "std.compat.ixx")} - -- end - -- end + -- msstl std module file is not compatible with llvm < 19 + local clang_version = get_clang_version(target) + if clang_version and semver.compare(clang_version, "19.0") >= 0 then + local toolchain = target:toolchain("clang") or target:toolchain("clang-cl") + local msvc = import("core.tool.toolchain", {anonymous = true}).load("msvc", {plat = toolchain:plat(), arch = toolchain:arch()}) + if msvc and msvc:check() then + local vcvars = msvc:config("vcvars") + if vcvars.VCInstallDir and vcvars.VCToolsVersion then + local stdmodulesdir = path.join(vcvars.VCInstallDir, "Tools", "MSVC", vcvars.VCToolsVersion, "modules") + if os.isdir(stdmodulesdir) then + return {path.join(stdmodulesdir, "std.ixx"), path.join(stdmodulesdir, "std.compat.ixx")} + end + end + end + else + wprint("msstl std module file is not compatible with llvm < 19, please upgrade clang/clang-cl version!") + return + end end end wprint("std and std.compat modules not found! maybe try to add --sdk=<PATH/TO/LLVM> or install libc++") diff --git a/xmake/rules/c++/modules/modules_support/compiler_support.lua b/xmake/rules/c++/modules/modules_support/compiler_support.lua index 7c4e665d0..cf64a08bb 100644 --- a/xmake/rules/c++/modules/modules_support/compiler_support.lua +++ b/xmake/rules/c++/modules/modules_support/compiler_support.lua @@ -29,7 +29,7 @@ function _compiler_support(target) local cachekey = tostring(target) local compiler_support = memcache():get2("compiler_support", cachekey) if compiler_support == nil then - if target:has_tool("cxx", "clang", "clangxx") then + if target:has_tool("cxx", "clang", "clangxx", "clang_cl") then compiler_support = import("clang.compiler_support", {anonymous = true}) elseif target:has_tool("cxx", "gcc", "gxx") then compiler_support = import("gcc.compiler_support", {anonymous = true}) diff --git a/xmake/rules/c++/modules/modules_support/dependency_scanner.lua b/xmake/rules/c++/modules/modules_support/dependency_scanner.lua index 3287628ef..9d552d0fd 100644 --- a/xmake/rules/c++/modules/modules_support/dependency_scanner.lua +++ b/xmake/rules/c++/modules/modules_support/dependency_scanner.lua @@ -31,7 +31,7 @@ function _dependency_scanner(target) local cachekey = tostring(target) local dependency_scanner = compiler_support.memcache():get2("dependency_scanner", cachekey) if dependency_scanner == nil then - if target:has_tool("cxx", "clang", "clangxx") then + if target:has_tool("cxx", "clang", "clangxx", "clang_cl") then dependency_scanner = import("clang.dependency_scanner", {anonymous = true}) elseif target:has_tool("cxx", "gcc", "gxx") then dependency_scanner = import("gcc.dependency_scanner", {anonymous = true}) |
