<a title="Effing Package Management ;)">fpm</a> greatly simplifies distribution package generation.<br>
<a title="Cross Package 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* assembles Windows SFX "installers"

  *  <kbd>[*-s* consumes per-file relative `pack:` specifiers from meta comment fields for source-based apps

  *  <kbd>[*-t* bundles PHP scripts into with meta fields

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

  *  <kbd>[*-s* 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:

      * - compresses man pages
      * - creates pkg.appdata.xml for distro managers
      * - add stub fpm:pkg.desktop file
      * - update/generate `composer.json` for <kbd>phar</kbd> target
      * - limit file permissions (umask 755 / 644)
      * - strip debugging symbols from binaries
      * - resolve cross-distro library names per whohas/distromatch
      * - workaround for converting system packages back to local paths
      * - lowercase filenames prior packaging
      * - runs any `Packfile` within the 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* → a GUI/Python-based BSD/Linux cross-distro installer (reusing zip, deb, alien, pkcon, xdg-tools)

  * <kbd>[*-t* - for proper Windows packages

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

  * Add a `--attr` or `--meta` flag to inject custom package headers and meta information. (For instance `Vcs-Git:` or `Screenshot:` into Debian packages.)

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

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 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