mirror of
https://github.com/jmcorgan/fips.git
synced 2026-07-22 07:48:26 +00:00
Add a flake that builds all four binaries (fips, fipsctl, fips-gateway,
fipstop) on Linux and macOS, pinning the exact toolchain from
rust-toolchain.toml (1.94.1 + rustfmt/clippy) via fenix so Nix builds
match CI and the AUR/Debian packaging.
Wire up the build-time native deps the source tree needs: pkg-config and
bindgenHook (libclang) for the rustables/libdbus-sys bindgen step, and
dbus for bluer's BLE support. autoPatchelfHook rewrites the binary RPATHs
so the daemon resolves libdbus-1.so.3 and libgcc_s.so.1 from the Nix store
at runtime — without it `fips` fails to load on NixOS, which has no global
/usr/lib.
Outputs: packages.{default,fips}, apps for each binary, checks.fips, and a
devShell with the pinned toolchain plus cargo-edit. Tests are skipped in
the package build since they exercise TUN devices, raw sockets, and mDNS
that aren't available in the sandbox, mirroring the AUR/Debian packaging.
Verified end-to-end in a pure Nix store (nixos/nix container): nix build,
nix flake check, and running all four binaries succeed against the
committed flake.lock.
Documented across the install and developer docs: a Nix / NixOS section in
packaging/README.md, the from-source guide in docs/getting-started.md
(noting the flake produces binaries only, with NixOS system integration
through the system configuration rather than the installer), the CHANGELOG,
README, CONTRIBUTING, and the v0.4.0 release notes.
Co-authored-by: Johnathan Corgan <johnathan@corganlabs.com>
129 lines
4.2 KiB
Nix
129 lines
4.2 KiB
Nix
{
|
|
description = "FIPS — a distributed, decentralized network routing protocol for mesh nodes connecting over arbitrary transports";
|
|
|
|
inputs = {
|
|
nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
|
|
flake-utils.url = "github:numtide/flake-utils";
|
|
fenix = {
|
|
url = "github:nix-community/fenix";
|
|
inputs.nixpkgs.follows = "nixpkgs";
|
|
};
|
|
};
|
|
|
|
outputs =
|
|
{
|
|
self,
|
|
nixpkgs,
|
|
flake-utils,
|
|
fenix,
|
|
}:
|
|
flake-utils.lib.eachDefaultSystem (
|
|
system:
|
|
let
|
|
pkgs = import nixpkgs { inherit system; };
|
|
|
|
# Honor the toolchain the repo pins in rust-toolchain.toml
|
|
# (channel 1.94.1 + rustfmt, clippy) so Nix builds match CI and the
|
|
# AUR/Debian packaging exactly, including the edition-2024 frontend.
|
|
rustToolchain = fenix.packages.${system}.fromToolchainFile {
|
|
file = ./rust-toolchain.toml;
|
|
sha256 = "sha256-zC8E38iDVJ1oPIzCqTk/Ujo9+9kx9dXq7wAwPMpkpg0=";
|
|
};
|
|
|
|
rustPlatform = pkgs.makeRustPlatform {
|
|
cargo = rustToolchain;
|
|
rustc = rustToolchain;
|
|
};
|
|
|
|
cargoToml = pkgs.lib.importTOML ./Cargo.toml;
|
|
|
|
# libdbus-sys (pulled in transitively by `bluer`, Linux/glibc only)
|
|
# runs `bindgen` against the system D-Bus headers at build time.
|
|
nativeBuildInputs = [
|
|
pkgs.pkg-config
|
|
rustPlatform.bindgenHook # sets LIBCLANG_PATH + clang for bindgen
|
|
];
|
|
|
|
buildInputs = pkgs.lib.optionals pkgs.stdenv.isLinux [
|
|
pkgs.dbus # libdbus-1.so.3, linked via bluer→libdbus-sys
|
|
pkgs.stdenv.cc.cc.lib # libgcc_s.so.1, needed by every Rust binary
|
|
];
|
|
|
|
fips = rustPlatform.buildRustPackage {
|
|
pname = "fips";
|
|
version = cargoToml.package.version;
|
|
|
|
src = pkgs.lib.cleanSourceWith {
|
|
src = ./.;
|
|
# Drop the build dir and the usual editor/VCS noise so the source
|
|
# hash is stable and unrelated edits don't trigger rebuilds.
|
|
filter =
|
|
path: type:
|
|
(pkgs.lib.cleanSourceFilter path type) && (baseNameOf path != "target");
|
|
};
|
|
|
|
cargoLock.lockFile = ./Cargo.lock;
|
|
|
|
inherit buildInputs;
|
|
|
|
# autoPatchelfHook rewrites the RPATH of the built binaries so the
|
|
# daemon finds libdbus-1.so.3 (linked via bluer→libdbus-sys) in the
|
|
# Nix store at runtime — without it the `fips` binary fails to load
|
|
# on NixOS where there is no global /usr/lib.
|
|
nativeBuildInputs =
|
|
nativeBuildInputs ++ pkgs.lib.optionals pkgs.stdenv.isLinux [ pkgs.autoPatchelfHook ];
|
|
|
|
# The test suite exercises TUN devices, raw sockets and mDNS, none of
|
|
# which exist in the build sandbox. The AUR/Debian packaging likewise
|
|
# ships the release binaries without running the integration tests
|
|
# here, so keep the package build hermetic and skip them.
|
|
doCheck = false;
|
|
|
|
meta = {
|
|
description = cargoToml.package.description;
|
|
homepage = cargoToml.package.homepage;
|
|
license = pkgs.lib.licenses.mit;
|
|
mainProgram = "fips";
|
|
platforms = pkgs.lib.platforms.linux ++ pkgs.lib.platforms.darwin;
|
|
};
|
|
};
|
|
|
|
mkApp = name: {
|
|
type = "app";
|
|
program = "${fips}/bin/${name}";
|
|
meta.description = "Run the ${name} binary from the FIPS package";
|
|
};
|
|
in
|
|
{
|
|
packages = {
|
|
default = fips;
|
|
fips = fips;
|
|
};
|
|
|
|
apps = {
|
|
default = mkApp "fips";
|
|
fips = mkApp "fips";
|
|
fipsctl = mkApp "fipsctl";
|
|
fips-gateway = mkApp "fips-gateway";
|
|
fipstop = mkApp "fipstop";
|
|
};
|
|
|
|
# `nix flake check` builds the package (and thus validates the flake on
|
|
# the current system).
|
|
checks.fips = fips;
|
|
|
|
devShells.default = pkgs.mkShell {
|
|
inherit buildInputs;
|
|
nativeBuildInputs = nativeBuildInputs ++ [
|
|
rustToolchain
|
|
pkgs.cargo-edit
|
|
];
|
|
# Point rust-analyzer at the matching std sources.
|
|
RUST_SRC_PATH = "${rustToolchain}/lib/rustlib/src/rust/library";
|
|
};
|
|
|
|
formatter = pkgs.nixfmt;
|
|
}
|
|
);
|
|
}
|