o< gak! gak!
-/)
^^
rockhopper generates installer packages for a wide variety of platforms.
Distro hoppers, enjoy~
$ cd example/sh
$ ./demo
$ tree .rockhopper
.rockhopper
├── alpine-linux
│ └── hello-1.0.0-r1.noarch.apk
├── arch-linux
│ └── hello-1.0.0-1-any.pkg.tar.zst
├── crux-x86_64
│ └── hello#1.0.0-1.pkg.tar.gz
...docker pull -a n4jm4/rockhopperrockhopper organizes package generators by distro.
| Target Distro | Tag |
|---|---|
| Alpine Linux | alpine-linux |
| Arch Linux | arch |
| CRUX | crux |
| Debian | debian |
| Fedora | fedora |
| Slackware Linux | slackware-linux |
| Ubuntu / Windows (WSL) | ubuntu |
| Void Linux (musl) | void-linux-musl |
Version pin tags also available, of the form:
<rockhopper version>-<distro>.
Pro tip: A happy consequence of building Ubuntu packages, is that Windows users can then access your applications via WSL.
For information on developing custom package generators, see the rocklets interface.
Supported host environments:
- Linux
- macOS
- UNIX
- Windows native or WSL
Prerequisites:
- a docker CLI
For more installation methods, see our install guide.
For more details on developing rockhopper itself, see our development guide.
- a docker CLI
- a UNIX-like environment (e.g. WSL)
- a host capable of running musl/Linux containers (e.g. a GNU/Linux, musl/Linux, macOS, or Windows host)
- Docker First Aid Kit
- Apply
DOCKER_DEFAULT_PLATFORM=linux/amd64environment variable - bash 4+
- GNU grep
- GNU time
- tree
rockhopper bundles all the tools needed to generate packages, inside Docker containers.
-
Write and test Linux applications.
no pain, no gain! >* (\- ^^Note: Fully static Go/musl binaries tend to improve portability for compiled applications.
Lost? Try Raspberry Pi for Dummies. We all gotta start somewhere.
-
Inside your project, create a
rockhopper-datasubdirectory. Withinrockhopper-data, layout all of your application's assets as they should appear on the end user's machine after installation.Linux, and many UNIX style operating systems follow the Filesystem Hierarchy Standard.
Example:
$ tree . └── rockhopper-data └── usr └── bin └── hello
In this simple example, we've laid out the directory structure directly in git. However, most mature projects will use a combination of
mkdir/cpcommands to accomplish this as a dynamic build step.Shell scripts and other interpreted executables may be checked this way into version control. For binary assets, configure
makeor another build system, to copy the files there dynamically. -
Configure target platform.
Example:
export ROCKHOPPER_NAME='hello' export ROCKHOPPER_VERSION='1.0.0' export ROCKHOPPER_MAINTAINER='Bob Loblaw <bob@bananastand.test>' export ROCKHOPPER_DESCRIPTION='hello world welcomes new developers' export ROCKHOPPER_COPYRIGHT='Copyright (C) 2026 Bob' export ROCKHOPPER_LICENSE='0BSD' export ROCKHOPPER_IMAGE='n4jm4/rockhopper:debian' export ROCKHOPPER_ARCH='all'
Note: Customize
ROCKHOPPER_ARCHper rocklet to match your target ISA(s).Note: Debian and other distros often have additional optional and/or required fields.
-
Generate packages and verify.
Packages write to
.rockhopper/<distro>/<package-file>.$ rockhopper $ tree .rockhopper .rockhopper └── debian └── hello_1.0.0_all.debWith minor tweaks, it's possible to extend support for even more distributions. See example/sh/demo.
o< wowowweewow!!! `/) ^^You've gone from source code, to executables, to installers. Congratulations, you're above and beyond.
Remember to test your shiny new packages. Install them into a fresh environment. Run your apps. Kick the tires!
For more usage options, see CONFIGURATION.md.
A dream of impossible colors... Let's make vendor lock a thing of the past.
-< zzZ... *as if!* zzZ...
,/)
^^
- alien, an OS package converter
- chandler, an OS agnostic tar normalizer
- crit, an automated Rust multiplatform compiler
- factorio, an automated Go multiplatform compiler
- fpm, an older, host native package generator
- tuggy, an automated Docker multiplatform image builder
- xgo, an automated cGo multiplatform compiler
🐧