diff options
| author | Arthur LAURENT <[email protected]> | 2025-05-07 15:42:28 +0200 |
|---|---|---|
| committer | Arthur LAURENT <[email protected]> | 2025-05-09 15:56:33 +0200 |
| commit | b1578e624a53de98cbbbbf5a21ade120efdc5130 (patch) | |
| tree | b75d6bf52a0d2ef33661f85fd1889660ecbd322d /tests/projects/c++/modules | |
| parent | 41bb46475576049e3b0dc6c008311c41d8432f62 (diff) | |
(C++ modules support) add tests
Diffstat (limited to 'tests/projects/c++/modules')
38 files changed, 353 insertions, 4 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..9e2b6a21e --- /dev/null +++ b/tests/projects/c++/modules/cmake/test.lua @@ -0,0 +1,51 @@ +import("lib.detect.find_tool") +import("core.base.semver") +import("core.tool.toolchain") + +function _cleanup() + os.rm(".xmake", "build") +end + +function _gen_cmakelist() + if not os.isfile("CMakeLists.txt") then + os.exec("xmake project -k cmake") + end +end + +function _build(t) + os.mv("xmake.lua", "xmake.lua_") + os.exec("xmake f --trybuild=cmake --toolchain=" .. t) + os.exec("xmake b") + os.mv("xmake.lua_", "xmake.lua") +end + +function main(t) + _cleanup() + + 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 + local clang = find_tool("clang", {version = true}) + if clang and clang.version and semver.compare(clang.version, "18.0") >= 0 then + _build("clang") + _cleanup() + end + _build("msvc") + elseif is_subhost("msys") or is_subhost("linux") then + local gcc = find_tool("gcc", {version = true}) + if gcc and gcc.version and semver.compare(gcc.version, "14.0") >= 0 then + _build("gcc") + _cleanup() + end + local clang = find_tool("clang", {version = true}) + if clang and clang.version and semver.compare(clang.version, "18.0") >= 0 then + _build("clang") + _cleanup() + end + 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/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") + |
