summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorruki <[email protected]>2022-08-04 00:48:54 +0800
committerruki <[email protected]>2022-08-04 00:48:54 +0800
commit5e4888e6d5bfe276fa3d69b09e2db2bd52014e9b (patch)
treedd0f1d8acdb14ee6f069bb1261474748b30158c7
parent739e62f633aa8307d0c1ab6f33b35d08560a58fe (diff)
improve contains modules
-rw-r--r--xmake/rules/c++/modules/modules_support/clang.lua24
-rw-r--r--xmake/rules/c++/modules/modules_support/common.lua62
-rw-r--r--xmake/rules/c++/modules/modules_support/gcc.lua14
-rw-r--r--xmake/rules/c++/modules/modules_support/msvc.lua22
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