Creating packages for other distributions

Arch is the best. But you may still want to package for other distributions.

General

  • Virtualization is an obvious way, but requires maintaining additional system(s).
  • Use distribution-specific packaging tools. Examples: dh-makeAUR, dpkg (Debian), rpm-tools (Fedora). Shortcuts such as dpkg-deb may be suited for less complex tasks.
  • Chroot or systemd-nspawn to create a base system inside (yet separate from) Arch. Examples: debootstrap (Debian), dnf (Fedora). This has the added benefit of building in a minimal, clean environment.
  • Use chroot with packaging tools in an an automated fashion. Examples: pbuilder-ubuntuAUR (Debian).
  • A different way to handle (possibly incompatible) dependencies is static linking. Please note that most distributions frown on this practice.
  • Common practice applies regardless of distribution used. For example, do not build packages as root.

Debian

The Debian Packaging Tutorial explains the groundwork. It describes use of the following tools:

  • cowdancer Copy-on-write wrapper for pbuilder
https://packages.debian.org/sid/cowdancer || cowdancerAUR
  • dh-make Tool that converts source archives into Debian package source
https://packages.debian.org/sid/dh-make || dh-makeAUR
  • quilt Manage a series of patches by keeping track of the changes each patch makes
https://savannah.nongnu.org/projects/quilt || quilt

Override dependency handling

dpkg does not recognize dependencies installed by pacman. This means will generally fail with errors such as:

dpkg-checkbuilddeps: Unmet build dependencies: build-essential:native debhelper (>= 8.0.0)
dpkg-buildpackage: warning: build dependencies/conflicts unsatisfied; aborting

To override this, use the -d flag:

$ dpkg-buildpackage -d -us -uc

You may also need to override by adding the following lines to :

override_dh_shlibdeps:
   dh_shlibdeps --dpkg-shlibdeps-params=--ignore-missing-info
Note: Any run-time dependencies (and matching version numbers) should be added manually to debian/control, where ${shlibs:Depends} now has no meaning.

Set up a chroot

See the Pbuilder How-To for an introduction to pbuilder-ubuntu. Using cowdancer in addition is recommended as copy-on-write offers a significant performance benefit.

  • , and are required.
  • eatmydata is available as and . To prevent LD_PRELOAD errors, it must be installed both inside and outside the chroot. As the paths are different in Arch and Debian, create the following symbolic links:
# 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

See also about Debian

Fedora

Fedora:How to create an RPM package

  • mock Takes Source RPMs and builds RPMs from them in a chroot
https://github.com/rpm-software-management/mock/wiki || mockAUR

See also about Fedora

openSUSE

The Open Build Service (OBS) is a generic system to build and distribute packages from sources in an automatic, consistent and reproducible way. It supports at least .deb, .rpm and Arch packages.

Creating a package

  1. Create an account in
  2. Install the package. Upstream documentation is available here.
  3. Create an example project.
  4. Create an example subproject (optional, but recommended).
  5. Create a new example package with . Save the created XML then exit.
  6. Switch to a clean working directory then checkout the project you have just created: .
  7. Now cd into it: .

Managing a package

Now it is time to decide how we will manage our project. There are two practical ways to do this:

  1. Maintain a PKGBUILD plus its helper files (such as *.install scripts) in a version control system (such as git, hg) then just make OBS track it;
  2. Maintain a package entirely in OBS itself.

The first version is more flexible and dynamic. To proceed:

  • From your project directory, create a _service file with the following contents:
<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>

Here is an example for :

<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>
  • Make OBS track it:
  • If you have any other files to include into the repo, just proceed as before: add the files in the project directory, then make OBS track them (OBS uses subversion as its underlying SCM, so this process might already be familiar for you)
  • Check-in (=upload) your files into the repo .

Now, after a while, OBS will begin building your package.

Tips and tricks about openSUSE

  • To see the build progress of your package, cd into its working directory, then: .
  • There are three repositories, Arch:Core, Arch:Extra and Arch:Community. [community] can be appended as a "repository path" after adding the main Arch repository to the project.

ca-certificates-utils package problem

If OBS build fails because of the ca-certificates-utils package, you can add this line to your project config (from your project page, go to Advanced -> Project Config).

Prefer: ca-certificates-utils ca-certificates

See also about openSUSE

Multi-distribution

Pacur

Some tools such as Pacur allow building packages for multiple Linux distributions with a consistent package specification format. The package format is very similar to PKGBUILD so it is easy to re-use an existing PKGBUILD and add a few distribution-specific variables to be able to build debian and rpm packages effortlessly. By quickly adapting a PKGBUILD one is able to build package for Amazon Linux, Centos, Debian, Oracle Linux, Fedora and Ubuntu.

gollark: You'd probably need a way to ensure that the caretakers do not do their jobs badly, is the main issue.
gollark: That actually would have a lot of advantages.
gollark: Cool idea.
gollark: logici™
gollark: Well, less time at work → more time for children. logic™.

See also

This article is issued from Archlinux. The text is licensed under Creative Commons - Attribution - Sharealike. Additional terms may apply for the media files.