diff options
| author | ruki <[email protected]> | 2021-11-24 00:56:24 +0800 |
|---|---|---|
| committer | ruki <[email protected]> | 2021-11-24 00:56:24 +0800 |
| commit | 12ee3ed6eb196f5d9e5cdeb619c40f51b2bec144 (patch) | |
| tree | 15757810c3fb3f7d953d681c803236c770705921 /xmake/rules/c++/modules/build_modules | |
| parent | 499b857f587073a09145c44d4ab9c312afb9a69a (diff) | |
improve c++ modules
Diffstat (limited to 'xmake/rules/c++/modules/build_modules')
| -rw-r--r-- | xmake/rules/c++/modules/build_modules/clang.lua | 26 | ||||
| -rw-r--r-- | xmake/rules/c++/modules/build_modules/gcc.lua | 14 | ||||
| -rw-r--r-- | xmake/rules/c++/modules/build_modules/msvc.lua | 15 |
3 files changed, 55 insertions, 0 deletions
diff --git a/xmake/rules/c++/modules/build_modules/clang.lua b/xmake/rules/c++/modules/build_modules/clang.lua index 06b5aa1db..523c61ad9 100644 --- a/xmake/rules/c++/modules/build_modules/clang.lua +++ b/xmake/rules/c++/modules/build_modules/clang.lua @@ -23,6 +23,32 @@ import("core.tool.compiler") import("private.action.build.object", {alias = "objectbuilder"}) import("module_parser") +-- load parent target with modules files +function load_parent(target, opt) + -- get modules flag + local modulesflag + local compinst = compiler.load("cxx", {target = target}) + if compinst:has_flags("-fmodules") then + modulesflag = "-fmodules" + elseif compinst:has_flags("-fmodules-ts") then + modulesflag = "-fmodules-ts" + end + assert(modulesflag, "compiler(clang): does not support c++ module!") + + -- add module flags + target:add("cxxflags", modulesflag) + + -- the module cache directory + for _, dep in ipairs(target:orderdeps()) do + local sourcebatches = dep:sourcebatches() + if sourcebatches and sourcebatches["c++.build.modules"] then + local cachedir = path.join(dep:autogendir(), "rules", "modules", "cache") + target:add("cxxflags", "-fmodules-cache-path=" .. cachedir, {force = true}) + target:add("cxxflags", "-fimplicit-modules", "-fimplicit-module-maps", "-fprebuilt-module-path=" .. cachedir, {force = true}) + end + end +end + -- build module files function build_with_batchjobs(target, batchjobs, sourcebatch, opt) diff --git a/xmake/rules/c++/modules/build_modules/gcc.lua b/xmake/rules/c++/modules/build_modules/gcc.lua index 1264f29c2..2abaa4f7f 100644 --- a/xmake/rules/c++/modules/build_modules/gcc.lua +++ b/xmake/rules/c++/modules/build_modules/gcc.lua @@ -23,6 +23,20 @@ import("core.tool.compiler") import("private.action.build.object", {alias = "objectbuilder"}) import("module_parser") +-- load parent target with modules files +function load_parent(target, opt) + -- get modules flag + local modulesflag + local compinst = compiler.load("cxx", {target = target}) + if compinst:has_flags("-fmodules-ts") then + modulesflag = "-fmodules-ts" + end + assert(modulesflag, "compiler(gcc): does not support c++ module!") + + -- add module flags + target:add("cxxflags", modulesflag) +end + -- build module files function build_with_batchjobs(target, batchjobs, sourcebatch, opt) diff --git a/xmake/rules/c++/modules/build_modules/msvc.lua b/xmake/rules/c++/modules/build_modules/msvc.lua index 4606edb7e..4cc8500ab 100644 --- a/xmake/rules/c++/modules/build_modules/msvc.lua +++ b/xmake/rules/c++/modules/build_modules/msvc.lua @@ -23,6 +23,21 @@ import("core.tool.compiler") import("private.action.build.object", {alias = "objectbuilder"}) import("module_parser") +-- load parent target with modules files +function load_parent(target, opt) + + -- get modules flag + local modulesflag + local compinst = compiler.load("cxx", {target = target}) + if compinst:has_flags("/experimental:module", "cxxflags") then + modulesflag = "/experimental:module" + end + assert(modulesflag, "compiler(msvc): does not support c++ module!") + + -- add module flags + target:add("cxxflags", modulesflag) +end + -- build module files function build_with_batchjobs(target, batchjobs, sourcebatch, opt) |
