summaryrefslogtreecommitdiff
path: root/xmake/rules/c++/modules/modules_support
diff options
context:
space:
mode:
authorruki <[email protected]>2025-03-07 11:35:41 +0800
committerGitHub <[email protected]>2025-03-07 11:35:41 +0800
commit1c6af0d56d9c6d4b6e0fc91a5c47c8ba6ed2a2c5 (patch)
treea5ff151620d489ebc8051bea9d382d1ad883bcda /xmake/rules/c++/modules/modules_support
parenta697325de5e02b1e94e2e79bc52dae4184331136 (diff)
parente6809b94206cb4ec9bc05baa0f09567ebb5d67e9 (diff)
Merge pull request #6182 from star-hengxing/clang
Support msstl modules for clang
Diffstat (limited to 'xmake/rules/c++/modules/modules_support')
-rw-r--r--xmake/rules/c++/modules/modules_support/builder.lua2
-rw-r--r--xmake/rules/c++/modules/modules_support/clang/compiler_support.lua39
-rw-r--r--xmake/rules/c++/modules/modules_support/compiler_support.lua2
-rw-r--r--xmake/rules/c++/modules/modules_support/dependency_scanner.lua2
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})