patagia-control/flake.nix
Lars Sjöstrom cb9d8b4bf0
Some checks are pending
ci/woodpecker/pr/ci Pipeline is pending
chore: build static binaries with musl
2025-02-11 10:21:01 +01:00

179 lines
5.2 KiB
Nix

{
inputs = {
advisory-db = {
url = "github:rustsec/advisory-db";
flake = false;
};
crane.url = "github:ipetkov/crane";
flake-utils.url = "github:numtide/flake-utils";
nix-filter.url = "github:numtide/nix-filter";
nixpkgs.url = "github:NixOS/nixpkgs/nixos-24.11";
rust-overlay.url = "github:oxalica/rust-overlay";
treefmt-nix.url = "github:numtide/treefmt-nix";
};
outputs =
{
self,
advisory-db,
crane,
flake-utils,
nix-filter,
nixpkgs,
rust-overlay,
treefmt-nix,
}:
flake-utils.lib.eachDefaultSystem (
system:
let
rustVersion = "1.83.0";
target = "x86_64-unknown-linux-musl";
isStatic = true;
overlays = [
(import rust-overlay)
(final: prev: {
nix-filter = nix-filter.lib;
rust-toolchain = pkgs.rust-bin.stable.${rustVersion}.default;
rust-dev-toolchain = pkgs.rust-toolchain.override {
extensions = [
"rust-analyzer"
"rust-src"
];
};
})
];
pkgs = import nixpkgs { inherit overlays system; };
basePkgs = import nixpkgs (
{
localSystem = system;
overlays = [
(import rust-overlay)
];
}
// pkgs.lib.optionalAttrs isStatic { crossSystem.config = target; }
);
crossPkgs = (if isStatic then basePkgs.pkgsStatic else basePkgs);
craneLib = (crane.mkLib crossPkgs).overrideToolchain (
p:
p.rust-bin.stable.${rustVersion}.default.override {
targets = [ target ];
}
);
src = pkgs.lib.fileset.toSource {
root = ./.;
fileset = pkgs.lib.fileset.unions [
./api.json
./controller/.sqlx
./controller/migrations
(craneLib.fileset.commonCargoSources ./.)
];
};
commonArgs = {
inherit src;
strictDeps = true;
cargoArtifacts = craneLib.buildDepsOnly commonArgs;
nativeBuildInputs = with crossPkgs.pkgsBuildHost; [ pkg-config ];
buildInputs = with crossPkgs.pkgsHostHost; [ openssl ];
CARGO_BUILD_TARGET = target;
CARGO_BUILD_RUSTFLAGS = "-C target-feature=+crt-static";
"CARGO_TARGET_${pkgs.lib.toUpper (builtins.replaceStrings [ "-" ] [ "_" ] target)}_LINKER" =
"${crossPkgs.stdenv.cc.targetPrefix}cc";
OPENSSL_STATIC = true;
OPENSSL_DIR = "${crossPkgs.openssl.dev}";
OPENSSL_LIB_DIR = "${crossPkgs.openssl.out}/lib";
OPENSSL_INCLUDE_DIR = "${crossPkgs.openssl.dev}/include/";
};
buildCrate =
name: path:
craneLib.buildPackage commonArgs
// {
inherit (craneLib.crateNameFromCargoToml { inherit src; }) version;
doCheck = false; # We use cargo-nextest for all tests
pname = name;
cargoExtraArgs = "-p ${name}";
};
patagia-agent = buildCrate "patagia-agent" ./agent;
patagia-controller = buildCrate "patagia-controller" ./controller;
xtask = buildCrate "xtask" ./xtask;
in
{
packages = {
inherit patagia-agent patagia-controller xtask;
};
checks = {
inherit patagia-agent patagia-controller xtask;
audit = craneLib.cargoAudit (commonArgs // { inherit advisory-db; });
clippy = craneLib.cargoClippy commonArgs // {
cargoClippyExtraArgs = "--all-targets -- --deny warnings";
};
fmt = craneLib.cargoFmt commonArgs;
nextest = craneLib.cargoNextest commonArgs // {
partitions = 1;
partitionType = "count";
};
openapi = pkgs.runCommand "openapi" commonArgs ''
${self.packages.${system}.xtask}/bin/xtask open-api |
${pkgs.diffutils}/bin/diff -u $src/api.json - |
tee $out
'';
};
formatter =
(treefmt-nix.lib.evalModule pkgs {
projectRootFile = "flake.nix";
programs = {
nixfmt.enable = true;
nixfmt.package = pkgs.nixfmt-rfc-style;
shfmt.enable = true;
rustfmt.enable = true;
};
settings.formatter.rustfmt.command = pkgs.lib.mkForce "${pkgs.rust-toolchain}/bin/rustfmt";
}).config.build.wrapper;
devShells.default = pkgs.mkShell {
nativeBuildInputs = commonArgs.nativeBuildInputs;
buildInputs =
with pkgs;
[
bacon
cargo-edit
cargo-features-manager
cargo-hakari
cargo-machete
cargo-nextest
cargo-watch
hyperfine
just
nixfmt-rfc-style
rust-dev-toolchain
sqls
sqlx-cli
watchexec
]
++ commonArgs.buildInputs;
RUST_BACKTRACE = 1;
RUST_SRC_PATH = pkgs.rustPlatform.rustLibSrc; # Required for rust-analyzer
};
}
);
}