From 1dcfa0d95ee2cbe521b707cec7e142d8706570ff Mon Sep 17 00:00:00 2001 From: Arthur LAURENT Date: Tue, 13 May 2025 20:21:51 +0200 Subject: (C++ modules support) fix _patch_sourcebatch when a dep have a namespace --- xmake/rules/c++/modules/scanner.lua | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/xmake/rules/c++/modules/scanner.lua b/xmake/rules/c++/modules/scanner.lua index 263b5725a..d0d197ab4 100644 --- a/xmake/rules/c++/modules/scanner.lua +++ b/xmake/rules/c++/modules/scanner.lua @@ -296,7 +296,11 @@ function _get_targetdeps_modules(target) fileconfig.undefines = table.join(fileconfig.undefines or {}, dep:get("undefines") or {}) fileconfig.includedirs = table.join(fileconfig.includedirs or {}, dep:get("includedirs") or {}) if not dep:is_phony() then - fileconfig.external = dep:fullname() + if target:namespace() == dep:namespace() then + fileconfig.external = dep:name() + else + fileconfig.external = dep:fullname() + end fileconfig.bmionly = not dep:is_moduleonly() end if not modules[sourcefile] then @@ -358,6 +362,7 @@ function _patch_sourcebatch(target, sourcebatch) local strict = target:policy("build.c++.modules.reuse.strict") or target:policy("build.c++.modules.tryreuse.discriminate_on_defines") local dep = target:dep(fileconfig.external) + assert(dep, format("dep target <%s> for <%s>", fileconfig.external, target:fullname())) local can_reuse = nocheck or _are_flags_compatible(target, dep, sourcefile, {strict = strict}) if can_reuse then -- cgit v1.3.1 From d1fd8beee890a1beb4ef63ad9b9cd476b2e8bc5b Mon Sep 17 00:00:00 2001 From: Arthur LAURENT Date: Tue, 13 May 2025 20:22:03 +0200 Subject: (C++ modules support) add tests --- tests/projects/c++/modules/namespace/src/hello.mpp | 14 +++++++++++++ .../c++/modules/namespace/src/hello_impl.cpp | 23 ++++++++++++++++++++++ tests/projects/c++/modules/namespace/src/main.cpp | 9 +++++++++ tests/projects/c++/modules/namespace/src/mod.mpp | 5 +++++ .../c++/modules/namespace/src/mod_impl.cpp | 8 ++++++++ tests/projects/c++/modules/namespace/test.lua | 1 + tests/projects/c++/modules/namespace/xmake.lua | 15 ++++++++++++++ .../projects/c++/modules/namespace2/src/hello.mpp | 14 +++++++++++++ .../c++/modules/namespace2/src/hello_impl.cpp | 23 ++++++++++++++++++++++ tests/projects/c++/modules/namespace2/src/main.cpp | 9 +++++++++ tests/projects/c++/modules/namespace2/src/mod.mpp | 5 +++++ .../c++/modules/namespace2/src/mod_impl.cpp | 8 ++++++++ tests/projects/c++/modules/namespace2/test.lua | 1 + tests/projects/c++/modules/namespace2/xmake.lua | 17 ++++++++++++++++ 14 files changed, 152 insertions(+) create mode 100644 tests/projects/c++/modules/namespace/src/hello.mpp create mode 100644 tests/projects/c++/modules/namespace/src/hello_impl.cpp create mode 100644 tests/projects/c++/modules/namespace/src/main.cpp create mode 100644 tests/projects/c++/modules/namespace/src/mod.mpp create mode 100644 tests/projects/c++/modules/namespace/src/mod_impl.cpp create mode 100644 tests/projects/c++/modules/namespace/test.lua create mode 100644 tests/projects/c++/modules/namespace/xmake.lua create mode 100644 tests/projects/c++/modules/namespace2/src/hello.mpp create mode 100644 tests/projects/c++/modules/namespace2/src/hello_impl.cpp create mode 100644 tests/projects/c++/modules/namespace2/src/main.cpp create mode 100644 tests/projects/c++/modules/namespace2/src/mod.mpp create mode 100644 tests/projects/c++/modules/namespace2/src/mod_impl.cpp create mode 100644 tests/projects/c++/modules/namespace2/test.lua create mode 100644 tests/projects/c++/modules/namespace2/xmake.lua diff --git a/tests/projects/c++/modules/namespace/src/hello.mpp b/tests/projects/c++/modules/namespace/src/hello.mpp new file mode 100644 index 000000000..abac9fcb0 --- /dev/null +++ b/tests/projects/c++/modules/namespace/src/hello.mpp @@ -0,0 +1,14 @@ +export module hello; + +export namespace hello { + extern int data__; + void say_hello(); + + class say { + public: + say(int data); + void hello(); + private: + int data_; + }; +} diff --git a/tests/projects/c++/modules/namespace/src/hello_impl.cpp b/tests/projects/c++/modules/namespace/src/hello_impl.cpp new file mode 100644 index 000000000..064afebad --- /dev/null +++ b/tests/projects/c++/modules/namespace/src/hello_impl.cpp @@ -0,0 +1,23 @@ +module; +#include + +module hello; +import mod; + +void inner() { + std::cout << "hello world! data: " + << mod::foo() << std::endl; +} + +namespace hello { + int data__; + void say_hello() { ::inner(); } + + say::say(int data) : data_{data} { + } + + void say::hello() { + hello::data__ = data_; + ::inner(); + } +} diff --git a/tests/projects/c++/modules/namespace/src/main.cpp b/tests/projects/c++/modules/namespace/src/main.cpp new file mode 100644 index 000000000..93cc427a4 --- /dev/null +++ b/tests/projects/c++/modules/namespace/src/main.cpp @@ -0,0 +1,9 @@ +import hello; + +int main() { + hello::data__ = 123; + hello::say_hello(); + hello::say(sizeof(hello::say)).hello(); + return 0; +} + diff --git a/tests/projects/c++/modules/namespace/src/mod.mpp b/tests/projects/c++/modules/namespace/src/mod.mpp new file mode 100644 index 000000000..ac30a31c8 --- /dev/null +++ b/tests/projects/c++/modules/namespace/src/mod.mpp @@ -0,0 +1,5 @@ +export module mod; + +export namespace mod { + int foo(); +} diff --git a/tests/projects/c++/modules/namespace/src/mod_impl.cpp b/tests/projects/c++/modules/namespace/src/mod_impl.cpp new file mode 100644 index 000000000..1adf6570e --- /dev/null +++ b/tests/projects/c++/modules/namespace/src/mod_impl.cpp @@ -0,0 +1,8 @@ +module mod; +import hello; + +namespace mod { + int foo() { + return hello::data__; + } +} diff --git a/tests/projects/c++/modules/namespace/test.lua b/tests/projects/c++/modules/namespace/test.lua new file mode 100644 index 000000000..7717f8049 --- /dev/null +++ b/tests/projects/c++/modules/namespace/test.lua @@ -0,0 +1 @@ +inherit(".test_base") diff --git a/tests/projects/c++/modules/namespace/xmake.lua b/tests/projects/c++/modules/namespace/xmake.lua new file mode 100644 index 000000000..aefa1ba09 --- /dev/null +++ b/tests/projects/c++/modules/namespace/xmake.lua @@ -0,0 +1,15 @@ +add_rules("mode.release", "mode.debug") +set_languages("c++20") + +namespace("foo", function() + target("dep") + set_kind("static") + add_files("src/hello.mpp", "src/mod.mpp", {public = true}) + add_files("src/hello_impl.cpp", "src/mod_impl.cpp") + + target("binary") + set_kind("binary") + add_files("src/main.cpp") + add_deps("dep") +end) + diff --git a/tests/projects/c++/modules/namespace2/src/hello.mpp b/tests/projects/c++/modules/namespace2/src/hello.mpp new file mode 100644 index 000000000..abac9fcb0 --- /dev/null +++ b/tests/projects/c++/modules/namespace2/src/hello.mpp @@ -0,0 +1,14 @@ +export module hello; + +export namespace hello { + extern int data__; + void say_hello(); + + class say { + public: + say(int data); + void hello(); + private: + int data_; + }; +} diff --git a/tests/projects/c++/modules/namespace2/src/hello_impl.cpp b/tests/projects/c++/modules/namespace2/src/hello_impl.cpp new file mode 100644 index 000000000..064afebad --- /dev/null +++ b/tests/projects/c++/modules/namespace2/src/hello_impl.cpp @@ -0,0 +1,23 @@ +module; +#include + +module hello; +import mod; + +void inner() { + std::cout << "hello world! data: " + << mod::foo() << std::endl; +} + +namespace hello { + int data__; + void say_hello() { ::inner(); } + + say::say(int data) : data_{data} { + } + + void say::hello() { + hello::data__ = data_; + ::inner(); + } +} diff --git a/tests/projects/c++/modules/namespace2/src/main.cpp b/tests/projects/c++/modules/namespace2/src/main.cpp new file mode 100644 index 000000000..93cc427a4 --- /dev/null +++ b/tests/projects/c++/modules/namespace2/src/main.cpp @@ -0,0 +1,9 @@ +import hello; + +int main() { + hello::data__ = 123; + hello::say_hello(); + hello::say(sizeof(hello::say)).hello(); + return 0; +} + diff --git a/tests/projects/c++/modules/namespace2/src/mod.mpp b/tests/projects/c++/modules/namespace2/src/mod.mpp new file mode 100644 index 000000000..ac30a31c8 --- /dev/null +++ b/tests/projects/c++/modules/namespace2/src/mod.mpp @@ -0,0 +1,5 @@ +export module mod; + +export namespace mod { + int foo(); +} diff --git a/tests/projects/c++/modules/namespace2/src/mod_impl.cpp b/tests/projects/c++/modules/namespace2/src/mod_impl.cpp new file mode 100644 index 000000000..1adf6570e --- /dev/null +++ b/tests/projects/c++/modules/namespace2/src/mod_impl.cpp @@ -0,0 +1,8 @@ +module mod; +import hello; + +namespace mod { + int foo() { + return hello::data__; + } +} diff --git a/tests/projects/c++/modules/namespace2/test.lua b/tests/projects/c++/modules/namespace2/test.lua new file mode 100644 index 000000000..7717f8049 --- /dev/null +++ b/tests/projects/c++/modules/namespace2/test.lua @@ -0,0 +1 @@ +inherit(".test_base") diff --git a/tests/projects/c++/modules/namespace2/xmake.lua b/tests/projects/c++/modules/namespace2/xmake.lua new file mode 100644 index 000000000..4f124c5ac --- /dev/null +++ b/tests/projects/c++/modules/namespace2/xmake.lua @@ -0,0 +1,17 @@ +add_rules("mode.release", "mode.debug") +set_languages("c++20") + +namespace("bar", function() + target("dep") + set_kind("static") + add_files("src/hello.mpp", "src/mod.mpp", {public = true}) + add_files("src/hello_impl.cpp", "src/mod_impl.cpp") +end) + +namespace("foo", function() + target("binary") + set_kind("binary") + add_files("src/main.cpp") + add_deps("bar::dep") +end) + -- cgit v1.3.1 From bb8609c50ec1d82c50af24455ab904c4f0b7cd27 Mon Sep 17 00:00:00 2001 From: ruki Date: Wed, 14 May 2025 14:44:31 +0800 Subject: Update scanner.lua --- xmake/rules/c++/modules/scanner.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/xmake/rules/c++/modules/scanner.lua b/xmake/rules/c++/modules/scanner.lua index d0d197ab4..fe9b9c63d 100644 --- a/xmake/rules/c++/modules/scanner.lua +++ b/xmake/rules/c++/modules/scanner.lua @@ -362,7 +362,7 @@ function _patch_sourcebatch(target, sourcebatch) local strict = target:policy("build.c++.modules.reuse.strict") or target:policy("build.c++.modules.tryreuse.discriminate_on_defines") local dep = target:dep(fileconfig.external) - assert(dep, format("dep target <%s> for <%s>", fileconfig.external, target:fullname())) + assert(dep, "dep target <%s> for <%s>", fileconfig.external, target:fullname()) local can_reuse = nocheck or _are_flags_compatible(target, dep, sourcefile, {strict = strict}) if can_reuse then -- cgit v1.3.1