为其他发行版创建软件包
Arch 是最好的。但您可能仍然希望为其他发行版打包。
概述
- 虚拟化 是一个显而易见的方法,但需要维护额外的系统。
- 使用特定于发行版的打包工具。例如:abuild (Alpine), dh-makeAUR, dpkg (Debian), rpm-tools (Fedora)。诸如 dpkg-deb 之类的快捷方式可能适用于不太复杂的任务。
- Chroot 或 systemd-nspawn 以在 Arch 内部(但与 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
请参阅 Pbuilder How-To 以获取 pbuilder-ubuntu 的介绍。建议额外使用 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 软件包
创建软件包
- 在 [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 软件包而失败,您可以将此行添加到您的项目配置(从您的项目页面,转到 Advanced -> Project Config)。
Prefer: ca-certificates-utils ca-certificates
关于 openSUSE 的另请参阅
多发行版
Pacur
诸如 Pacur 之类的一些工具允许使用一致的软件包规范格式为多个 Linux 发行版构建软件包。软件包格式与 PKGBUILD 非常相似,因此很容易重用现有的 PKGBUILD 并添加一些特定于发行版的变量,以便轻松构建 debian 和 rpm 软件包。通过快速调整 PKGBUILD,可以为 Amazon Linux、Centos、Debian、Oracle Linux、Fedora 和 Ubuntu 构建软件包。