summaryrefslogtreecommitdiff
path: root/xmake/rules/c++/modules
diff options
context:
space:
mode:
authorArthur LAURENT <[email protected]>2022-08-07 14:59:23 +0200
committerArthur LAURENT <[email protected]>2022-08-07 14:59:23 +0200
commit1c96d8379173130442227222c75e0caac6afb40b (patch)
tree04899d36b4565ba398c18a7fe9d88aa41c3b3746 /xmake/rules/c++/modules
parenta8f09abe90cf7955a0b8bb2f6747ecc6ac0c28a7 (diff)
Use localcache instead of a file
Diffstat (limited to 'xmake/rules/c++/modules')
-rw-r--r--xmake/rules/c++/modules/modules_support/clang.lua52
-rw-r--r--xmake/rules/c++/modules/modules_support/common.lua9
-rw-r--r--xmake/rules/c++/modules/modules_support/gcc.lua4
-rw-r--r--xmake/rules/c++/modules/modules_support/msvc.lua81
4 files changed, 51 insertions, 95 deletions
diff --git a/xmake/rules/c++/modules/modules_support/clang.lua b/xmake/rules/c++/modules/modules_support/clang.lua
index 28ee152bc..4749f7fe3 100644
--- a/xmake/rules/c++/modules/modules_support/clang.lua
+++ b/xmake/rules/c++/modules/modules_support/clang.lua
@@ -27,30 +27,21 @@ import("utils.progress")
import("private.action.build.object", {alias = "objectbuilder"})
import("common")
--- get and create the path of module mapper
-function _get_module_mapper()
- local mapper_file = path.join(config.buildir(), "mapper.txt")
- if not os.isfile(mapper_file) then
- io.writefile(mapper_file, "")
- end
- return mapper_file
-end
-
-- add a module into the mapper
--
-- e.g
-- -fmodule-file=foo=build/.gens/Foo/rules/modules/cache/foo.pcm
--
-function _add_module_to_mapper(target, file, module, bmi)
+function _add_module_to_mapper(target, module, bmi)
+ local cache = common.localcache():get("mapflags") or {}
local modulefileflag = get_modulefileflag(target)
- for line in io.lines(file) do
- if line:startswith(modulefileflag .. module) then
- return
- end
+ local mapflag = format("%s%s=%s", modulefileflag, module, bmi)
+ if table.contains(cache, mapflag) then
+ return
end
- local f = io.open(file, "a")
- f:print("%s%s=%s", modulefileflag, module, bmi)
- f:close()
+ table.insert(cache, mapflag)
+ common.localcache():set("mapflags", cache)
+ common.localcache():save("mapflags")
end
-- add a header unit into the mapper
@@ -58,7 +49,18 @@ end
-- e.g
-- -fmodule-file=build/.gens/Foo/rules/modules/cache/foo.hpp.pcm
--
-function _add_headerunit_to_mapper(target, file, bmi)
+function _add_headerunit_to_mapper(target, bmi)
+ local cache = common.localcache():get("mapflags") or {}
+ local modulefileflag = get_modulefileflag(target)
+ local mapflag = format("%s%s", modulefileflag, bmi)
+ if table.contains(cache, mapflag) then
+ return
+ end
+ table.insert(cache, mapflag)
+ common.localcache():set("mapflags", cache)
+ common.localcache():save("mapflags")
+end
+
local modulefileflag = get_modulefileflag(target)
for line in io.lines(file) do
if line:startswith(modulefileflag .. bmi) then
@@ -74,7 +76,6 @@ end
function load(target)
local cachedir = common.modules_cachedir(target)
local stlcachedir = common.stlmodules_cachedir(target)
- local mapper_file = _get_module_mapper()
-- get module and module cache flags
local modulesflag = get_modulesflag(target)
@@ -174,7 +175,6 @@ end
-- 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()
-- get cachedirs
local stlcachedir = common.stlmodules_cachedir(target)
@@ -195,7 +195,7 @@ function generate_stl_headerunits_for_batchcmds(target, batchcmds, headerunits,
-- libc++ have a builtin module mapper
if not target:data_set("cxx.modules.use_libc++") then
- _add_headerunit_to_mapper(target, mapper_file, bmifile)
+ _add_headerunit_to_mapper(target, bmifile)
end
end
depmtime = math.max(depmtime, os.mtime(bmifile))
@@ -207,7 +207,6 @@ end
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!")
- local mapper_file = _get_module_mapper()
-- get cachedirs
local cachedir = common.modules_cachedir(target)
@@ -248,7 +247,7 @@ function generate_user_headerunits_for_batchcmds(target, batchcmds, headerunits,
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))
batchcmds:add_depfiles(headerunit.path)
- _add_headerunit_to_mapper(target, mapper_file, bmifile)
+ _add_headerunit_to_mapper(target, bmifile)
depmtime = math.max(depmtime, os.mtime(bmifile))
end
@@ -258,7 +257,6 @@ end
-- 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()
-- get cachedirs
local cachedir = common.modules_cachedir(target)
@@ -298,7 +296,7 @@ function build_modules_for_batchcmds(target, batchcmds, objectfiles, modules, op
batchcmds:vrunv(compinst:program(), table.join(compinst:compflags({target = target}), common_args, {bmifile}, {"-c", "-o", objectfile}))
batchcmds:add_depfiles(provide.sourcefile)
- _add_module_to_mapper(target, mapper_file, name, bmifile)
+ _add_module_to_mapper(target, name, bmifile)
target:add("objectfiles", objectfile)
depmtime = math.max(depmtime, os.mtime(bmifile))
@@ -459,8 +457,4 @@ function has_headerunitsupport(target)
_g.support_headerunits = support_headerunits or false
end
return support_headerunits or nil
-end
-
--- no .o generated by header units on Clang
-function append_headerunits_objectfiles(target)
end \ No newline at end of file
diff --git a/xmake/rules/c++/modules/modules_support/common.lua b/xmake/rules/c++/modules/modules_support/common.lua
index aa1db3f0f..34d014238 100644
--- a/xmake/rules/c++/modules/modules_support/common.lua
+++ b/xmake/rules/c++/modules/modules_support/common.lua
@@ -476,5 +476,12 @@ function build_modules_for_batchcmds(target, batchcmds, sourcebatch, modules, op
end
function append_headerunits_objectfiles(target)
- modules_support(target).append_headerunits_objectfiles(target)
+ local cache = localcache():get("headerunit_objectfiles") or {}
+ if target:is_binary() then
+ target:add("ldflags", cache, {force = true})
+ elseif target:is_static() == "static" then
+ target:add("arflags", cache, {force = true})
+ elseif target:is_shared() == "shared" then
+ target:add("shflags", cache, {force = true})
+ end
end \ No newline at end of file
diff --git a/xmake/rules/c++/modules/modules_support/gcc.lua b/xmake/rules/c++/modules/modules_support/gcc.lua
index e5deed0cd..99045cf54 100644
--- a/xmake/rules/c++/modules/modules_support/gcc.lua
+++ b/xmake/rules/c++/modules/modules_support/gcc.lua
@@ -336,8 +336,4 @@ function get_depoutputflag(target)
_g.depoutputflag = depoutputflag or false
end
return depoutputflag or nil
-end
-
--- no .o generated by header units on GCC
-function append_headerunits_objectfiles(target)
end \ No newline at end of file
diff --git a/xmake/rules/c++/modules/modules_support/msvc.lua b/xmake/rules/c++/modules/modules_support/msvc.lua
index 371cc1f50..b2b2e605a 100644
--- a/xmake/rules/c++/modules/modules_support/msvc.lua
+++ b/xmake/rules/c++/modules/modules_support/msvc.lua
@@ -27,39 +27,21 @@ import("utils.progress")
import("private.action.build.object", {alias = "objectbuilder"})
import("common")
--- get and create the path of module mapper
-function _get_module_mapper()
- local mapper_file = path.join(config.buildir(), "mapper.txt")
- if not os.isfile(mapper_file) then
- io.writefile(mapper_file, "")
- end
- return mapper_file
-end
-
--- get and create the path of linker arguments
-function _get_linker_argument_file()
- local linker_file = path.join(config.buildir(), "linkargs.txt")
- if not os.isfile(linker_file) then
- io.writefile(linker_file, "")
- end
- return linker_file
-end
-
-- add a module or header unit into the mapper
--
-- e.g
-- /headerUnit:angle cstdint=cstdint.ifc
-- /headerUnit:angle glm/mat4x4.hpp=Users\arthu\AppData\Local\.xmake\packages\g\glm\0.9.9+8\91454f3ee0be416cb9c7452970a2300f\include\glm\mat4x4.hpp.ifc
--
-function _add_module_to_mapper(file, argument, module)
- for line in io.lines(file) do
- if line:startswith(argument .. " " .. module) then
- return
- end
+function _add_module_to_mapper(argument, module)
+ local cache = common.localcache():get("mapflags") or {}
+ local mapflag = format("%s %s", argument, module)
+ if table.contains(cache, mapflag) then
+ return
end
- local f = io.open(file, "a")
- f:print("%s %s", argument, module)
- f:close()
+ table.insert(cache, mapflag)
+ common.localcache():set("mapflags", cache)
+ common.localcache():save("mapflags")
end
-- add an objectfile to the linker args
@@ -67,23 +49,20 @@ end
-- e.g
-- foo.obj
--
-function _add_objectfile_to_link_arguments(file, objectfile)
- for line in io.lines(file) do
- if line:startswith(objectfile) then
- return
- end
+function _add_objectfile_to_link_arguments(objectfile)
+ local cache = common.localcache():get("headerunit_objectfiles") or {}
+ if table.contains(cache, objectfile) then
+ return
end
- local f = io.open(file, "a")
- f:print(objectfile)
- f:close()
+ table.insert(cache, objectfile)
+ common.localcache():set("headerunit_objectfiles", cache)
+ common.localcache():save("headerunit_objectfiles")
end
-- load module support for the current target
function load(target)
local cachedir = common.modules_cachedir(target)
local stlcachedir = common.stlmodules_cachedir(target)
- local mapper_file = _get_module_mapper()
- local linker_file = _get_linker_argument_file()
-- get flags
local modulesflag = get_modulesflag(target)
@@ -176,8 +155,6 @@ function generate_stl_headerunits_for_batchcmds(target, batchcmds, headerunits,
local compinst = target:compiler("cxx")
local toolchain = target:toolchain("msvc")
local vcvars = toolchain:config("vcvars")
- local mapper_file = _get_module_mapper()
- local linker_file = _get_linker_argument_file()
-- get flags
local exportheaderflag = get_exportheaderflag(target)
@@ -202,7 +179,7 @@ function generate_stl_headerunits_for_batchcmds(target, batchcmds, headerunits,
batchcmds:add_depfiles(headerunit.path)
_add_module_to_mapper(headerunitflag .. ":angle", headerunit.name .. "=" .. path.filename(headerunit.name) .. get_bmi_extension())
- _add_objectfile_to_link_arguments(linker_file, objectfile)
+ _add_objectfile_to_link_arguments(objectfile)
end
depmtime = math.max(depmtime, os.mtime(bmifile))
end
@@ -214,8 +191,6 @@ function generate_user_headerunits_for_batchcmds(target, batchcmds, headerunits,
local compinst = target:compiler("cxx")
local toolchain = target:toolchain("msvc")
local vcvars = toolchain:config("vcvars")
- local mapper_file = _get_module_mapper()
- local linker_file = _get_linker_argument_file()
-- get flags
local exportheaderflag = get_exportheaderflag(target)
@@ -254,7 +229,7 @@ function generate_user_headerunits_for_batchcmds(target, batchcmds, headerunits,
batchcmds:add_depfiles(headerunit.path)
_add_module_to_mapper(headerunitflag .. headerunit.type, headerunit.name .. "=" .. path.relative(bmifile, cachedir))
- _add_objectfile_to_link_arguments(linker_file, objectfile)
+ _add_objectfile_to_link_arguments(objectfile)
depmtime = math.max(depmtime, os.mtime(bmifile))
end
@@ -264,7 +239,6 @@ end
-- 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 toolchain = target:toolchain("msvc")
local vcvars = toolchain:config("vcvars")
@@ -277,9 +251,8 @@ function build_modules_for_batchcmds(target, batchcmds, objectfiles, modules, op
local referenceflag = get_referenceflag(target)
-- append module mapper flags
- for line in io.lines(mapper_file) do
- target:add("cxxflags", line, {force = true})
- end
+ local cache = common.localcache():get("mapflags") or {}
+ target:add("cxxflags", cache, {force = true})
-- build modules
local common_args = {"-TP"}
@@ -307,7 +280,7 @@ function build_modules_for_batchcmds(target, batchcmds, objectfiles, modules, op
batchcmds:vrunv(compinst:program(), table.join(compinst:compflags({target = target}), common_args, args), {envs = vcvars})
batchcmds:add_depfiles(provide.sourcefile)
- _add_module_to_mapper(mapper_file, referenceflag, name .. "=" .. path.filename(bmifile))
+ _add_module_to_mapper(referenceflag, name .. "=" .. path.filename(bmifile))
target:add("objectfiles", objectfile)
depmtime = math.max(depmtime, os.mtime(bmifile))
@@ -457,18 +430,4 @@ function get_scandependenciesflag(target)
_g.scandependenciesflag = scandependenciesflag or false
end
return scandependenciesflag or nil
-end
-
--- append .obj to final link
-function append_headerunits_objectfiles(target)
- local linker_file = _get_linker_argument_file()
- for line in io.lines(linker_file) do
- if target:is_binary() then
- target:add("ldflags", line, {force = true})
- elseif target:is_static() == "static" then
- target:add("arflags", line, {force = true})
- elseif target:is_shared() == "shared" then
- target:add("shflags", line, {force = true})
- end
- end
end \ No newline at end of file