summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorruki <[email protected]>2021-07-15 22:58:21 +0800
committerGitHub <[email protected]>2021-07-15 22:58:21 +0800
commitba4ebd5a676ad15d8d72fe4fefa4d949ea11bc68 (patch)
tree817b50173948547f7e4b491da271918c67b8a5ff
parent8c1141aba414c07554179cb28687124514f6e770 (diff)
parent942c32f448d9b8a850438aa2af1de2415b7ae872 (diff)
Merge pull request #1519 from aacirino/master
Added the correct support to build C++ projects that use modules
-rw-r--r--tests/projects/c++/modules/class/src/hello_impl.cpp5
-rw-r--r--tests/projects/c++/modules/class/xmake.lua3
-rw-r--r--tests/projects/c++/modules/dependence/src/hello.mpp3
-rw-r--r--tests/projects/c++/modules/dependence/src/hello_impl.cpp4
-rw-r--r--tests/projects/c++/modules/dependence/xmake.lua4
-rw-r--r--tests/projects/c++/modules/hello/src/hello.mpp5
-rw-r--r--tests/projects/c++/modules/hello/xmake.lua3
-rw-r--r--tests/projects/c++/modules/impl_unit/src/hello_impl.cpp4
-rw-r--r--tests/projects/c++/modules/impl_unit/xmake.lua3
-rw-r--r--tests/projects/c++/modules/inline_and_template/src/hello.mpp4
-rw-r--r--tests/projects/c++/modules/inline_and_template/src/say.mpp4
-rw-r--r--tests/projects/c++/modules/inline_and_template/xmake.lua4
-rw-r--r--xmake/rules/c++/modules/build_modulefiles.lua43
13 files changed, 49 insertions, 40 deletions
diff --git a/tests/projects/c++/modules/class/src/hello_impl.cpp b/tests/projects/c++/modules/class/src/hello_impl.cpp
index b929c453b..6d0008fbb 100644
--- a/tests/projects/c++/modules/class/src/hello_impl.cpp
+++ b/tests/projects/c++/modules/class/src/hello_impl.cpp
@@ -1,8 +1,7 @@
-// module;
-#include <iostream>
module hello;
-// import std.core;
+#include <iostream>
+
using namespace std;
namespace hello {
diff --git a/tests/projects/c++/modules/class/xmake.lua b/tests/projects/c++/modules/class/xmake.lua
index a3bc3a394..6d6eaddee 100644
--- a/tests/projects/c++/modules/class/xmake.lua
+++ b/tests/projects/c++/modules/class/xmake.lua
@@ -1,5 +1,4 @@
+set_languages("c++20")
target("class")
set_kind("binary")
add_files("src/*.cpp", "src/*.mpp")
-
-
diff --git a/tests/projects/c++/modules/dependence/src/hello.mpp b/tests/projects/c++/modules/dependence/src/hello.mpp
index e29bd7b95..3f803afaf 100644
--- a/tests/projects/c++/modules/dependence/src/hello.mpp
+++ b/tests/projects/c++/modules/dependence/src/hello.mpp
@@ -17,10 +17,11 @@ export namespace hello {
int data_;
};
}
-
+/*
#ifndef _MSC_VER
export namespace {
void anonymous() {
}
}
#endif
+*/ \ No newline at end of file
diff --git a/tests/projects/c++/modules/dependence/src/hello_impl.cpp b/tests/projects/c++/modules/dependence/src/hello_impl.cpp
index 37797c31c..5dbc009f4 100644
--- a/tests/projects/c++/modules/dependence/src/hello_impl.cpp
+++ b/tests/projects/c++/modules/dependence/src/hello_impl.cpp
@@ -1,6 +1,6 @@
-// module;
-#include <iostream>
module hello;
+
+#include <iostream>
import mod;
void inner() {
diff --git a/tests/projects/c++/modules/dependence/xmake.lua b/tests/projects/c++/modules/dependence/xmake.lua
index 14d6ca17c..6d64b49b1 100644
--- a/tests/projects/c++/modules/dependence/xmake.lua
+++ b/tests/projects/c++/modules/dependence/xmake.lua
@@ -1,6 +1,4 @@
+set_languages("c++20")
target("dependence")
set_kind("binary")
add_files("src/*.cpp", "src/*.mpp")
- set_languages("c++11")
-
-
diff --git a/tests/projects/c++/modules/hello/src/hello.mpp b/tests/projects/c++/modules/hello/src/hello.mpp
index fbd7fd6ad..9bbd036f0 100644
--- a/tests/projects/c++/modules/hello/src/hello.mpp
+++ b/tests/projects/c++/modules/hello/src/hello.mpp
@@ -1,6 +1,7 @@
-// module;
-#include <cstdio>
export module hello;
+
+#include <cstdio>
+
using namespace std;
export namespace hello {
diff --git a/tests/projects/c++/modules/hello/xmake.lua b/tests/projects/c++/modules/hello/xmake.lua
index 6c3bff19a..2315cf287 100644
--- a/tests/projects/c++/modules/hello/xmake.lua
+++ b/tests/projects/c++/modules/hello/xmake.lua
@@ -1,5 +1,4 @@
+set_languages("c++20")
target("hello")
set_kind("binary")
add_files("src/*.cpp", "src/*.mpp")
-
-
diff --git a/tests/projects/c++/modules/impl_unit/src/hello_impl.cpp b/tests/projects/c++/modules/impl_unit/src/hello_impl.cpp
index 1c9968a51..9cee17cfd 100644
--- a/tests/projects/c++/modules/impl_unit/src/hello_impl.cpp
+++ b/tests/projects/c++/modules/impl_unit/src/hello_impl.cpp
@@ -1,7 +1,7 @@
-// module;
-#include <iostream>
module hello;
+#include <iostream>
+
using namespace std;
namespace hello {
diff --git a/tests/projects/c++/modules/impl_unit/xmake.lua b/tests/projects/c++/modules/impl_unit/xmake.lua
index 3d19e0908..abe41d20a 100644
--- a/tests/projects/c++/modules/impl_unit/xmake.lua
+++ b/tests/projects/c++/modules/impl_unit/xmake.lua
@@ -1,5 +1,4 @@
+set_languages("c++20")
target("impl_unit")
set_kind("binary")
add_files("src/*.cpp", "src/*.mpp")
-
-
diff --git a/tests/projects/c++/modules/inline_and_template/src/hello.mpp b/tests/projects/c++/modules/inline_and_template/src/hello.mpp
index 1796f0b11..c36d54783 100644
--- a/tests/projects/c++/modules/inline_and_template/src/hello.mpp
+++ b/tests/projects/c++/modules/inline_and_template/src/hello.mpp
@@ -1,7 +1,7 @@
-// module;
-#include <cstdio>
export module hello;
+#include <cstdio>
+
export namespace hello {
inline void say_hello() {
std::printf("hello world!\n");
diff --git a/tests/projects/c++/modules/inline_and_template/src/say.mpp b/tests/projects/c++/modules/inline_and_template/src/say.mpp
index d09e14d28..b4d05a5f4 100644
--- a/tests/projects/c++/modules/inline_and_template/src/say.mpp
+++ b/tests/projects/c++/modules/inline_and_template/src/say.mpp
@@ -1,7 +1,7 @@
-// module;
-#include <cstdio>
export module say;
+#include <cstdio>
+
export class say {
public:
template <int N>
diff --git a/tests/projects/c++/modules/inline_and_template/xmake.lua b/tests/projects/c++/modules/inline_and_template/xmake.lua
index c0722cccc..4810edb85 100644
--- a/tests/projects/c++/modules/inline_and_template/xmake.lua
+++ b/tests/projects/c++/modules/inline_and_template/xmake.lua
@@ -1,6 +1,4 @@
+set_languages("c++20")
target("inline_and_template")
set_kind("binary")
add_files("src/*.cpp", "src/*.mpp")
- set_languages("c++11")
-
-
diff --git a/xmake/rules/c++/modules/build_modulefiles.lua b/xmake/rules/c++/modules/build_modulefiles.lua
index 992344059..4e26f1eca 100644
--- a/xmake/rules/c++/modules/build_modulefiles.lua
+++ b/xmake/rules/c++/modules/build_modulefiles.lua
@@ -35,7 +35,7 @@ function _build_modulefiles_clang(target, sourcebatch, opt)
end
-- compile module files to *.pcm
- opt = table.join(opt, {configs = {force = {cxxflags = {"-fmodules-ts", "--precompile", "-x c++-module"}}}})
+ opt = table.join(opt, {configs = {force = {cxxflags = {opt.modulesflag, "--precompile", "-x c++-module"}}}})
import("private.action.build.object").build(target, sourcebatch, opt)
-- compile *.pcm to object files
@@ -48,12 +48,12 @@ function _build_modulefiles_clang(target, sourcebatch, opt)
sourcebatch.dependfiles[idx] = target:dependfile(objectfile)
table.insert(modulefiles, modulefile)
end
- opt.configs = {cxxflags = {"-fmodules-ts"}}
+ opt.configs = {cxxflags = {opt.modulesflag}}
opt.quiet = true
import("private.action.build.object").build(target, sourcebatch, opt)
-- add module files
- target:add("cxxflags", "-fmodules-ts")
+ target:add("cxxflags", opt.modulesflag)
for _, modulefile in ipairs(modulefiles) do
target:add("cxxflags", "-fmodule-file=" .. modulefile)
end
@@ -77,7 +77,7 @@ function _build_modulefiles_gcc(target, sourcebatch, opt)
-- compile module file to *.pcm
local singlebatch = {sourcekind = "cxx", sourcefiles = {sourcefile}, objectfiles = {objectfile}, dependfiles = {dependfile}}
- opt.configs.cxxflags = {"-fmodules-ts", "-fmodule-output=" .. modulefile, "-x c++"}
+ opt.configs.cxxflags = {"-fmodules", "-fmodule-output=" .. modulefile, "-x c++"}
import("private.action.build.object").build(target, singlebatch, opt)
table.insert(modulefiles, modulefile)
table.insert(sourcebatch.objectfiles, objectfile)
@@ -86,7 +86,7 @@ function _build_modulefiles_gcc(target, sourcebatch, opt)
-- add module files
for _, modulefile in ipairs(modulefiles) do
- target:add("cxxflags", "-fmodules-ts", "-fmodule-file=" .. modulefile)
+ target:add("cxxflags", "-fmodules", "-fmodule-file=" .. modulefile)
end]]
raise("compiler(gcc): not implemented for c++ module!")
end
@@ -124,15 +124,30 @@ end
function main(target, sourcebatch, opt)
-- do compile
+ local modulesflag = nil
+ local _, toolname = target:tool("cxx")
local compinst = compiler.load("cxx")
- if compinst:name() == "clang" and compinst:has_flags("-fmodules-ts") then
- _build_modulefiles_clang(target, sourcebatch, opt)
- elseif compinst:name() == "gcc" and compinst:has_flags("-fmodules-ts") then
- _build_modulefiles_gcc(target, sourcebatch, opt)
- elseif compinst:name() == "cl" and compinst:has_flags("/experimental:module") then
- _build_modulefiles_msvc(target, sourcebatch, opt)
- else
- raise("compiler(%s): does not support c++ module!", compinst:name())
+ if toolname:find("clang", 1, true) or toolname:find("gcc", 1, true) then
+ if compinst:has_flags("-fmodules") then
+ modulesflag = "-fmodules"
+ elseif compinst:has_flags("-fmodules-ts") then
+ modulesflag = "-fmodules-ts"
+ end
+ elseif toolname == "cl" then
+ if compinst:has_flags("/experimental:module") then
+ modulesflag = "/experimental:module"
+ end
+ end
+ if modulesflag then
+ opt.modulesflag = modulesflag
+ if toolname:find("clang", 1, true) then
+ _build_modulefiles_clang(target, sourcebatch, opt)
+ elseif toolname:find("gcc", 1, true) then
+ _build_modulefiles_gcc(target, sourcebatch, opt)
+ elseif toolname == "cl" then
+ _build_modulefiles_msvc(target, sourcebatch, opt)
+ else
+ raise("compiler(%s): does not support c++ module!", toolname)
+ end
end
end
-