diff options
Diffstat (limited to 'xmake/rules/c++/modules')
| -rw-r--r-- | xmake/rules/c++/modules/modules_support/clang.lua | 24 | ||||
| -rw-r--r-- | xmake/rules/c++/modules/modules_support/common.lua | 62 | ||||
| -rw-r--r-- | xmake/rules/c++/modules/modules_support/gcc.lua | 14 | ||||
| -rw-r--r-- | xmake/rules/c++/modules/modules_support/msvc.lua | 22 |
4 files changed, 67 insertions, 55 deletions
diff --git a/xmake/rules/c++/modules/modules_support/clang.lua b/xmake/rules/c++/modules/modules_support/clang.lua index 3cb79ac40..e1e136c97 100644 --- a/xmake/rules/c++/modules/modules_support/clang.lua +++ b/xmake/rules/c++/modules/modules_support/clang.lua @@ -29,12 +29,12 @@ import("common") -- load parent target with modules files function load_parent(target, opt) - local cachedir = common.get_modules_cachedir(target) + local cachedir = common.modules_cachedir(target) local prebuiltmodulepathflag = get_prebuiltmodulepathflag(target) for _, dep in ipairs(target:orderdeps()) do - cachedir = common.get_modules_cachedir(dep) + cachedir = common.modules_cachedir(dep) target:add("cxxflags", prebuiltmodulepathflag .. cachedir, {force = true}) end end @@ -42,8 +42,8 @@ end -- check C++20 module support function check_module_support(target) local compinst = compiler.load("cxx", {target = target}) - local cachedir = common.get_modules_cachedir(target) - local stlcachedir = common.get_stlmodules_cachedir(target) + local cachedir = common.modules_cachedir(target) + local stlcachedir = common.stlmodules_cachedir(target) -- get module and module cache flags local modulesflag = get_modulesflag(target) @@ -87,7 +87,7 @@ function toolchain_include_directories(target) end function generate_dependencies(target, sourcebatch, opt) - local cachedir = common.get_modules_cachedir(target) + local cachedir = common.modules_cachedir(target) for _, sourcefile in ipairs(sourcebatch.sourcefiles) do local dependfile = target:dependfile(sourcefile) @@ -114,8 +114,8 @@ end -- generate target header units function generate_headerunits(target, batchcmds, sourcebatch, opt) local compinst = target:compiler("cxx") - local cachedir = common.get_modules_cachedir(target) - local stlcachedir = common.get_stlmodules_cachedir(target) + local cachedir = common.modules_cachedir(target) + local stlcachedir = common.stlmodules_cachedir(target) assert(has_headerunitsupport(target), "compiler(clang): does not support c++ header units!") @@ -145,7 +145,7 @@ function generate_headerunits(target, batchcmds, sourcebatch, opt) os.mkdir(outdir) end - local bmifilename = path.basename(objectfile) .. get_bmi_ext() + local bmifilename = path.basename(objectfile) .. bmi_extension() local bmifile = (outdir and path.join(outdir, bmifilename) or bmifilename) if not os.isdir(path.directory(objectfile)) then @@ -168,7 +168,7 @@ function generate_headerunits(target, batchcmds, sourcebatch, opt) table.append(public_flags, modulefileflag .. bmifile) else - local bmifile = path.join(stlcachedir, headerunit.name .. get_bmi_ext()) + local bmifile = path.join(stlcachedir, headerunit.name .. bmi_extension()) if not os.isfile(bmifile) then local args = { modulecachepathflag .. stlcachedir, "-c", "-o", bmifile, "-x", "c++-system-header", headerunit.path } @@ -190,7 +190,7 @@ end -- build module files function build_modules(target, batchcmds, objectfiles, modules, opt) local compinst = target:compiler("cxx") - local cachedir = common.get_modules_cachedir(target) + local cachedir = common.modules_cachedir(target) -- get modules flags local modulecachepathflag = get_modulecachepathflag(target) @@ -246,7 +246,7 @@ function build_modules(target, batchcmds, objectfiles, modules, opt) end end -function get_bmi_ext() +function bmi_extension() return ".pcm" end @@ -345,7 +345,7 @@ function get_modulefileflag(target) local modulefileflag = _g.modulefileflag if modulefileflag == nil then local compinst = target:compiler("cxx") - if compinst:has_flags("-fmodule-file=" .. os.tmpfile() .. get_bmi_ext(), "cxxflags", {flagskey = "clang_module_file"}) then + if compinst:has_flags("-fmodule-file=" .. os.tmpfile() .. bmi_extension(), "cxxflags", {flagskey = "clang_module_file"}) then modulefileflag = "-fmodule-file=" end assert(modulefileflag, "compiler(clang): does not support c++ module!") diff --git a/xmake/rules/c++/modules/modules_support/common.lua b/xmake/rules/c++/modules/modules_support/common.lua index 8ef1877f0..a8668f2bf 100644 --- a/xmake/rules/c++/modules/modules_support/common.lua +++ b/xmake/rules/c++/modules/modules_support/common.lua @@ -23,11 +23,17 @@ import("core.base.json") import("core.base.hashset") import("core.project.config") import("core.tool.compiler") +import("core.cache.memcache", {alias = "_memcache"}) import("core.project.project") import("lib.detect.find_file") +-- get memcache +function memcache() + return _memcache.cache("rule.cxx.modules") +end + -- get stl modules cache directory -function get_stlmodules_cachedir(target) +function stlmodules_cachedir(target) local stlcachedir = path.join(target:autogendir(), "stlmodules", "cache") if target:has_tool("cxx", "clang", "clangxx") then stlcachedir = path.join(config.buildir(), "stlmodules", "cache") @@ -39,7 +45,7 @@ function get_stlmodules_cachedir(target) end -- get modules cache directory -function get_modules_cachedir(target) +function modules_cachedir(target) local cachedir = path.join(target:autogendir(), "rules", "modules", "cache") if not os.isdir(cachedir) then os.mkdir(cachedir) @@ -49,7 +55,7 @@ end -- patch sourcebatch function patch_sourcebatch(target, sourcebatch, opt) - local cachedir = get_modules_cachedir(target) + local cachedir = modules_cachedir(target) sourcebatch.sourcekind = "cxx" sourcebatch.objectfiles = sourcebatch.objectfiles or {} sourcebatch.dependfiles = sourcebatch.dependfiles or {} @@ -63,40 +69,46 @@ end -- get modules support function modules_support(target) - local module_builder - if target:has_tool("cxx", "clang", "clangxx") then - module_builder = import("clang", {anonymous = true}) - elseif target:has_tool("cxx", "gcc", "gxx") then - module_builder = import("gcc", {anonymous = true}) - elseif target:has_tool("cxx", "cl") then - module_builder = import("msvc", {anonymous = true}) - else - local _, toolname = target:tool("cxx") - raise("compiler(%s): does not support c++ module!", toolname) + local cachekey = tostring(target) + local module_builder = memcache():get2("modules_support", cachekey) + if module_builder == nil then + if target:has_tool("cxx", "clang", "clangxx") then + module_builder = import("clang", {anonymous = true}) + elseif target:has_tool("cxx", "gcc", "gxx") then + module_builder = import("gcc", {anonymous = true}) + elseif target:has_tool("cxx", "cl") then + module_builder = import("msvc", {anonymous = true}) + else + local _, toolname = target:tool("cxx") + raise("compiler(%s): does not support c++ module!", toolname) + end + memcache():set2("modules_support", cachekey, module_builder) end return module_builder end -- get bmi extension -function get_bmi_ext(target) - return modules_support(target).get_bmi_ext() +function bmi_extension(target) + return modules_support(target).bmi_extension() end +-- this target contains module files? function contains_modules(target) local target_with_modules = target:sourcebatches()["c++.build.modules"] and true or false - - for _, dep in ipairs(target:orderdeps()) do - local sourcebatches = dep:sourcebatches() - if sourcebatches and sourcebatches["c++.build.modules"] then - target_with_modules = true - break + if not target_with_modules then + for _, dep in ipairs(target:orderdeps()) do + local sourcebatches = dep:sourcebatches() + if sourcebatches and sourcebatches["c++.build.modules"] then + target_with_modules = true + break + end end end return target_with_modules end function load(target, sourcebatch, opt) - local cachedir = get_modules_cachedir(target) + local cachedir = modules_cachedir(target) local moduleinfos for _, sourcefile in ipairs(sourcebatch.sourcefiles) do @@ -119,7 +131,7 @@ function load(target, sourcebatch, opt) end function parse_dependency_data(target, moduleinfos, opt) - local cachedir = get_modules_cachedir(target) + local cachedir = modules_cachedir(target) local modules for _, moduleinfo in ipairs(moduleinfos) do @@ -140,7 +152,7 @@ function parse_dependency_data(target, moduleinfos, opt) m.provides[provide["logical-name"] ] = path.translate(provide["compiled-module-path"]) end else -- assume path with name - local name = provide["logical-name"] .. get_bmi_ext(target) + local name = provide["logical-name"] .. bmi_extension(target) name:replace(":", "-") m.provides[provide["logical-name"] ] = { @@ -347,7 +359,7 @@ function fallback_generate_dependencies(target, jsonfile, sourcefile) end if module_name then - table.append(rule.outputs, module_name .. get_bmi_ext(target)) + table.append(rule.outputs, module_name .. bmi_extension(target)) local provide = {} provide["logical-name"] = module_name diff --git a/xmake/rules/c++/modules/modules_support/gcc.lua b/xmake/rules/c++/modules/modules_support/gcc.lua index 1053eb56a..9812115b8 100644 --- a/xmake/rules/c++/modules/modules_support/gcc.lua +++ b/xmake/rules/c++/modules/modules_support/gcc.lua @@ -99,7 +99,7 @@ end -- generate dependency files function generate_dependencies(target, sourcebatch, opt) - local cachedir = common.get_modules_cachedir(target) + local cachedir = common.modules_cachedir(target) local compinst = target:compiler("cxx") local common_args = {"-E", "-x", "c++"} @@ -141,8 +141,8 @@ end function generate_headerunits(target, batchcmds, sourcebatch, opt) local compinst = target:compiler("cxx") - local cachedir = common.get_modules_cachedir(target) - local stlcachedir = common.get_stlmodules_cachedir(target) + local cachedir = common.modules_cachedir(target) + local stlcachedir = common.stlmodules_cachedir(target) local mapper_file = get_module_mapper() @@ -165,7 +165,7 @@ function generate_headerunits(target, batchcmds, sourcebatch, opt) os.mkdir(outdir) end - local bmifilename = path.basename(objectfile) .. get_bmi_ext() + local bmifilename = path.basename(objectfile) .. bmi_extension() local bmifile = (outdir and path.join(outdir, bmifilename) or bmifilename) if not os.isdir(path.directory(objectfile)) then @@ -190,7 +190,7 @@ function generate_headerunits(target, batchcmds, sourcebatch, opt) batchcmds:set_depcache(target:dependfile(bmifile)) end else - local bmifile = path.join(stlcachedir, headerunit.name .. get_bmi_ext()) + local bmifile = path.join(stlcachedir, headerunit.name .. bmi_extension()) if add_module_to_mapper(mapper_file, headerunit.path, path.absolute(bmifile, project.directory())) then if not os.isfile(bmifile) then @@ -209,7 +209,7 @@ end -- build module files function build_modules(target, batchcmds, objectfiles, modules, opt) - local cachedir = common.get_modules_cachedir(target) + local cachedir = common.modules_cachedir(target) local compinst = target:compiler("cxx") @@ -247,7 +247,7 @@ function build_modules(target, batchcmds, objectfiles, modules, opt) end end -function get_bmi_ext() +function bmi_extension() return ".gcm" end diff --git a/xmake/rules/c++/modules/modules_support/msvc.lua b/xmake/rules/c++/modules/modules_support/msvc.lua index 6f004ee5f..c7a6f6c15 100644 --- a/xmake/rules/c++/modules/modules_support/msvc.lua +++ b/xmake/rules/c++/modules/modules_support/msvc.lua @@ -31,7 +31,7 @@ function load_parent(target, opt) local ifcsearchdirflag = get_ifcsearchdirflag(target) for _, dep in ipairs(target:orderdeps()) do - cachedir = common.get_modules_cachedir(dep) + cachedir = common.modules_cachedir(dep) target:add("cxxflags", {ifcsearchdirflag, cachedir}, {force = true, expand = false}) end end @@ -39,8 +39,8 @@ end -- check C++20 module support function check_module_support(target) local compinst = target:compiler("cxx") - local cachedir = common.get_modules_cachedir(target) - local stlcachedir = common.get_stlmodules_cachedir(target) + local cachedir = common.modules_cachedir(target) + local stlcachedir = common.stlmodules_cachedir(target) -- get flags local modulesflag = get_modulesflag(target) @@ -89,7 +89,7 @@ function generate_dependencies(target, sourcebatch, opt) local scandependenciesflag = get_scandependenciesflag(target) - local cachedir = common.get_modules_cachedir(target) + local cachedir = common.modules_cachedir(target) local common_args = {"/TP", scandependenciesflag} for _, sourcefile in ipairs(sourcebatch.sourcefiles) do @@ -133,8 +133,8 @@ function generate_headerunits(target, batchcmds, sourcebatch, opt) assert(headerunitflag and headernameflag and exportheaderflag, "compiler(msvc): does not support c++ header units!") - local cachedir = common.get_modules_cachedir(target) - local stlcachedir = common.get_stlmodules_cachedir(target) + local cachedir = common.modules_cachedir(target) + local stlcachedir = common.stlmodules_cachedir(target) -- build headerunits local common_args = {"/TP", exportheaderflag, "/c"} @@ -158,7 +158,7 @@ function generate_headerunits(target, batchcmds, sourcebatch, opt) os.mkdir(outdir) end - local bmifilename = path.basename(objectfile) .. get_bmi_ext() + local bmifilename = path.basename(objectfile) .. bmi_extension() local bmifile = (outdir and path.join(outdir, bmifilename) or bmifilename) if not os.isdir(path.directory(objectfile)) then @@ -179,7 +179,7 @@ function generate_headerunits(target, batchcmds, sourcebatch, opt) table.join2(public_flags, flag) target:add("objectfiles", objectfile) else - local bmifile = path.join(stlcachedir, headerunit.name .. get_bmi_ext()) + local bmifile = path.join(stlcachedir, headerunit.name .. bmi_extension()) local args = {exportheaderflag, headernameflag .. ":angle", headerunit.name, ifcoutputflag, stlcachedir} batchcmds:show_progress(opt.progress, "${color.build.object}generating.cxx.headerunit.bmi %s", headerunit.name) batchcmds:vrunv(compinst:program(), table.join(compinst:compflags({target = target}), args), {envs = vcvars}) @@ -187,7 +187,7 @@ function generate_headerunits(target, batchcmds, sourcebatch, opt) batchcmds:set_depmtime(os.mtime(bmifile)) batchcmds:set_depcache(target:dependfile(bmifile)) - local flag = {headerunitflag .. ":angle", headerunit.name .. "=" .. headerunit.name .. get_bmi_ext()} + local flag = {headerunitflag .. ":angle", headerunit.name .. "=" .. headerunit.name .. bmi_extension()} table.join2(private_flags, flag) end end @@ -197,7 +197,7 @@ end -- build module files function build_modules(target, batchcmds, objectfiles, modules, opt) - local cachedir = common.get_modules_cachedir(target) + local cachedir = common.modules_cachedir(target) local compinst = target:compiler("cxx") local toolchain = target:toolchain("msvc") @@ -253,7 +253,7 @@ function build_modules(target, batchcmds, objectfiles, modules, opt) end end -function get_bmi_ext() +function bmi_extension() return ".ifc" end |
