From 0d92314dcb782bd460a1f1771acb4deb71152e73 Mon Sep 17 00:00:00 2001 From: Arthur LAURENT Date: Mon, 15 Sep 2025 03:22:35 +0200 Subject: nfc(C++ modules) add a test for multiple c++ runtimes --- .../c++/modules/multiple_runtimes/src/main.cpp | 6 +++++ .../c++/modules/multiple_runtimes/test.lua | 1 + .../c++/modules/multiple_runtimes/xmake.lua | 31 ++++++++++++++++++++++ 3 files changed, 38 insertions(+) create mode 100644 tests/projects/c++/modules/multiple_runtimes/src/main.cpp create mode 100644 tests/projects/c++/modules/multiple_runtimes/test.lua create mode 100644 tests/projects/c++/modules/multiple_runtimes/xmake.lua (limited to 'tests/projects/c++/modules') 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..e77adc4ae --- /dev/null +++ b/tests/projects/c++/modules/multiple_runtimes/test.lua @@ -0,0 +1 @@ +inherit(".test_stdmodules") 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..6fc363a95 --- /dev/null +++ b/tests/projects/c++/modules/multiple_runtimes/xmake.lua @@ -0,0 +1,31 @@ +add_rules("mode.debug", "mode.release") +add_files("src/*.cpp") +set_languages("c++23") +set_encodings("utf-8") + +if not is_plat("windows") then -- remove when std module is supported for libc++ on windows + target("llvm") + set_kind("binary") + set_toolchains("clang") + set_runtimes("c++_shared") + set_policy("build.c++.modules", true) + add_files("src/main.cpp") +end + +if is_plat("linux") or is_plat("mingw") then + 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 + +if is_plat("windows") then + target("msvc") + set_kind("binary") + set_toolchains("msvc") + set_policy("build.c++.modules", true) + add_files("src/main.cpp") +end -- cgit v1.3.1 From 438fdf4c5cf90993aca9f7be0280ddf0c298f42a Mon Sep 17 00:00:00 2001 From: Arthur LAURENT Date: Mon, 15 Sep 2025 03:49:55 +0200 Subject: nfx(C++ modules) improve stdmodule related tests --- .../c++/modules/multiple_runtimes/test.lua | 48 +++++++++++++++++++++- .../c++/modules/multiple_runtimes/xmake.lua | 14 +++---- tests/projects/c++/modules/test_stdmodules.lua | 1 + 3 files changed, 54 insertions(+), 9 deletions(-) (limited to 'tests/projects/c++/modules') diff --git a/tests/projects/c++/modules/multiple_runtimes/test.lua b/tests/projects/c++/modules/multiple_runtimes/test.lua index e77adc4ae..8ae3ae3a7 100644 --- a/tests/projects/c++/modules/multiple_runtimes/test.lua +++ b/tests/projects/c++/modules/multiple_runtimes/test.lua @@ -1 +1,47 @@ -inherit(".test_stdmodules") +inherit(".test_base") + +CLANG_MIN_VER = "19" +GCC_MIN_VER = "15" +MSVC_MIN_VER = "14.35" + +function main(_) + local format_string = "Multiple runtimes don't work" + + local clang_options + if not is_plat("windows") then -- remove when std module is supported for libc++ on windows + local str + if is_plat("windows") then + str = "v1\\std.cppm" + else + str = "v1/std.cppm" + end + clang_options = {stdmodule = true, compiler = "clang", version = CLANG_MIN_VER, {str = str, format_string = format_string}} + end + local gcc_options + if is_plat("mingw") or is_plat("linux") then + gcc_options = {stdmodule = true, compiler = "gcc", version = GCC_MIN_VER, {str = "v1/std.cppm", format_string = format_string}} + end + + -- 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, + -- | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~ + -- In file included from F:/msys64/mingw64/include/c++/15.1.0/x86_64-w64-mingw32/bits/gthr-default.h:35, + -- from F:/msys64/mingw64/include/c++/15.1.0/x86_64-w64-mingw32/bits/gthr.h:157, + -- from F:/msys64/mingw64/include/c++/15.1.0/ext/atomicity.h:37, + -- from F:/msys64/mingw64/include/c++/15.1.0/bits/ios_base.h:41, + -- from F:/msys64/mingw64/include/c++/15.1.0/streambuf:45, + -- from F:/msys64/mingw64/include/c++/15.1.0/bits/streambuf_iterator.h:37, + -- from F:/msys64/mingw64/include/c++/15.1.0/iterator:68, + -- from F:/msys64/mingw64/include/c++/15.1.0/x86_64-w64-mingw32/bits/stdc++.h:56: + -- F:/msys64/mingw64/include/pthread.h:296:28: note: 'int pthread_rwlock_timedrdlock(pthread_rwlock_t*, const timespec*)' declared with internal linkage + -- 296 | WINPTHREAD_RWLOCK_DECL int pthread_rwlock_timedrdlock(pthread_rwlock_t *l, const struct timespec *ts) + -- | ^~~~~~~~~~~~~~~~~~~~~~~~~~ + -- F:/msys64/mingw64/include/c++/15.1.0/shared_mutex:115:3: error: 'int std::__glibcxx_rwlock_timedwrlock(pthread_rwlock_t*, const timespec*)' exposes TU-local entity 'int pthread_rwlock_timedwrlock(pthread_rwlock_t*, const timespec*)' + -- 115 | __glibcxx_rwlock_timedwrlock (pthread_rwlock_t *__rwlock, local gcc_options = {stdmodule = true, compiler = "gcc", version = GCC_MIN_VER} + if is_subhost("msys") then + gcc_options = nil + end + local msvc_options = {stdmodule = true, version = MSVC_MIN_VER, {std = "modules\\std.ixx"}} + run_tests(clang_options, gcc_options, msvc_options) +end diff --git a/tests/projects/c++/modules/multiple_runtimes/xmake.lua b/tests/projects/c++/modules/multiple_runtimes/xmake.lua index 6fc363a95..736079687 100644 --- a/tests/projects/c++/modules/multiple_runtimes/xmake.lua +++ b/tests/projects/c++/modules/multiple_runtimes/xmake.lua @@ -3,14 +3,12 @@ add_files("src/*.cpp") set_languages("c++23") set_encodings("utf-8") -if not is_plat("windows") then -- remove when std module is supported for libc++ on windows - target("llvm") - set_kind("binary") - set_toolchains("clang") - set_runtimes("c++_shared") - set_policy("build.c++.modules", true) - add_files("src/main.cpp") -end +target("llvm") + set_kind("binary") + set_toolchains("clang") + set_runtimes("c++_shared") + set_policy("build.c++.modules", true) + add_files("src/main.cpp") if is_plat("linux") or is_plat("mingw") then target("gnu") 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, -- cgit v1.3.1 From 213876242403c07495d4866de2f49ecfaf6fcfa9 Mon Sep 17 00:00:00 2001 From: Arthur LAURENT Date: Mon, 15 Sep 2025 04:05:37 +0200 Subject: fix(C++ modules) fix outdata check in modules tests --- tests/projects/c++/modules/multiple_runtimes/test.lua | 6 +++--- tests/projects/c++/modules/test_base.lua | 2 +- tests/projects/c++/modules/test_culling.lua | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) (limited to 'tests/projects/c++/modules') diff --git a/tests/projects/c++/modules/multiple_runtimes/test.lua b/tests/projects/c++/modules/multiple_runtimes/test.lua index 8ae3ae3a7..9d19543a4 100644 --- a/tests/projects/c++/modules/multiple_runtimes/test.lua +++ b/tests/projects/c++/modules/multiple_runtimes/test.lua @@ -15,11 +15,11 @@ function main(_) else str = "v1/std.cppm" end - clang_options = {stdmodule = true, compiler = "clang", version = CLANG_MIN_VER, {str = str, format_string = format_string}} + clang_options = {stdmodule = true, compiler = "clang", version = CLANG_MIN_VER, check_outdata = {str = str, format_string = format_string}} end local gcc_options if is_plat("mingw") or is_plat("linux") then - gcc_options = {stdmodule = true, compiler = "gcc", version = GCC_MIN_VER, {str = "v1/std.cppm", format_string = format_string}} + gcc_options = {stdmodule = true, compiler = "gcc", version = GCC_MIN_VER, check_outdata = {str = "v1/std.cppm", format_string = format_string}} end -- latest mingw gcc 15.1 is broken @@ -42,6 +42,6 @@ function main(_) if is_subhost("msys") then gcc_options = nil end - local msvc_options = {stdmodule = true, version = MSVC_MIN_VER, {std = "modules\\std.ixx"}} + local msvc_options = {stdmodule = true, version = MSVC_MIN_VER, check_outdata = {std = "modules\\std.ixx"}} run_tests(clang_options, gcc_options, msvc_options) end diff --git a/tests/projects/c++/modules/test_base.lua b/tests/projects/c++/modules/test_base.lua index 25181fe70..8a473b364 100644 --- a/tests/projects/c++/modules/test_base.lua +++ b/tests/projects/c++/modules/test_base.lua @@ -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 -- cgit v1.3.1 From f270a7cf4823d723299bef4999493e25b7ac4f38 Mon Sep 17 00:00:00 2001 From: Arthur LAURENT Date: Mon, 15 Sep 2025 09:59:49 +0200 Subject: nfc(C++ modules) improve multiple_runtimes test --- .../c++/modules/multiple_runtimes/test.lua | 93 +++++++++++++--------- tests/projects/c++/modules/test_base.lua | 2 +- 2 files changed, 58 insertions(+), 37 deletions(-) (limited to 'tests/projects/c++/modules') diff --git a/tests/projects/c++/modules/multiple_runtimes/test.lua b/tests/projects/c++/modules/multiple_runtimes/test.lua index 9d19543a4..2050445f3 100644 --- a/tests/projects/c++/modules/multiple_runtimes/test.lua +++ b/tests/projects/c++/modules/multiple_runtimes/test.lua @@ -1,47 +1,68 @@ -inherit(".test_base") +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 main(_) - local format_string = "Multiple runtimes don't work" - - local clang_options - if not is_plat("windows") then -- remove when std module is supported for libc++ on windows - local str - if is_plat("windows") then - str = "v1\\std.cppm" - else - str = "v1/std.cppm" - end - clang_options = {stdmodule = true, compiler = "clang", version = CLANG_MIN_VER, check_outdata = {str = str, format_string = format_string}} + if not is_subhost("windows") and not is_host("linux") then + return end - local gcc_options - if is_plat("mingw") or is_plat("linux") then - gcc_options = {stdmodule = true, compiler = "gcc", version = GCC_MIN_VER, check_outdata = {str = "v1/std.cppm", format_string = format_string}} + + if is_subhost("windows") then + local msvc = toolchain.load("msvc") + if not msvc or not msvc:check() then + wprint("msvc not found, skipping tests") + return + end + local vcvars = msvc:config("vcvars") + if not vcvars or not vcvars.VCInstallDir or not vcvars.VCToolsVersion then + wprint("msvc not found, skipping tests") + return + end + local version = vcvars.VCToolsVersion + if not version or not (semver.compare(version, MSVC_MIN_VER) >= 0) then + return + end + -- on windows, llvm libc++ std module is currently not supported, uncommend when supported + local clang = find_tool("clang", {version = true}) + if not (clang and clang.version and semver.compare(clang.version, CLANG_MIN_VER) >= 0) then + return + end + else + local gcc = find_tool("gcc", {version = true}) + if not (gcc and gcc.version and semver.compare(gcc.version, GCC_MIN_VER) >= 0) then + return + end + local clang = find_tool("clang", {version = true}) + if not (clang and clang.version and semver.compare(clang.version, CLANG_MIN_VER) >= 0) then + return + end end - -- 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, - -- | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -- In file included from F:/msys64/mingw64/include/c++/15.1.0/x86_64-w64-mingw32/bits/gthr-default.h:35, - -- from F:/msys64/mingw64/include/c++/15.1.0/x86_64-w64-mingw32/bits/gthr.h:157, - -- from F:/msys64/mingw64/include/c++/15.1.0/ext/atomicity.h:37, - -- from F:/msys64/mingw64/include/c++/15.1.0/bits/ios_base.h:41, - -- from F:/msys64/mingw64/include/c++/15.1.0/streambuf:45, - -- from F:/msys64/mingw64/include/c++/15.1.0/bits/streambuf_iterator.h:37, - -- from F:/msys64/mingw64/include/c++/15.1.0/iterator:68, - -- from F:/msys64/mingw64/include/c++/15.1.0/x86_64-w64-mingw32/bits/stdc++.h:56: - -- F:/msys64/mingw64/include/pthread.h:296:28: note: 'int pthread_rwlock_timedrdlock(pthread_rwlock_t*, const timespec*)' declared with internal linkage - -- 296 | WINPTHREAD_RWLOCK_DECL int pthread_rwlock_timedrdlock(pthread_rwlock_t *l, const struct timespec *ts) - -- | ^~~~~~~~~~~~~~~~~~~~~~~~~~ - -- F:/msys64/mingw64/include/c++/15.1.0/shared_mutex:115:3: error: 'int std::__glibcxx_rwlock_timedwrlock(pthread_rwlock_t*, const timespec*)' exposes TU-local entity 'int pthread_rwlock_timedwrlock(pthread_rwlock_t*, const timespec*)' - -- 115 | __glibcxx_rwlock_timedwrlock (pthread_rwlock_t *__rwlock, local gcc_options = {stdmodule = true, compiler = "gcc", version = GCC_MIN_VER} - if is_subhost("msys") then - gcc_options = nil + 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 = "" + if ci_is_running() then + flags = "-vD" + end + local outdata + outdata = os.iorun("xmake -r " .. flags) + if outdata then + local error = true + -- on windows, llvm libc++ std module is currently not supported, uncommend when supported + if is_host("windows") and outdata:find(cl_str, 1, true) and outdata:find(clang_str, 1, true) then + error = false + elseif outdata:find(clang_str, 1, true) and outdata:find(gcc_str, 1, true) then + error = false + end + if error then + raise("Multiple runtimes doesn't work\n%s", outdata) + end end - local msvc_options = {stdmodule = true, version = MSVC_MIN_VER, check_outdata = {std = "modules\\std.ixx"}} - run_tests(clang_options, gcc_options, msvc_options) end diff --git a/tests/projects/c++/modules/test_base.lua b/tests/projects/c++/modules/test_base.lua index 8a473b364..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 -- cgit v1.3.1 From bcc3c5617baad62989a45a44aa2890fda5eba0f3 Mon Sep 17 00:00:00 2001 From: Arthur LAURENT Date: Thu, 25 Sep 2025 17:51:15 +0200 Subject: nfc(C++ modules) apply PR suggestion --- .../c++/modules/add_move_remove_module/test.lua | 4 +- .../c++/modules/multiple_runtimes/test.lua | 75 +++++++++++----------- .../c++/modules/multiple_runtimes/xmake.lua | 39 +++++++---- xmake/rules/c++/modules/support.lua | 8 +-- 4 files changed, 69 insertions(+), 57 deletions(-) (limited to 'tests/projects/c++/modules') 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/test.lua b/tests/projects/c++/modules/multiple_runtimes/test.lua index 2050445f3..ad2585efa 100644 --- a/tests/projects/c++/modules/multiple_runtimes/test.lua +++ b/tests/projects/c++/modules/multiple_runtimes/test.lua @@ -7,61 +7,64 @@ CLANG_MIN_VER = "19" GCC_MIN_VER = "15" MSVC_MIN_VER = "14.35" -function main(_) - if not is_subhost("windows") and not is_host("linux") then - return +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 - local msvc = toolchain.load("msvc") - if not msvc or not msvc:check() then - wprint("msvc not found, skipping tests") - return - end - local vcvars = msvc:config("vcvars") - if not vcvars or not vcvars.VCInstallDir or not vcvars.VCToolsVersion then - wprint("msvc not found, skipping tests") - return - end - local version = vcvars.VCToolsVersion - if not version or not (semver.compare(version, MSVC_MIN_VER) >= 0) 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 - local clang = find_tool("clang", {version = true}) - if not (clang and clang.version and semver.compare(clang.version, CLANG_MIN_VER) >= 0) then + -- 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 - local gcc = find_tool("gcc", {version = true}) - if not (gcc and gcc.version and semver.compare(gcc.version, GCC_MIN_VER) >= 0) then - return - end - local clang = find_tool("clang", {version = true}) - if not (clang and clang.version and semver.compare(clang.version, CLANG_MIN_VER) >= 0) then - return - end + 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 = "" - if ci_is_running() then - flags = "-vD" - end + local flags = true and "-vD" or "" local outdata - outdata = os.iorun("xmake -r " .. flags) + outdata = os.iorun("xmake b " .. flags) if outdata then - local error = true + local success = false -- on windows, llvm libc++ std module is currently not supported, uncommend when supported - if is_host("windows") and outdata:find(cl_str, 1, true) and outdata:find(clang_str, 1, true) then - error = false - elseif outdata:find(clang_str, 1, true) and outdata:find(gcc_str, 1, true) then - error = false + 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 error then + if not success then raise("Multiple runtimes doesn't work\n%s", outdata) end end diff --git a/tests/projects/c++/modules/multiple_runtimes/xmake.lua b/tests/projects/c++/modules/multiple_runtimes/xmake.lua index 736079687..f67ab211b 100644 --- a/tests/projects/c++/modules/multiple_runtimes/xmake.lua +++ b/tests/projects/c++/modules/multiple_runtimes/xmake.lua @@ -1,29 +1,40 @@ add_rules("mode.debug", "mode.release") -add_files("src/*.cpp") set_languages("c++23") set_encodings("utf-8") -target("llvm") - set_kind("binary") - set_toolchains("clang") - set_runtimes("c++_shared") - set_policy("build.c++.modules", true) - add_files("src/main.cpp") +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") -if is_plat("linux") or is_plat("mingw") then - target("gnu") + target("llvm-msvc") set_kind("binary") - set_toolchains("gcc") - set_runtimes("stdc++_shared") + set_toolchains("clang") set_policy("build.c++.modules", true) - set_policy("build.c++.modules.gcc.cxx11abi", true) add_files("src/main.cpp") -end -if is_plat("windows") then 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/xmake/rules/c++/modules/support.lua b/xmake/rules/c++/modules/support.lua index cce8272c8..8d1c39531 100644 --- a/xmake/rules/c++/modules/support.lua +++ b/xmake/rules/c++/modules/support.lua @@ -78,9 +78,10 @@ function get_cpplibrary_name(target) elseif target:has_runtime("MD", "MT", "MDd", "MTd") then return "msstl" end + -- if no specified runtime, fallback on native platform C++ library if target:is_plat("macosx", "iphoneos", "appletvos") then return "c++" - elseif target:is_plat("linux") then + elseif target:is_plat("linux") or target:is_plat("mingw") then return "stdc++" elseif target:is_plat("windows") then return "msstl" @@ -259,10 +260,7 @@ function can_be_culled(target, sourcefile) end end if can_cull then - can_cull = false - if is_stdmodule or (fileconfig and fileconfig.external) then - can_cull = true - end + can_cull = is_stdmodule or (fileconfig and fileconfig.external) end return can_cull and not public end -- cgit v1.3.1