From d05b9e331ef7b12a198acd1fe08d61352643b406 Mon Sep 17 00:00:00 2001 From: Nathan McCarty Date: Sat, 13 May 2023 15:11:02 -0400 Subject: [PATCH] Add generator for single crate flake --- flake.nix | 134 ++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 130 insertions(+), 4 deletions(-) diff --git a/flake.nix b/flake.nix index 7d3fb15..9394a08 100644 --- a/flake.nix +++ b/flake.nix @@ -11,14 +11,23 @@ url = "github:oxalica/rust-overlay"; inputs.nixpkgs.follows = "nixpkgs"; }; + # Advisory db from rust-sec + advisory-db = { + url = "github:RustSec/advisory-db"; + flake = false; + }; }; description = "Rust Toolchain and Utility Flake"; outputs = { self, nixpkgs, utils, ... }@inputs: - (utils.lib.eachDefaultSystem (system: { + with builtins; + let + sources = fromJSON (readFile ./sources/sources.json); + rustPackageNames = attrValues sources; + # Build the rust packages we'll be using + in (utils.lib.eachDefaultSystem (system: { packages = let - sources = builtins.fromJSON (builtins.readFile ./sources/sources.json); pkgs = import nixpkgs { inherit system; overlays = [ (import inputs.rust-overlay) ]; @@ -30,10 +39,127 @@ rustc = rust; cargo = rust; }; - in builtins.mapAttrs (name: source: + in mapAttrs (name: source: naersk-lib.buildPackage { pname = source.pname; src = pkgs.fetchCrate source; }) sources; - })); + })) // + # Now provide our builder functions + { + # Build a rust flake with a single crate + single = { src, crateName, sharedDeps ? (system: [ ]) + , sharedNativeDeps ? (system: [ ]) }: + utils.lib.eachDefaultsystem (system: + let + pkgs = import nixpkgs { + inherit system; + overlays = [ (import inputs.rust-overlay) ]; + }; + rust = pkgs.rust-bin.stable.latest.default.override { + extensions = [ "llvm-tools-preview" ]; + }; + naersk-lib = inputs.naersk.lib."${system}".override { + rustc = rust; + cargo = rust; + }; + devBase = with pkgs; + [ + # Build tools + openssl + pkg-config + rust-analyzer + cmake + gnuplot + # git tooling + gitFull + pre-commit + git-lfs + git-cliff + # Formatters + nixfmt + python311Packages.mdformat + ] ++ map (x: self.packages.${system}.${x}) rustPackageNames; + in rec { + # Main binary + packages.${crateName} = naersk-lib.buildPackage { + pname = "${crateName}"; + buildInputs = sharedDeps system; + nativeBuildInputs = sharedNativeDeps system; + root = src; + }; + # binary + tests + packages.tests.${crateName} = naersk-lib.buildPackage { + pname = "${crateName}"; + buildInputs = sharedDeps system; + nativeBuildInputs = sharedNativeDeps system; + root = src; + doCheck = true; + }; + # Docs + packages.docs.${crateName} = naersk-lib.buildPackage { + pname = "${crateName}"; + buildInputs = sharedDeps system; + nativeBuildInputs = sharedNativeDeps system; + root = src; + dontBuild = true; + doDoc = true; + doDocFail = true; + }; + + # Set the default package to the main binary + defaultPackage = packages.${crateName}; + + # CI tasks + packages.lints = { + # lint formatting + format.${crateName} = with import nixpkgs { inherit system; }; + stdenv.mkDerivation { + name = "format lint"; + src = src; + nativeBuildInputs = with pkgs; + [ rust-bin.stable.latest.default ] + ++ (sharedNativeDeps system); + buildInputs = sharedDeps system; + buildPhase = "cargo fmt -- --check"; + installPhase = "mkdir -p $out; echo 'done'"; + }; + # audit against stored advisory db + audit.${crateName} = with import nixpkgs { inherit system; }; + stdenv.mkDerivation { + name = "audit lint"; + src = src; + nativeBuildInputs = with pkgs; + [ rust-bin.stable.latest.default cargo-audit ] + ++ (sharedNativeDeps system); + buildInputs = sharedDeps system; + buildPhase = '' + export HOME=$TMP + mkdir -p ~/.cargo + cp -r ${advisory-db} ~/.cargo/advisory-db + cargo audit -n + ''; + installPhase = "mkdir -p $out; echo 'done'"; + }; + # Clippy + clippy.${crateName} = naersk-lib.buildPackage { + pname = "${crateName}"; + root = src; + buildInputs = sharedDeps system; + nativeBuildInputs = sharedNativeDeps system; + cargoTestCommands = (old: [ "cargo $cargo_options clippy" ]); + doCheck = true; + dontBuild = true; + }; + }; + + # Development environments + devShell = pkgs.mkShell { + inputsFrom = builtins.attrValues packages.${system}; + buildInputs = [ rust ] ++ devBase ++ (sharedDeps system) + ++ (sharedNativeDeps system); + }; + + }); + }; }