summaryrefslogtreecommitdiff
path: root/xmake/rules/c++/modules
diff options
context:
space:
mode:
authorruki <[email protected]>2022-08-06 00:59:10 +0800
committerruki <[email protected]>2022-08-06 00:59:10 +0800
commit53c31dfffd73cd635a6512d49b902e8c45dca102 (patch)
tree998921520a998224de105e5dcfb637a6ba85a38c /xmake/rules/c++/modules
parent8ac03c2d83d6cf5b9509ab2d4e756998711886b8 (diff)
add batchjobs stub
Diffstat (limited to 'xmake/rules/c++/modules')
-rw-r--r--xmake/rules/c++/modules/modules_support/clang.lua12
-rw-r--r--xmake/rules/c++/modules/modules_support/common.lua47
-rw-r--r--xmake/rules/c++/modules/modules_support/gcc.lua12
-rw-r--r--xmake/rules/c++/modules/modules_support/msvc.lua12
-rw-r--r--xmake/rules/c++/modules/xmake.lua52
5 files changed, 90 insertions, 45 deletions
diff --git a/xmake/rules/c++/modules/modules_support/clang.lua b/xmake/rules/c++/modules/modules_support/clang.lua
index 04f92bdeb..89dbf4467 100644
--- a/xmake/rules/c++/modules/modules_support/clang.lua
+++ b/xmake/rules/c++/modules/modules_support/clang.lua
@@ -129,8 +129,8 @@ function generate_dependencies(target, sourcebatch, opt)
end
end
--- generate target stl header units
-function generate_stl_headerunits(target, batchcmds, headerunits, opt)
+-- generate target stl header units for batchcmds
+function generate_stl_headerunits_for_batchcmds(target, batchcmds, headerunits, opt)
local compinst = target:compiler("cxx")
-- get cachedirs
@@ -159,8 +159,8 @@ function generate_stl_headerunits(target, batchcmds, headerunits, opt)
return flags
end
--- generate target user header units
-function generate_user_headerunits(target, batchcmds, headerunits, opt)
+-- generate target user header units for batchcmds
+function generate_user_headerunits_for_batchcmds(target, batchcmds, headerunits, opt)
local compinst = target:compiler("cxx")
assert(has_headerunitsupport(target), "compiler(clang): does not support c++ header units!")
@@ -212,8 +212,8 @@ function generate_user_headerunits(target, batchcmds, headerunits, opt)
return flags
end
--- build module files
-function build_modules(target, batchcmds, objectfiles, modules, opt)
+-- build module files for batchcmds
+function build_modules_for_batchcmds(target, batchcmds, objectfiles, modules, opt)
local compinst = target:compiler("cxx")
-- get cachedirs
diff --git a/xmake/rules/c++/modules/modules_support/common.lua b/xmake/rules/c++/modules/modules_support/common.lua
index b5a49e680..5d5c625ec 100644
--- a/xmake/rules/c++/modules/modules_support/common.lua
+++ b/xmake/rules/c++/modules/modules_support/common.lua
@@ -52,10 +52,9 @@ function modules_cachedir(target)
end
-- get headerunits info
-function get_headerunits(target, sourcebatch)
+function get_headerunits(target, sourcebatch, modules)
local headerunits
local stl_headerunits
- local modules = target:data("cxx.modules")
for _, objectfile in ipairs(sourcebatch.objectfiles) do
local m = modules[objectfile]
if m then
@@ -281,6 +280,7 @@ function _topological_sort_get_first_unmarked_node(nodes)
end
end
+-- topological sort
function sort_modules_by_dependencies(objectfiles, modules)
local output = {}
local nodes = {}
@@ -412,22 +412,55 @@ function generate_dependencies(target, sourcebatch, opt)
return parse_dependency_data(target, moduleinfos)
end
--- generate headerunits
-function generate_headerunits(target, batchcmds, sourcebatch, opt)
+-- generate headerunits for batchjobs, TODO
+function generate_headerunits_for_batchjobs(target, batchjobs, sourcebatch, modules, opt)
-- get headerunits info
- local headerunits, stl_headerunits = get_headerunits(target, sourcebatch)
+ local headerunits, stl_headerunits = get_headerunits(target, sourcebatch, modules)
-- generate headerunits
+ -- build stl header units as other headerunits may need them
local headerunits_flags
+ if stl_headerunits then
+ headerunits_flags = headerunits_flags or {}
+-- table.join2(headerunits_flags, modules_support(target).generate_stl_headerunits_for_batchjobs(target, batchjobs, stl_headerunits, opt))
+ end
+ if headerunits then
+ headerunits_flags = headerunits_flags or {}
+-- table.join2(headerunits_flags, modules_support(target).generate_user_headerunits_for_batchjobs(target, batchjobs, headerunits, opt))
+ end
+ return headerunits_flags
+end
+
+-- generate headerunits for batchcmds
+function generate_headerunits_for_batchcmds(target, batchcmds, sourcebatch, modules, opt)
+
+ -- get headerunits info
+ local headerunits, stl_headerunits = get_headerunits(target, sourcebatch, modules)
+
+ -- generate headerunits
-- build stl header units as other headerunits may need them
+ local headerunits_flags
if stl_headerunits then
headerunits_flags = headerunits_flags or {}
- table.join2(headerunits_flags, modules_support(target).generate_stl_headerunits(target, batchcmds, stl_headerunits, opt))
+ table.join2(headerunits_flags, modules_support(target).generate_stl_headerunits_for_batchcmds(target, batchcmds, stl_headerunits, opt))
end
if headerunits then
headerunits_flags = headerunits_flags or {}
- table.join2(headerunits_flags, modules_support(target).generate_user_headerunits(target, batchcmds, headerunits, opt))
+ table.join2(headerunits_flags, modules_support(target).generate_user_headerunits_for_batchcmds(target, batchcmds, headerunits, opt))
end
return headerunits_flags
end
+
+-- build modules for batchjobs, TODO
+function build_modules_for_batchjobs(target, batchjobs, sourcebatch, modules, opt)
+ local objectfiles = sort_modules_by_dependencies(sourcebatch.objectfiles, modules)
+-- modules_support(target).build_modules_for_batchjobs(target, batchjobs, objectfiles, modules, opt)
+end
+
+-- build modules for batchcmds
+function build_modules_for_batchcmds(target, batchcmds, sourcebatch, modules, opt)
+ local objectfiles = sort_modules_by_dependencies(sourcebatch.objectfiles, modules)
+ modules_support(target).build_modules_for_batchcmds(target, batchcmds, objectfiles, modules, opt)
+end
+
diff --git a/xmake/rules/c++/modules/modules_support/gcc.lua b/xmake/rules/c++/modules/modules_support/gcc.lua
index 841313a5b..08afba431 100644
--- a/xmake/rules/c++/modules/modules_support/gcc.lua
+++ b/xmake/rules/c++/modules/modules_support/gcc.lua
@@ -151,8 +151,8 @@ function generate_dependencies(target, sourcebatch, opt)
end
end
--- generate target stl header units
-function generate_stl_headerunits(target, batchcmds, headerunits, opt)
+-- generate target stl header units for batchcmds
+function generate_stl_headerunits_for_batchcmds(target, batchcmds, headerunits, opt)
local compinst = target:compiler("cxx")
local mapper_file = _get_module_mapper()
@@ -175,8 +175,8 @@ function generate_stl_headerunits(target, batchcmds, headerunits, opt)
batchcmds:set_depmtime(depmtime)
end
--- generate target user header units
-function generate_user_headerunits(target, batchcmds, headerunits, opt)
+-- generate target user header units for batchcmds
+function generate_user_headerunits_for_batchcmds(target, batchcmds, headerunits, opt)
local compinst = target:compiler("cxx")
local mapper_file = _get_module_mapper()
@@ -223,8 +223,8 @@ function generate_user_headerunits(target, batchcmds, headerunits, opt)
batchcmds:set_depmtime(depmtime)
end
--- build module files
-function build_modules(target, batchcmds, objectfiles, modules, opt)
+-- build module files for batchcmds
+function build_modules_for_batchcmds(target, batchcmds, objectfiles, modules, opt)
local compinst = target:compiler("cxx")
local mapper_file = _get_module_mapper()
local common_args = {"-x", "c++"}
diff --git a/xmake/rules/c++/modules/modules_support/msvc.lua b/xmake/rules/c++/modules/modules_support/msvc.lua
index 5e0fba4a9..109c68751 100644
--- a/xmake/rules/c++/modules/modules_support/msvc.lua
+++ b/xmake/rules/c++/modules/modules_support/msvc.lua
@@ -111,8 +111,8 @@ function generate_dependencies(target, sourcebatch, opt)
end
end
--- generate target stl header units
-function generate_stl_headerunits(target, batchcmds, headerunits, opt)
+-- generate target stl header units for batchcmds
+function generate_stl_headerunits_for_batchcmds(target, batchcmds, headerunits, opt)
local compinst = target:compiler("cxx")
local toolchain = target:toolchain("msvc")
local vcvars = toolchain:config("vcvars")
@@ -149,8 +149,8 @@ function generate_stl_headerunits(target, batchcmds, headerunits, opt)
return flags
end
--- generate target user header units
-function generate_user_headerunits(target, batchcmds, headerunits, opt)
+-- generate target user header units for batchcmds
+function generate_user_headerunits_for_batchcmds(target, batchcmds, headerunits, opt)
local compinst = target:compiler("cxx")
local toolchain = target:toolchain("msvc")
local vcvars = toolchain:config("vcvars")
@@ -203,8 +203,8 @@ function generate_user_headerunits(target, batchcmds, headerunits, opt)
return flags
end
--- build module files
-function build_modules(target, batchcmds, objectfiles, modules, opt)
+-- build module files for batchcmds
+function build_modules_for_batchcmds(target, batchcmds, objectfiles, modules, opt)
local cachedir = common.modules_cachedir(target)
local compinst = target:compiler("cxx")
diff --git a/xmake/rules/c++/modules/xmake.lua b/xmake/rules/c++/modules/xmake.lua
index a4288034d..6d0da85c2 100644
--- a/xmake/rules/c++/modules/xmake.lua
+++ b/xmake/rules/c++/modules/xmake.lua
@@ -22,7 +22,6 @@
rule("c++.build.modules")
set_extensions(".mpp", ".mxx", ".cppm", ".ixx")
- add_deps("c++.build.modules.dependencies")
add_deps("c++.build.modules.builder")
add_deps("c++.build.modules.install")
@@ -49,45 +48,58 @@ rule("c++.build.modules")
end
end)
--- build dependencies
-rule("c++.build.modules.dependencies")
- before_buildcmd(function(target, batchcmds, opt)
- if target:data("cxx.has_modules") then
- import("modules_support.common")
- local sourcebatch = target:sourcebatches()["c++.build.modules.builder"]
- common.patch_sourcebatch(target, sourcebatch)
- local modules = common.generate_dependencies(target, sourcebatch, opt)
- target:data_set("cxx.modules", modules)
- end
- end)
-
-- build modules
rule("c++.build.modules.builder")
set_sourcekinds("cxx")
set_extensions(".mpp", ".mxx", ".cppm", ".ixx")
- before_buildcmd_files(function(target, batchcmds, sourcebatch, opt)
+ -- TODO parallel build support to accelerate `xmake build` to build modules
+ --[[
+ before_build_files(function(target, batchjobs, sourcebatch, opt)
if not target:data("cxx.has_modules") then
sourcebatch.objectfiles = {}
return
end
+ -- patch sourcebatch
import("modules_support.common")
+ common.patch_sourcebatch(target, sourcebatch, opt)
+
+ -- generate dependencies
+ local modules = common.generate_dependencies(target, sourcebatch, opt)
+
+ -- generate headerunits
+ local headerunits_flags = common.generate_headerunits_for_batchjobs(target, batchjobs, sourcebatch, modules, opt)
+ if headerunits_flags then
+ target:add("cxxflags", headerunits_flags, {force = true, expand = false})
+ end
+
+ -- build modules
+ common.build_modules_for_batchjobs(target, batchjobs, sourcebatch, modules, opt)
+ end, {batch = true})]]
+
+ -- serial compilation only, usually used to support project generator
+ before_buildcmd_files(function(target, batchcmds, sourcebatch, opt)
+ if not target:data("cxx.has_modules") then
+ sourcebatch.objectfiles = {}
+ return
+ end
-- patch sourcebatch
+ import("modules_support.common")
common.patch_sourcebatch(target, sourcebatch, opt)
+ -- generate dependencies
+ local modules = common.generate_dependencies(target, sourcebatch, opt)
+
-- generate headerunits
- local headerunits_flags = common.generate_headerunits(target, batchcmds, sourcebatch, opt)
+ local headerunits_flags = common.generate_headerunits_for_batchcmds(target, batchcmds, sourcebatch, modules, opt)
if headerunits_flags then
target:add("cxxflags", headerunits_flags, {force = true, expand = false})
end
- -- topological sort
- local modules = target:data("cxx.modules")
- local modules_support = common.modules_support(target)
- local objectfiles = common.sort_modules_by_dependencies(sourcebatch.objectfiles, modules)
- modules_support.build_modules(target, batchcmds, objectfiles, modules, opt)
+ -- build modules
+ common.build_modules_for_batchcmds(target, batchcmds, sourcebatch, modules, opt)
end)
-- install modules