summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorruki <[email protected]>2019-01-21 22:43:26 +0800
committerruki <[email protected]>2019-01-21 10:20:37 +0800
commit8adc05268ed172871aef4a1b3c97dc8f2dcbd8f2 (patch)
tree8cdc64fb209222fe14a51562f664f2f26ce38549
parent41d7ccc69187d460c8155ba93e941fe0e85a796e (diff)
improve install_package
-rw-r--r--xmake/modules/package/manager/find_package.lua50
-rw-r--r--xmake/modules/package/manager/install_package.lua72
2 files changed, 100 insertions, 22 deletions
diff --git a/xmake/modules/package/manager/find_package.lua b/xmake/modules/package/manager/find_package.lua
index 8de7c483f..3cf608ee3 100644
--- a/xmake/modules/package/manager/find_package.lua
+++ b/xmake/modules/package/manager/find_package.lua
@@ -22,6 +22,37 @@
-- @file find_package.lua
--
+-- imports
+import("core.base.semver")
+import("core.project.config")
+import("lib.detect.cache")
+
+-- find package
+function _find(manager_name, package_name, opt)
+
+ -- get managers
+ local managers = {}
+ if manager_name then
+ table.insert(managers, manager_name)
+ else
+ if not is_host("windows") then
+ table.insert(managers, "brew")
+ end
+ table.insert(managers, "vcpkg")
+ table.insert(managers, "conan")
+ end
+ assert(#managers > 0, "no suitable package manager!")
+
+ -- find package from the given package manager
+ for _, manager_name in ipairs(managers) do
+ vprint("finding %s from %s ..", package_name, manager_name)
+ local result = import("package.manager." .. manager_name .. ".find_package", {anonymous = true})(package_name, opt)
+ if result then
+ return result
+ end
+ end
+end
+
-- find package using the package manager
--
-- @param name the package name, e.g. zlib 1.12.x (try all), XMAKE::zlib 1.12.x, BREW::zlib, VCPKG::zlib, CONAN::OpenSSL/1.0.2n@conan/stable
@@ -30,4 +61,23 @@
--
function main(name, opt)
+ -- get the copied options
+ opt = table.copy(opt)
+
+ -- get package manager name
+ local manager_name, package_name = unpack(name:split("::", true))
+ if package_name == nil then
+ package_name = manager_name
+ manager_name = nil
+ else
+ manager_name = manager_name:lower():trim()
+ end
+
+ -- get package name and require version
+ local require_version = nil
+ package_name, require_version = unpack(package_name:trim():split("%s+"))
+ opt.version = require_version or opt.version
+
+
+ _find(manager_name, package_name, opt)
end
diff --git a/xmake/modules/package/manager/install_package.lua b/xmake/modules/package/manager/install_package.lua
index 4981d5746..aca5e9758 100644
--- a/xmake/modules/package/manager/install_package.lua
+++ b/xmake/modules/package/manager/install_package.lua
@@ -22,33 +22,61 @@
-- @file install_package.lua
--
+-- install package
+function _install(manager_name, package_name, opt)
+
+ -- get managers
+ local managers = {}
+ if manager_name then
+ table.insert(managers, manager_name)
+ else
+ if is_host("windows") then
+ table.insert(managers, "pacman") -- msys/mingw
+ elseif is_host("linux") then
+ table.insert(managers, "apt")
+ table.insert(managers, "yum")
+ table.insert(managers, "pacman")
+ table.insert(managers, "brew")
+ elseif is_host("macosx") then
+ table.insert(managers, "brew")
+ end
+ end
+ assert(#managers > 0, "no suitable package manager!")
+
+ -- find package from the given package manager
+ for _, manager_name in ipairs(managers) do
+ vprint("installing %s from %s ..", package_name, manager_name)
+ if import("package.manager." .. manager_name .. ".install_package", {anonymous = true})(package_name, opt) then
+ break
+ end
+ end
+end
+
-- install package using the package manager
--
--- @param name the package name
--- @param opt the options, .e.g {verbose = true, brew = "the package name in brew", pacman = "xxx", apt = "xxx", yum = "xxx"}
---
+-- @param name the package name, e.g. zlib 1.12.x (try all), XMAKE::zlib 1.12.x, BREW::zlib, VCPKG::zlib, CONAN::OpenSSL/1.0.2n@conan/stable
+-- @param opt the options, .e.g {verbose = true, version = "1.12.x")
--
function main(name, opt)
- -- init scripts
- local scripts = {}
- local host = os.host()
- if host == "macosx" then
- table.insert(scripts, import("brew.install_package", {anonymous = true}))
- elseif host == "linux" then
- table.insert(scripts, import("apt.install_package", {anonymous = true}))
- table.insert(scripts, import("yum.install_package", {anonymous = true}))
- table.insert(scripts, import("pacman.install_package", {anonymous = true}))
- table.insert(scripts, import("brew.install_package", {anonymous = true}))
- elseif host == "windows" then
- table.insert(scripts, import("pacman.install_package", {anonymous = true})) -- msys/mingw
- end
- assert(#scripts > 0, "the package manager not found!")
+ -- get the copied options
+ opt = table.copy(opt)
- -- run install script
- for _, script in ipairs(scripts) do
- if script(name, opt) then
- break
- end
+ -- get package manager name
+ local manager_name, package_name = unpack(name:split("::", true))
+ if package_name == nil then
+ package_name = manager_name
+ manager_name = nil
+ else
+ manager_name = manager_name:lower():trim()
end
+
+ -- get package name and require version
+ local require_version = nil
+ package_name, require_version = unpack(package_name:trim():split("%s+"))
+ opt.version = require_version or opt.version
+
+ -- do install package
+ _install(manager_name, package_name, opt)
+
end