diff options
| author | ruki <[email protected]> | 2024-02-12 21:01:00 +0800 |
|---|---|---|
| committer | ruki <[email protected]> | 2024-02-12 21:01:00 +0800 |
| commit | a208ed59d8068fbb34a0baae4e01a5276021ac94 (patch) | |
| tree | a5d1837f3f18cd974ad917f4b0bbedfb3e32bb2f | |
| parent | d22eb92376a02e6c4443c7c683531d969eba2d3d (diff) | |
improve to select script
| -rw-r--r-- | xmake/core/base/private/select_script.lua | 70 | ||||
| -rw-r--r-- | xmake/core/package/package.lua | 44 | ||||
| -rw-r--r-- | xmake/core/project/rule.lua | 44 | ||||
| -rw-r--r-- | xmake/core/project/target.lua | 44 |
4 files changed, 76 insertions, 126 deletions
diff --git a/xmake/core/base/private/select_script.lua b/xmake/core/base/private/select_script.lua new file mode 100644 index 000000000..70477f624 --- /dev/null +++ b/xmake/core/base/private/select_script.lua @@ -0,0 +1,70 @@ +--!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 select_script.lua +-- + +-- define module +local instance_deps = instance_deps or {} + +-- load modules +local option = require("base/option") +local string = require("base/string") +local table = require("base/table") + +-- select the matched pattern script for the current platform/architecture +-- +-- the supported pattern: +-- +-- `@linux` +-- `@linux|x86_64` +-- `@macosx,linux` +-- `android@macosx,linux` +-- `android|armeabi-v7a@macosx,linux` +-- `android|armeabi-v7a@macosx,linux|x86_64` +-- `android|armeabi-v7a@linux|x86_64` +-- +function select_script(scripts, opt) + opt = opt or {} + local result = nil + if type(scripts) == "function" then + result = scripts + elseif type(scripts) == "table" then + local plat = opt.plat or "" + local arch = opt.arch or "" + for pattern, script in pairs(scripts) do + local hosts = {} + local hosts_spec = false + pattern = pattern:gsub("@(.+)", function (v) + for _, host in ipairs(v:split(',')) do + hosts[host] = true + hosts_spec = true + end + return "" + end) + if not pattern:startswith("__") and (not hosts_spec or hosts[os.subhost() .. '|' .. os.subarch()] or hosts[os.subhost()]) + and (pattern:trim() == "" or (plat .. '|' .. arch):find('^' .. pattern .. '$') or plat:find('^' .. pattern .. '$')) then + result = script + break + end + end + result = result or scripts["__generic__"] + end + return result +end + +return select_script diff --git a/xmake/core/package/package.lua b/xmake/core/package/package.lua index d151a9317..a3985a5e9 100644 --- a/xmake/core/package/package.lua +++ b/xmake/core/package/package.lua @@ -34,6 +34,7 @@ local option = require("base/option") local hashset = require("base/hashset") local scopeinfo = require("base/scopeinfo") local interpreter = require("base/interpreter") +local select_script = require("base/private/select_script") local memcache = require("cache/memcache") local toolchain = require("tool/toolchain") local compiler = require("tool/compiler") @@ -1662,48 +1663,7 @@ function _instance:script(name, generic) -- get script local script = self:get(name) - local result = nil - if type(script) == "function" then - result = script - elseif type(script) == "table" then - - -- get plat and arch - local plat = self:plat() or "" - local arch = self:arch() or "" - - -- match pattern - -- - -- `@linux` - -- `@linux|x86_64` - -- `@macosx,linux` - -- `android@macosx,linux` - -- `android|armeabi-v7a@macosx,linux` - -- `android|armeabi-v7a@macosx,linux|x86_64` - -- `android|armeabi-v7a@linux|x86_64` - -- - for _pattern, _script in pairs(script) do - local hosts = {} - local hosts_spec = false - _pattern = _pattern:gsub("@(.+)", function (v) - for _, host in ipairs(v:split(',')) do - hosts[host] = true - hosts_spec = true - end - return "" - end) - if not _pattern:startswith("__") and (not hosts_spec or hosts[os.subhost() .. '|' .. os.subarch()] or hosts[os.subhost()]) - and (_pattern:trim() == "" or (plat .. '|' .. arch):find('^' .. _pattern .. '$') or plat:find('^' .. _pattern .. '$')) then - result = _script - break - end - end - - -- get generic script - result = result or script["__generic__"] or generic - end - - -- only generic script - result = result or generic + local result = select_script(script, {plat = self:plat(), arch = self:arch()}) or generic -- imports some modules first if result and result ~= generic then diff --git a/xmake/core/project/rule.lua b/xmake/core/project/rule.lua index c6f476d61..8bf4e1b39 100644 --- a/xmake/core/project/rule.lua +++ b/xmake/core/project/rule.lua @@ -30,6 +30,7 @@ local table = require("base/table") local global = require("base/global") local interpreter = require("base/interpreter") local instance_deps = require("base/private/instance_deps") +local select_script = require("base/private/select_script") local config = require("project/config") local sandbox = require("sandbox/sandbox") local sandbox_os = require("sandbox/modules/os") @@ -147,48 +148,7 @@ function _instance:script(name, generic) -- get script local script = self:get(name) - local result = nil - if type(script) == "function" then - result = script - elseif type(script) == "table" then - - -- get plat and arch - local plat = config.get("plat") or "" - local arch = config.get("arch") or "" - - -- match pattern - -- - -- `@linux` - -- `@linux|x86_64` - -- `@macosx,linux` - -- `android@macosx,linux` - -- `android|armeabi-v7a@macosx,linux` - -- `android|armeabi-v7a@macosx,linux|x86_64` - -- `android|armeabi-v7a@linux|x86_64` - -- - for _pattern, _script in pairs(script) do - local hosts = {} - local hosts_spec = false - _pattern = _pattern:gsub("@(.+)", function (v) - for _, host in ipairs(v:split(',')) do - hosts[host] = true - hosts_spec = true - end - return "" - end) - if not _pattern:startswith("__") and (not hosts_spec or hosts[os.subhost() .. '|' .. os.subarch()] or hosts[os.subhost()]) - and (_pattern:trim() == "" or (plat .. '|' .. arch):find('^' .. _pattern .. '$') or plat:find('^' .. _pattern .. '$')) then - result = _script - break - end - end - - -- get generic script - result = result or script["__generic__"] or generic - end - - -- only generic script - result = result or generic + local result = select_script(script, {plat = config.get("plat"), arch = config.get("arch")}) or generic -- imports some modules first if result and result ~= generic then diff --git a/xmake/core/project/target.lua b/xmake/core/project/target.lua index 25685ccb5..39d43bec9 100644 --- a/xmake/core/project/target.lua +++ b/xmake/core/project/target.lua @@ -32,6 +32,7 @@ local table = require("base/table") local baseoption = require("base/option") local hashset = require("base/hashset") local deprecated = require("base/deprecated") +local select_script = require("base/private/select_script") local instance_deps = require("base/private/instance_deps") local memcache = require("cache/memcache") local rule = require("project/rule") @@ -2341,48 +2342,7 @@ function _instance:script(name, generic) -- get script local script = self:get(name) - local result = nil - if type(script) == "function" then - result = script - elseif type(script) == "table" then - - -- get plat and arch - local plat = self:plat() - local arch = self:arch() - - -- match pattern - -- - -- `@linux` - -- `@linux|x86_64` - -- `@macosx,linux` - -- `android@macosx,linux` - -- `android|armeabi-v7a@macosx,linux` - -- `android|armeabi-v7a@macosx,linux|x86_64` - -- `android|armeabi-v7a@linux|x86_64` - -- - for _pattern, _script in pairs(script) do - local hosts = {} - local hosts_spec = false - _pattern = _pattern:gsub("@(.+)", function (v) - for _, host in ipairs(v:split(',')) do - hosts[host] = true - hosts_spec = true - end - return "" - end) - if not _pattern:startswith("__") and (not hosts_spec or hosts[os.subhost() .. '|' .. os.subarch()] or hosts[os.subhost()]) - and (_pattern:trim() == "" or (plat .. '|' .. arch):find('^' .. _pattern .. '$') or plat:find('^' .. _pattern .. '$')) then - result = _script - break - end - end - - -- get generic script - result = result or script["__generic__"] or generic - end - - -- only generic script - result = result or generic + local result = select_script(script, {plat = self:plat(), arch = self:arch()}) or generic -- imports some modules first if result and result ~= generic then |
