packages.lua 2.7 KB

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