package An official xmake package repository
https://xrepo.xmake.io/
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
94 lines
3.4 KiB
94 lines
3.4 KiB
-- imports |
|
import("core.package.package") |
|
import("core.platform.platform") |
|
|
|
-- is supported platform and architecture? |
|
function _is_supported(instance, plat, arch) |
|
|
|
-- get script |
|
local script = instance:get("install") |
|
local result = nil |
|
if type(script) == "function" then |
|
result = script |
|
elseif type(script) == "table" then |
|
|
|
-- get plat and arch |
|
local plat = plat or "" |
|
local arch = arch or "" |
|
|
|
-- match script for special plat and arch |
|
local pattern = plat .. '|' .. arch |
|
for _pattern, _script in pairs(script) do |
|
local hosts = {} |
|
local hosts_spec = false |
|
_pattern = _pattern:gsub("@(.+)", function (v) |
|
-- get and remove hosts for `android|armv7-a@macosx,linux` |
|
for _, host in ipairs(v:split(',')) do |
|
hosts[host] = true |
|
hosts_spec = true |
|
end |
|
return "" |
|
end) |
|
if not _pattern:startswith("__") and pattern:find('^' .. _pattern .. '$') and (not hosts_spec or hosts[os.host()]) then |
|
result = _script |
|
break |
|
end |
|
end |
|
|
|
-- match script for special plat |
|
if result == nil then |
|
for _pattern, _script in pairs(script) do |
|
local hosts = {} |
|
local hosts_spec = false |
|
_pattern = _pattern:gsub("@(.+)", function (v) |
|
-- get and remove hosts for `android@macosx,linux` |
|
for _, host in ipairs(v:split(',')) do |
|
hosts[host] = true |
|
hosts_spec = true |
|
end |
|
return "" |
|
end) |
|
if not _pattern:startswith("__") and plat:find('^' .. _pattern .. '$') and (not hosts_spec or hosts[os.host()]) then |
|
result = _script |
|
break |
|
end |
|
end |
|
end |
|
|
|
-- get generic script |
|
result = result or script["__generic__"] |
|
end |
|
return result |
|
end |
|
|
|
-- the main entry |
|
function main(...) |
|
local packages = {} |
|
local plat = os.host() |
|
for _, packagedir in ipairs(os.dirs(path.join("packages", "*", "*"))) do |
|
local packagename = path.filename(packagedir) |
|
local packagefile = path.join(packagedir, "xmake.lua") |
|
local instance = package.load_from_repository(packagename, nil, packagedir, packagefile) |
|
if instance then |
|
for _, plat in ipairs({"windows", "linux", "macosx", "iphoneos", "android", "mingw"}) do |
|
local archs = platform.archs(plat) |
|
if archs then |
|
local package_archs = {} |
|
for _, arch in ipairs(archs) do |
|
if _is_supported(instance, plat, arch) then |
|
table.insert(package_archs, arch) |
|
end |
|
end |
|
if #package_archs > 0 then |
|
packages[plat] = packages[plat] or {} |
|
table.insert(packages[plat], {name = instance:name(), archs = package_archs, generic = #package_archs == #archs}) |
|
end |
|
end |
|
end |
|
end |
|
end |
|
for _, packages_plat in pairs(packages) do |
|
table.sort(packages_plat, function(a, b) return a.name < b.name end) |
|
end |
|
return packages |
|
end
|
|
|