Jump to content

Packaging

From postmarketOS Wiki
Revision as of 20:40, 30 November 2017 by Ollieparanoid (talk | contribs) (Packaging git commits: document how to put $_commit in the source filename)

Here is a practical approach on how to port packages from other Linux distributions to pmOS (because that is usually the fastest way). Feel free to extend this information, and to add other distributions.

General information

  • Please read this section from our upstream friends wiki (which we should also extend and improve)
  • Please always package the latest version of a software (unless it is impossible because of software that depends on it, but try to avoid that!)
  • Please do not copy maintainers/contributors from the other packages to your new ports (so they won't get annoyed by questions for pmOS/Alpine packages!). Instead please credit them in the commit messages (maybe with a link to the original build recipe)
  • Alpine Linux uses musl as libc, not glibc. Never add glibc as dependency.
  • Alpine uses busybox' sh for building packages. Do not use bash specific features.
  • Manpages and other documentation goes into an extra -doc package in Alpine, and abuild will complain if the main package contains them. The solution is to add this: subpackages="$pkgname-doc" (more info)
  • You can look up the exact meaning of every variable and function in the APKBUILD Reference
  • Set up the git hook from the development guide article to automatically verify checksums in your APKBUILDs and therefore making your life easier
  • How to create a patch when packaging software

Beware of legacy APKBUILDs

Alpine's program to build packages, abuild evolves constantly. But the APKBUILDs sometimes lack behind. Some APKBUILDs still have the following, which is unnecessary:

  • || return 1 statements after every line (e.g. make || return 1 is not needed anymore, use make instead)
  • a custom prepare() function that does nothing but apply patches (more information))
  • not using the builddir variable to point to the extracted source location (usually: builddir="$srcdir/$pkgname-$pkgver")

Packaging git commits

Only package git commits when necessary. Stable releases are preferred. Consider asking upstream to tag releases.

  • pkgver: We use the following format: $lastrelease_gitYYYYMMDD, e.g. 1.0_git20171101 (that makes it easy to see how old the commit is and apk is able to upgrade the package properly when the next release, e.g. 1.1, comes out)
  • Save the git commit in a variable _commit=.... and use it throughout the APKBUILD (e.g. in the builddir), so it's easy to update it.
  • The source should be saved with the $_commit in the filename. For GitHub links, this means:
 source="$pkgname-$_commit.tar.gz::https://github.com/ORG/NAME/archive/$_commit.tar.gz"

Porting packages from Arch Linux

Find the package

Search here, click the package name, click on "Source Files" on the top right. A git repo with the PKGBUILD and all other files (such as patches appears).

Differences between APKBUILDs and PKGBUILDs

  • APKBUILDs do not have the arrays from bash, use flat strings instead
  • There's no optdepends
  • -doc subpackages (see above)
  • APKBUILD has different options (!makeflags won't work, but it has !strip and !check)