2023-05-13 13:21:58 -04:00
|
|
|
{
|
2023-05-13 14:37:05 -04:00
|
|
|
inputs = {
|
|
|
|
nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable";
|
|
|
|
utils.url = "github:numtide/flake-utils";
|
|
|
|
naersk = {
|
|
|
|
url = "github:nix-community/naersk";
|
|
|
|
inputs.nixpkgs.follows = "nixpkgs";
|
|
|
|
};
|
|
|
|
# Used for rust compiler
|
|
|
|
rust-overlay = {
|
|
|
|
url = "github:oxalica/rust-overlay";
|
|
|
|
inputs.nixpkgs.follows = "nixpkgs";
|
|
|
|
};
|
2023-05-13 15:11:02 -04:00
|
|
|
# Advisory db from rust-sec
|
|
|
|
advisory-db = {
|
|
|
|
url = "github:RustSec/advisory-db";
|
|
|
|
flake = false;
|
|
|
|
};
|
2023-05-13 14:37:05 -04:00
|
|
|
};
|
2023-05-13 13:21:58 -04:00
|
|
|
|
2023-05-13 14:37:05 -04:00
|
|
|
description = "Rust Toolchain and Utility Flake";
|
2023-05-13 13:21:58 -04:00
|
|
|
|
2023-05-13 14:37:05 -04:00
|
|
|
outputs = { self, nixpkgs, utils, ... }@inputs:
|
2023-05-13 15:11:02 -04:00
|
|
|
with builtins;
|
|
|
|
let
|
|
|
|
sources = fromJSON (readFile ./sources/sources.json);
|
|
|
|
rustPackageNames = attrNames sources ++ [ "cargo-release" "cargo-deny" ];
|
|
|
|
# Build the rust packages we'll be using
|
|
|
|
in (utils.lib.eachDefaultSystem (system: {
|
2023-05-13 14:37:05 -04:00
|
|
|
packages = 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;
|
|
|
|
};
|
2023-05-13 15:11:02 -04:00
|
|
|
in (mapAttrs (name: source:
|
2023-05-13 14:37:05 -04:00
|
|
|
naersk-lib.buildPackage {
|
|
|
|
pname = source.pname;
|
|
|
|
src = pkgs.fetchCrate source;
|
2023-05-13 15:11:02 -04:00
|
|
|
buildInputs = with pkgs; [ pkg-config openssl ];
|
|
|
|
}) sources) //
|
|
|
|
# Packages that naersk has trouble building due to https://github.com/nix-community/naersk/issues/263
|
|
|
|
{
|
|
|
|
cargo-release = pkgs.cargo-release;
|
|
|
|
cargo-deny = pkgs.cargo-deny;
|
|
|
|
};
|
|
|
|
})) //
|
|
|
|
# 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;
|
|
|
|
buildInputs = [ rust ] ++ devBase ++ (sharedDeps system)
|
|
|
|
++ (sharedNativeDeps system);
|
|
|
|
};
|
|
|
|
|
|
|
|
});
|
|
|
|
};
|
2023-05-13 13:21:58 -04:00
|
|
|
}
|