Cross package maker. DEB/RPM generation or conversion. Derived from jordansissel/fpm.

⌈⌋ branch:  cross package maker

Artifact Content

Artifact 99a1bfefd131b65759b8b169fc29f0260c75e9e5:

Wiki page [cross package maker] by mario 2015-04-17 13:12:53.
D 2015-04-17T13:12:53.094
L cross\spackage\smaker
N text/x-markdown
P d8b5ce3ff41b1679419d965f2f5b4770b301e170
U mario
W 5549
<a href="" title="Effing Package Management ;)">fpm</a> greatly simplifies distribution package generation.<br>
<a href=""><em title="Cross Package Maker">xpm</em></a> is a feature-oriented branch of fpm.

<img src=logo align=right width=130 height=154 alt=xpm style="margin:25pt">
It creates or converts between

  * Debian <kbd>`deb`</kbd>
  * RedHat <kbd>`rpm`</kbd>
  * Node <kbd>`npm`</kbd>
  * OSX <kbd>`pkg`</kbd>
  * Ruby <kbd>`gem`</kbd>
  * Solaris packages, plain <kbd>`zip`</kbd> or <kbd>`tar`</kbd> archives, and a few more..

See the [→ Howto](wiki/Howto) on common `fpm` usage examples.

### xpm target/source plugins

This variant (precautiosly renamed for parallel installation) adds a few more source/target modules:

  *  <kbd>[*-t* **exe**](wiki/exe)</kbd> assembles Windows SFX "installers"

  *  <kbd>[*-s* **src**](wiki/src)</kbd> consumes per-file relative `pack:` specifiers from meta comment fields for source-based apps

  *  <kbd>[*-t* **phar**](wiki/phar)</kbd> bundles PHP scripts into `.phar`/zip/tars with meta fields

  *  <kbd>[*-t* **ipk**](wiki/ipk)</kbd> creates a static Listaller (.IPK) or Limba archive (which is a cross-distro packaging format)

  *  <kbd>[*-s* **composer**](wiki/source_composer)</kbd> fetches PHP bundles per composer, allows to pack them as phars or system packages (or matroska phar in deb/rpm)

A few more are currently pondered..

### new features

This fpm branch already provides a few extensions:

  *  [**Multi-target**](wiki/multi-target) creation in one swoop.

        xpm -t deb,rpm,exe

     Avoids having to call fpm multiple times for creating distinct system packages. Usually package-specific flags `--deb-…` and `--rpm-…` can be mixed in one invocation - when they're non-overlapping.

  *  Simple post-processing with [**update filters**](wiki/update+filters):

        xpm -u man,appdata

     Update filters are run between input file collection and target package building. They're intended for quick tasks or semi-build functionality. Existing filters:

      * <kbd>[man](wiki/update+filters#man)</kbd> - compresses man pages
      * <kbd>[appdata](wiki/update+filters#appdata)</kbd> - creates pkg.appdata.xml for distro managers
      * <kbd>[desktop](wiki/update+filters#desktop)</kbd> - add stub fpm:pkg.desktop file
      * <kbd>[composer](wiki/update+filters#update_composer)</kbd> - update/generate `composer.json` for <kbd>phar</kbd> target
      * <kbd>[fixperms](wiki/update+filters#fixperms)</kbd> - limit file permissions (umask 755 / 644)
      * <kbd>[strip](wiki/update+filters#strip)</kbd> - strip debugging symbols from binaries
      * <kbd>[deps](wiki/update+filters#deps)</kbd> - resolve cross-distro library names per whohas/distromatch
      * <kbd>[unprefix](wiki/update+filters#unprefix)</kbd> - workaround for converting system packages back to local paths
      * <kbd>[lcase](wiki/update+filters#lcase)</kbd> - lowercase filenames prior packaging
      * <kbd>[packfile](wiki/update+filters#packfile)</kbd> - runs any `Packfile` within the /tmp/staging dir on assembled files

  *  Debian [package signing](wiki/package+signing) with `--deb-sign KEYNAME` integrated.

  *  Additional <kbd>--attr</kbd> option to add custom control header fields (practically an alias for --deb-field, but also works for phar packages, based on `attrs{}`, so src plugin implicitly populates extra fields).

### possible extensions

It's planned or at least considered to add:

  * <kbd>[*-t* **inst**](wiki/inst)</kbd> → a GUI/Python-based BSD/Linux cross-distro installer (reusing zip, deb, alien, pkcon, xdg-tools)

  * <kbd>[*-t* **msi**](wiki/msi)</kbd> - for proper Windows packages

  * depending on further research, one of the AppImage-formats (utilizing their actual tools) might make sense

See [Research](wiki/Research) on existing and inactive cross-distro packagers, schemes and initiatives.

### build and installation

Meanwhile xpm installs as `xpm`, to keep any mainline `fpm` accessible. It's installed per rubygems easily. Either download a [prebuilt gem from ``]( or assemble it yourself:

  1. Download the [xpm.tgz](tarball/xpm.tgz?uuid=trunk) tarball, extract somewhere
  2. `gem build ./xpm.gemspec`
  3. `gem install ./xpm-`

Take note that this fetches a few other dependencies, even compiles `ffi`; so may take a few more seconds. But basically that's it.

### fossil → git

I just don't fancy git. That is all. But this fossil repo will be synced back to []( once in a while.

Or you can just sync it directly from here. Download or install the single [fossil binary](, then:

  1. `fossil clone xpm.fsl`
  2. `fossil open xpm.fsl`
  3. `fossil ui`

From there you could also just `fossil export --git` and pipe that into `git fast-import`.

Alternatively just use the new direct remote export:

  1. `wget //`

It should be noted that Git is occasionally flaky with its own export format though.

### links

  *  mainline fpm version [](
  *  apt/yum repo builder [](

Z f3c9fa67ff0a80c38ce009a1b9b7bb9c