为其他发行版创建软件包
Arch 是最好的。但您可能仍然想为其他发行版打包。
概述
- 虚拟化是一种显而易见的方法,但需要维护额外的系统。
- 使用特定于发行版的打包工具。示例:abuild (Alpine), dh-makeAUR, dpkg (Debian), rpm-tools (Fedora)。诸如 dpkg-deb 之类的快捷方式可能适用于不太复杂的任务。
- Chroot 或 systemd-nspawn 在 Arch 内部(但与其分离)创建一个基本系统。示例:debootstrap (Debian), dnf (Fedora)。这样做的好处是在最小、干净的环境中构建。
- 以自动方式将 chroot 与打包工具结合使用。示例:pbuilder-ubuntuAUR (Debian)。
- 处理(可能不兼容的)依赖关系的另一种方法是 静态链接。请注意,大多数发行版都不赞成这种做法。
- 通用实践适用于所使用的发行版。例如,不要以 root 用户身份构建软件包。
Alpine
参见 abuild。
Debian
Debian 打包教程 解释了基础知识。它描述了以下工具的用法
- cowdancer — pbuilder 的写时复制包装器
- debootstrap — 一种从头开始创建 Debian 基本系统的工具,无需 dpkg 或 apt。
- devscripts — 使 Debian 软件包维护者生活更轻松的脚本
- dh-autoreconf — Debhelper 插件,用于调用 autoreconf 并在构建后清理
- dh-make — 将源代码存档转换为 Debian 软件包源代码的工具
- dpkg — Debian 软件包管理器
- dput — Debian 软件包上传工具
- git-buildpackage — 来自 Debian 的工具,用于将软件包构建系统与 Git 集成
- pbuilder-ubuntu — 用于构建 Debian 软件包的 Chroot 环境
- quilt — 通过跟踪每个补丁所做的更改来管理一系列补丁
- strip-nondeterminism — 用于从文件中剥离非确定性信息位的工具
关于 Debian 的提示和技巧
覆盖依赖处理
dpkg 无法识别由 pacman 安装的依赖项。这意味着 dpkg-buildpackage
通常会因如下错误而失败
dpkg-checkbuilddeps: Unmet build dependencies: build-essential:native debhelper (>= 8.0.0) dpkg-buildpackage: warning: build dependencies/conflicts unsatisfied; aborting
要覆盖此项,请使用 -d 标志
$ dpkg-buildpackage -d -us -uc
您可能还需要通过将以下行添加到 debian/rules
来覆盖 dh_shlibdeps
override_dh_shlibdeps: dh_shlibdeps --dpkg-shlibdeps-params=--ignore-missing-info
注意: 任何运行时依赖项(和匹配的版本号)都应手动添加到
debian/control
中,其中 ${shlibs:Depends}
现在没有意义。警告: 即使您设法以这种方式成功构建软件包,也强烈建议在干净的环境(例如 chroot)中构建,以防止任何不兼容性。
设置 chroot
有关 pbuilder-ubuntu 的介绍,请参阅 Pbuilder How-To。建议额外使用 cowdancer,因为 写时复制 提供了显着的性能优势。
- debian-archive-keyring、ubuntu-keyring 和 gnupg1AUR 是必需的。
- eatmydata 可作为 libeatmydata 使用。为防止
LD_PRELOAD
错误,必须在 chroot 内外都安装它。由于 Arch 和 Debian 中的路径不同,请创建以下符号链接
# ln -s /usr/lib/libeatmydata.so.1.1.1 /usr/lib/libeatmydata/libeatmydata.so # ln -s /usr/lib/libeatmydata.so.1.1.1 /usr/lib/libeatmydata/libeatmydata.so.1
- 示例 pbuilderrc
- 要创建源软件包供 pbuilder 处理
$ dpkg-buildpackage -d -us -uc -S
关于 Debian 的另请参阅
Fedora
- rpm-tools — RPM.org 分支,在主要的 RPM 发行版中使用
- mock — 获取 Source RPM 并在 chroot 中从中构建 RPM
关于 Fedora 的另请参阅
openSUSE
Open Build Service (OBS) 是一个通用系统,用于以自动、一致和可重现的方式从源代码构建和分发软件包。它至少支持 .deb、.rpm 和 Arch 软件包。
在 OBS 中使用 OSC 创建 Arch 软件包
注意: 对于构建,您必须上传您的 PKGBUILD 文件以及源文件(通过上传或让 OBS 下载文件)。OBS 使用没有网络支持的虚拟机,无法下载任何文件。
创建软件包
- 在 [1] 中创建一个帐户
- 安装 oscAUR 软件包。上游文档可在此处 获取。
- 创建一个示例
home:foo
项目。 - 创建一个示例
home:foo:bar
子项目(可选,但推荐)。 - 使用
osc meta pkg -e home:foo:bar ham
创建一个新的ham
示例软件包。保存创建的 XML 然后退出。 - 切换到干净的工作目录,然后检出您刚刚创建的项目:
osc co home:foo:bar/ham
。 - 现在 cd 进入它:
cd home:foo:bar/ham
。
管理软件包
现在是决定如何管理我们的项目的时候了。有两种实用的方法可以做到这一点
- 在版本控制系统(例如 git、hg)中维护 PKGBUILD 及其辅助文件(例如 *.install 脚本),然后让 OBS 跟踪它;
- 完全在 OBS 本身中维护软件包。
第一个版本更灵活和动态。要继续
- 从您的项目目录中,创建一个具有以下内容的
_service
文件
<services> <service name="tar_scm"> <param name="scm">git</param> <param name="url">git://<your_repo_here></param> <param name="versionformat">git%cd~%h</param> <param name="versionprefix"><your_version_here></param> <param name="filename"><name_of_your_package></param> </service> <service name="recompress"> <param name="file">*.tar</param> <param name="compression">xz</param> </service> <service name="set_version"/> </services>
这是一个 gimp-gitAUR 的示例
<services> <service name="tar_scm"> <param name="scm">git</param> <param name="url">git://git.gnome.org/gimp.git</param> <param name="versionformat">git%cd~%h</param> <param name="versionprefix">2.9.1</param> <param name="filename">gimp-git</param> </service> <service name="recompress"> <param name="file">*.tar</param> <param name="compression">xz</param> </service> <service name="set_version"/> </services>
- 让 OBS 跟踪它:
osc add _service
- 如果您有任何其他文件要包含到仓库中,只需像以前一样继续:在项目目录中添加文件,然后让 OBS 跟踪它们(OBS 使用 subversion 作为其底层 SCM,因此此过程您可能已经熟悉)
- 检入(=上传)您的文件到仓库
osc ci -m "提交消息(例如,将软件包 xxx 升级到版本 yyy"
。
现在,过一会儿,OBS 将开始构建您的软件包。
关于 openSUSE 的提示和技巧
- 要查看软件包的构建进度,请 cd 进入其工作目录,然后:
osc results
。 - 有三个存储库,Arch:Core、Arch:Extra 和 Arch:Community。[community] 可以在将主 Arch 存储库添加到项目后作为“存储库路径”附加。
ca-certificates-utils 软件包问题
如果 OBS 构建因 ca-certificates-utils 软件包而失败,您可以将此行添加到您的项目配置中(从您的项目页面,转到高级 -> 项目配置)。
Prefer: ca-certificates-utils ca-certificates
关于 openSUSE 的另请参阅
多发行版
Pacur
诸如 Pacur 之类的一些工具允许使用一致的软件包规范格式为多个 Linux 发行版构建软件包。软件包格式与 PKGBUILD 非常相似,因此可以轻松地重用现有的 PKGBUILD 并添加一些特定于发行版的变量,以便轻松构建 debian 和 rpm 软件包。通过快速调整 PKGBUILD,人们能够为 Amazon Linux、Centos、Debian、Oracle Linux、Fedora 和 Ubuntu 构建软件包。