summaryrefslogtreecommitdiff
path: root/xmake/rules/c++/modules
diff options
context:
space:
mode:
authorruki <[email protected]>2019-09-06 22:38:17 +0800
committerruki <[email protected]>2019-09-06 09:49:43 +0800
commite5152e174154dde4f9fdd3f49047f36c0966d7ea (patch)
treeabd39a906a05aa856dbb18b4813d9181ae8a1fdd /xmake/rules/c++/modules
parentcfb90668f507c9b93fa3e53f78f8f46cdb136413 (diff)
impl clang modules
Diffstat (limited to 'xmake/rules/c++/modules')
-rw-r--r--xmake/rules/c++/modules/xmake.lua31
1 files changed, 25 insertions, 6 deletions
diff --git a/xmake/rules/c++/modules/xmake.lua b/xmake/rules/c++/modules/xmake.lua
index 2ecb829fc..33c0bfb9c 100644
--- a/xmake/rules/c++/modules/xmake.lua
+++ b/xmake/rules/c++/modules/xmake.lua
@@ -21,9 +21,6 @@
-- define rule: c++.build.modules
rule("c++.build.modules")
set_extensions(".mpp", ".mxx", ".cppm", ".ixx")
- before_load(function (target)
- --target:add("cxxflags", "-fprebuilt-module-path=")
- end)
before_build_files(function (target, sourcebatch, opt)
-- imports
@@ -34,7 +31,7 @@ rule("c++.build.modules")
sourcebatch.objectfiles = sourcebatch.objectfiles or {}
sourcebatch.dependfiles = sourcebatch.dependfiles or {}
for _, sourcefile in ipairs(sourcebatch.sourcefiles) do
- local objectfile = target:objectfile(sourcefile)
+ local objectfile = target:objectfile(sourcefile) .. ".pcm"
table.insert(sourcebatch.objectfiles, objectfile)
table.insert(sourcebatch.dependfiles, target:dependfile(objectfile))
end
@@ -42,10 +39,32 @@ rule("c++.build.modules")
-- do compile
local compinst = compiler.load("cxx")
if compinst:name() == "clang" then
- opt.configs = {cxxflags = {"-fmodules-ts", "--precompile"}}
+
+ -- compile module files to *.pcm
+ opt = table.join(opt, {configs = {cxxflags = {"-fmodules-ts", "--precompile", "-x c++-module"}}})
+ import("private.action.build.object")(target, sourcebatch, opt)
+
+ -- compile *.pcm to object files
+ local modulefiles = {}
+ for idx, sourcefile in ipairs(sourcebatch.sourcefiles) do
+ local modulefile = sourcebatch.objectfiles[idx]
+ local objectfile = target:objectfile(sourcefile)
+ sourcebatch.sourcefiles[idx] = modulefile
+ sourcebatch.objectfiles[idx] = objectfile
+ sourcebatch.dependfiles[idx] = target:dependfile(objectfile)
+ table.insert(modulefiles, modulefile)
+ end
+ opt.configs = {cxxflags = {"-fmodules-ts"}}
+ opt.quiet = true
+ import("private.action.build.object")(target, sourcebatch, opt)
+
+ -- add module files
+ target:add("cxxflags", "-fmodules-ts")
+ for _, modulefile in ipairs(modulefiles) do
+ target:add("cxxflags", "-fmodule-file=" .. modulefile)
+ end
else
raise("compiler(%s): does not support module!", compinst:name())
end
- import("private.action.build.object")(target, sourcebatch, opt)
end)