Skip to content

Build Process

Warning

This section is currently somewhat WIP.

Warning

This section is intended for people who wish to work on/build/distribute bottom, not general users.

Overview

bottom manages its own binary builds for nightly and stable release purposes. The core build workflow is handled by build_releases.yml, called by a wrapper workflow for nightly and stable releases. Builds take place via GitHub Actions.

The main things built are:

  • Binaries for various platforms
  • MSI installer for Windows
  • .deb package for Debian and its derivatives

This documentation gives a high-level overview of the build process for each part. For the most up-to-date and detailed reference, definitely refer back to the build_releases.yml file.

Binaries

Binaries are built currently for various targets. Note that not all of these are officially supported. The following general steps are performed:

  • Set up the Rust toolchain for the action runner.
  • Enable cache.
  • Build a release build with:

    • --features deploy, which enables only crates needed for release builds.
    • --locked to lock the dependency versions.
    • The following env variables set:

      • BTM_GENERATE: true
      • COMPLETION_DIR: "target/tmp/bottom/completion/"
      • MANPAGE_DIR: "target/tmp/bottom/manpage/"

      These generate the manpages and shell completions (see Packaging for some more information).

  • Bundle the binaries and manpage/completions.
  • Cleanup.

Some builds use cross to do cross-compilation builds for architectures otherwise not natively supported by the runner.

MSI

This builds a full Windows installer using cargo-wix. This requires some setup beforehand with some dependencies:

  • Net-Framework-Core (handled by Powershell)
  • wixtoolset (handled by chocolatey)
  • Rust toolchain

After that, cache is enabled, and cargo wix takes care of the rest.

.deb

Currently, .deb files are built for x86 and ARM architectures (armv7, aarch64). This is handled by cargo-deb.

  • For x86, this is handled natively with just cargo-deb.
  • For ARM, this uses a Docker container, cargo-deb-arm, which correctly sets the dependencies and architecture for the generated .deb file.

There are additional checks via dpkg to ensure the architecture is correctly set.