packages.lua 2.5 KB

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