summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorruki <[email protected]>2024-02-12 21:01:00 +0800
committerruki <[email protected]>2024-02-12 21:01:00 +0800
commita208ed59d8068fbb34a0baae4e01a5276021ac94 (patch)
treea5d1837f3f18cd974ad917f4b0bbedfb3e32bb2f
parentd22eb92376a02e6c4443c7c683531d969eba2d3d (diff)
improve to select script
-rw-r--r--xmake/core/base/private/select_script.lua70
-rw-r--r--xmake/core/package/package.lua44
-rw-r--r--xmake/core/project/rule.lua44
-rw-r--r--xmake/core/project/target.lua44
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