How to use fpm?
The virtue of fpm is that it vastly simplifies both RPM and DEB creation. You don't neccessarily need the distro-specific tools even (well,
And it just needs simple command-line options instead of spec/control files:
fpm -s dir -t deb,rpm \ -n packagename -v 1.0.0 -a x86 \ -m firstname.lastname@example.org --url http://example.com \ --description "Package that does all the things." \ src/* # (The backslashes above are just used to mask linebreaks.)
dir module basically reads in all the files and bundles them asis. The target can be one of
exe. Version, architecture, maintainer all have short options, while the --longer ones are self-explanatory.
See also the fpm wiki on github for more examples and the complete option reference (
.fpm file to reduce options
Instead of relisting the flags on each invocation, you can also just create a
.fpm file in your source tree. It ought to list fpm flags verbatim:
--force --name PACKAGENAME --version 1.0.0 --iteration 1 --description "All the things." --license BSDL --category Multimedia --vendor email@example.com --maintainer firstname.lastname@example.org --depends python --prefix /usr/local --verbose
.fpm file thus reduces the packaging process to just:
fpm -s src -t deb,rpm main.py
Notably you can also utilize the
--input flag, to externalize the file list. (Often best suited for the
Embed within a Makefile
For many projects it might make sense to embed the fpm-packaging recipe as regular section into the
Makefile. It's basically an embellished shell script therein.
Instead of distributing a
.fpm alongside, it's possible to just add a few variable fields topmost the Make script:
CCFLAGS=... ... PKNAME="yourpackagename" VERSION="0.1.2.3" URL="http://example.com/project/name" DESCRIPTION="X11 tool which does all the things"
And construe a target such as:
pack: for PACK in rpm deb; \ do \ fpm -t $$PACK -n $(PKGNAME) -v $(VERSION) \ --description $(DESCRIPTION) -m y@x --category x11 --url $(URL) \ -f -s dir \ ./xapp=/usr/bin/xapp \ ./pixmaps=/usr/share/xapp/pixmaps; \ done
Note that this prevents the description from containing linebreaks easily. It's still suitable to allow users to quickly build a system package instead of requiring
sudo make install incantations.
One benefit of the
xpm branch is to avoid
done shell loops as shown above. The
-t target type can be a comma-separated list now:
fpm -t deb,rpm,exe,pkg,zip
For compatibility with curent
fpm, please just use individual
-t calls for general build scripts however.
FPM is widely used, therefore covered in other tutorials as well:
Examplary the make install DESTDIR= method