diff options
| author | ruki <[email protected]> | 2025-05-11 17:23:04 +0800 |
|---|---|---|
| committer | GitHub <[email protected]> | 2025-05-11 17:23:04 +0800 |
| commit | c357c9bb8bd5c91e33a6453d134720ffd4dec9b1 (patch) | |
| tree | a7a70f2a1e959ffdac1c62366f8cdc5a47c7c52c /tests/projects/c++/modules | |
| parent | d679f86a8f78e8b8c172bdd8d050f0bb72f69864 (diff) | |
| parent | fca3c75472f07dc5e6f632e89d283c2cda8acaff (diff) | |
Merge pull request #6373 from Arthapz/improve-jobgraph-support
(C++ module support) improve jobgraph support
Diffstat (limited to 'tests/projects/c++/modules')
43 files changed, 386 insertions, 5 deletions
diff --git a/tests/projects/c++/modules/cmake/src/hello.mpp b/tests/projects/c++/modules/cmake/src/hello.mpp new file mode 100644 index 000000000..268964aa3 --- /dev/null +++ b/tests/projects/c++/modules/cmake/src/hello.mpp @@ -0,0 +1,11 @@ +export module hello; + +export namespace hello { + class say { + public: + say(int data); + void hello(); + private: + int data_; + }; +} diff --git a/tests/projects/c++/modules/cmake/src/hello_impl.cpp b/tests/projects/c++/modules/cmake/src/hello_impl.cpp new file mode 100644 index 000000000..5dd555a7a --- /dev/null +++ b/tests/projects/c++/modules/cmake/src/hello_impl.cpp @@ -0,0 +1,14 @@ +module; +#include <iostream> + +module hello; + +using namespace std; +namespace hello { + say::say(int data) : data_(data) { + + } + void say::hello() { + cout << "hello, say class: " << data_ << endl; + } +} diff --git a/tests/projects/c++/modules/cmake/src/main.cpp b/tests/projects/c++/modules/cmake/src/main.cpp new file mode 100644 index 000000000..b96807bda --- /dev/null +++ b/tests/projects/c++/modules/cmake/src/main.cpp @@ -0,0 +1,7 @@ +import hello; + +int main() { + hello::say s(sizeof(hello::say)); + s.hello(); + return 0; +} diff --git a/tests/projects/c++/modules/cmake/test.lua b/tests/projects/c++/modules/cmake/test.lua new file mode 100644 index 000000000..2b246c9a6 --- /dev/null +++ b/tests/projects/c++/modules/cmake/test.lua @@ -0,0 +1,60 @@ +import("lib.detect.find_tool") +import("core.base.semver") +import("core.tool.toolchain") +import("utils.ci.is_running", {alias = "ci_is_running"}) + +function _gen_cmakelist() + if not os.isfile("CMakeLists.txt") then + os.vrunv("xmake project -k cmake") + end +end + +function _build(name, opt) + opt = opt or {} + local build_args = {} + if ci_is_running() then + table.insert(build_args, "-vD") + end + os.rm(".xmake", "build") + os.mv("xmake.lua", "xmake.lua_") + os.vrunv("xmake", table.join({"f", "--trybuild=cmake", "--toolchain=" .. name}, build_args), {shell = true, envs = opt.envs}) + os.vrunv("xmake", table.join({"b"}, build_args), {shell = true, envs = opt.envs}) + os.mv("xmake.lua_", "xmake.lua") +end + +function _build_with(name, minver) + if name == "msvc" then + local _toolchain = toolchain.load(name, {plat = os.host(), arch = os.arch()}) + if _toolchain and _toolchain:check() then + local vcvars = _toolchain:config("vcvars") + if vcvars and vcvars.VCToolsVersion and semver.compare(vcvars.VCToolsVersion, minver) >= 0 then + _build(name, {envs = vcvars}) + end + end + else + local tool = find_tool(name, {version = true}) + if tool and tool.version and semver.compare(tool.version, minver) >= 0 then + local _toolchain = toolchain.load(name, {plat = os.host(), arch = os.arch()}) + if _toolchain and _toolchain:check() then + _build(name) + end + end + end +end + +function main(t) + os.setenv("CMAKE_GENERATOR", "Ninja") + + local cmake = find_tool("cmake", {version = true}) + local ninja = find_tool("ninja") + if ninja and cmake and cmake.version and semver.compare(cmake.version, "3.28") >= 0 then + _gen_cmakelist() + if is_subhost("windows") then + _build_with("clang", "19") + _build_with("msvc", "14.35") + elseif is_subhost("linux") then + _build_with("gcc", "14") + _build_with("clang", "19") + end + end +end diff --git a/tests/projects/c++/modules/cmake/xmake.lua b/tests/projects/c++/modules/cmake/xmake.lua new file mode 100644 index 000000000..42da78369 --- /dev/null +++ b/tests/projects/c++/modules/cmake/xmake.lua @@ -0,0 +1,8 @@ +add_rules("mode.release", "mode.debug") +set_languages("c++20") + +target("class") + set_kind("binary") + add_files("src/*.cpp", "src/*.mpp") + + diff --git a/tests/projects/c++/modules/hello_mpp/src/hello.mpp b/tests/projects/c++/modules/hello_mpp/src/hello.mpp new file mode 100644 index 000000000..124bd72bc --- /dev/null +++ b/tests/projects/c++/modules/hello_mpp/src/hello.mpp @@ -0,0 +1,10 @@ +module; +#include <cstdio> + +export module hello; + +export namespace hello { + void say(const char* str) { + printf("%s\n", str); + } +} diff --git a/tests/projects/c++/modules/hello_mpp/src/main.mpp b/tests/projects/c++/modules/hello_mpp/src/main.mpp new file mode 100644 index 000000000..87122ad50 --- /dev/null +++ b/tests/projects/c++/modules/hello_mpp/src/main.mpp @@ -0,0 +1,6 @@ +#include <cstdio> + +int main() { + std::printf("Hello world\n"); + return 0; +} diff --git a/tests/projects/c++/modules/hello_mpp/test.lua b/tests/projects/c++/modules/hello_mpp/test.lua new file mode 100644 index 000000000..7717f8049 --- /dev/null +++ b/tests/projects/c++/modules/hello_mpp/test.lua @@ -0,0 +1 @@ +inherit(".test_base") diff --git a/tests/projects/c++/modules/hello_mpp/xmake.lua b/tests/projects/c++/modules/hello_mpp/xmake.lua new file mode 100644 index 000000000..141a87a5b --- /dev/null +++ b/tests/projects/c++/modules/hello_mpp/xmake.lua @@ -0,0 +1,6 @@ +add_rules("mode.release", "mode.debug") +set_languages("c++23") + +target("hello") + set_kind("binary") + add_files("src/*.mpp") diff --git a/tests/projects/c++/modules/include-dirs/include/foo.h b/tests/projects/c++/modules/include-dirs/include/foo.h new file mode 100644 index 000000000..2cdd5d64b --- /dev/null +++ b/tests/projects/c++/modules/include-dirs/include/foo.h @@ -0,0 +1 @@ +inline int foo() { return 0; } diff --git a/tests/projects/c++/modules/include-dirs/src/hello.mpp b/tests/projects/c++/modules/include-dirs/src/hello.mpp new file mode 100644 index 000000000..9c23cb28a --- /dev/null +++ b/tests/projects/c++/modules/include-dirs/src/hello.mpp @@ -0,0 +1,9 @@ +module; + +#include "foo.h" + +export module bar; + +export int bar() { + return foo(); +} diff --git a/tests/projects/c++/modules/include-dirs/src/main.cpp b/tests/projects/c++/modules/include-dirs/src/main.cpp new file mode 100644 index 000000000..c5cd67532 --- /dev/null +++ b/tests/projects/c++/modules/include-dirs/src/main.cpp @@ -0,0 +1,5 @@ +import bar; + +int main() { + return bar(); +} diff --git a/tests/projects/c++/modules/include-dirs/test.lua b/tests/projects/c++/modules/include-dirs/test.lua new file mode 100644 index 000000000..7717f8049 --- /dev/null +++ b/tests/projects/c++/modules/include-dirs/test.lua @@ -0,0 +1 @@ +inherit(".test_base") diff --git a/tests/projects/c++/modules/include-dirs/xmake.lua b/tests/projects/c++/modules/include-dirs/xmake.lua new file mode 100644 index 000000000..c81e2a9fe --- /dev/null +++ b/tests/projects/c++/modules/include-dirs/xmake.lua @@ -0,0 +1,17 @@ +add_rules("mode.debug", "mode.release") + +rule("include") + before_config(function (target) + target:add("includedirs", "$(projectdir)/include") + end) + +target("src1") + set_kind("static") + add_rules("include") + add_files("src/*.mpp", {public = true}) + add_defines("A") + +target("src2") + set_kind("binary") + add_deps("src1") + add_files("src/*.cpp") diff --git a/tests/projects/c++/modules/packages-subtarget/my-repo/packages/b/bar/src/bar.cpp b/tests/projects/c++/modules/packages-subtarget/my-repo/packages/b/bar/src/bar.cpp new file mode 100644 index 000000000..279541ed0 --- /dev/null +++ b/tests/projects/c++/modules/packages-subtarget/my-repo/packages/b/bar/src/bar.cpp @@ -0,0 +1,5 @@ +#include <a.hpp> + +const char *hello() { + return "Hello world"; +} diff --git a/tests/projects/c++/modules/packages-subtarget/my-repo/packages/b/bar/src/bar.mpp b/tests/projects/c++/modules/packages-subtarget/my-repo/packages/b/bar/src/bar.mpp new file mode 100644 index 000000000..48ed6b73b --- /dev/null +++ b/tests/projects/c++/modules/packages-subtarget/my-repo/packages/b/bar/src/bar.mpp @@ -0,0 +1,12 @@ +module; + +#include <a.hpp> + +export module bar; + +export namespace bar { +const char *hello() { + return ::hello(); +} +} + diff --git a/tests/projects/c++/modules/packages-subtarget/my-repo/packages/b/bar/src/include/a.hpp b/tests/projects/c++/modules/packages-subtarget/my-repo/packages/b/bar/src/include/a.hpp new file mode 100644 index 000000000..7cd8caadb --- /dev/null +++ b/tests/projects/c++/modules/packages-subtarget/my-repo/packages/b/bar/src/include/a.hpp @@ -0,0 +1,6 @@ +#ifndef A_HPP +#define A_HPP + +[[gnu::visibility("default")]] const char *hello(); + +#endif diff --git a/tests/projects/c++/modules/packages-subtarget/my-repo/packages/b/bar/src/xmake.lua b/tests/projects/c++/modules/packages-subtarget/my-repo/packages/b/bar/src/xmake.lua new file mode 100644 index 000000000..d11bc4f60 --- /dev/null +++ b/tests/projects/c++/modules/packages-subtarget/my-repo/packages/b/bar/src/xmake.lua @@ -0,0 +1,9 @@ +add_rules("mode.release", "mode.debug") +set_languages("c++20") + +target("bar") + set_kind("static") + add_headerfiles("include/(**.hpp)") + add_includedirs("include") + add_files("*.cpp") + add_files("*.mpp", { public = true }) diff --git a/tests/projects/c++/modules/packages-subtarget/my-repo/packages/b/bar/xmake.lua b/tests/projects/c++/modules/packages-subtarget/my-repo/packages/b/bar/xmake.lua new file mode 100644 index 000000000..1592fc623 --- /dev/null +++ b/tests/projects/c++/modules/packages-subtarget/my-repo/packages/b/bar/xmake.lua @@ -0,0 +1,6 @@ +package("bar") + set_sourcedir(path.join(os.scriptdir(), "src")) + + on_install(function(package) + import("package.tools.xmake").install(package, {}) + end) diff --git a/tests/projects/c++/modules/packages-subtarget/my-repo/packages/b/bar2/src/bar.mpp b/tests/projects/c++/modules/packages-subtarget/my-repo/packages/b/bar2/src/bar.mpp new file mode 100644 index 000000000..ee9fb2c78 --- /dev/null +++ b/tests/projects/c++/modules/packages-subtarget/my-repo/packages/b/bar2/src/bar.mpp @@ -0,0 +1,8 @@ +export module bar2; + +export namespace bar { + const char *hello2() { + return "Hello world"; + } +} + diff --git a/tests/projects/c++/modules/packages-subtarget/my-repo/packages/b/bar2/src/xmake.lua b/tests/projects/c++/modules/packages-subtarget/my-repo/packages/b/bar2/src/xmake.lua new file mode 100644 index 000000000..0324fa931 --- /dev/null +++ b/tests/projects/c++/modules/packages-subtarget/my-repo/packages/b/bar2/src/xmake.lua @@ -0,0 +1,6 @@ +add_rules("mode.release", "mode.debug") +set_languages("c++20") + +target("bar2") + set_kind("moduleonly") + add_files("*.mpp") diff --git a/tests/projects/c++/modules/packages-subtarget/my-repo/packages/b/bar2/xmake.lua b/tests/projects/c++/modules/packages-subtarget/my-repo/packages/b/bar2/xmake.lua new file mode 100644 index 000000000..8d7f969bc --- /dev/null +++ b/tests/projects/c++/modules/packages-subtarget/my-repo/packages/b/bar2/xmake.lua @@ -0,0 +1,7 @@ +package("bar2") + set_kind("library", {moduleonly = true}) + set_sourcedir(path.join(os.scriptdir(), "src")) + + on_install(function(package) + import("package.tools.xmake").install(package, {}) + end) diff --git a/tests/projects/c++/modules/packages-subtarget/my-repo/packages/f/foo/src/foo.cpp b/tests/projects/c++/modules/packages-subtarget/my-repo/packages/f/foo/src/foo.cpp new file mode 100644 index 000000000..e5565a01a --- /dev/null +++ b/tests/projects/c++/modules/packages-subtarget/my-repo/packages/f/foo/src/foo.cpp @@ -0,0 +1,6 @@ +module foo; + +namespace foo { + void say(const char *msg) { + } +} diff --git a/tests/projects/c++/modules/packages-subtarget/my-repo/packages/f/foo/src/foo.mpp b/tests/projects/c++/modules/packages-subtarget/my-repo/packages/f/foo/src/foo.mpp new file mode 100644 index 000000000..a97f3d62b --- /dev/null +++ b/tests/projects/c++/modules/packages-subtarget/my-repo/packages/f/foo/src/foo.mpp @@ -0,0 +1,7 @@ +export module foo; + +export namespace foo { + #ifdef FOO_EXPORT + void say(const char *); + #endif +} diff --git a/tests/projects/c++/modules/packages-subtarget/my-repo/packages/f/foo/src/xmake.lua b/tests/projects/c++/modules/packages-subtarget/my-repo/packages/f/foo/src/xmake.lua new file mode 100644 index 000000000..9fa37e1d7 --- /dev/null +++ b/tests/projects/c++/modules/packages-subtarget/my-repo/packages/f/foo/src/xmake.lua @@ -0,0 +1,7 @@ +add_rules("mode.release", "mode.debug") +set_languages("c++20") + +target("foo") + set_kind("static") + add_files("*.cpp") + add_files("*.mpp", {defines = "FOO_EXPORT", public = true}) diff --git a/tests/projects/c++/modules/packages-subtarget/my-repo/packages/f/foo/xmake.lua b/tests/projects/c++/modules/packages-subtarget/my-repo/packages/f/foo/xmake.lua new file mode 100644 index 000000000..19c87d866 --- /dev/null +++ b/tests/projects/c++/modules/packages-subtarget/my-repo/packages/f/foo/xmake.lua @@ -0,0 +1,6 @@ +package("foo") + set_sourcedir(path.join(os.scriptdir(), "src")) + + on_install(function(package) + import("package.tools.xmake").install(package, {}) + end)
\ No newline at end of file diff --git a/tests/projects/c++/modules/packages-subtarget/src/main.cpp b/tests/projects/c++/modules/packages-subtarget/src/main.cpp new file mode 100644 index 000000000..8559bf110 --- /dev/null +++ b/tests/projects/c++/modules/packages-subtarget/src/main.cpp @@ -0,0 +1,8 @@ +import foobar; +import bar2; + +int main() { + foo::say(bar::hello()); + foo::say(bar::hello2()); + return 0; +} diff --git a/tests/projects/c++/modules/packages-subtarget/src/mod.mpp b/tests/projects/c++/modules/packages-subtarget/src/mod.mpp new file mode 100644 index 000000000..aadf28413 --- /dev/null +++ b/tests/projects/c++/modules/packages-subtarget/src/mod.mpp @@ -0,0 +1,4 @@ +export module foobar; + +export import foo; +export import bar; diff --git a/tests/projects/c++/modules/packages-subtarget/test.lua b/tests/projects/c++/modules/packages-subtarget/test.lua new file mode 100644 index 000000000..c18e5a1d0 --- /dev/null +++ b/tests/projects/c++/modules/packages-subtarget/test.lua @@ -0,0 +1 @@ +inherit(".test_headerunits") diff --git a/tests/projects/c++/modules/packages-subtarget/xmake.lua b/tests/projects/c++/modules/packages-subtarget/xmake.lua new file mode 100644 index 000000000..bfafb232b --- /dev/null +++ b/tests/projects/c++/modules/packages-subtarget/xmake.lua @@ -0,0 +1,17 @@ +add_rules("mode.release", "mode.debug") +set_languages("c++2b") + +add_repositories("my-repo my-repo") +add_requires("foo", "bar", "bar2") + +target("dep") + set_kind("static") + add_packages("foo", "bar") + add_files("src/*.mpp", {public = true}) + +target("packages") + set_kind("binary") + add_files("src/*.cpp") + add_deps("dep") + add_packages("foo", "bar", "bar2") + set_policy("build.c++.modules", true) diff --git a/tests/projects/c++/modules/partitions_implunit/src/foo.cpp b/tests/projects/c++/modules/partitions_implunit/src/foo.cpp index d2e8d2a52..cc4c0c3fe 100644 --- a/tests/projects/c++/modules/partitions_implunit/src/foo.cpp +++ b/tests/projects/c++/modules/partitions_implunit/src/foo.cpp @@ -1,8 +1,6 @@ // Foo.cpp
module Foo;
-import :Impl;
+// Impl is implictly imported here
-void foo() {
- bar();
-}
+void foo() { bar(); }
diff --git a/tests/projects/c++/modules/phony/src/hello.cpp b/tests/projects/c++/modules/phony/src/hello.cpp new file mode 100644 index 000000000..38ecf20e3 --- /dev/null +++ b/tests/projects/c++/modules/phony/src/hello.cpp @@ -0,0 +1,17 @@ +module; + +#include <iostream> + +module hello; + +using namespace std; + +namespace hello { + say::say(int data) : data_(data) { + + } + + void say::hello() { + cout << "hello, say class: " << data_ << endl; + } +} // namespace hello diff --git a/tests/projects/c++/modules/phony/src/hello.mpp b/tests/projects/c++/modules/phony/src/hello.mpp new file mode 100644 index 000000000..6ddcc1d7f --- /dev/null +++ b/tests/projects/c++/modules/phony/src/hello.mpp @@ -0,0 +1,16 @@ +module; + +#include <iostream> + +export module hello; + +export namespace hello { + class say { + public: + say(int data); + void hello(); + + private: + int data_; + }; +} // namespace hello diff --git a/tests/projects/c++/modules/phony/src/main.cpp b/tests/projects/c++/modules/phony/src/main.cpp new file mode 100644 index 000000000..6f80b6c7d --- /dev/null +++ b/tests/projects/c++/modules/phony/src/main.cpp @@ -0,0 +1,7 @@ +import hello; + +int main() { + hello::say s(sizeof(hello::say)); + s.hello(); + return 0; +}
\ No newline at end of file diff --git a/tests/projects/c++/modules/phony/test.lua b/tests/projects/c++/modules/phony/test.lua new file mode 100644 index 000000000..7717f8049 --- /dev/null +++ b/tests/projects/c++/modules/phony/test.lua @@ -0,0 +1 @@ +inherit(".test_base") diff --git a/tests/projects/c++/modules/phony/xmake.lua b/tests/projects/c++/modules/phony/xmake.lua new file mode 100644 index 000000000..1bb71298b --- /dev/null +++ b/tests/projects/c++/modules/phony/xmake.lua @@ -0,0 +1,12 @@ +add_rules("mode.release", "mode.debug") +set_languages("c++20") + +target("test-phony") + set_kind("phony") + add_files("src/*.mpp", {public = true}) + +target("class") + set_kind("binary") + add_files("src/*.cpp") + add_deps("test-phony") + diff --git a/tests/projects/c++/modules/phony2/include/foo.h b/tests/projects/c++/modules/phony2/include/foo.h new file mode 100644 index 000000000..e66099202 --- /dev/null +++ b/tests/projects/c++/modules/phony2/include/foo.h @@ -0,0 +1 @@ +inline int foo() { return 5; } diff --git a/tests/projects/c++/modules/phony2/src/hello.cpp b/tests/projects/c++/modules/phony2/src/hello.cpp new file mode 100644 index 000000000..38ecf20e3 --- /dev/null +++ b/tests/projects/c++/modules/phony2/src/hello.cpp @@ -0,0 +1,17 @@ +module; + +#include <iostream> + +module hello; + +using namespace std; + +namespace hello { + say::say(int data) : data_(data) { + + } + + void say::hello() { + cout << "hello, say class: " << data_ << endl; + } +} // namespace hello diff --git a/tests/projects/c++/modules/phony2/src/hello.mpp b/tests/projects/c++/modules/phony2/src/hello.mpp new file mode 100644 index 000000000..6ddcc1d7f --- /dev/null +++ b/tests/projects/c++/modules/phony2/src/hello.mpp @@ -0,0 +1,16 @@ +module; + +#include <iostream> + +export module hello; + +export namespace hello { + class say { + public: + say(int data); + void hello(); + + private: + int data_; + }; +} // namespace hello diff --git a/tests/projects/c++/modules/phony2/src/main.cpp b/tests/projects/c++/modules/phony2/src/main.cpp new file mode 100644 index 000000000..6f80b6c7d --- /dev/null +++ b/tests/projects/c++/modules/phony2/src/main.cpp @@ -0,0 +1,7 @@ +import hello; + +int main() { + hello::say s(sizeof(hello::say)); + s.hello(); + return 0; +}
\ No newline at end of file diff --git a/tests/projects/c++/modules/phony2/test.lua b/tests/projects/c++/modules/phony2/test.lua new file mode 100644 index 000000000..7717f8049 --- /dev/null +++ b/tests/projects/c++/modules/phony2/test.lua @@ -0,0 +1 @@ +inherit(".test_base") diff --git a/tests/projects/c++/modules/phony2/xmake.lua b/tests/projects/c++/modules/phony2/xmake.lua new file mode 100644 index 000000000..3247ab41c --- /dev/null +++ b/tests/projects/c++/modules/phony2/xmake.lua @@ -0,0 +1,17 @@ +add_rules("mode.release", "mode.debug") +set_languages("c++20") + +target("test") + set_kind("static") + add_includedirs("include") + add_files("src/*.mpp", {public = true}) + +target("test-phony") + set_kind("phony") + add_deps("test") + +target("class") + set_kind("binary") + add_files("src/*.cpp") + add_deps("test-phony") + diff --git a/tests/projects/c++/modules/test_dependency_scanner.lua b/tests/projects/c++/modules/test_dependency_scanner.lua index 24cf602e8..5f56113c2 100644 --- a/tests/projects/c++/modules/test_dependency_scanner.lua +++ b/tests/projects/c++/modules/test_dependency_scanner.lua @@ -3,7 +3,7 @@ import("core.base.semver") import("utils.ci.is_running", {alias = "ci_is_running"}) function _build() - os.run("xmake f --foo=n") + os.run("xmake f --foo=n --policies=build.c++.modules.std:n") local outdata if ci_is_running() then outdata = os.iorun("xmake -rvD") |
