为其他发行版创建软件包

来自 ArchWiki

Arch 是最好的。但您可能仍然想为其他发行版打包。

概述

  • 虚拟化是一种显而易见的方法,但需要维护额外的系统。
  • 使用特定于发行版的打包工具。示例:abuild (Alpine), dh-makeAUR, dpkg (Debian), rpm-tools (Fedora)。诸如 dpkg-deb 之类的快捷方式可能适用于不太复杂的任务。
  • Chrootsystemd-nspawn 在 Arch 内部(但与其分离)创建一个基本系统。示例:debootstrap (Debian), dnf (Fedora)。这样做的好处是在最小、干净的环境中构建。
  • 以自动方式将 chroot 与打包工具结合使用。示例:pbuilder-ubuntuAUR (Debian)。
  • 处理(可能不兼容的)依赖关系的另一种方法是 静态链接。请注意,大多数发行版都不赞成这种做法。
  • 通用实践适用于所使用的发行版。例如,不要以 root 用户身份构建软件包

Alpine

参见 abuild

Debian

Debian 打包教程 解释了基础知识。它描述了以下工具的用法

此条目或章节需要扩充。

原因: 缺少工具:lintian, reprepo, cdbs, svn-buildpackage, javahelper (在 Talk:Creating packages for other distributions 中讨论)
  • cowdancer — pbuilder 的写时复制包装器
https://packages.debian.org/sid/cowdancer || cowdancerAUR
  • debootstrap — 一种从头开始创建 Debian 基本系统的工具,无需 dpkg 或 apt。
https://packages.debian.org/sid/debootstrap || debootstrap
  • devscripts — 使 Debian 软件包维护者生活更轻松的脚本
https://packages.debian.org/sid/devscripts || devscriptsAUR
  • dh-autoreconf — Debhelper 插件,用于调用 autoreconf 并在构建后清理
https://packages.debian.org/sid/dh-autoreconf || dh-autoreconfAUR
  • dh-make — 将源代码存档转换为 Debian 软件包源代码的工具
https://packages.debian.org/sid/dh-make || dh-makeAUR
  • dpkg — Debian 软件包管理器
https://packages.debian.org/sid/dpkg || dpkg
  • dput — Debian 软件包上传工具
https://packages.debian.org/sid/dput || dputAUR
  • git-buildpackage — 来自 Debian 的工具,用于将软件包构建系统与 Git 集成
https://honk.sigxcpu.org/piki/projects/git-buildpackage/ || git-buildpackageAUR
  • pbuilder-ubuntu — 用于构建 Debian 软件包的 Chroot 环境
https://launchpad.net/ubuntu/+source/pbuilder || pbuilder-ubuntuAUR
  • quilt — 通过跟踪每个补丁所做的更改来管理一系列补丁
https://savannah.nongnu.org/projects/quilt || quilt
  • strip-nondeterminism — 用于从文件中剥离非确定性信息位的工具
https://salsa.debian.org/reproducible-builds/strip-nondeterminism || 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,因为 写时复制 提供了显着的性能优势。

# 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
$ dpkg-buildpackage -d -us -uc -S

关于 Debian 的另请参阅

Fedora

此条目或章节需要扩充。

Fedora:如何创建 RPM 软件包

  • rpm-tools — RPM.org 分支,在主要的 RPM 发行版中使用
http://www.rpm.org/ || rpm-tools
  • mock — 获取 Source RPM 并在 chroot 中从中构建 RPM
https://github.com/rpm-software-management/mock/wiki || mockAUR

关于 Fedora 的另请参阅

openSUSE

Open Build Service (OBS) 是一个通用系统,用于以自动、一致和可重现的方式从源代码构建和分发软件包。它至少支持 .deb、.rpm 和 Arch 软件包。

在 OBS 中使用 OSC 创建 Arch 软件包

注意: 对于构建,您必须上传您的 PKGBUILD 文件以及源文件(通过上传或让 OBS 下载文件)。OBS 使用没有网络支持的虚拟机,无法下载任何文件。

创建软件包

  1. [1] 中创建一个帐户
  2. 安装 oscAUR 软件包。上游文档可在此处 获取
  3. 创建一个示例 home:foo 项目。
  4. 创建一个示例 home:foo:bar 子项目(可选,但推荐)。
  5. 使用 osc meta pkg -e home:foo:bar ham 创建一个新的 ham 示例软件包。保存创建的 XML 然后退出。
  6. 切换到干净的工作目录,然后检出您刚刚创建的项目:osc co home:foo:bar/ham
  7. 现在 cd 进入它:cd home:foo:bar/ham

管理软件包

现在是决定如何管理我们的项目的时候了。有两种实用的方法可以做到这一点

  1. 在版本控制系统(例如 git、hg)中维护 PKGBUILD 及其辅助文件(例如 *.install 脚本),然后让 OBS 跟踪它;
  2. 完全在 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 的提示和技巧

此条目或章节已过时。

原因: git 迁移已完成,[community] 已消失。(在 ArchWiki talk:Requests#Git migration 中讨论)
  • 要查看软件包的构建进度,请 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 构建软件包。

另请参阅