summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorruki <[email protected]>2023-10-11 22:40:57 +0800
committerruki <[email protected]>2023-10-11 22:40:57 +0800
commit9449c51bf2e709ba7807093a6876cf4eadf9fbac (patch)
tree11b0808d2597a671319a30a2d7c3414b9a34c33a
parent8de7e001caabfefddfdec8f0e7bfd941764079f2 (diff)
improve flags for vsxmake #4268
-rw-r--r--xmake/modules/private/check/checkers/api/api_checker.lua26
-rw-r--r--xmake/modules/private/utils/target.lua88
-rw-r--r--xmake/plugins/project/cmake/cmakelists.lua45
-rw-r--r--xmake/plugins/project/vsxmake/getinfo.lua13
4 files changed, 103 insertions, 69 deletions
diff --git a/xmake/modules/private/check/checkers/api/api_checker.lua b/xmake/modules/private/check/checkers/api/api_checker.lua
index caa82a1df..375e27354 100644
--- a/xmake/modules/private/check/checkers/api/api_checker.lua
+++ b/xmake/modules/private/check/checkers/api/api_checker.lua
@@ -23,6 +23,7 @@ import("core.base.option")
import("core.base.hashset")
import("core.project.project")
import("private.check.checker")
+import("private.utils.target", {alias = "target_utils"})
-- get the most probable value
function _get_most_probable_value(value, valueset)
@@ -142,29 +143,8 @@ end
-- @see https://github.com/xmake-io/xmake/issues/3594
function check_flag(target, toolinst, flagkind, flag)
local extraconf = target:extraconf(flagkind)
-
- -- does this flag belong to this tool?
- -- @see https://github.com/xmake-io/xmake/issues/3022
- --
- -- e.g.
- -- for all: add_cxxflags("-g")
- -- only for clang: add_cxxflags("clang::-stdlib=libc++")
- -- only for clang and multiple flags: add_cxxflags("-stdlib=libc++", "-DFOO", {tools = "clang"})
- --
- local for_this_tool = true
- local flagconf = extraconf and extraconf[flag]
- if type(flag) == "string" and flag:find("::", 1, true) then
- for_this_tool = false
- local splitinfo = flag:split("::", {plain = true})
- local toolname = splitinfo[1]
- if toolname == toolinst:name() then
- flag = splitinfo[2]
- for_this_tool = true
- end
- elseif flagconf and flagconf.tools then
- for_this_tool = table.contains(table.wrap(flagconf.tools), toolinst:name())
- end
- if for_this_tool then
+ flag = target_utils.flag_belong_to_tool(target, flag, toolinst, extraconf)
+ if flag then
return toolinst:has_flags(flag)
else
return true
diff --git a/xmake/modules/private/utils/target.lua b/xmake/modules/private/utils/target.lua
new file mode 100644
index 000000000..7eeb1a86f
--- /dev/null
+++ b/xmake/modules/private/utils/target.lua
@@ -0,0 +1,88 @@
+--!A cross-platform build utility based on Lua
+--
+-- Licensed under the Apache License, Version 2.0 (the "License");
+-- you may not use this file except in compliance with the License.
+-- You may obtain a copy of the License at
+--
+-- http://www.apache.org/licenses/LICENSE-2.0
+--
+-- Unless required by applicable law or agreed to in writing, software
+-- distributed under the License is distributed on an "AS IS" BASIS,
+-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+-- See the License for the specific language governing permissions and
+-- limitations under the License.
+--
+-- Copyright (C) 2015-present, TBOOX Open Source Group.
+--
+-- @author ruki
+-- @file target.lua
+--
+
+-- imports
+import("core.base.option")
+
+-- does this flag belong to this tool?
+-- @see https://github.com/xmake-io/xmake/issues/3022
+--
+-- e.g.
+-- for all: add_cxxflags("-g")
+-- only for clang: add_cxxflags("clang::-stdlib=libc++")
+-- only for clang and multiple flags: add_cxxflags("-stdlib=libc++", "-DFOO", {tools = "clang"})
+--
+function flag_belong_to_tool(target, flag, toolinst, extraconf)
+ local for_this_tool = true
+ local flagconf = extraconf and extraconf[flag]
+ if type(flag) == "string" and flag:find("::", 1, true) then
+ for_this_tool = false
+ local splitinfo = flag:split("::", {plain = true})
+ local toolname = splitinfo[1]
+ if toolname == toolinst:name() then
+ flag = splitinfo[2]
+ for_this_tool = true
+ end
+ elseif flagconf and flagconf.tools then
+ for_this_tool = table.contains(table.wrap(flagconf.tools), toolinst:name())
+ end
+ if for_this_tool then
+ return flag
+ end
+end
+
+-- translate flags in tool
+function translate_flags_in_tool(target, flagkind, flags)
+ local extraconf = target:extraconf(flagkind)
+ local sourcekind
+ local linkerkind
+ if flagkind == "cflags" then
+ sourcekind = "cc"
+ elseif flagkind == "cxxflags" or flagkind == "cxflags" then
+ sourcekind = "cxx"
+ elseif flagkind == "asflags" then
+ sourcekind = "as"
+ elseif flagkind == "cuflags" then
+ sourcekind = "cu"
+ elseif flagkind == "ldflags" or flagkind == "shflags" then
+ -- pass
+ else
+ raise("unknown flag kind %s", flagkind)
+ end
+ local toolinst = sourcekind and target:compiler(sourcekind) or target:linker()
+
+ -- does this flag belong to this tool?
+ -- @see https://github.com/xmake-io/xmake/issues/3022
+ --
+ -- e.g.
+ -- for all: add_cxxflags("-g")
+ -- only for clang: add_cxxflags("clang::-stdlib=libc++")
+ -- only for clang and multiple flags: add_cxxflags("-stdlib=libc++", "-DFOO", {tools = "clang"})
+ --
+ local result = {}
+ for _, flag in ipairs(flags) do
+ flag = flag_belong_to_tool(target, flag, toolinst, extraconf)
+ if flag then
+ table.insert(result, flag)
+ end
+ end
+ return result
+end
+
diff --git a/xmake/plugins/project/cmake/cmakelists.lua b/xmake/plugins/project/cmake/cmakelists.lua
index 7dcabd2a4..9d66cba48 100644
--- a/xmake/plugins/project/cmake/cmakelists.lua
+++ b/xmake/plugins/project/cmake/cmakelists.lua
@@ -29,6 +29,7 @@ import("core.project.rule")
import("lib.detect.find_tool")
import("private.utils.batchcmds")
import("private.utils.rule_groups")
+import("private.utils.target", {alias = "target_utils"})
import("plugins.project.utils.target_cmds", {rootdir = os.programdir()})
-- get minimal cmake version
@@ -201,49 +202,7 @@ end
-- @see https://github.com/xmake-io/xmake/issues/3594
function _get_flags_from_target(target, flagkind)
local flags = _get_configs_from_target(target, flagkind)
- local extraconf = target:extraconf(flagkind)
- local sourcekind
- if flagkind == "cflags" then
- sourcekind = "cc"
- elseif flagkind == "cxxflags" or flagkind == "cxflags" then
- sourcekind = "cxx"
- elseif flagkind == "asflags" then
- sourcekind = "as"
- elseif flagkind == "cuflags" then
- sourcekind = "cu"
- else
- raise("unknown flag kind %s", flagkind)
- end
- local toolinst = target:compiler(sourcekind)
-
- -- does this flag belong to this tool?
- -- @see https://github.com/xmake-io/xmake/issues/3022
- --
- -- e.g.
- -- for all: add_cxxflags("-g")
- -- only for clang: add_cxxflags("clang::-stdlib=libc++")
- -- only for clang and multiple flags: add_cxxflags("-stdlib=libc++", "-DFOO", {tools = "clang"})
- --
- local result = {}
- for _, flag in ipairs(flags) do
- local for_this_tool = true
- local flagconf = extraconf and extraconf[flag]
- if type(flag) == "string" and flag:find("::", 1, true) then
- for_this_tool = false
- local splitinfo = flag:split("::", {plain = true})
- local toolname = splitinfo[1]
- if toolname == toolinst:name() then
- flag = splitinfo[2]
- for_this_tool = true
- end
- elseif flagconf and flagconf.tools then
- for_this_tool = table.contains(table.wrap(flagconf.tools), toolinst:name())
- end
- if for_this_tool then
- table.insert(result, flag)
- end
- end
- return result
+ return target_utils.translate_flags_in_tool(target, flagkind, flags)
end
-- add project info
diff --git a/xmake/plugins/project/vsxmake/getinfo.lua b/xmake/plugins/project/vsxmake/getinfo.lua
index 4e318fdcf..eaa671ac3 100644
--- a/xmake/plugins/project/vsxmake/getinfo.lua
+++ b/xmake/plugins/project/vsxmake/getinfo.lua
@@ -31,6 +31,7 @@ import("core.tool.toolchain")
import("core.cache.memcache")
import("core.cache.localcache")
import("lib.detect.find_tool")
+import("private.utils.target", {alias = "target_utils"})
import("private.action.run.runenvs")
import("private.action.require.install", {alias = "install_requires"})
import("actions.config.configfiles", {alias = "generate_configfiles", rootdir = os.programdir()})
@@ -96,6 +97,12 @@ function _get_values_from_target(target, name)
return table.unique(values)
end
+-- get flags from target
+function _get_flags_from_target(target, name)
+ local flags = _get_values_from_target(target, name)
+ return target_utils.translate_flags_in_tool(target, name, flags)
+end
+
-- make target info
function _make_targetinfo(mode, arch, target)
@@ -137,9 +144,9 @@ function _make_targetinfo(mode, arch, target)
targetinfo.defines = _make_arrs(_get_values_from_target(target, "defines"))
-- save flags
- targetinfo.cflags = _make_arrs(_get_values_from_target(target, "cflags"), " ")
- targetinfo.cxflags = _make_arrs(_get_values_from_target(target, "cxflags"), " ")
- targetinfo.cxxflags = _make_arrs(_get_values_from_target(target, "cxxflags"), " ")
+ targetinfo.cflags = _make_arrs(_get_flags_from_target(target, "cflags"), " ")
+ targetinfo.cxflags = _make_arrs(_get_flags_from_target(target, "cxflags"), " ")
+ targetinfo.cxxflags = _make_arrs(_get_flags_from_target(target, "cxxflags"), " ")
-- save languages
targetinfo.languages = _make_arrs(_get_values_from_target(target, "languages"))