summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorruki <[email protected]>2022-08-24 16:37:18 +0800
committerGitHub <[email protected]>2022-08-24 16:37:18 +0800
commitd0cf3945938f7e3ea971f825c22ef93a7684ac0b (patch)
tree76c3081ca4f89848de0a49f6e9be46d79615dbe5
parent27f07791a6ba754bb2bd07e87513af3da9c68f29 (diff)
parentab8143a85b50dab08e1a3573f3456fb9573a699a (diff)
Merge pull request #2717 from xmake-io/modules
improve modules
-rw-r--r--tests/projects/c++/modules/headerunits_person/src/Person.mpp20
-rw-r--r--tests/projects/c++/modules/headerunits_person/src/test.cpp11
-rw-r--r--tests/projects/c++/modules/headerunits_person/test.lua1
-rw-r--r--tests/projects/c++/modules/headerunits_person/xmake.lua4
-rw-r--r--tests/projects/c++/modules/partitions/test.lua1
-rw-r--r--tests/projects/c++/modules/partitions2/src/math.cpp15
-rw-r--r--tests/projects/c++/modules/partitions2/src/math.mpp7
-rw-r--r--tests/projects/c++/modules/partitions2/src/math_helpers.mpp7
-rw-r--r--tests/projects/c++/modules/partitions2/src/test.cpp7
-rw-r--r--tests/projects/c++/modules/partitions2/test.lua1
-rw-r--r--tests/projects/c++/modules/partitions2/xmake.lua4
-rw-r--r--xmake/rules/c++/modules/modules_support/common.lua24
-rw-r--r--xmake/rules/c++/modules/modules_support/gcc.lua2
13 files changed, 95 insertions, 9 deletions
diff --git a/tests/projects/c++/modules/headerunits_person/src/Person.mpp b/tests/projects/c++/modules/headerunits_person/src/Person.mpp
new file mode 100644
index 000000000..e5b8105e8
--- /dev/null
+++ b/tests/projects/c++/modules/headerunits_person/src/Person.mpp
@@ -0,0 +1,20 @@
+module;
+
+#include <cstddef>
+
+export module person;
+
+import <string>;
+
+export class Person {
+public:
+ Person(std::string firstName, std::string lastName)
+ : m_firstName{std::move(firstName)}, m_lastName{std::move(lastName)} {}
+
+ const std::string &getFirstName() const { return m_firstName; }
+ const std::string &getLastName() const { return m_lastName; }
+
+private:
+ std::string m_firstName;
+ std::string m_lastName;
+};
diff --git a/tests/projects/c++/modules/headerunits_person/src/test.cpp b/tests/projects/c++/modules/headerunits_person/src/test.cpp
new file mode 100644
index 000000000..d12206ef7
--- /dev/null
+++ b/tests/projects/c++/modules/headerunits_person/src/test.cpp
@@ -0,0 +1,11 @@
+import person;
+import <iostream>;
+import <string>; // For operator<< for std::string
+
+using namespace std;
+
+int main()
+{
+ Person person{ "Kole", "Webb" };
+ cout << person.getLastName() << ", " << person.getFirstName() << endl;
+}
diff --git a/tests/projects/c++/modules/headerunits_person/test.lua b/tests/projects/c++/modules/headerunits_person/test.lua
new file mode 100644
index 000000000..c18e5a1d0
--- /dev/null
+++ b/tests/projects/c++/modules/headerunits_person/test.lua
@@ -0,0 +1 @@
+inherit(".test_headerunits")
diff --git a/tests/projects/c++/modules/headerunits_person/xmake.lua b/tests/projects/c++/modules/headerunits_person/xmake.lua
new file mode 100644
index 000000000..c9290833b
--- /dev/null
+++ b/tests/projects/c++/modules/headerunits_person/xmake.lua
@@ -0,0 +1,4 @@
+set_languages("c++20")
+target("hello")
+ set_kind("binary")
+ add_files("src/*.cpp", "src/*.mpp")
diff --git a/tests/projects/c++/modules/partitions/test.lua b/tests/projects/c++/modules/partitions/test.lua
new file mode 100644
index 000000000..c18e5a1d0
--- /dev/null
+++ b/tests/projects/c++/modules/partitions/test.lua
@@ -0,0 +1 @@
+inherit(".test_headerunits")
diff --git a/tests/projects/c++/modules/partitions2/src/math.cpp b/tests/projects/c++/modules/partitions2/src/math.cpp
new file mode 100644
index 000000000..3a10c8203
--- /dev/null
+++ b/tests/projects/c++/modules/partitions2/src/math.cpp
@@ -0,0 +1,15 @@
+module math;
+
+import :details;
+
+double Math::superLog(double z, double b)
+{
+ // Implementation omitted...
+ return someHelperFunction(z);
+}
+
+double Math::lerchZeta(double lambda, double alpha, double s)
+{
+ // Implementation omitted...
+ return someHelperFunction(s);
+}
diff --git a/tests/projects/c++/modules/partitions2/src/math.mpp b/tests/projects/c++/modules/partitions2/src/math.mpp
new file mode 100644
index 000000000..9e2552513
--- /dev/null
+++ b/tests/projects/c++/modules/partitions2/src/math.mpp
@@ -0,0 +1,7 @@
+export module math; // math module declaration
+
+export namespace Math
+{
+ double superLog(double z, double b);
+ double lerchZeta(double lambda, double alpha, double s);
+}
diff --git a/tests/projects/c++/modules/partitions2/src/math_helpers.mpp b/tests/projects/c++/modules/partitions2/src/math_helpers.mpp
new file mode 100644
index 000000000..a92cb5e4a
--- /dev/null
+++ b/tests/projects/c++/modules/partitions2/src/math_helpers.mpp
@@ -0,0 +1,7 @@
+export module math:details; // math:details implementation partition
+
+double someHelperFunction(double a)
+{
+ // Implementation omitted...
+ return 42;
+}
diff --git a/tests/projects/c++/modules/partitions2/src/test.cpp b/tests/projects/c++/modules/partitions2/src/test.cpp
new file mode 100644
index 000000000..8f7f81b2c
--- /dev/null
+++ b/tests/projects/c++/modules/partitions2/src/test.cpp
@@ -0,0 +1,7 @@
+import math;
+
+int main()
+{
+ auto a{ Math::lerchZeta(1, 2, 3) };
+ auto b{ Math::superLog(1, 2) };
+}
diff --git a/tests/projects/c++/modules/partitions2/test.lua b/tests/projects/c++/modules/partitions2/test.lua
new file mode 100644
index 000000000..c18e5a1d0
--- /dev/null
+++ b/tests/projects/c++/modules/partitions2/test.lua
@@ -0,0 +1 @@
+inherit(".test_headerunits")
diff --git a/tests/projects/c++/modules/partitions2/xmake.lua b/tests/projects/c++/modules/partitions2/xmake.lua
new file mode 100644
index 000000000..c9290833b
--- /dev/null
+++ b/tests/projects/c++/modules/partitions2/xmake.lua
@@ -0,0 +1,4 @@
+set_languages("c++20")
+target("hello")
+ set_kind("binary")
+ add_files("src/*.cpp", "src/*.mpp")
diff --git a/xmake/rules/c++/modules/modules_support/common.lua b/xmake/rules/c++/modules/modules_support/common.lua
index 580d52dd9..92c92d465 100644
--- a/xmake/rules/c++/modules/modules_support/common.lua
+++ b/xmake/rules/c++/modules/modules_support/common.lua
@@ -381,26 +381,31 @@ function fallback_generate_dependencies(target, jsonfile, sourcefile)
local rule = {outputs = {jsonfile}}
rule["primary-output"] = target:objectfile(sourcefile)
- local module_name
+ local module_name_export
+ local module_name_private
local module_deps = {}
+ local module_deps_set = hashset.new()
local sourcecode = io.readfile(sourcefile)
sourcecode = sourcecode:gsub("//.-\n", "\n")
sourcecode = sourcecode:gsub("/%*.-%*/", "")
for _, line in ipairs(sourcecode:split("\n", {plain = true})) do
- if not module_name then
- module_name = line:match("export%s+module%s+(.+)%s*;")
+ if not module_name_export then
+ module_name_export = line:match("export%s+module%s+(.+)%s*;")
+ end
+ if not module_name_private then
+ module_name_private = line:match("module%s+(.+)%s*;")
end
local module_depname = line:match("import%s+(.+)%s*;")
-- we need parse module interface dep in cxx/impl_unit.cpp, e.g. hello.mpp and hello_impl.cpp
-- @see https://github.com/xmake-io/xmake/pull/2664#issuecomment-1213167314
if not module_depname and not has_module_extension(sourcefile) then
- module_depname = line:match("module%s+(.+)%s*;")
+ module_depname = module_name_private
end
- if module_depname then
+ if module_depname and not module_deps_set:has(module_depname) then
local module_dep = {}
-- partition? import :xxx;
if module_depname:startswith(":") then
- module_depname = module_name .. module_depname
+ module_depname = (module_name_export or module_name_private or "") .. module_depname
elseif module_depname:startswith("\"") then
module_depname = module_depname:sub(2, -2)
module_dep["lookup-method"] = "include-quote"
@@ -414,14 +419,15 @@ function fallback_generate_dependencies(target, jsonfile, sourcefile)
end
module_dep["logical-name"] = module_depname
table.insert(module_deps, module_dep)
+ module_deps_set:insert(module_depname)
end
end
- if module_name then
- table.insert(rule.outputs, module_name .. bmi_extension(target))
+ if module_name_export then
+ table.insert(rule.outputs, module_name_export .. bmi_extension(target))
local provide = {}
- provide["logical-name"] = module_name
+ provide["logical-name"] = module_name_export
provide["source-path"] = path.absolute(sourcefile, project.directory())
rule.provides = {}
diff --git a/xmake/rules/c++/modules/modules_support/gcc.lua b/xmake/rules/c++/modules/modules_support/gcc.lua
index 9660466bd..20a8437aa 100644
--- a/xmake/rules/c++/modules/modules_support/gcc.lua
+++ b/xmake/rules/c++/modules/modules_support/gcc.lua
@@ -63,6 +63,8 @@ function load(target)
os.rm(_get_module_mapper())
end
target:add("cxxflags", modulemapperflag .. _get_module_mapper(), {force = true, expand = false})
+ -- fix cxxabi issue, @see https://github.com/xmake-io/xmake/issues/2716#issuecomment-1225057760
+ target:add("cxxflags", "-D_GLIBCXX_USE_CXX11_ABI=0")
end
-- get includedirs for stl headers