2
Developer Versioning
Felis edited this page 2026-09-24 14:41:41 +08:00
This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
Table of Contents
include_toc
include_toc
true

Build versions and the workstation package

tools/version is the authoritative FDS build-version resolver. It reads this repository's Git history, never the Void submodule's history. All FDS Rust commands, base XBPS packages, login/boot banners and /etc/os-release use it. SYSTEM cartridge metadata copies the version already embedded in its rootfs, so wrapping an older rootfs does not mislabel it as the current source version.

Release tags are numeric MAJOR.MINOR or MAJOR.MINOR.PATCH, optionally prefixed with v. Unrelated tags are ignored. The nearest reachable release tag is used:

Source state Example build version
Exactly release tag 1.0, clean checkout 1.0
Two commits after 1.0 1.0.r2.g123456789abc
No reachable release tag 0.dev.g123456789abc
Uncommitted changes to tracked files Append .dirty

Untracked files do not affect the version, matching Git’s usual dirty-checkout convention. Add new release sources to Git before tagging.

Versions are bounded to 32 letters, digits and periods, starting with a digit, for the cartridge metadata, XBPS and Arch package formats. A shallow clone without a reachable release tag gets a development version; fetch the intended release tag/history before building a release. No value is silently invented when both Git identity and an exported identity are missing.

Each Rust crate uses the shared build script, including direct Cargo builds. Cargo notices tag/ref changes, index changes and source edits, avoiding an old version string in a cached binary. Cargo's workspace metadata uses the SemVer form 1.0.0; the public build version comes from Git. Protocol/schema versions, application recipe versions, the Linux kernel version and third-party package versions are independent and remain unchanged.

tools/prepare-void writes the resolved value to the writable build checkout's fds-version file. FDS-owned XBPS templates read it; base-files substitutes it into /usr/lib/os-release and /etc/issue. /etc/os-release links to that installed identity file. Runtime checks compare installed command versions against VERSION_ID. Superseded FDS packages are archived under out/package-history/ so the active repository cannot accidentally select an older development package whose version sorts above a release.

Frozen source exports save a validated FDS_VERSION file before inventorying and hashing their contents. Their builds use that saved value without Git or network access. Legacy 0.1.0 snapshots retain their original scripts and layout; the historical release stays unchanged. Release verification accepts supported version strings independently of the verifier's own version, so newer tools can still authenticate an older signed release using the supplied trust key.

Build and install on Arch

packaging/arch/PKGBUILD packages the local checkout. make workstation invokes makepkg, building both binaries in the existing Cargo cache and recording the result in out/workstation/package-path.txt. It builds without implicit package installation; required build commands are checked directly. Runtime feature packages are declared as optional because project-local runners are supported. make workstation-install explicitly invokes pacman to install the exact recorded package. Generic Linux users use make workstation-binaries.

The package includes binaries, the user/developer manuals, source examples, MIT licensing and dependency notices. It has no service, hook or installation script. The workflow follows the official PKGBUILD specification and makepkg interface.

Verification

make check includes release/no-tag/dirty/export and real Cargo cache-invalidation checks. make workstation-test exercises the installed-tree cartridge creator; make emulator-test covers stopping and starting the same directory, preserved logs/overlays/mappings, and rejecting a restart of a live VM. make workstation-package-test installs the real Arch package with pacman in a disposable root and executes all three installed commands. After building matching images, python3 tests/integration/version-images.py reads the identity and metadata directly from the GPT/EROFS image and executes its twelve FDS commands under ARM emulation to compare their versions. Image acceptance requires a new CLI rootfs and SYSTEM image: inspect their identity, execute the ARM tools and run the VM checks. A VM result does not establish physical Pi or Dasung power-cycle behavior.