switch to alejandra for nix formatting

This commit is contained in:
Robin Appelman 2024-12-23 22:55:24 +01:00
commit 576d0418c8
8 changed files with 500 additions and 386 deletions

View file

@ -1,51 +1,55 @@
{ lib, src, config }: {
let lib,
src,
config,
}: let
inherit (builtins) readFile pathExists attrNames hasAttr; inherit (builtins) readFile pathExists attrNames hasAttr;
inherit (lib) map intersectLists foldl splitString getAttrFromPath; inherit (lib) map intersectLists foldl splitString getAttrFromPath;
cargoLockDeps = cargoLockDeps =
if pathExists (src + /Cargo.lock) then if pathExists (src + /Cargo.lock)
let then let
cargoLock = fromTOML (readFile (src + /Cargo.lock)); cargoLock = fromTOML (readFile (src + /Cargo.lock));
in in
map (package: package.name) cargoLock.package map (package: package.name) cargoLock.package
else [ ]; else [];
availableAutoDeps = import ./deps.nix; availableAutoDeps = import ./deps.nix;
detectedDeps = intersectLists cargoLockDeps (attrNames availableAutoDeps); detectedDeps = intersectLists cargoLockDeps (attrNames availableAutoDeps);
mergedDetectedDeps = mergedDetectedDeps =
if config.autodeps then if config.autodeps
then
foldl foldl
(merged: dep: { (merged: dep: {
build = merged.build ++ (availableAutoDeps.${dep}.build or [ ]); build = merged.build ++ (availableAutoDeps.${dep}.build or []);
native = merged.native ++ (availableAutoDeps.${dep}.native or [ ]); native = merged.native ++ (availableAutoDeps.${dep}.native or []);
runtime = merged.runtime ++ (availableAutoDeps.${dep}.runtime or [ ]); runtime = merged.runtime ++ (availableAutoDeps.${dep}.runtime or []);
env = env =
if (hasAttr "env" availableAutoDeps.${dep}) then if (hasAttr "env" availableAutoDeps.${dep})
pkgs: (merged.env pkgs) // (availableAutoDeps.${dep}.env pkgs) then pkgs: (merged.env pkgs) // (availableAutoDeps.${dep}.env pkgs)
else merged.env; else merged.env;
}) })
{ {
build = [ ]; build = [];
native = [ ]; native = [];
runtime = [ ]; runtime = [];
env = pkgs: { }; env = pkgs: {};
} }
detectedDeps else { detectedDeps
build = [ ]; else {
native = [ ]; build = [];
runtime = [ ]; native = [];
env = pkgs: { }; runtime = [];
env = pkgs: {};
}; };
getPkgs = pkgs: deps: getPkgs = pkgs: deps: let
let
depPaths = map (splitString ".") deps; depPaths = map (splitString ".") deps;
in in
map (path: getAttrFromPath path pkgs) depPaths; map (path: getAttrFromPath path pkgs) depPaths;
autoDeps = pkgs: { autoDeps = pkgs: {
buildInputs = getPkgs pkgs mergedDetectedDeps.build; buildInputs = getPkgs pkgs mergedDetectedDeps.build;
nativeBuildInputs = with pkgs; [ pkg-config ] ++ (getPkgs pkgs mergedDetectedDeps.native); nativeBuildInputs = with pkgs; [pkg-config] ++ (getPkgs pkgs mergedDetectedDeps.native);
runtimeInputs = getPkgs pkgs mergedDetectedDeps.runtime; runtimeInputs = getPkgs pkgs mergedDetectedDeps.runtime;
env = mergedDetectedDeps.env pkgs; env = mergedDetectedDeps.env pkgs;
}; };
in in
autoDeps autoDeps

View file

@ -1,12 +1,12 @@
{ {
"openssl-sys" = { build = [ "openssl" ]; }; "openssl-sys" = {build = ["openssl"];};
"libudev-sys" = { build = [ "eudev" ]; }; "libudev-sys" = {build = ["eudev"];};
"libdbus-sys" = { build = [ "dbus" ]; }; "libdbus-sys" = {build = ["dbus"];};
"expat-sys" = { native = [ "cmake" ]; }; "expat-sys" = {native = ["cmake"];};
"servo-fontconfig-sys" = { build = [ "fontconfig" ]; }; "servo-fontconfig-sys" = {build = ["fontconfig"];};
"x11-dl" = { build = [ "xorg.libX11" "xorg.libXcursor" "xorg.libXrandr" "xorg.libXi" ]; }; "x11-dl" = {build = ["xorg.libX11" "xorg.libXcursor" "xorg.libXrandr" "xorg.libXi"];};
"glutin_glx_sys" = { runtime = [ "libGL" "libGLU" ]; }; "glutin_glx_sys" = {runtime = ["libGL" "libGLU"];};
"wayland-egl" = { build = [ "egl-wayland" ]; }; "wayland-egl" = {build = ["egl-wayland"];};
"wayland-sys" = { runtime = [ "wayland" "libxkbcommon" ]; }; "wayland-sys" = {runtime = ["wayland" "libxkbcommon"];};
"libsodium-sys" = { build = [ "libsodium" ]; }; "libsodium-sys" = {build = ["libsodium"];};
} }

View file

@ -1,17 +1,16 @@
{ lib }: {lib}: let
let
inherit (builtins) isAttrs attrNames; inherit (builtins) isAttrs attrNames;
inherit (lib) assertMsg remove; inherit (lib) assertMsg remove;
in in
cargoToml: rec { cargoToml: rec {
tomlPackage = cargoToml.package or cargoToml.workspace.package; tomlPackage = cargoToml.package or cargoToml.workspace.package;
hasMsrv = tomlPackage ? rust-version; hasMsrv = tomlPackage ? rust-version;
hasWorkspace = tomlPackage ? workspace; hasWorkspace = tomlPackage ? workspace;
hasFeatures = cargoToml ? features && isAttrs cargoToml.features; hasFeatures = cargoToml ? features && isAttrs cargoToml.features;
features = cargoToml.features or { }; features = cargoToml.features or {};
defaultFeatures = features.default or [ ]; defaultFeatures = features.default or [];
nonDefaultFeatures = remove "default" (attrNames features); nonDefaultFeatures = remove "default" (attrNames features);
hasNonDefaultFeatures = hasFeatures && (defaultFeatures != nonDefaultFeatures); hasNonDefaultFeatures = hasFeatures && (defaultFeatures != nonDefaultFeatures);
hasDefaultFeatures = cargoToml ? features && cargoToml.features ? default; hasDefaultFeatures = cargoToml ? features && cargoToml.features ? default;
msrv = assert assertMsg hasMsrv ''"rust-version" not set in Cargo.toml''; tomlPackage.rust-version; msrv = assert assertMsg hasMsrv ''"rust-version" not set in Cargo.toml''; tomlPackage.rust-version;
} }

View file

@ -1,29 +1,39 @@
{ callPackage, pkgsCross, stdenv, lib }: {
let callPackage,
pkgsCross,
stdenv,
lib,
}: let
inherit (lib) mapAttrs hasInfix replaceStrings toUpper concatStrings recursiveUpdate; inherit (lib) mapAttrs hasInfix replaceStrings toUpper concatStrings recursiveUpdate;
isMusl = hasInfix "-musl"; isMusl = hasInfix "-musl";
crossOpts = callPackage ./crossOpts.nix { }; crossOpts = callPackage ./crossOpts.nix {};
buildCrossArgs = target: { targetDeps ? [ ] buildCrossArgs = target: {
, rustFlags ? (if isMusl target then "-C target-feature=+crt-static" else "") targetDeps ? [],
, cFlags ? "" rustFlags ? (
, targetStdenv if isMusl target
, ... then "-C target-feature=+crt-static"
} @ args: else ""
let ),
cFlags ? "",
targetStdenv,
...
} @ args: let
isHostTarget = targetStdenv.targetPlatform.config == stdenv.targetPlatform.config; isHostTarget = targetStdenv.targetPlatform.config == stdenv.targetPlatform.config;
# don't use the pkgsCross cc if the target is the host platform # don't use the pkgsCross cc if the target is the host platform
targetCc = if isHostTarget then stdenv.cc else targetStdenv.cc; targetCc =
targetUnderscore = replaceStrings [ "-" ] [ "_" ] target; if isHostTarget
then stdenv.cc
else targetStdenv.cc;
targetUnderscore = replaceStrings ["-"] ["_"] target;
targetUpperCase = toUpper targetUnderscore; targetUpperCase = toUpper targetUnderscore;
rest = removeAttrs args [ "rustFlags" "cc" "cFlags" "targetDeps" "targetStdenv" "nativeBuildInputs" ]; rest = removeAttrs args ["rustFlags" "cc" "cFlags" "targetDeps" "targetStdenv" "nativeBuildInputs"];
# by adding the dependency in the (target specific) linker args instead of buildInputs # by adding the dependency in the (target specific) linker args instead of buildInputs
# we can prevent it trying to link to it for host build dependencies # we can prevent it trying to link to it for host build dependencies
rustFlagsWithDeps = rustFlags + concatStrings (map (targetDep: " -Clink-arg=-L${targetDep}/lib") targetDeps); rustFlagsWithDeps = rustFlags + concatStrings (map (targetDep: " -Clink-arg=-L${targetDep}/lib") targetDeps);
in in (
(
{ {
nativeBuildInputs = (args.nativeBuildInputs or [ ]) ++ [ targetCc stdenv.cc ]; nativeBuildInputs = (args.nativeBuildInputs or []) ++ [targetCc stdenv.cc];
"CARGO_TARGET_${targetUpperCase}_RUSTFLAGS" = rustFlagsWithDeps; "CARGO_TARGET_${targetUpperCase}_RUSTFLAGS" = rustFlagsWithDeps;
"CARGO_TARGET_${targetUpperCase}_LINKER" = "${targetCc.targetPrefix}cc"; "CARGO_TARGET_${targetUpperCase}_LINKER" = "${targetCc.targetPrefix}cc";
"AR_${targetUnderscore}" = "${targetCc.targetPrefix}ar"; "AR_${targetUnderscore}" = "${targetCc.targetPrefix}ar";
@ -31,8 +41,8 @@ let
"CCX_${targetUnderscore}" = "${targetCc.targetPrefix}ccx"; "CCX_${targetUnderscore}" = "${targetCc.targetPrefix}ccx";
"HOST_CC" = "${stdenv.cc.targetPrefix}cc"; "HOST_CC" = "${stdenv.cc.targetPrefix}cc";
"CFLAGS_${targetUnderscore}" = cFlags; "CFLAGS_${targetUnderscore}" = cFlags;
} // }
rest // rest
); );
in in
target: buildCrossArgs target crossOpts.${target} target: buildCrossArgs target crossOpts.${target}

View file

@ -1,12 +1,15 @@
{ pkgsCross, perl, callPackage, freebsdCross }: {
let pkgsCross,
perl,
callPackage,
freebsdCross,
}: let
freebsdSysrootX86 = callPackage ./freebsd-sysroot.nix { freebsdSysrootX86 = callPackage ./freebsd-sysroot.nix {
arch = "amd64"; arch = "amd64";
sha256 = "sha256-/XZXt0bPI9bTXrD+TR2KYzhE7wKpVAvKndWL3tqe5cg="; sha256 = "sha256-/XZXt0bPI9bTXrD+TR2KYzhE7wKpVAvKndWL3tqe5cg=";
version = freebsdCross.versionData.revision; version = freebsdCross.versionData.revision;
}; };
in in {
{
"armv7-unknown-linux-musleabihf" = { "armv7-unknown-linux-musleabihf" = {
targetStdenv = pkgsCross.muslpi.stdenv; targetStdenv = pkgsCross.muslpi.stdenv;
}; };
@ -29,14 +32,14 @@ in
"x86_64-pc-windows-gnu" = { "x86_64-pc-windows-gnu" = {
targetStdenv = pkgsCross.mingwW64.stdenv; targetStdenv = pkgsCross.mingwW64.stdenv;
# rink wants perl for windows targets # rink wants perl for windows targets
buildInputs = [ perl ]; buildInputs = [perl];
targetDeps = [ pkgsCross.mingwW64.windows.pthreads ]; targetDeps = [pkgsCross.mingwW64.windows.pthreads];
rustFlags = "-C target-feature=+crt-static"; rustFlags = "-C target-feature=+crt-static";
BINARY_SUFFIX = ".exe"; BINARY_SUFFIX = ".exe";
}; };
"x86_64-unknown-freebsd" = { "x86_64-unknown-freebsd" = {
targetStdenv = pkgsCross.x86_64-freebsd.stdenv; targetStdenv = pkgsCross.x86_64-freebsd.stdenv;
targetDeps = [ freebsdSysrootX86 ]; targetDeps = [freebsdSysrootX86];
dontPatchELF = true; dontPatchELF = true;
postInstall = '' postInstall = ''
patchelf --set-interpreter /libexec/ld-elf.so.1 $out/bin/* patchelf --set-interpreter /libexec/ld-elf.so.1 $out/bin/*

View file

@ -1,7 +1,6 @@
# mill-scale -- Another rust module for flakelight # mill-scale -- Another rust module for flakelight
# Copyright (C) 2024 Robin Appelman <robin@icewind.nl> # Copyright (C) 2024 Robin Appelman <robin@icewind.nl>
# SPDX-License-Identifier: MIT # SPDX-License-Identifier: MIT
{ {
description = "Another rust module for flakelite"; description = "Another rust module for flakelite";
inputs = { inputs = {
@ -12,10 +11,20 @@
inputs.nixpkgs.follows = "flakelight/nixpkgs"; inputs.nixpkgs.follows = "flakelight/nixpkgs";
}; };
}; };
outputs = { flakelight, crane, rust-overlay, ... }: flakelight ./. { outputs = {
imports = [ flakelight.flakelightModules.flakelightModule ]; flakelight,
flakelightModule = { lib, ... }: { crane,
imports = [ ./mill-scale.nix ]; rust-overlay,
...
}:
flakelight ./. {
imports = [flakelight.flakelightModules.flakelightModule];
formatters = pkgs:
with pkgs; {
"*.nix" = pkgs.lib.getExe alejandra;
};
flakelightModule = {lib, ...}: {
imports = [./mill-scale.nix];
inputs.crane = lib.mkDefault crane; inputs.crane = lib.mkDefault crane;
inputs.rust-overlay = lib.mkDefault rust-overlay; inputs.rust-overlay = lib.mkDefault rust-overlay;
}; };

View file

@ -1,9 +1,9 @@
{ stdenv {
, fetchzip stdenv,
, arch fetchzip,
, version arch,
, sha256 version,
, sha256,
}: }:
stdenv.mkDerivation { stdenv.mkDerivation {
pname = "freebsd-sysroot"; pname = "freebsd-sysroot";

View file

@ -1,86 +1,98 @@
# mill-scale -- Another rust module for flakelight # mill-scale -- Another rust module for flakelight
# Copyright (C) 2024 Robin Appelman <robin@icewind.nl> # Copyright (C) 2024 Robin Appelman <robin@icewind.nl>
# SPDX-License-Identifier: MIT # SPDX-License-Identifier: MIT
{
{ lib, src, config, flakelight, inputs, ... }: lib,
let src,
config,
flakelight,
inputs,
...
}: let
inherit (builtins) elem readFile pathExists isAttrs match any; inherit (builtins) elem readFile pathExists isAttrs match any;
inherit (lib) map mkDefault mkIf mkMerge mkOption warnIf assertMsg optionalAttrs types optionalString genAttrs hasInfix intersectLists attrVals; inherit (lib) getExe map mkDefault mkIf mkMerge mkOption warnIf assertMsg optionalAttrs types optionalString genAttrs hasInfix intersectLists attrVals;
inherit (lib.fileset) fileFilter toSource unions; inherit (lib.fileset) fileFilter toSource unions;
inherit (flakelight.types) fileset function optFunctionTo; inherit (flakelight.types) fileset function optFunctionTo;
filteredSrc = toSource { root = src; fileset = unions (config.extraPaths ++ [ config.fileset ]); }; filteredSrc = toSource {
root = src;
fileset = unions (config.extraPaths ++ [config.fileset]);
};
cargoToml = fromTOML (readFile (src + /Cargo.toml)); cargoToml = fromTOML (readFile (src + /Cargo.toml));
cargoMeta = (import ./cargo-meta.nix { inherit lib; }) cargoToml; cargoMeta = (import ./cargo-meta.nix {inherit lib;}) cargoToml;
inherit (cargoMeta) tomlPackage hasMsrv hasWorkspace hasFeatures hasNonDefaultFeatures hasDefaultFeatures msrv; inherit (cargoMeta) tomlPackage hasMsrv hasWorkspace hasFeatures hasNonDefaultFeatures hasDefaultFeatures msrv;
maybeWorkspace = optionalString hasWorkspace "--workspace"; maybeWorkspace = optionalString hasWorkspace "--workspace";
hasExamples = pathExists (src + /examples); hasExamples = pathExists (src + /examples);
hasDefaultPackage = pathExists (src + /nix/package.nix); hasDefaultPackage = pathExists (src + /nix/package.nix);
autoDeps = (import ./autodeps { inherit lib src config; }); autoDeps = import ./autodeps {inherit lib src config;};
buildDeps = pkgs: rec { buildDeps = pkgs: rec {
buildInputs = (autoDeps pkgs).buildInputs ++ (config.buildInputs pkgs); buildInputs = (autoDeps pkgs).buildInputs ++ (config.buildInputs pkgs);
nativeBuildInputs = (autoDeps pkgs).nativeBuildInputs ++ (config.nativeBuildInputs pkgs); nativeBuildInputs = (autoDeps pkgs).nativeBuildInputs ++ (config.nativeBuildInputs pkgs);
runtimeInputs = (autoDeps pkgs).runtimeInputs ++ (config.runtimeInputs pkgs); runtimeInputs = (autoDeps pkgs).runtimeInputs ++ (config.runtimeInputs pkgs);
env = (autoDeps pkgs).env // (config.buildEnv pkgs) // { env =
LD_LIBRARY_PATH = "/run/opengl-driver/lib/:${lib.makeLibraryPath (runtimeInputs)}"; (autoDeps pkgs).env
// (config.buildEnv pkgs)
// {
LD_LIBRARY_PATH = "/run/opengl-driver/lib/:${lib.makeLibraryPath runtimeInputs}";
}; };
}; };
in in
warnIf (! builtins ? readFileType) "Unsupported Nix version in use." warnIf (! builtins ? readFileType) "Unsupported Nix version in use."
{ {
options = { options = {
extraFiles = mkOption { extraFiles = mkOption {
type = with types; listOf str; type = with types; listOf str;
default = [ ]; default = [];
}; };
extraFilesRegex = mkOption { extraFilesRegex = mkOption {
type = with types; listOf str; type = with types; listOf str;
default = [ ]; default = [];
}; };
extraPaths = mkOption { extraPaths = mkOption {
type = with types; listOf path; type = with types; listOf path;
default = [ ]; default = [];
}; };
fileset = mkOption { fileset = mkOption {
type = fileset; type = fileset;
default = fileFilter default =
fileFilter
(file: (file:
file.hasExt "rs" || file.hasExt "rs"
match "snapshot__.*\.snap" file.name != null || || match "snapshot__.*\.snap" file.name != null
elem file.name ([ "Cargo.toml" "Cargo.lock" ] ++ config.extraFiles) || || elem file.name (["Cargo.toml" "Cargo.lock"] ++ config.extraFiles)
any (re: match re file.name != null) config.extraFilesRegex) || any (re: match re file.name != null) config.extraFilesRegex)
src; src;
}; };
crossTargets = mkOption { crossTargets = mkOption {
type = with types; listOf str; type = with types; listOf str;
default = [ ]; default = [];
}; };
buildInputs = mkOption { buildInputs = mkOption {
type = function; type = function;
default = pkgs: [ ]; default = pkgs: [];
description = "build inputs for the package"; description = "build inputs for the package";
}; };
nativeBuildInputs = mkOption { nativeBuildInputs = mkOption {
type = function; type = function;
default = pkgs: [ ]; default = pkgs: [];
description = "native build inputs for the package"; description = "native build inputs for the package";
}; };
buildEnv = mkOption { buildEnv = mkOption {
type = function; type = function;
default = pkgs: { }; default = pkgs: {};
description = "build environent variables for the package"; description = "build environent variables for the package";
}; };
runtimeInputs = mkOption { runtimeInputs = mkOption {
type = function; type = function;
default = pkgs: [ ]; default = pkgs: [];
description = "runtime inputs for the package"; description = "runtime inputs for the package";
}; };
tools = mkOption { tools = mkOption {
type = function; type = function;
default = pkgs: with pkgs; [ cargo-edit bacon ]; default = pkgs: with pkgs; [cargo-edit bacon];
description = "extra packages to make available in the dev shells"; description = "extra packages to make available in the dev shells";
}; };
autodeps = mkOption { autodeps = mkOption {
@ -90,7 +102,7 @@ warnIf (! builtins ? readFileType) "Unsupported Nix version in use."
}; };
packageOpts = mkOption { packageOpts = mkOption {
type = optFunctionTo types.attrs; type = optFunctionTo types.attrs;
default = { }; default = {};
}; };
toolchain = mkOption { toolchain = mkOption {
type = function; type = function;
@ -104,8 +116,10 @@ warnIf (! builtins ? readFileType) "Unsupported Nix version in use."
}; };
miriToolchain = mkOption { miriToolchain = mkOption {
type = function; type = function;
default = pkgs: pkgs.rust-bin.selectLatestNightlyWith (toolchain: toolchain.default.override { default = pkgs:
extensions = [ "miri" "rust-src" ]; pkgs.rust-bin.selectLatestNightlyWith (toolchain:
toolchain.default.override {
extensions = ["miri" "rust-src"];
}); });
description = "rust toolchain to use for miri"; description = "rust toolchain to use for miri";
}; };
@ -115,30 +129,41 @@ warnIf (! builtins ? readFileType) "Unsupported Nix version in use."
(mkIf (pathExists (src + /Cargo.toml)) { (mkIf (pathExists (src + /Cargo.toml)) {
withOverlays = [ withOverlays = [
(import inputs.rust-overlay) (import inputs.rust-overlay)
(final: { inputs, rust-bin, writeShellApplication, stdenvNoCC, ... } @ prev: rec { (final: {
inputs,
rust-bin,
writeShellApplication,
stdenvNoCC,
...
} @ prev: rec {
commonCraneArgs = { commonCraneArgs = {
src = filteredSrc; src = filteredSrc;
strictDeps = true; strictDeps = true;
doCheck = false; doCheck = false;
inherit ((buildDeps final)) buildInputs nativeBuildInputs; inherit ((buildDeps final)) buildInputs nativeBuildInputs;
}; };
allFeaturesCraneArgs = commonCraneArgs // { allFeaturesCraneArgs =
commonCraneArgs
// {
cargoExtraArgs = "--locked --all-features ${maybeWorkspace}"; cargoExtraArgs = "--locked --all-features ${maybeWorkspace}";
pname = "${crateName}-all-features"; pname = "${crateName}-all-features";
}; };
noDefaultFeaturesCraneArgs = commonCraneArgs // { noDefaultFeaturesCraneArgs =
commonCraneArgs
// {
cargoExtraArgs = "--locked --no-default-features ${maybeWorkspace}"; cargoExtraArgs = "--locked --no-default-features ${maybeWorkspace}";
pname = "${crateName}-all-features"; pname = "${crateName}-all-features";
}; };
msrvCraneArgs = commonCraneArgs // { msrvCraneArgs =
commonCraneArgs
// {
cargoExtraArgs = "--locked --all-features ${maybeWorkspace}"; cargoExtraArgs = "--locked --all-features ${maybeWorkspace}";
pname = "${crateName}-msrv"; pname = "${crateName}-msrv";
}; };
crateName = (craneLib.crateNameFromCargoToml { inherit src; }).pname; crateName = (craneLib.crateNameFromCargoToml {inherit src;}).pname;
craneLib = (inputs.crane.mkLib final).overrideToolchain (p: p.rustToolchain); craneLib = (inputs.crane.mkLib final).overrideToolchain (p: p.rustToolchain);
craneLibForTargets = targets: (inputs.crane.mkLib final).overrideToolchain (p: p.rustToolchain.override { inherit targets; }); craneLibForTargets = targets: (inputs.crane.mkLib final).overrideToolchain (p: p.rustToolchain.override {inherit targets;});
craneLibMsrv = (inputs.crane.mkLib final).overrideToolchain (p: p.msrvRustToolchain); craneLibMsrv = (inputs.crane.mkLib final).overrideToolchain (p: p.msrvRustToolchain);
cargoArtifacts = craneLib.buildDepsOnly commonCraneArgs; cargoArtifacts = craneLib.buildDepsOnly commonCraneArgs;
@ -149,22 +174,22 @@ warnIf (! builtins ? readFileType) "Unsupported Nix version in use."
rustToolchain = config.toolchain prev; rustToolchain = config.toolchain prev;
msrvRustToolchain = config.msrvToolchain prev; msrvRustToolchain = config.msrvToolchain prev;
miriRustToolchain = config.miriToolchain prev; miriRustToolchain = config.miriToolchain prev;
cargo-expand = (writeShellApplication { cargo-expand = writeShellApplication {
name = "cargo-expand"; name = "cargo-expand";
runtimeInputs = [ prev.cargo-expand ]; runtimeInputs = [prev.cargo-expand];
text = '' text = ''
# shellcheck disable=SC2068 # shellcheck disable=SC2068
RUSTC_BOOTSTRAP=1 cargo-expand $@ RUSTC_BOOTSTRAP=1 cargo-expand $@
''; '';
}); };
cargo-miri = (writeShellApplication { cargo-miri = writeShellApplication {
name = "cargo-miri"; name = "cargo-miri";
runtimeInputs = [ miriRustToolchain ]; runtimeInputs = [miriRustToolchain];
text = '' text = ''
# shellcheck disable=SC2068 # shellcheck disable=SC2068
cargo miri $@ cargo miri $@
''; '';
}); };
}) })
]; ];
@ -175,30 +200,54 @@ warnIf (! builtins ? readFileType) "Unsupported Nix version in use."
pname = tomlPackage.name; pname = tomlPackage.name;
packages = (optionalAttrs (!hasDefaultPackage) { packages =
default = { craneLib, cargoArtifacts, defaultMeta, commonCraneArgs, pkgs }: craneLib.buildPackage (commonCraneArgs // { (optionalAttrs (!hasDefaultPackage) {
default = {
craneLib,
cargoArtifacts,
defaultMeta,
commonCraneArgs,
pkgs,
}:
craneLib.buildPackage (commonCraneArgs
// {
inherit cargoArtifacts; inherit cargoArtifacts;
meta = defaultMeta; meta = defaultMeta;
} // (config.packageOpts pkgs)); }
}) // (genAttrs config.crossTargets ( // (config.packageOpts pkgs));
target: { craneLibForTargets, cargoArtifacts, defaultMeta, callPackage, crateName, commonCraneArgs, pkgs }: })
let // (genAttrs config.crossTargets (
targetCraneLib = craneLibForTargets [ target ]; target: {
crossArgs = callPackage ./crossArgs.nix { } target; craneLibForTargets,
cargoArtifacts,
defaultMeta,
callPackage,
crateName,
commonCraneArgs,
pkgs,
}: let
targetCraneLib = craneLibForTargets [target];
crossArgs = callPackage ./crossArgs.nix {} target;
in in
targetCraneLib.buildPackage targetCraneLib.buildPackage
(commonCraneArgs // { (commonCraneArgs
meta = defaultMeta // { // {
meta =
defaultMeta
// {
targetPlatform = target; targetPlatform = target;
binarySuffix = crossArgs.BINARY_SUFFIX or ""; binarySuffix = crossArgs.BINARY_SUFFIX or "";
}; };
pname = "${crateName}-${target}"; pname = "${crateName}-${target}";
cargoExtraArgs = "--target ${target}"; cargoExtraArgs = "--target ${target}";
} // crossArgs // (config.packageOpts pkgs)) }
// crossArgs
// (config.packageOpts pkgs))
)); ));
outputs = { outputs = {
lib.crossMatrix = map lib.crossMatrix =
map
(target: { (target: {
inherit target; inherit target;
binary-suffix = optionalString (hasInfix "windows" target) ".exe"; binary-suffix = optionalString (hasInfix "windows" target) ".exe";
@ -206,98 +255,136 @@ warnIf (! builtins ? readFileType) "Unsupported Nix version in use."
config.crossTargets; config.crossTargets;
}; };
checks = checks = {
{ craneLib craneLib,
, craneLibMsrv craneLibMsrv,
, cargoArtifacts cargoArtifacts,
, cargoArtifactsMsrv cargoArtifactsMsrv,
, cargoArtifactsAllFeatures cargoArtifactsAllFeatures,
, cargoArtifactsNoDefault cargoArtifactsNoDefault,
, crateName crateName,
, commonCraneArgs commonCraneArgs,
, allFeaturesCraneArgs allFeaturesCraneArgs,
, noDefaultFeaturesCraneArgs noDefaultFeaturesCraneArgs,
, msrvCraneArgs msrvCraneArgs,
, pkgs pkgs,
, ... ...
}: }: let
let
packageOpts = config.packageOpts pkgs; packageOpts = config.packageOpts pkgs;
in in
{ {
test = craneLib.cargoTest (commonCraneArgs // { test = craneLib.cargoTest (commonCraneArgs
// {
inherit cargoArtifacts; inherit cargoArtifacts;
doCheck = true; doCheck = true;
cargoExtraArgs = "--locked --all-targets ${maybeWorkspace}"; cargoExtraArgs = "--locked --all-targets ${maybeWorkspace}";
} // packageOpts); }
clippy = craneLib.cargoClippy (commonCraneArgs // { // packageOpts);
clippy = craneLib.cargoClippy (commonCraneArgs
// {
inherit cargoArtifacts; inherit cargoArtifacts;
cargoClippyExtraArgs = "--all-targets -- --deny warnings"; cargoClippyExtraArgs = "--all-targets -- --deny warnings";
} // packageOpts); }
} // (optionalAttrs hasMsrv // packageOpts);
}
// (optionalAttrs hasMsrv
{ {
msrv = craneLibMsrv.buildPackage msrv =
(msrvCraneArgs // { craneLibMsrv.buildPackage
(msrvCraneArgs
// {
pname = "${crateName}-msrv"; pname = "${crateName}-msrv";
cargoArtifacts = cargoArtifactsMsrv; cargoArtifacts = cargoArtifactsMsrv;
cargoBuildCommand = "cargo check"; cargoBuildCommand = "cargo check";
cargoExtraArgs = "--release --locked --all-targets --all-features ${maybeWorkspace}"; cargoExtraArgs = "--release --locked --all-targets --all-features ${maybeWorkspace}";
installPhaseCommand = "mkdir $out"; installPhaseCommand = "mkdir $out";
} // packageOpts); }
}) // (optionalAttrs hasNonDefaultFeatures { // packageOpts);
test-all-features = craneLib.cargoTest (allFeaturesCraneArgs // { })
// (optionalAttrs hasNonDefaultFeatures {
test-all-features = craneLib.cargoTest (allFeaturesCraneArgs
// {
cargoArtifacts = cargoArtifactsAllFeatures; cargoArtifacts = cargoArtifactsAllFeatures;
doCheck = true; doCheck = true;
} // packageOpts); }
clippy-all-features = craneLib.cargoClippy (allFeaturesCraneArgs // { // packageOpts);
clippy-all-features = craneLib.cargoClippy (allFeaturesCraneArgs
// {
cargoArtifacts = cargoArtifactsAllFeatures; cargoArtifacts = cargoArtifactsAllFeatures;
cargoClippyExtraArgs = "--all-targets -- --deny warnings"; cargoClippyExtraArgs = "--all-targets -- --deny warnings";
} // packageOpts); }
}) // (optionalAttrs hasDefaultFeatures { // packageOpts);
test-no-default-features = craneLib.cargoTest (noDefaultFeaturesCraneArgs // { })
// (optionalAttrs hasDefaultFeatures {
test-no-default-features = craneLib.cargoTest (noDefaultFeaturesCraneArgs
// {
cargoArtifacts = cargoArtifactsNoDefault; cargoArtifacts = cargoArtifactsNoDefault;
doCheck = true; doCheck = true;
} // packageOpts); }
clippy-no-default-features = craneLib.cargoClippy (noDefaultFeaturesCraneArgs // { // packageOpts);
clippy-no-default-features = craneLib.cargoClippy (noDefaultFeaturesCraneArgs
// {
cargoArtifacts = cargoArtifactsNoDefault; cargoArtifacts = cargoArtifactsNoDefault;
cargoClippyExtraArgs = "--all-targets -- --deny warnings"; cargoClippyExtraArgs = "--all-targets -- --deny warnings";
} // packageOpts); }
}) // (optionalAttrs hasExamples { // packageOpts);
examples = craneLibMsrv.buildPackage (commonCraneArgs // { })
// (optionalAttrs hasExamples {
examples = craneLibMsrv.buildPackage (commonCraneArgs
// {
pname = "${crateName}-examples"; pname = "${crateName}-examples";
cargoExtraArgs = "--examples ${optionalString hasNonDefaultFeatures "--all-features"} ${maybeWorkspace}"; cargoExtraArgs = "--examples ${optionalString hasNonDefaultFeatures "--all-features"} ${maybeWorkspace}";
} // packageOpts); }
// packageOpts);
}); });
apps = { cargo-miri, cargo-semver-checks, ... }: { apps = {
cargo-miri,
cargo-semver-checks,
...
}: {
miri = "${cargo-miri}/bin/cargo-miri"; miri = "${cargo-miri}/bin/cargo-miri";
semver-checks = "${cargo-semver-checks}/bin/cargo-semver-checks semver-checks"; semver-checks = "${cargo-semver-checks}/bin/cargo-semver-checks semver-checks";
}; };
}) })
rec { rec {
devShells = rec { devShells =
rec {
default = { default = {
packages = pkgs: with pkgs; [ rustToolchain ] packages = pkgs:
with pkgs;
[rustToolchain]
++ (config.tools pkgs) ++ (config.tools pkgs)
++ (buildDeps pkgs).buildInputs ++ (buildDeps pkgs).buildInputs
++ (buildDeps pkgs).nativeBuildInputs; ++ (buildDeps pkgs).nativeBuildInputs;
env = { rustPlatform, pkgs, ... }: { env = {
rustPlatform,
pkgs,
...
}:
{
RUST_SRC_PATH = toString rustPlatform.rustLibSrc; RUST_SRC_PATH = toString rustPlatform.rustLibSrc;
} // (buildDeps pkgs).env; }
// (buildDeps pkgs).env;
}; };
miri = { miri = {
packages = pkgs: with pkgs; [ miriRustToolchain ] packages = pkgs:
with pkgs;
[miriRustToolchain]
++ (config.tools pkgs) ++ (config.tools pkgs)
++ (buildDeps pkgs).buildInputs ++ (buildDeps pkgs).buildInputs
++ (buildDeps pkgs).nativeBuildInputs; ++ (buildDeps pkgs).nativeBuildInputs;
inherit (default) env; inherit (default) env;
}; };
} // (optionalAttrs hasMsrv { }
// (optionalAttrs hasMsrv {
msrv = { msrv = {
packages = pkgs: with pkgs; [ msrvRustToolchain ] packages = pkgs:
with pkgs;
[msrvRustToolchain]
++ (config.tools pkgs) ++ (config.tools pkgs)
++ (buildDeps pkgs).buildInputs ++ (buildDeps pkgs).buildInputs
++ (buildDeps pkgs).nativeBuildInputs; ++ (buildDeps pkgs).nativeBuildInputs;
@ -306,9 +393,11 @@ warnIf (! builtins ? readFileType) "Unsupported Nix version in use."
}; };
}); });
formatters = pkgs: { formatters = pkgs:
"*.rs" = "${pkgs.rustfmt}/bin/rustfmt"; with pkgs; {
"*.nix" = getExe alejandra;
"*.rs" = getExe rustfmt;
}; };
} }
]; ];
} }