- Shell 100%
| app-data | ||
| build | ||
| debian | ||
| tools | ||
| ubuntu | ||
| README.md | ||
debian-ubuntu-packages
Binary packages and .deb files built from source for Debian and Ubuntu targets.
Directory Structure
debian-ubuntu-packages/
├── build/ # Build system (scripts, Dockerfiles, per-package hooks)
│ ├── Dockerfile.* # One per supported distro
│ ├── pkg-build.sh # Main build orchestrator
│ └── pkg/
│ └── <package>/ # Per-package hook scripts
│ ├── build.sh # Build command(s) — mandatory
│ ├── artifact.sh # Prints path to built artifact — mandatory
│ ├── patches.sh # Pre-build patches — optional
│ ├── deps.txt # Extra apt packages — optional
│ ├── notes.txt # Free-form notes for .txt description — optional
│ ├── src.txt # Source dir name override — optional (default: pkg name)
│ └── distro-block.txt # Distros to exclude (blocklist) — optional
├── debian/
│ ├── 12/
│ │ ├── amd64/ # Built packages for Debian 12 (Bookworm) x86-64
│ │ └── arm64/ # Built packages for Debian 12 (Bookworm) arm64
│ └── 13/
│ ├── amd64/ # Built packages for Debian 13 (Trixie) x86-64
│ └── arm64/ # Built packages for Debian 13 (Trixie) arm64
└── ubuntu/
├── 24.04/
│ ├── amd64/ # Built packages for Ubuntu 24.04 (Noble) x86-64
│ └── arm64/ # Built packages for Ubuntu 24.04 (Noble) arm64
└── 26.04/
├── amd64/ # Built packages for Ubuntu 26.04 (Resolute) x86-64
└── arm64/ # Built packages for Ubuntu 26.04 (Resolute) arm64
The architecture subdir is detected automatically from the Docker container at build time
(uname -m mapped to amd64, arm64, armhf). Builds on different host architectures
write to their respective subdirs without conflict.
Sparse checkout is used on non-amd64 build hosts (e.g. raspi-seeed / arm64) to avoid checking out foreign architecture binaries.
Important: Both this repository and all source repositories to be built must reside on local storage. Docker bind mounts cannot traverse SSHFS or other network filesystems. Symlinks pointing to network-mounted paths will cause Docker mount failures.
Build System
Requirements
- Docker
- User must be in the
dockergroup
Usage
# Build a package for all its target distros (skips if output already exists)
build/pkg-build.sh <package>
# Force rebuild even if output exists
build/pkg-build.sh --rebuild <package>
# Build for all versions of a distro family
build/pkg-build.sh <package> debian
build/pkg-build.sh <package> ubuntu
# Build for a specific distro version
build/pkg-build.sh <package> debian/12
# Mix of family and specific targets
build/pkg-build.sh <package> debian ubuntu/26.04
# (Re)build Docker images
build/pkg-build.sh --build-images
build/pkg-build.sh --build-images debian
# Show version
build/pkg-build.sh --version
Supported Distros
Distros are discovered automatically from Dockerfile.* files in build/. Currently:
| Tag | Base Image |
|---|---|
debian/12 |
debian:12 |
debian/13 |
debian:13 |
ubuntu/24.04 |
ubuntu:24.04 |
ubuntu/26.04 |
ubuntu:26.04 |
Adding a new Dockerfile.<family>-<version> automatically makes it available as a build target.
How It Works
- Builds a Docker image for the target distro if not already present
- Detects the container architecture (
uname -m) and maps toamd64/arm64/armhf - Checks if output artifact already exists — skips build if so (use
--rebuildto force) - Runs a container with
~/_gitmounted at/home/jcf/_git - Inside the container, in order:
- Installs extra apt packages from
pkg/<package>/deps.txt - Runs
pkg/<package>/patches.shif present - Runs
pkg/<package>/build.sh
- Installs extra apt packages from
- Calls
pkg/<package>/artifact.shto locate the output file(s) - Copies artifacts to
<distro>/<arch>/ - Generates
<artifact>.txtdescription file if not already present
Docker images are kept after builds. Containers are ephemeral (--rm).
Cargo and Gradle caches are persisted in named Docker volumes
(pkg-builder-cargo-cache, pkg-builder-gradle-cache) shared across all distros.
Description Files
Each artifact gets a <name>.txt sidecar file generated automatically on first build.
Content: Package, Version, Arch, Distro, Built, Source, Branch, Build, Host, Notes.
The Notes: field is populated from pkg/<package>/notes.txt if present.
Description files are not regenerated if they already exist.
Adding a New Package
- Create
build/pkg/<package>/ - Add
build.shwith the build command - Add
artifact.shthat prints the path to the output file(s) - Optionally add
deps.txt,patches.sh,notes.txt,distro-block.txt - Optionally add
src.txtwith the source repo directory name if it differs from the package name - Run
build/pkg-build.sh <package>
distro-block.txt accepts family names (debian, ubuntu) or specific versions (debian/12, ubuntu/24.04), one per line.
Packages
iamb
Terminal-based Matrix chat client.
- Source: https://github.com/ulyssa/iamb
- Language: Rust
- Build tool: Cargo
- Output:
iamb_<version>_<arch>.deb - Notes: Requires
RUSTUP_TOOLCHAIN=stableoverride (repo pins an older toolchain). Applies recursion limit patch tomatrix-sdk-0.16.0due to upstream compiler bug.
tammy
Desktop Matrix client built with Kotlin Multiplatform / Compose Desktop.
- Source: https://gitlab.com/connect2x/tammy
- Language: Kotlin
- Build tool: Gradle (
./gradlew packageDeb) - Output:
tammy_<version>_<arch>.deb - Notes: Requires
TargetFormat.Debto be enabled inbuild.gradle.kts(patched automatically).
VeraCrypt
Disk encryption software based on TrueCrypt.
- Source: https://github.com/veracrypt/VeraCrypt
- Language: C++
- Build tool: make
- Output:
veracrypt_<version>_<arch>.deb(GUI + CLI),veracrypt-nogui_<version>_<arch>.deb(CLI only) - Notes: Built with WITHFUSE3=1 (fuse3). CLI binary built first, then GUI reuses object files.
For new version requests or questions: jens@franik.net