diff options
| author | ruki <[email protected]> | 2025-09-26 22:14:46 +0800 |
|---|---|---|
| committer | GitHub <[email protected]> | 2025-09-26 22:14:46 +0800 |
| commit | 7c9fbf87ba1d4b48fb111bf3cc4090b5ebcf90b3 (patch) | |
| tree | 94e3d5a47e819b573ada0c418846f70fe1224ae6 /tests/projects/c++/modules | |
| parent | f6e00b1cc570b023c618f3753f9e0c91b82df652 (diff) | |
| parent | bcc3c5617baad62989a45a44aa2890fda5eba0f3 (diff) | |
Merge pull request #6809 from Arthapz/fix-stdmodule-priority
fix(C++ modules) fix stdmodule priority
Diffstat (limited to 'tests/projects/c++/modules')
7 files changed, 124 insertions, 6 deletions
diff --git a/tests/projects/c++/modules/add_move_remove_module/test.lua b/tests/projects/c++/modules/add_move_remove_module/test.lua index 627688f6c..ad8c4833b 100644 --- a/tests/projects/c++/modules/add_move_remove_module/test.lua +++ b/tests/projects/c++/modules/add_move_remove_module/test.lua @@ -5,10 +5,10 @@ CLANG_MIN_VER = is_subhost("windows") and "19" or "17" GCC_MIN_VER = "11" MSVC_MIN_VER = "14.29" -function _build(check_outdata) +function _build(_) local flags = "" if ci_is_running() then - flags = "-vD" + flags = "-vD" end os.run("xmake -r " .. flags) io.writefile("src/bar.mpp", "export module bar;\n export {\n inline int bar() { return 0; }\n}") diff --git a/tests/projects/c++/modules/multiple_runtimes/src/main.cpp b/tests/projects/c++/modules/multiple_runtimes/src/main.cpp new file mode 100644 index 000000000..b25b474a6 --- /dev/null +++ b/tests/projects/c++/modules/multiple_runtimes/src/main.cpp @@ -0,0 +1,6 @@ +import std; + +int main() { + std::println("Hello world"); + return 0; +} diff --git a/tests/projects/c++/modules/multiple_runtimes/test.lua b/tests/projects/c++/modules/multiple_runtimes/test.lua new file mode 100644 index 000000000..ad2585efa --- /dev/null +++ b/tests/projects/c++/modules/multiple_runtimes/test.lua @@ -0,0 +1,71 @@ +import("lib.detect.find_tool") +import("core.base.semver") +import("core.tool.toolchain") +import("utils.ci.is_running", {alias = "ci_is_running"}) + +CLANG_MIN_VER = "19" +GCC_MIN_VER = "15" +MSVC_MIN_VER = "14.35" + +function _check_tool_version(name, min_ver) + local tool = find_tool(name, {version = true}) + if not (tool and tool.version and semver.compare(tool.version, min_ver) >= 0) then + return false + end + return true +end + + +function _check_msvc_version(min_ver) + local msvc = toolchain.load("msvc") + if not msvc or not msvc:check() then + return false + end + local vcvars = msvc:config("vcvars") + if not vcvars or not vcvars.VCInstallDir or not vcvars.VCToolsVersion then + return false + end + local version = vcvars.VCToolsVersion + if not version or not (semver.compare(version, min_ver) >= 0) then + return false + end + return true +end + +function main(_) + if is_subhost("windows") then + if not _check_msvc_version(MSVC_MIN_VER) then + return + end + -- on windows, llvm libc++ std module is currently not supported, uncommend when supported + -- if not check_tool_version("clang", CLANG_MIN_VER) then + -- return + -- end + elseif is_host("linux") then + if not _check_tool_version("gcc", GCC_MIN_VER) or not _check_tool_version("clang", CLANG_MIN_VER) then + return + end + else + return + end + + local cl_str = "modules\\std.ixx" + local clang_str = is_host("windows") and "v1\\std.cppm" or "v1/std.cppm" + local gcc_str = "v1/std.cppm" + + local flags = true and "-vD" or "" + local outdata + outdata = os.iorun("xmake b " .. flags) + if outdata then + local success = false + -- on windows, llvm libc++ std module is currently not supported, uncommend when supported + if is_subhost("windows") then + success = outdata:find(cl_str, 1, true) -- and outdata:find(clang_str, 1, true) + else + success = outdata:find(gcc_str, 1, true) and outdata:find(clang_str, 1, true) + end + if not success then + raise("Multiple runtimes doesn't work\n%s", outdata) + end + end +end diff --git a/tests/projects/c++/modules/multiple_runtimes/xmake.lua b/tests/projects/c++/modules/multiple_runtimes/xmake.lua new file mode 100644 index 000000000..f67ab211b --- /dev/null +++ b/tests/projects/c++/modules/multiple_runtimes/xmake.lua @@ -0,0 +1,40 @@ +add_rules("mode.debug", "mode.release") +set_languages("c++23") +set_encodings("utf-8") + +if is_plat("windows") then + -- on windows, llvm libc++ std module is currently not supported, uncommend when supported + -- target("llvm") + -- set_kind("binary") + -- set_toolchains("clang") + -- set_runtimes("c++_shared") + -- set_policy("build.c++.modules", true) + -- add_files("src/main.cpp") + + target("llvm-msvc") + set_kind("binary") + set_toolchains("clang") + set_policy("build.c++.modules", true) + add_files("src/main.cpp") + + target("msvc") + set_kind("binary") + set_toolchains("msvc") + set_policy("build.c++.modules", true) + add_files("src/main.cpp") +else + target("llvm") + set_kind("binary") + set_toolchains("clang") + set_runtimes("c++_shared") + set_policy("build.c++.modules", true) + add_files("src/main.cpp") + + target("gnu") + set_kind("binary") + set_toolchains("gcc") + set_runtimes("stdc++_shared") + set_policy("build.c++.modules", true) + set_policy("build.c++.modules.gcc.cxx11abi", true) + add_files("src/main.cpp") +end diff --git a/tests/projects/c++/modules/test_base.lua b/tests/projects/c++/modules/test_base.lua index 25181fe70..0a0d07dae 100644 --- a/tests/projects/c++/modules/test_base.lua +++ b/tests/projects/c++/modules/test_base.lua @@ -18,7 +18,7 @@ function _build(check_outdata) outdata = os.iorun("xmake -r " .. flags) if outdata then if outdata:find(check_outdata.str, 1, true) then - raise(check_outdata.format_string, outdata) + raise(check_outdata.format_string .. "\n%s", outdata) end end else @@ -107,7 +107,7 @@ function build_tests(toolchain_name, opt) if opt.build then opt.build() else - _build(opt.find_in_outdata) + _build(opt.check_outdata) end if opt.after_build then opt.after_build(platform, toolchain_name, runtimes, policies, flags) diff --git a/tests/projects/c++/modules/test_culling.lua b/tests/projects/c++/modules/test_culling.lua index 9accf9a12..a2b046e74 100644 --- a/tests/projects/c++/modules/test_culling.lua +++ b/tests/projects/c++/modules/test_culling.lua @@ -7,7 +7,7 @@ MSVC_MIN_VER = "14.29" function main(_) local check_outdata = {str = "culled", format_string = "Modules culling does not work"} local clang_options = {compiler = "clang", version = CLANG_MIN_VER, check_outdata = check_outdata} - local gcc_options = {compiler = "gcc", version = GCC_MIN_VER, check_outdata} - local msvc_options = {version = MSVC_MIN_VER, check_outdata} + local gcc_options = {compiler = "gcc", version = GCC_MIN_VER, check_outdata = check_outdata} + local msvc_options = {version = MSVC_MIN_VER, check_outdata = check_outdata} run_tests(clang_options, gcc_options, msvc_options) end diff --git a/tests/projects/c++/modules/test_stdmodules.lua b/tests/projects/c++/modules/test_stdmodules.lua index c9062eb96..291494b38 100644 --- a/tests/projects/c++/modules/test_stdmodules.lua +++ b/tests/projects/c++/modules/test_stdmodules.lua @@ -6,6 +6,7 @@ MSVC_MIN_VER = "14.35" function main(_) local clang_options = {stdmodule = true, compiler = "clang", version = CLANG_MIN_VER} + local gcc_options = {stdmodule = true, compiler = "gcc", version = GCC_MIN_VER} -- latest mingw gcc 15.1 is broken -- error: F:/msys64/mingw64/include/c++/15.1.0/shared_mutex:105:3: error: 'int std::__glibcxx_rwlock_timedrdlock(pthread_rwlock_t*, const timespec*)' exposes TU-local entity 'int pthread_rwlock_timedrdlock(pthread_rwlock_t*, const timespec*)' -- 105 | __glibcxx_rwlock_timedrdlock (pthread_rwlock_t *__rwlock, |
