diff options
| author | ruki <[email protected]> | 2019-01-21 22:43:26 +0800 |
|---|---|---|
| committer | ruki <[email protected]> | 2019-01-21 10:20:37 +0800 |
| commit | 8adc05268ed172871aef4a1b3c97dc8f2dcbd8f2 (patch) | |
| tree | 8cdc64fb209222fe14a51562f664f2f26ce38549 | |
| parent | 41d7ccc69187d460c8155ba93e941fe0e85a796e (diff) | |
improve install_package
| -rw-r--r-- | xmake/modules/package/manager/find_package.lua | 50 | ||||
| -rw-r--r-- | xmake/modules/package/manager/install_package.lua | 72 |
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 |
