summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLingfeng Fu <[email protected]>2023-06-09 23:17:41 +0800
committerLingfeng Fu <[email protected]>2023-06-09 23:17:41 +0800
commita6c95c916e566de85a5620904d0db5728d781a7d (patch)
tree0ede76ec352314497f21f93f183db8ca4b80169e
parente13615bd53b985222986cbe01e4eb6d7fe69f47e (diff)
add zypper support
-rw-r--r--xmake/modules/detect/tools/find_rpm.lua54
-rw-r--r--xmake/modules/detect/tools/find_zypper.lua54
-rw-r--r--xmake/modules/package/manager/zypper/find_package.lua152
-rw-r--r--xmake/modules/package/manager/zypper/install_package.lua62
-rw-r--r--xmake/modules/package/manager/zypper/search_package.lua59
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