packages.lua 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. -- imports
  2. import("core.package.package")
  3. import("core.platform.platform")
  4. import("private.core.base.select_script")
  5. -- is supported platform and architecture?
  6. function is_supported(instance, plat, arch, opt)
  7. opt = opt or {}
  8. if instance:is_template() then
  9. return false
  10. end
  11. local script = instance:get(instance:is_fetchonly() and "fetch" or "install")
  12. if not select_script(script, {plat = plat, arch = arch}) then
  13. if opt.native and select_script(script, {
  14. plat = plat, arch = arch, subhost = plat, subarch = arch}) then
  15. return true
  16. end
  17. return false
  18. end
  19. return true
  20. end
  21. -- load package
  22. function _load_package(packagename, packagedir, packagefile)
  23. local funcinfo = debug.getinfo(package.load_from_repository)
  24. if funcinfo and funcinfo.nparams == 3 then -- >= 2.7.8
  25. return package.load_from_repository(packagename, packagedir, {packagefile = packagefile})
  26. else
  27. -- deprecated
  28. return package.load_from_repository(packagename, nil, packagedir, packagefile)
  29. end
  30. end
  31. -- the main entry
  32. function main(opt)
  33. opt = opt or {}
  34. local packages = {}
  35. for _, packagedir in ipairs(os.dirs(path.join("packages", "*", "*"))) do
  36. local packagename = path.filename(packagedir)
  37. local packagefile = path.join(packagedir, "xmake.lua")
  38. local instance = _load_package(packagename, packagedir, packagefile)
  39. local basename = instance:get("base")
  40. if instance and basename then
  41. local basedir = path.join("packages", basename:sub(1, 1):lower(), basename:lower())
  42. local basefile = path.join(basedir, "xmake.lua")
  43. instance._BASE = _load_package(basename, basedir, basefile)
  44. end
  45. if instance then
  46. for _, plat in ipairs({"windows", "linux", "macosx", "iphoneos", "android", "mingw", "msys", "bsd", "wasm", "cross"}) do
  47. local archs = platform.archs(plat)
  48. if archs then
  49. local package_archs = {}
  50. for _, arch in ipairs(archs) do
  51. if is_supported(instance, plat, arch, opt) then
  52. table.insert(package_archs, arch)
  53. end
  54. end
  55. if #package_archs > 0 then
  56. packages[plat] = packages[plat] or {}
  57. table.insert(packages[plat], {name = instance:name(), instance = instance, archs = package_archs, generic = #package_archs == #archs})
  58. end
  59. end
  60. end
  61. end
  62. end
  63. for _, packages_plat in pairs(packages) do
  64. table.sort(packages_plat, function(a, b) return a.name < b.name end)
  65. end
  66. return packages
  67. end