2
0

packages.lua 2.5 KB

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