Building from source

What you need

A Linux host with a C toolchain, cmake, ninja, xorriso, mksquashfs, bubblewrap, and about 30 GiB free.

git clone https://github.com/apiwo/arctic-linux
git clone https://github.com/apiwo/arctic-linux-ports
cd arctic-linux
ln -s ../arctic-linux-ports ports

The ports tree lives in its own repository, so the main one stays the system rather than the system plus five hundred recipes.

Building

./build.sh                 everything
./build.sh rootfs iso      only these steps

Steps, in order: fetch, kernel, rootfs, usable, pkgs, iso. Each is idempotent — anything already built is skipped, so a failed run can be fixed and re-run without starting over.

build/arctic-sandbox build/build-batch.sh vim nano

Everything builds in a sandbox

Not a convention — a rule the filesystem enforces. Every build runs under bubblewrap with the entire host bound read-only; only the build tree, the source tree and /tmp are writable.

build/arctic-sandbox --check

This exists because it went wrong once. Arctic's glibc is configured with slibdir=/usr/lib, so a recipe that forgets DESTDIR writes that glibc straight into the host's /usr/lib and every dynamically linked program on the machine stops working. A note in a README was not good enough; the filesystem has to refuse.

For musl packages use arctic-musl-sandbox instead — same guarantee, plus a working musl toolchain. See musl.

Testing

build/arctic-qemu live        boot the ISO
build/arctic-qemu live-uefi   through OVMF
build/arctic-qemu install     with a blank disk attached
build/arctic-qemu boot        boot what you installed
build/arctic-qemu wipe        start over

The toolchain

glibc cannot be compiled by clang — upstream requires GCC — so the host's GCC is used as a stage-0 tool for glibc alone. Nothing it produces beyond glibc is packaged.

One thing worth knowing if you write recipes: alpm-build exports pkgdir but deliberately not srcdir. srcdir is autoconf's own variable name, and exporting it put a path autoconf never chose into every configure script — which broke any package whose configure re-execs a nested one, silently and with no error at all.

Contributing

Pull requests are welcome and are read before merging. Package changes go through ports/manifest.tsv in arctic-linux-ports, not the main repository — recipes are generated from the manifest.

There is no logo yet. If you want to make one: CONTRIBUTING.md says what is wanted.

More: arctic linux docs · install · declarative configuration · generations and rollback · init systems · kernels · packages (alpm) · desktops and audio · ephemeral shells · musl