diff options
| author | Arthur LAURENT <[email protected]> | 2023-01-04 22:30:23 +0100 |
|---|---|---|
| committer | Arthur LAURENT <[email protected]> | 2023-01-06 10:03:34 +0100 |
| commit | 13ae811418d4855cb5cc223d7e4546771f704e6f (patch) | |
| tree | b30eef0cab22b263a7cecf5fdec1160dbcdc5671 /xmake/rules/c++/modules/modules_support/clang.lua | |
| parent | 41a79045a74bccf4804a8ba11ef841ac18e403ab (diff) | |
Improve compatibility with libc++
Diffstat (limited to 'xmake/rules/c++/modules/modules_support/clang.lua')
| -rw-r--r-- | xmake/rules/c++/modules/modules_support/clang.lua | 29 |
1 files changed, 21 insertions, 8 deletions
diff --git a/xmake/rules/c++/modules/modules_support/clang.lua b/xmake/rules/c++/modules/modules_support/clang.lua index 02d08e6b0..d73b17533 100644 --- a/xmake/rules/c++/modules/modules_support/clang.lua +++ b/xmake/rules/c++/modules/modules_support/clang.lua @@ -67,13 +67,12 @@ end -- load module support for the current target function load(target) local modulesflag = get_modulesflag(target) - local builtinmodulemapflag = get_builtinmodulemapflag(target) - local implicitmodulesflag = get_implicitmodulesflag(target) + local noimplicitmodulemapsflag = get_noimplicitmodulemapsflag(target) -- add module flags target:add("cxxflags", modulesflag) - target:add("cxxflags", builtinmodulemapflag, {force = true}) - target:add("cxxflags", implicitmodulesflag, {force = true}) + -- target:add("cxxflags", builtinmodulemapflag, {force = true}) + target:add("cxxflags", noimplicitmodulemapsflag, {force = true}) -- fix default visibility for functions and variables [-fvisibility] differs in PCH file vs. current file -- module.pcm cannot be loaded due to a configuration mismatch with the current compilation. @@ -97,7 +96,8 @@ function load(target) -- on ubuntu: -- sudo apt install libc++-dev libc++abi-15-dev -- - target:data_set("cxx.modules.use_libc++", table.contains(target:get("cxxflags"), "-stdlib=libc++", "clang::-stdlib=libc++")) + local flags = table.join(target:get("cxxflags"), get_config("cxxflags") or {}) + target:data_set("cxx.modules.use_libc++", table.contains(flags, "-stdlib=libc++", "clang::-stdlib=libc++")) if target:data("cxx.modules.use_libc++") then target:add("syslinks", "c++") end @@ -117,7 +117,7 @@ function _get_toolchain_includedirs_for_stlheaders(target, includedirs, clang) if target:data("cxx.modules.use_libc++") then table.insert(argv, 1, "-stdlib=libc++") end - local result = try {function () return os.iorunv(clang, {"-E", "-x", "c++", tmpfile}) end} + local result = try {function () return os.iorunv(clang, argv) end} if result then for _, line in ipairs(result:split("\n", {plain = true})) do line = line:trim() @@ -199,7 +199,7 @@ function toolchain_includedirs(target) local clang, toolname = target:tool("cxx") assert(toolname == "clang") _get_toolchain_includedirs_for_stlheaders(target, includedirs, clang) - local _, result = try {function () return os.iorunv(clang, {"-E", "-Wp,-v", "-xc", os.nuldev()}) end} + local _, result = try {function () return os.iorunv(clang, {"-E", "-stdlib=libc++", "-Wp,-v", "-xc", os.nuldev()}) end} if result then for _, line in ipairs(result:split("\n", {plain = true})) do line = line:trim() @@ -292,7 +292,7 @@ function generate_stl_headerunits_for_batchjobs(target, batchjobs, headerunits, if not common.memcache():get2(headerunit.name, "building") then common.memcache():set2(headerunit.name, "building", true) progress.show((index * 100) / total, "${color.build.object}compiling.headerunit.$(mode) %s", headerunit.name) - local args = {modulecachepathflag .. stlcachedir, "-c", "-o", bmifile, "-x", "c++-system-header", headerunit.name} + local args = {modulecachepathflag .. stlcachedir, "-c", "-Wno-everything", "-o", bmifile, "-x", "c++-system-header", headerunit.name} os.vrunv(compinst:program(), table.join(compinst:compflags({target = target}), args)) end @@ -622,6 +622,19 @@ function get_implicitmodulesflag(target) return implicitmodulesflag or nil end +function get_implicitmodulemapsflag(target) + local implicitmodulemapsflag = _g.implicitmodulemapsflag + if implicitmodulemapsflag == nil then + local compinst = target:compiler("cxx") + if compinst:has_flags("-fimplicit-module-maps", "cxxflags", {flagskey = "clang_implicit_module_map"}) then + implicitmodulemapsflag = "-fimplicit-module-maps" + end + assert(implicitmodulemapsflag, "compiler(clang): does not support c++ module!") + _g.implicitmodulemapsflag = implicitmodulemapsflag or false + end + return implicitmodulemapsflag or nil +end + function get_noimplicitmodulemapsflag(target) local noimplicitmodulemapsflag = _g.noimplicitmodulemapsflag if noimplicitmodulemapsflag == nil then |
