diff options
| author | ruki <[email protected]> | 2022-08-06 00:59:10 +0800 |
|---|---|---|
| committer | ruki <[email protected]> | 2022-08-06 00:59:10 +0800 |
| commit | 53c31dfffd73cd635a6512d49b902e8c45dca102 (patch) | |
| tree | 998921520a998224de105e5dcfb637a6ba85a38c /xmake/rules/c++/modules | |
| parent | 8ac03c2d83d6cf5b9509ab2d4e756998711886b8 (diff) | |
add batchjobs stub
Diffstat (limited to 'xmake/rules/c++/modules')
| -rw-r--r-- | xmake/rules/c++/modules/modules_support/clang.lua | 12 | ||||
| -rw-r--r-- | xmake/rules/c++/modules/modules_support/common.lua | 47 | ||||
| -rw-r--r-- | xmake/rules/c++/modules/modules_support/gcc.lua | 12 | ||||
| -rw-r--r-- | xmake/rules/c++/modules/modules_support/msvc.lua | 12 | ||||
| -rw-r--r-- | xmake/rules/c++/modules/xmake.lua | 52 |
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 |
