aboutsummaryrefslogtreecommitdiff

spm

Simple Package Manager — a POSIX-compatible package manager for Linux.

spm builds, installs, upgrades, and removes .spm packages. A package is a compressed tar archive with a filename that encodes its identity: <name>#<version>-<release>.spm.

Install

make install                          # install to /usr/bin/spm
make install DESTDIR=/tmp/staging     # install to a staging directory
make install PREFIX=/usr/local        # install to /usr/local/bin/spm
make uninstall                        # remove spm and its man page

Usage

spm -a              list all installed packages
spm -b <path>       build a package from the current directory
spm -h              print help
spm -i <file>       install a package (requires root)
spm -l <name>       list files installed by a package
spm -o <file>       find which package owns a file
spm -r <name>       remove an installed package (requires root)
spm -u <file>       upgrade or reinstall a package (requires root)

Package format

.spm packages are compressed tar archives whose contents mirror the target filesystem tree. Files under etc/ are automatically given a .new suffix during build so they don't overwrite existing configs on install — the .new file is moved into place only if the destination is absent or identical.

Environment variables

Variable Description
SPM_ROOT Alternate installation root (default: /)
SPM_FORCEINSTALL Skip conflict detection
SPM_VERBOSE Print each file as it's installed or removed
SPM_COMPRESSION Compression for builds: gzip (default), bzip2, or xz

Database

Package metadata lives under /var/lib/spm/ (or $SPM_ROOT/var/lib/spm/):

Path Contents
db/<name> One file per package: version line + list of installed paths
perms/<name> Non-standard directory permissions for the package
owner/<name> Non-root directory ownership for the package

Examples

# Build
cd staged-files && spm -b /tmp/mypkg#1.0-1.spm

# Install / upgrade / remove
spm -i /tmp/mypkg#1.0-1.spm
spm -u /tmp/mypkg#1.1-1.spm
spm -r mypkg

# Query
spm -a              # what's installed?
spm -l mypkg        # what files did mypkg install?
spm -o /usr/bin/x   # what package owns /usr/bin/x?

# Alternate root (chroot / container)
SPM_ROOT=/mnt/rootfs spm -i /tmp/mypkg#1.0-1.spm

# Different compression
SPM_COMPRESSION=xz spm -b /tmp/mypkg#1.0-1.spm