summaryrefslogtreecommitdiff
path: root/tests/projects/c++/modules
diff options
context:
space:
mode:
authorArthur LAURENT <[email protected]>2025-05-07 15:42:28 +0200
committerArthur LAURENT <[email protected]>2025-05-09 15:56:33 +0200
commitb1578e624a53de98cbbbbf5a21ade120efdc5130 (patch)
treeb75d6bf52a0d2ef33661f85fd1889660ecbd322d /tests/projects/c++/modules
parent41bb46475576049e3b0dc6c008311c41d8432f62 (diff)
(C++ modules support) add tests
Diffstat (limited to 'tests/projects/c++/modules')
-rw-r--r--tests/projects/c++/modules/cmake/src/hello.mpp11
-rw-r--r--tests/projects/c++/modules/cmake/src/hello_impl.cpp14
-rw-r--r--tests/projects/c++/modules/cmake/src/main.cpp7
-rw-r--r--tests/projects/c++/modules/cmake/test.lua51
-rw-r--r--tests/projects/c++/modules/cmake/xmake.lua8
-rw-r--r--tests/projects/c++/modules/include-dirs/include/foo.h1
-rw-r--r--tests/projects/c++/modules/include-dirs/src/hello.mpp9
-rw-r--r--tests/projects/c++/modules/include-dirs/src/main.cpp5
-rw-r--r--tests/projects/c++/modules/include-dirs/test.lua1
-rw-r--r--tests/projects/c++/modules/include-dirs/xmake.lua17
-rw-r--r--tests/projects/c++/modules/packages-subtarget/my-repo/packages/b/bar/src/bar.cpp5
-rw-r--r--tests/projects/c++/modules/packages-subtarget/my-repo/packages/b/bar/src/bar.mpp12
-rw-r--r--tests/projects/c++/modules/packages-subtarget/my-repo/packages/b/bar/src/include/a.hpp6
-rw-r--r--tests/projects/c++/modules/packages-subtarget/my-repo/packages/b/bar/src/xmake.lua9
-rw-r--r--tests/projects/c++/modules/packages-subtarget/my-repo/packages/b/bar/xmake.lua6
-rw-r--r--tests/projects/c++/modules/packages-subtarget/my-repo/packages/b/bar2/src/bar.mpp8
-rw-r--r--tests/projects/c++/modules/packages-subtarget/my-repo/packages/b/bar2/src/xmake.lua6
-rw-r--r--tests/projects/c++/modules/packages-subtarget/my-repo/packages/b/bar2/xmake.lua7
-rw-r--r--tests/projects/c++/modules/packages-subtarget/my-repo/packages/f/foo/src/foo.cpp6
-rw-r--r--tests/projects/c++/modules/packages-subtarget/my-repo/packages/f/foo/src/foo.mpp7
-rw-r--r--tests/projects/c++/modules/packages-subtarget/my-repo/packages/f/foo/src/xmake.lua7
-rw-r--r--tests/projects/c++/modules/packages-subtarget/my-repo/packages/f/foo/xmake.lua6
-rw-r--r--tests/projects/c++/modules/packages-subtarget/src/main.cpp8
-rw-r--r--tests/projects/c++/modules/packages-subtarget/src/mod.mpp4
-rw-r--r--tests/projects/c++/modules/packages-subtarget/test.lua1
-rw-r--r--tests/projects/c++/modules/packages-subtarget/xmake.lua17
-rw-r--r--tests/projects/c++/modules/partitions_implunit/src/foo.cpp6
-rw-r--r--tests/projects/c++/modules/phony/src/hello.cpp17
-rw-r--r--tests/projects/c++/modules/phony/src/hello.mpp16
-rw-r--r--tests/projects/c++/modules/phony/src/main.cpp7
-rw-r--r--tests/projects/c++/modules/phony/test.lua1
-rw-r--r--tests/projects/c++/modules/phony/xmake.lua12
-rw-r--r--tests/projects/c++/modules/phony2/include/foo.h1
-rw-r--r--tests/projects/c++/modules/phony2/src/hello.cpp17
-rw-r--r--tests/projects/c++/modules/phony2/src/hello.mpp16
-rw-r--r--tests/projects/c++/modules/phony2/src/main.cpp7
-rw-r--r--tests/projects/c++/modules/phony2/test.lua1
-rw-r--r--tests/projects/c++/modules/phony2/xmake.lua17
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")
+