From 0033f9ea8567815f93e7a3bbc8caf4b239b02286 Mon Sep 17 00:00:00 2001 From: huarkiou Date: Mon, 27 May 2024 11:16:45 +0800 Subject: add encoding flags when generate cmakelists --- xmake/plugins/project/cmake/cmakelists.lua | 87 ++++++++++++++++++++++++++++++ 1 file changed, 87 insertions(+) diff --git a/xmake/plugins/project/cmake/cmakelists.lua b/xmake/plugins/project/cmake/cmakelists.lua index 9670972c9..8055d04a8 100644 --- a/xmake/plugins/project/cmake/cmakelists.lua +++ b/xmake/plugins/project/cmake/cmakelists.lua @@ -684,6 +684,90 @@ function _add_target_warnings(cmakelists, target) end end +-- copy from core.tools.cl +function nf_encoding_cl(encoding) + local kind + local charset + local splitinfo = encoding:split(":") + if #splitinfo > 1 then + kind = splitinfo[1] + charset = splitinfo[2] + else + charset = encoding + end + local charsets = { + ["utf-8"] = "utf-8", + utf8 = "utf-8", + gb2312 = "gb2312" + } + local flags = {} + charset = charsets[charset:lower()] + if charset then + if not kind and charset == "utf-8" then + table.insert(flags, "/utf-8") + else + if kind == "source" or not kind then + table.insert(flags, "-source-charset:" .. charset) + end + if kind == "target" or not kind then + table.insert(flags, "-execution-charset:" .. charset) + end + end + end + if #flags > 0 then + return flags + end +end + +-- copy from core.tools.gcc +function nf_encoding_gcc(encoding) + local kind + local charset + local splitinfo = encoding:split(":") + if #splitinfo > 1 then + kind = splitinfo[1] + charset = splitinfo[2] + else + charset = encoding + end + local charsets = { + ["utf-8"] = "UTF-8", + utf8 = "UTF-8" + } + local flags = {} + charset = charsets[charset:lower()] + if charset then + if kind == "source" or not kind then + table.insert(flags, "-finput-charset=" .. charset) + end + if kind == "target" or not kind then + table.insert(flags, "-fexec-charset=" .. charset) + end + end + if #flags > 0 then + return flags + end +end + +-- add target encodings +function _add_target_encodings(cmakelists, target) + local encodings = target:get("encodings") + if encodings then + cmakelists:print("if(MSVC)") + -- msvc or clang-cl + for _, encoding in ipairs(encodings) do + local flags_msvc = nf_encoding_cl(encoding) + cmakelists:print(" target_compile_options(%s PRIVATE %s)", target:name(), flags_msvc[1]) + end + cmakelists:print("else()") + for _, encoding in ipairs(encodings) do + local flags_gcc = nf_encoding_gcc(encoding) + cmakelists:print(" target_compile_options(%s PRIVATE %s)", target:name(), flags_gcc[1]) + end + cmakelists:print("endif()") + end +end + -- add target exceptions function _add_target_exceptions(cmakelists, target) local flags_gcc = @@ -1121,6 +1205,9 @@ function _add_target(cmakelists, target, outputdir) -- add target warnings _add_target_warnings(cmakelists, target) + -- add target exceptions + _add_target_encodings(cmakelists, target) + -- add target exceptions _add_target_exceptions(cmakelists, target) -- cgit v1.3.1 From 870ce4a240fe6a49de9265e4483f96f598ff26a5 Mon Sep 17 00:00:00 2001 From: huarkiou Date: Mon, 27 May 2024 12:04:04 +0800 Subject: 1. use nf_encoding(self, encoding) in core.tools.cl and core.tools.gcc; 2. only process MSVC and Gcc --- xmake/plugins/project/cmake/cmakelists.lua | 74 +++--------------------------- 1 file changed, 6 insertions(+), 68 deletions(-) diff --git a/xmake/plugins/project/cmake/cmakelists.lua b/xmake/plugins/project/cmake/cmakelists.lua index 8055d04a8..bbf799bad 100644 --- a/xmake/plugins/project/cmake/cmakelists.lua +++ b/xmake/plugins/project/cmake/cmakelists.lua @@ -684,84 +684,22 @@ function _add_target_warnings(cmakelists, target) end end --- copy from core.tools.cl -function nf_encoding_cl(encoding) - local kind - local charset - local splitinfo = encoding:split(":") - if #splitinfo > 1 then - kind = splitinfo[1] - charset = splitinfo[2] - else - charset = encoding - end - local charsets = { - ["utf-8"] = "utf-8", - utf8 = "utf-8", - gb2312 = "gb2312" - } - local flags = {} - charset = charsets[charset:lower()] - if charset then - if not kind and charset == "utf-8" then - table.insert(flags, "/utf-8") - else - if kind == "source" or not kind then - table.insert(flags, "-source-charset:" .. charset) - end - if kind == "target" or not kind then - table.insert(flags, "-execution-charset:" .. charset) - end - end - end - if #flags > 0 then - return flags - end -end - --- copy from core.tools.gcc -function nf_encoding_gcc(encoding) - local kind - local charset - local splitinfo = encoding:split(":") - if #splitinfo > 1 then - kind = splitinfo[1] - charset = splitinfo[2] - else - charset = encoding - end - local charsets = { - ["utf-8"] = "UTF-8", - utf8 = "UTF-8" - } - local flags = {} - charset = charsets[charset:lower()] - if charset then - if kind == "source" or not kind then - table.insert(flags, "-finput-charset=" .. charset) - end - if kind == "target" or not kind then - table.insert(flags, "-fexec-charset=" .. charset) - end - end - if #flags > 0 then - return flags - end -end - -- add target encodings function _add_target_encodings(cmakelists, target) + local tools_cl = import("core.tools.cl", {alias = "tools_cl"}) + local tools_gcc = import("core.tools.gcc", {alias = "tools_gcc"}) local encodings = target:get("encodings") if encodings then cmakelists:print("if(MSVC)") -- msvc or clang-cl for _, encoding in ipairs(encodings) do - local flags_msvc = nf_encoding_cl(encoding) + local flags_msvc = tools_cl.nf_encoding(target, encoding) cmakelists:print(" target_compile_options(%s PRIVATE %s)", target:name(), flags_msvc[1]) end - cmakelists:print("else()") + cmakelists:print("elseif(Gcc)") + -- gcc for _, encoding in ipairs(encodings) do - local flags_gcc = nf_encoding_gcc(encoding) + local flags_gcc = tools_gcc.nf_encoding(target, encoding) cmakelists:print(" target_compile_options(%s PRIVATE %s)", target:name(), flags_gcc[1]) end cmakelists:print("endif()") -- cgit v1.3.1 From ffb53524e7dcbe9eef3e4691cfc8e074d7d47291 Mon Sep 17 00:00:00 2001 From: ruki Date: Wed, 29 May 2024 23:59:10 +0800 Subject: add encodings for cmakelists #5149 --- xmake/plugins/project/cmake/cmakelists.lua | 36 +++++++++++++++++++++--------- 1 file changed, 26 insertions(+), 10 deletions(-) diff --git a/xmake/plugins/project/cmake/cmakelists.lua b/xmake/plugins/project/cmake/cmakelists.lua index bbf799bad..3d89c7cb6 100644 --- a/xmake/plugins/project/cmake/cmakelists.lua +++ b/xmake/plugins/project/cmake/cmakelists.lua @@ -233,6 +233,26 @@ function _translate_flags(flags, outputdir) return result end +-- map compiler flags +function _map_compflags(toolname, langkind, name, values) + local fake_target = { + is_shared = function() return false end, + tool = function() + local program + if toolname == "cl" then + program = "cl.exe" + elseif toolname == "gcc" then + program = "gcc" + end + return program, toolname + end, + sourcekinds = function() + return langkind == "c" and "cc" or "cxx" + end + } + return compiler.map_flags(langkind, name, values, {target = fake_target}) +end + -- get flags from fileconfig function _get_flags_from_fileconfig(fileconfig, outputdir, name) local flags = {} @@ -686,21 +706,17 @@ end -- add target encodings function _add_target_encodings(cmakelists, target) - local tools_cl = import("core.tools.cl", {alias = "tools_cl"}) - local tools_gcc = import("core.tools.gcc", {alias = "tools_gcc"}) local encodings = target:get("encodings") if encodings then cmakelists:print("if(MSVC)") - -- msvc or clang-cl - for _, encoding in ipairs(encodings) do - local flags_msvc = tools_cl.nf_encoding(target, encoding) - cmakelists:print(" target_compile_options(%s PRIVATE %s)", target:name(), flags_msvc[1]) + local flags_cl = _map_compflags("cl", "c", "encoding", encodings) + for _, flag in ipairs(flags_cl) do + cmakelists:print(" target_compile_options(%s PRIVATE %s)", target:name(), flag) end cmakelists:print("elseif(Gcc)") - -- gcc - for _, encoding in ipairs(encodings) do - local flags_gcc = tools_gcc.nf_encoding(target, encoding) - cmakelists:print(" target_compile_options(%s PRIVATE %s)", target:name(), flags_gcc[1]) + local flags_gcc = _map_compflags("gcc", "c", "encoding", encodings) + for _, flag in ipairs(flags_gcc) do + cmakelists:print(" target_compile_options(%s PRIVATE %s)", target:name(), flag) end cmakelists:print("endif()") end -- cgit v1.3.1 From c43e8533e5738fce03a58557c63377f60ac263e4 Mon Sep 17 00:00:00 2001 From: ruki Date: Wed, 29 May 2024 23:59:19 +0800 Subject: fix sourcekinds --- xmake/modules/package/tools/cmake.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/xmake/modules/package/tools/cmake.lua b/xmake/modules/package/tools/cmake.lua index 7b8aef360..5336a7c69 100644 --- a/xmake/modules/package/tools/cmake.lua +++ b/xmake/modules/package/tools/cmake.lua @@ -814,7 +814,7 @@ function _get_envs_for_runtime_flags(package, configs, opt) local runtimes = package:runtimes() if runtimes then local fake_target = {is_shared = function(_) return false end, - sourcekinds = function(_) return "c" end} + sourcekinds = function(_) return "cc" end} envs[format("CMAKE_C_FLAGS_%s", buildtype)] = _map_compflags(fake_target, "c", "runtime", runtimes) fake_target.sourcekinds = function(_) return "cxx" end envs[format("CMAKE_CXX_FLAGS_%s", buildtype)] = _map_compflags(fake_target, "cxx", "runtime", runtimes) -- cgit v1.3.1