diff options
| author | Lingfeng Fu <[email protected]> | 2023-06-09 23:17:41 +0800 |
|---|---|---|
| committer | Lingfeng Fu <[email protected]> | 2023-06-09 23:17:41 +0800 |
| commit | a6c95c916e566de85a5620904d0db5728d781a7d (patch) | |
| tree | 0ede76ec352314497f21f93f183db8ca4b80169e | |
| parent | e13615bd53b985222986cbe01e4eb6d7fe69f47e (diff) | |
add zypper support
| -rw-r--r-- | xmake/modules/detect/tools/find_rpm.lua | 54 | ||||
| -rw-r--r-- | xmake/modules/detect/tools/find_zypper.lua | 54 | ||||
| -rw-r--r-- | xmake/modules/package/manager/zypper/find_package.lua | 152 | ||||
| -rw-r--r-- | xmake/modules/package/manager/zypper/install_package.lua | 62 | ||||
| -rw-r--r-- | xmake/modules/package/manager/zypper/search_package.lua | 59 |
5 files changed, 381 insertions, 0 deletions
diff --git a/xmake/modules/detect/tools/find_rpm.lua b/xmake/modules/detect/tools/find_rpm.lua new file mode 100644 index 000000000..02c59b5e3 --- /dev/null +++ b/xmake/modules/detect/tools/find_rpm.lua @@ -0,0 +1,54 @@ +--!A cross-platform build utility based on Lua +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- +-- Copyright (C) 2015-present, TBOOX Open Source Group. +-- +-- @author ruki, Lingfeng Fu +-- @file find_rpm.lua +-- + +-- imports +import("lib.detect.find_program") +import("lib.detect.find_programver") + +-- find rpm +-- +-- @param opt the argument options, e.g. {version = true} +-- +-- @return program, version +-- +-- @code +-- +-- local rpm = find_rpm() +-- local rpm, version = find_rpm({version = true}) +-- +-- @endcode +-- +function main(opt) + + -- init options + opt = opt or {} + + -- find program + local program = find_program(opt.program or "rpm", opt) + + -- find program version + local version = nil + if program and opt and opt.version then + version = find_programver(program, opt) + end + + -- ok? + return program, version +end diff --git a/xmake/modules/detect/tools/find_zypper.lua b/xmake/modules/detect/tools/find_zypper.lua new file mode 100644 index 000000000..cc0fb0445 --- /dev/null +++ b/xmake/modules/detect/tools/find_zypper.lua @@ -0,0 +1,54 @@ +--!A cross-platform build utility based on Lua +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- +-- Copyright (C) 2015-present, TBOOX Open Source Group. +-- +-- @author ruki, Lingfeng Fu +-- @file find_zypper.lua +-- + +-- imports +import("lib.detect.find_program") +import("lib.detect.find_programver") + +-- find zypper +-- +-- @param opt the argument options, e.g. {version = true} +-- +-- @return program, version +-- +-- @code +-- +-- local zypper = find_zypper() +-- local zypper, version = find_zypper({version = true}) +-- +-- @endcode +-- +function main(opt) + + -- init options + opt = opt or {} + + -- find program + local program = find_program(opt.program or "zypper", opt) + + -- find program version + local version = nil + if program and opt and opt.version then + version = find_programver(program, opt) + end + + -- ok? + return program, version +end
\ No newline at end of file diff --git a/xmake/modules/package/manager/zypper/find_package.lua b/xmake/modules/package/manager/zypper/find_package.lua new file mode 100644 index 000000000..53db5467e --- /dev/null +++ b/xmake/modules/package/manager/zypper/find_package.lua @@ -0,0 +1,152 @@ +--!A cross-platform build utility based on Lua +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- +-- Copyright (C) 2015-present, TBOOX Open Source Group. +-- +-- @author ruki, Lingfeng Fu +-- @file find_package.lua +-- + +-- imports +import("core.base.option") +import("core.project.config") +import("core.project.target") +import("lib.detect.find_tool") +import("package.manager.pkgconfig.find_package", { alias = "find_package_from_pkgconfig" }) + +-- find package +function _find_package(rpm, zypper, name, opt) + local result = nil + local pkgconfig_files = {} + local listinfo = try { function() + return os.iorunv(rpm.program, { "-ql", name }) + end } + if listinfo then + for _, line in ipairs(listinfo:split('\n', { plain = true })) do + line = line:trim() + + -- get includedirs + local pos = line:find("include/", 1, true) + if pos then + -- we need not add includedirs, gcc/clang will use /usr/ as default sysroot + result = result or {} + end + + -- get pc files + if line:find("/pkgconfig/", 1, true) and line:endswith(".pc") then + table.insert(pkgconfig_files, line) + end + + -- get linkdirs and links + if line:endswith(".a") or line:endswith(".so") then + result = result or {} + result.links = result.links or {} + result.linkdirs = result.linkdirs or {} + result.libfiles = result.libfiles or {} + table.insert(result.linkdirs, path.directory(line)) + table.insert(result.links, target.linkname(path.filename(line), { plat = opt.plat })) + table.insert(result.libfiles, path.join(path.directory(line), path.filename(line))) + end + end + end + + -- we iterate over each pkgconfig file to extract the required data + local foundpc = false + local pcresult = { includedirs = {}, linkdirs = {}, links = {} } + for _, pkgconfig_file in ipairs(pkgconfig_files) do + local pkgconfig_dir = path.directory(pkgconfig_file) + local pkgconfig_name = path.basename(pkgconfig_file) + local pcinfo = find_package_from_pkgconfig(pkgconfig_name, { configdirs = pkgconfig_dir, linkdirs = linkdirs }) + + -- the pkgconfig file has been parse successfully + if pcinfo then + for _, includedir in ipairs(pcinfo.includedirs) do + table.insert(pcresult.includedirs, includedir) + end + for _, linkdir in ipairs(pcinfo.linkdirs) do + table.insert(pcresult.linkdirs, linkdir) + end + for _, link in ipairs(pcinfo.links) do + table.insert(pcresult.links, link) + end + -- version should be the same if a pacman package contains multiples .pc + pcresult.version = pcinfo.version + foundpc = true + end + end + if foundpc == true then + pcresult.includedirs = table.unique(pcresult.includedirs) + pcresult.linkdirs = table.unique(pcresult.linkdirs) + pcresult.links = table.reverse_unique(pcresult.links) + result = pcresult + end + + -- meta/alias package? e.g. libboost_headers-devel -> libboost_headers1_82_0-devel + -- @see https://github.com/xmake-io/xmake/issues/1786 + if not result then + local statusinfo = try { function() + return os.iorunv(zypper.program, { "info", "--requires", name }) + end } + if statusinfo then + for _, line in ipairs(statusinfo:split("\n", { plain = true })) do + -- parse depends, e.g. Depends: libboost1.74-dev + if line:startswith("Requires") then + local depends = line:split("^Requires%s+:%s+") + if #depends == 1 then + return _find_package(rpm, zypper, depends[1], opt) + end + break + end + end + end + end + + -- remove repeat + if result then + if result.links then + result.links = table.unique(result.links) + end + if result.linkdirs then + result.linkdirs = table.unique(result.linkdirs) + end + if result.includedirs then + result.includedirs = table.unique(result.includedirs) + end + end + return result +end + +-- find package using the rpm package manager +-- +-- @param name the package name +-- @param opt the options, e.g. {verbose = true, version = "1.12.0") +-- +function main(name, opt) + + -- check + opt = opt or {} + if not is_host(opt.plat) or os.arch() ~= opt.arch then + return + end + + -- find rpm and zypper + local rpm = find_tool("rpm") + local zypper = find_tool("zypper") + if not (rpm and zypper) then + return + end + + -- find package + return _find_package(rpm, zypper, name, opt) +end diff --git a/xmake/modules/package/manager/zypper/install_package.lua b/xmake/modules/package/manager/zypper/install_package.lua new file mode 100644 index 000000000..8beb45ff1 --- /dev/null +++ b/xmake/modules/package/manager/zypper/install_package.lua @@ -0,0 +1,62 @@ +--!A cross-platform build utility based on Lua +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- +-- Copyright (C) 2015-present, TBOOX Open Source Group. +-- +-- @author ruki, Lingfeng Fu +-- @file install_package.lua +-- + +-- imports +import("core.base.option") +import("lib.detect.find_tool") +import("privilege.sudo") + +-- install package +-- +-- @param name the package name +-- @param opt the options, e.g. {verbose = true, apt = "the package name"} +-- +-- @return true or false +-- +function main(name, opt) + + -- init options + opt = opt or {} + + -- find apt + local zypper = find_tool("zypper") + if not zypper then + raise("apt not found!") + end + + -- init argv + local argv = { "install", "-y", opt.zypper or name } + + -- install package directly if the current user is root + if os.isroot() then + os.vrunv(zypper.program, argv) + -- install with administrator permission? + elseif sudo.has() then + + -- install it if be confirmed + local description = format("try installing %s with administrator permission", name) + local confirm = utils.confirm({ default = true, description = description }) + if confirm then + sudo.vrunv(zypper.program, argv) + end + else + raise("cannot get administrator permission!") + end +end diff --git a/xmake/modules/package/manager/zypper/search_package.lua b/xmake/modules/package/manager/zypper/search_package.lua new file mode 100644 index 000000000..daa8714d5 --- /dev/null +++ b/xmake/modules/package/manager/zypper/search_package.lua @@ -0,0 +1,59 @@ +--!A cross-platform build utility based on Lua +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- +-- Copyright (C) 2015-present, TBOOX Open Source Group. +-- +-- @author ruki, Lingfeng Fu +-- @file search_package.lua +-- + +-- imports +import("core.base.option") +import("lib.detect.find_tool") + +-- search package using the zypper package manager +-- +-- @param name the package name with pattern +-- +function main(name) + + -- find zypper + local zypper = find_tool("zypper") + if not zypper then + raise("zypper not found!") + end + + -- search packages + -- + -- | libboost_wave-devel | Development headers for Boost.Wave library | package + -- + -- i | libboost_wave-devel | Development headers for Boost.Wave library | package + -- + -- i+ | libboost_headers-devel | Development headers for Boost | package + -- + local results = {} + local searchdata = os.iorunv(zypper.program, { "search", name }) + for _, line in ipairs(searchdata:split("\n", { plain = true })) do + if line:endswith("package") then + local splitinfo = line:split("%s+|%s+", { limit = 4 }) + if not line:startswith(" ") then + table.remove(splitinfo, 1) + end + local packagename = splitinfo[1] + local description = splitinfo[2] + table.insert(results, { name = "zypper::" .. packagename, version = version, description = description }) + end + end + return results +end |
