This commit is contained in:
Robin Appelman 2024-09-24 16:54:20 +02:00
commit f1fa085ef3
4 changed files with 276 additions and 0 deletions

2
.gitignore vendored Normal file
View file

@ -0,0 +1,2 @@
result
.direnv

83
flake.lock generated Normal file
View file

@ -0,0 +1,83 @@
{
"nodes": {
"crane": {
"locked": {
"lastModified": 1727060013,
"narHash": "sha256-/fC5YlJy4IoAW9GhkJiwyzk0K/gQd9Qi4rRcoweyG9E=",
"owner": "ipetkov",
"repo": "crane",
"rev": "6b40cc876c929bfe1e3a24bf538ce3b5622646ba",
"type": "github"
},
"original": {
"owner": "ipetkov",
"repo": "crane",
"type": "github"
}
},
"flakelight": {
"inputs": {
"nixpkgs": "nixpkgs"
},
"locked": {
"lastModified": 1727095190,
"narHash": "sha256-eZfUxkPefTP5fknpr2/X+snNysEj830Ft1IaW7VafFE=",
"owner": "nix-community",
"repo": "flakelight",
"rev": "9e0f7e360688187ed3d7d8b033028e0d3473aa2c",
"type": "github"
},
"original": {
"owner": "nix-community",
"repo": "flakelight",
"type": "github"
}
},
"nixpkgs": {
"locked": {
"lastModified": 1726937504,
"narHash": "sha256-bvGoiQBvponpZh8ClUcmJ6QnsNKw0EMrCQJARK3bI1c=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "9357f4f23713673f310988025d9dc261c20e70c6",
"type": "github"
},
"original": {
"owner": "NixOS",
"ref": "nixos-unstable",
"repo": "nixpkgs",
"type": "github"
}
},
"root": {
"inputs": {
"crane": "crane",
"flakelight": "flakelight",
"rust-overlay": "rust-overlay"
}
},
"rust-overlay": {
"inputs": {
"nixpkgs": [
"flakelight",
"nixpkgs"
]
},
"locked": {
"lastModified": 1727058553,
"narHash": "sha256-tY/UU3Qk5gP/J0uUM4DZ6wo4arNLGAVqLKBotILykfQ=",
"owner": "oxalica",
"repo": "rust-overlay",
"rev": "edc5b0f896170f07bd39ad59d6186fcc7859bbb2",
"type": "github"
},
"original": {
"owner": "oxalica",
"repo": "rust-overlay",
"type": "github"
}
}
},
"root": "root",
"version": 7
}

23
flake.nix Normal file
View file

@ -0,0 +1,23 @@
# mill-scale -- Another rust module for flakelight
# Copyright (C) 2024 Robin Appelman <robin@icewind.nl>
# SPDX-License-Identifier: MIT
{
description = "Another rust module for flakelite";
inputs = {
flakelight.url = "github:nix-community/flakelight";
crane.url = "github:ipetkov/crane";
rust-overlay = {
url = "github:oxalica/rust-overlay";
inputs.nixpkgs.follows = "flakelight/nixpkgs";
};
};
outputs = { flakelight, crane, rust-overlay, ... }: flakelight ./. {
imports = [ flakelight.flakelightModules.flakelightModule ];
flakelightModule = { lib, ... }: {
imports = [ ./mill-scale.nix ];
inputs.crane = lib.mkDefault crane;
inputs.rust-overlay = lib.mkDefault rust-overlay;
};
};
}

168
mill-scale.nix Normal file
View file

@ -0,0 +1,168 @@
# mill-scale -- Another rust module for flakelight
# Copyright (C) 2024 Robin Appelman <robin@icewind.nl>
# SPDX-License-Identifier: MIT
{ lib, src, config, flakelight, inputs, ... }:
let
inherit (builtins) elem readFile pathExists isAttrs;
inherit (lib) mkDefault mkIf mkMerge mkOption warnIf assertMsg optionalAttrs types mapCartesianProduct id optionals;
inherit (lib.fileset) fileFilter toSource;
inherit (flakelight.types) fileset;
cargoToml = fromTOML (readFile (src + /Cargo.toml));
tomlPackage = cargoToml.package or cargoToml.workspace.package;
hasMsrv = tomlPackage ? rust-version;
hasWorkspace = tomlPackage ? workspace;
hasFeatures = cargoToml ? features && isAttrs cargoToml.features;
msrv = assert assertMsg hasMsrv ''"rust-version" not set in Cargo.toml''; tomlPackage.rust-version;
tools = pkgs: with pkgs; [ cargo-edit bacon ];
in
warnIf (! builtins ? readFileType) "Unsupported Nix version in use."
{
options = {
extraFiles = mkOption {
type = with types; listOf str;
default = [ ];
};
fileset = mkOption {
type = fileset;
default = fileFilter
(file: file.hasExt "rs" || elem file.name ([ "Cargo.toml" "Cargo.lock" ] ++ config.extraFiles))
src;
};
};
config = mkMerge [
(mkIf (pathExists (src + /Cargo.toml)) {
withOverlays = [
(import inputs.rust-overlay)
(final: { inputs, rust-bin, writeShellApplication, stdenvNoCC, ... } @ prev: rec {
craneLib = (inputs.crane.mkLib final).overrideToolchain (p: p.latestRustToolchain);
craneLibMsrv = (inputs.crane.mkLib final).overrideToolchain (p: p.msrvRustToolchain);
cargoArtifacts = craneLib.buildDepsOnly
{
inherit src;
strictDeps = true;
};
cargoArtifactsAllFeatures = craneLib.buildDepsOnly
{
inherit src;
strictDeps = true;
cargoExtraArgs = "--locked --all-features";
};
cargoArtifactsMsrv = craneLibMsrv.buildDepsOnly
{
inherit src;
strictDeps = true;
pnameSuffix = "-deps-all-features";
};
latestRustToolchain = rust-bin.stable.latest.default;
msrvRustToolchain = rust-bin.stable.${msrv}.default;
miriRustToolchain = rust-bin.selectLatestNightlyWith (toolchain: toolchain.default.override {
extensions = [ "miri" "rust-src" ];
});
cargo-expand = (writeShellApplication {
name = "cargo-expand";
runtimeInputs = [ prev.cargo-expand ];
text = ''
# shellcheck disable=SC2068
RUSTC_BOOTSTRAP=1 cargo-expand $@
'';
});
cargo-miri = (writeShellApplication {
name = "cargo-miri";
runtimeInputs = [ miriRustToolchain ];
text = ''
# shellcheck disable=SC2068
cargo miri $@
'';
});
})
];
description = mkIf (tomlPackage ? description) tomlPackage.description;
# license will need to be set if Cargo license is a complex expression
license = mkIf (tomlPackage ? license) (mkDefault tomlPackage.license);
pname = tomlPackage.name;
packages = {
default = { craneLib, cargoArtifacts, defaultMeta }: craneLib.buildPackage {
src = toSource { root = src; inherit (config) fileset; };
inherit cargoArtifacts;
doCheck = false;
strictDeps = true;
meta = defaultMeta;
};
};
checks = { craneLib, craneLibMsrv, cargoArtifacts, cargoArtifactsMsrv, cargoArtifactsAllFeatures, ... }: {
test = craneLib.cargoTest {
inherit src cargoArtifacts;
cargoExtraArgs = "--locked --all-targets --workspace";
};
clippy = craneLib.cargoClippy {
inherit src cargoArtifacts;
strictDeps = true;
cargoClippyExtraArgs = "--all-targets -- --deny warnings";
};
} // (optionalAttrs hasMsrv {
msrv = craneLibMsrv.buildPackage {
inherit src;
cargoArtifacts = cargoArtifactsMsrv;
strictDeps = true;
doCheck = false;
cargoBuildCommand = "cargo check";
cargoExtraArgs = "--all-targets";
installPhaseCommand = "mkdir $out";
};
}) // (optionalAttrs hasFeatures {
test-all-features = craneLib.cargoTest {
inherit src;
strictDeps = true;
cargoArtifacts = cargoArtifactsAllFeatures;
cargoExtraArgs = "--locked --all-targets --all-features --workspace";
};
clippy-all-features = craneLib.cargoClippy {
inherit src;
strictDeps = true;
cargoArtifacts = cargoArtifactsAllFeatures;
cargoClippyExtraArgs = "--all-targets --all-features -- --deny warnings";
};
});
apps = { cargo-miri, cargo-semver-checks, ... }: {
miri = "${cargo-miri}/bin/cargo-miri";
semver-checks = "${cargo-semver-checks}/bin/cargo-semver-checks semver-checks";
};
})
rec {
devShells = rec {
default = {
packages = pkgs: with pkgs; [ latestRustToolchain ] ++ tools pkgs;
env = { rustPlatform, ... }: {
RUST_SRC_PATH = toString rustPlatform.rustLibSrc;
};
};
miri = {
packages = pkgs: with pkgs; [ miriRustToolchain cargo-edit bacon ] ++ tools pkgs;
inherit (default) env;
};
} // (optionalAttrs hasMsrv {
msrv = {
packages = pkgs: with pkgs; [ msrvRustToolchain cargo-edit bacon ] ++ tools pkgs;
inherit (devShells.default) env;
};
});
formatters = pkgs: {
"*.rs" = "${pkgs.rustfmt}/bin/rustfmt";
};
}
];
}