From 43a4e2c277d003251f476e8aa5b2f0efbe2f3ae7 Mon Sep 17 00:00:00 2001 From: ruki Date: Thu, 18 Jun 2026 21:00:07 +0800 Subject: improve to check multiple targets --- xmake/actions/run/main.lua | 4 +- xmake/modules/cli/amalgamate.lua | 4 +- xmake/modules/private/action/utils.lua | 4 +- xmake/modules/private/detect/check_targetname.lua | 56 ---------------------- xmake/modules/private/detect/check_targetnames.lua | 39 +++++++++++++-- xmake/plugins/show/info/depgraph.lua | 4 +- xmake/plugins/show/info/target.lua | 4 +- 7 files changed, 44 insertions(+), 71 deletions(-) delete mode 100644 xmake/modules/private/detect/check_targetname.lua diff --git a/xmake/actions/run/main.lua b/xmake/actions/run/main.lua index d9b5e83d3..f6baa4253 100644 --- a/xmake/actions/run/main.lua +++ b/xmake/actions/run/main.lua @@ -29,7 +29,7 @@ import("devel.debugger") import("async.runjobs") import("private.action.run.runenvs") import("private.service.remote_build.action", {alias = "remote_build_action"}) -import("private.detect.check_targetname") +import("private.detect.check_targetnames") import("lib.detect.find_tool") import("private.action.utils", {alias = "action_utils"}) @@ -232,7 +232,7 @@ function _check_targets(targetname, group_pattern) -- get targets local targets = {} if targetname then - local target = assert(check_targetname(targetname)) + local target = assert(check_targetnames(targetname)) table.insert(targets, target) else for _, target in ipairs(project.ordertargets()) do diff --git a/xmake/modules/cli/amalgamate.lua b/xmake/modules/cli/amalgamate.lua index b76f60b6e..293b0c445 100644 --- a/xmake/modules/cli/amalgamate.lua +++ b/xmake/modules/cli/amalgamate.lua @@ -24,7 +24,7 @@ import("core.base.graph") import("core.project.config") import("core.project.task") import("core.project.project") -import("private.detect.check_targetname") +import("private.detect.check_targetnames") -- the options local options = @@ -160,7 +160,7 @@ function main(...) -- generate amalgamate code args.outputdir = args.outputdir or config.builddir() if args.target then - local target = assert(check_targetname(args.target)) + local target = assert(check_targetnames(args.target)) _generate_amalgamate_code(target, args) else for _, target in ipairs(project.ordertargets()) do diff --git a/xmake/modules/private/action/utils.lua b/xmake/modules/private/action/utils.lua index 24a5e3a46..39045d204 100644 --- a/xmake/modules/private/action/utils.lua +++ b/xmake/modules/private/action/utils.lua @@ -74,9 +74,9 @@ end function get_targets(targetnames, opt) opt = opt or {} - -- select the explicitly given targets + -- select the explicitly given targets (table.wrap to always get a list back) if type(targetnames) == "table" or (type(targetnames) == "string" and not targetnames:startswith("__")) then - return assert(check_targetnames(targetnames)) + return assert(check_targetnames(table.wrap(targetnames))) end -- otherwise select the default/all/group targets diff --git a/xmake/modules/private/detect/check_targetname.lua b/xmake/modules/private/detect/check_targetname.lua deleted file mode 100644 index 13a04c580..000000000 --- a/xmake/modules/private/detect/check_targetname.lua +++ /dev/null @@ -1,56 +0,0 @@ ---!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, Xmake Open Source Community. --- --- @author Shiffted --- @file check_targetname.lua --- - --- imports -import("core.project.project") -import("private.detect.find_similar_targetnames") - --- check if a target name is valid --- --- @param targetname the target name to check for --- @param opt the argument options, e.g. {find_similar = false, max_similar = 5} --- @return target or nil, errors --- --- @code --- --- local target, errors = check_targetname("mytarget") --- local target, errors = check_targetname("mytarget", {find_similar = false}) --- --- @endcode --- -function main(targetname, opt) - opt = opt or {} - - local target = project.target(targetname) - if target then - return target - end - - local errors = "'" .. targetname .. "' is not a valid target name for this project." - if opt.find_similar ~= false then - local matching_targetnames = find_similar_targetnames(targetname) - if #matching_targetnames > 0 then - local max_index = math.min(#matching_targetnames, opt.max_similar or 14) - errors = errors .. "\nValid target names closest to input:\n - " - .. table.concat(matching_targetnames, '\n - ', 1, max_index) - end - end - return nil, errors -end diff --git a/xmake/modules/private/detect/check_targetnames.lua b/xmake/modules/private/detect/check_targetnames.lua index 7c7f1b56a..a4d3c3fc8 100644 --- a/xmake/modules/private/detect/check_targetnames.lua +++ b/xmake/modules/private/detect/check_targetnames.lua @@ -19,29 +19,58 @@ -- -- imports -import("private.detect.check_targetname") +import("core.project.project") +import("private.detect.find_similar_targetnames") + +-- check if a single target name is valid +function _check_targetname(targetname, opt) + local target = project.target(targetname) + if target then + return target + end + + local errors = "'" .. targetname .. "' is not a valid target name for this project." + if opt.find_similar ~= false then + local matching_targetnames = find_similar_targetnames(targetname) + if #matching_targetnames > 0 then + local max_index = math.min(#matching_targetnames, opt.max_similar or 14) + errors = errors .. "\nValid target names closest to input:\n - " + .. table.concat(matching_targetnames, '\n - ', 1, max_index) + end + end + return nil, errors +end -- check if the given target names are valid -- +-- it accepts either a single target name or a list of target names. for a single +-- target name (string), it returns the single matching target; for a list, it +-- returns the matching targets as a list. +-- -- @param targetnames a single target name or a list of target names to check for -- @param opt the argument options, e.g. {find_similar = false, max_similar = 5} --- @return targets or nil, errors +-- @return target(s) or nil, errors -- -- @code -- --- local targets, errors = check_targetnames("mytarget") --- local targets, errors = check_targetnames({"target1", "target2"}) +-- local target = assert(check_targetnames("mytarget")) +-- local targets = assert(check_targetnames({"target1", "target2"})) -- -- @endcode -- function main(targetnames, opt) + opt = opt or {} local targets = {} for _, targetname in ipairs(table.wrap(targetnames)) do - local target, errors = check_targetname(targetname, opt) + local target, errors = _check_targetname(targetname, opt) if not target then return nil, errors end table.insert(targets, target) end + -- unwrap to a single target if a single target name is given + if type(targetnames) ~= "table" then + return targets[1] + end return targets end diff --git a/xmake/plugins/show/info/depgraph.lua b/xmake/plugins/show/info/depgraph.lua index 2c73f3abc..b8107a558 100644 --- a/xmake/plugins/show/info/depgraph.lua +++ b/xmake/plugins/show/info/depgraph.lua @@ -23,7 +23,7 @@ import("core.base.option") import("core.base.json") import("core.project.config") import("core.project.project") -import("private.detect.check_targetname") +import("private.detect.check_targetnames") function _collect_target_entry(target) local deps = {} @@ -135,7 +135,7 @@ function main(name) local root_target if name then - root_target = assert(check_targetname(name)) + root_target = assert(check_targetnames(name)) end local graph = _collect_target_graph(root_target) diff --git a/xmake/plugins/show/info/target.lua b/xmake/plugins/show/info/target.lua index 75f31f9a5..099a0419d 100644 --- a/xmake/plugins/show/info/target.lua +++ b/xmake/plugins/show/info/target.lua @@ -24,7 +24,7 @@ import("core.base.json") import("core.base.hashset") import("core.project.config") import("core.language.language") -import("private.detect.check_targetname") +import("private.detect.check_targetnames") -- get source info data function _get_sourceinfo(target, name, item, opt) @@ -371,7 +371,7 @@ function main(name) end assert(name, "please specify the target name, e.g. xmake show --info=target --target=xxx") - local target = assert(check_targetname(name)) + local target = assert(check_targetnames(name)) local info = _collect_target_info(target) if format == "json" then -- cgit v1.3.1