This commit is contained in:
Robin Appelman 2024-09-28 22:43:05 +02:00
commit 823fb3493c
2 changed files with 58 additions and 33 deletions

4
autodeps.nix Normal file
View file

@ -0,0 +1,4 @@
{
"openssl-sys" = { build = [ "openssl" ]; };
"libudev-sys" = { build = [ "eudev" ]; };
}

View file

@ -5,7 +5,7 @@
{ lib, src, config, flakelight, inputs, ... }: { lib, src, config, flakelight, inputs, ... }:
let let
inherit (builtins) elem readFile pathExists isAttrs attrNames; inherit (builtins) elem readFile pathExists isAttrs attrNames;
inherit (lib) map mkDefault mkIf mkMerge mkOption warnIf assertMsg optionalAttrs types optionalString genAttrs hasInfix; inherit (lib) map mkDefault mkIf mkMerge mkOption warnIf assertMsg optionalAttrs types optionalString genAttrs hasInfix intersectLists foldl attrVals;
inherit (lib.fileset) fileFilter toSource; inherit (lib.fileset) fileFilter toSource;
inherit (flakelight.types) fileset function; inherit (flakelight.types) fileset function;
@ -18,6 +18,35 @@ let
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;
maybeWorkspace = optionalString hasWorkspace "--workspace"; maybeWorkspace = optionalString hasWorkspace "--workspace";
cargoLockDeps =
if pathExists (src + /Cargo.lock) then
let
cargoLock = fromTOML (readFile (src + /Cargo.lock));
in
map (package: package.name) cargoLock.package
else [ ];
availableAutoDeps = import ./autodeps.nix;
detectedDeps = intersectLists cargoLockDeps (attrNames availableAutoDeps);
mergedDetectedDeps =
if config.autodeps then
foldl
(merged: dep: {
build = merged.build ++ (availableAutoDeps.${dep}.build or [ ]);
native = merged.native ++ (availableAutoDeps.${dep}.native or [ ]);
})
{
build = [ ];
native = [ ];
}
detectedDeps else {
build = [ ];
native = [ ];
};
buildDeps = pkgs: {
buildInputs = (attrVals mergedDetectedDeps.build pkgs) ++ (config.buildInputs pkgs);
nativeBuildInputs = with pkgs; [ pkg-config ] ++ (attrVals mergedDetectedDeps.native pkgs) ++ (config.nativeBuildInputs pkgs);
};
in in
warnIf (! builtins ? readFileType) "Unsupported Nix version in use." warnIf (! builtins ? readFileType) "Unsupported Nix version in use."
{ {
@ -51,6 +80,11 @@ warnIf (! builtins ? readFileType) "Unsupported Nix version in use."
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 {
type = types.bool;
default = true;
description = "Automatically detect (some) of the build dependencies";
};
}; };
config = mkMerge [ config = mkMerge [
@ -66,8 +100,7 @@ warnIf (! builtins ? readFileType) "Unsupported Nix version in use."
{ {
src = filteredSrc; src = filteredSrc;
strictDeps = true; strictDeps = true;
buildInputs = config.buildInputs final; inherit ((buildDeps final)) buildInputs nativeBuildInputs;
nativeBuildInputs = config.nativeBuildInputs final;
}; };
cargoArtifactsAllFeatures = craneLib.buildDepsOnly cargoArtifactsAllFeatures = craneLib.buildDepsOnly
{ {
@ -75,8 +108,7 @@ warnIf (! builtins ? readFileType) "Unsupported Nix version in use."
strictDeps = true; strictDeps = true;
cargoExtraArgs = "--locked --all-features"; cargoExtraArgs = "--locked --all-features";
pname = "${crateName}-all-features"; pname = "${crateName}-all-features";
buildInputs = config.buildInputs final; inherit ((buildDeps final)) buildInputs nativeBuildInputs;
nativeBuildInputs = config.nativeBuildInputs final;
}; };
cargoArtifactsNoDefault = craneLib.buildDepsOnly cargoArtifactsNoDefault = craneLib.buildDepsOnly
{ {
@ -84,8 +116,7 @@ warnIf (! builtins ? readFileType) "Unsupported Nix version in use."
strictDeps = true; strictDeps = true;
cargoExtraArgs = "--locked --no-default-features"; cargoExtraArgs = "--locked --no-default-features";
pname = "${crateName}-no-default-features"; pname = "${crateName}-no-default-features";
buildInputs = config.buildInputs final; inherit ((buildDeps final)) buildInputs nativeBuildInputs;
nativeBuildInputs = config.nativeBuildInputs final;
}; };
cargoArtifactsMsrv = craneLibMsrv.buildDepsOnly cargoArtifactsMsrv = craneLibMsrv.buildDepsOnly
{ {
@ -93,8 +124,7 @@ warnIf (! builtins ? readFileType) "Unsupported Nix version in use."
strictDeps = true; strictDeps = true;
cargoExtraArgs = "--locked --all-features"; cargoExtraArgs = "--locked --all-features";
pname = "${crateName}-msrv"; pname = "${crateName}-msrv";
buildInputs = config.buildInputs final; inherit ((buildDeps final)) buildInputs nativeBuildInputs;
nativeBuildInputs = config.nativeBuildInputs final;
}; };
latestRustToolchain = rust-bin.stable.latest.default; latestRustToolchain = rust-bin.stable.latest.default;
msrvRustToolchain = rust-bin.stable.${msrv}.default; msrvRustToolchain = rust-bin.stable.${msrv}.default;
@ -134,8 +164,7 @@ warnIf (! builtins ? readFileType) "Unsupported Nix version in use."
doCheck = false; doCheck = false;
strictDeps = true; strictDeps = true;
meta = defaultMeta; meta = defaultMeta;
buildInputs = config.buildInputs pkgs; inherit ((buildDeps pkgs)) buildInputs nativeBuildInputs;
nativeBuildInputs = config.nativeBuildInputs pkgs;
}; };
} // (genAttrs config.crossTargets ( } // (genAttrs config.crossTargets (
target: { craneLibForTargets, cargoArtifacts, defaultMeta, callPackage, crateName, pkgs }: target: { craneLibForTargets, cargoArtifacts, defaultMeta, callPackage, crateName, pkgs }:
@ -154,8 +183,7 @@ warnIf (! builtins ? readFileType) "Unsupported Nix version in use."
}; };
pname = "${crateName}-${target}"; pname = "${crateName}-${target}";
cargoExtraArgs = "--target ${target}"; cargoExtraArgs = "--target ${target}";
buildInputs = config.buildInputs pkgs; inherit ((buildDeps pkgs)) buildInputs nativeBuildInputs;
nativeBuildInputs = config.nativeBuildInputs pkgs;
} // crossArgs) } // crossArgs)
)); ));
@ -183,16 +211,14 @@ warnIf (! builtins ? readFileType) "Unsupported Nix version in use."
src = filteredSrc; src = filteredSrc;
inherit cargoArtifacts; inherit cargoArtifacts;
cargoExtraArgs = "--locked --all-targets --workspace"; cargoExtraArgs = "--locked --all-targets --workspace";
buildInputs = config.buildInputs pkgs; inherit ((buildDeps pkgs)) buildInputs nativeBuildInputs;
nativeBuildInputs = config.nativeBuildInputs pkgs;
}; };
clippy = craneLib.cargoClippy { clippy = craneLib.cargoClippy {
src = filteredSrc; src = filteredSrc;
inherit cargoArtifacts; inherit cargoArtifacts;
strictDeps = true; strictDeps = true;
cargoClippyExtraArgs = "--all-targets ${maybeWorkspace} -- --deny warnings"; cargoClippyExtraArgs = "--all-targets ${maybeWorkspace} -- --deny warnings";
buildInputs = config.buildInputs pkgs; inherit ((buildDeps pkgs)) buildInputs nativeBuildInputs;
nativeBuildInputs = config.nativeBuildInputs pkgs;
}; };
} // (optionalAttrs hasMsrv { } // (optionalAttrs hasMsrv {
msrv = craneLibMsrv.buildPackage { msrv = craneLibMsrv.buildPackage {
@ -204,8 +230,7 @@ warnIf (! builtins ? readFileType) "Unsupported Nix version in use."
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";
buildInputs = config.buildInputs pkgs; inherit ((buildDeps pkgs)) buildInputs nativeBuildInputs;
nativeBuildInputs = config.nativeBuildInputs pkgs;
}; };
}) // (optionalAttrs hasFeatures { }) // (optionalAttrs hasFeatures {
test-all-features = craneLib.cargoTest { test-all-features = craneLib.cargoTest {
@ -214,8 +239,7 @@ warnIf (! builtins ? readFileType) "Unsupported Nix version in use."
strictDeps = true; strictDeps = true;
cargoArtifacts = cargoArtifactsAllFeatures; cargoArtifacts = cargoArtifactsAllFeatures;
cargoExtraArgs = "--locked --all-targets --all-features ${maybeWorkspace}"; cargoExtraArgs = "--locked --all-targets --all-features ${maybeWorkspace}";
buildInputs = config.buildInputs pkgs; inherit ((buildDeps pkgs)) buildInputs nativeBuildInputs;
nativeBuildInputs = config.nativeBuildInputs pkgs;
}; };
clippy-all-features = craneLib.cargoClippy { clippy-all-features = craneLib.cargoClippy {
src = filteredSrc; src = filteredSrc;
@ -223,8 +247,7 @@ warnIf (! builtins ? readFileType) "Unsupported Nix version in use."
strictDeps = true; strictDeps = true;
cargoArtifacts = cargoArtifactsAllFeatures; cargoArtifacts = cargoArtifactsAllFeatures;
cargoClippyExtraArgs = "--all-targets ${maybeWorkspace} --all-features -- --deny warnings"; cargoClippyExtraArgs = "--all-targets ${maybeWorkspace} --all-features -- --deny warnings";
buildInputs = config.buildInputs pkgs; inherit ((buildDeps pkgs)) buildInputs nativeBuildInputs;
nativeBuildInputs = config.nativeBuildInputs pkgs;
}; };
}) // (optionalAttrs hasDefaultFeatures { }) // (optionalAttrs hasDefaultFeatures {
test-no-default-features = craneLib.cargoTest { test-no-default-features = craneLib.cargoTest {
@ -233,8 +256,7 @@ warnIf (! builtins ? readFileType) "Unsupported Nix version in use."
strictDeps = true; strictDeps = true;
cargoArtifacts = cargoArtifactsNoDefault; cargoArtifacts = cargoArtifactsNoDefault;
cargoExtraArgs = "--locked --all-targets --no-default-features ${maybeWorkspace}"; cargoExtraArgs = "--locked --all-targets --no-default-features ${maybeWorkspace}";
buildInputs = config.buildInputs pkgs; inherit ((buildDeps pkgs)) buildInputs nativeBuildInputs;
nativeBuildInputs = config.nativeBuildInputs pkgs;
}; };
clippy-no-default-features = craneLib.cargoClippy { clippy-no-default-features = craneLib.cargoClippy {
inherit src; inherit src;
@ -242,8 +264,7 @@ warnIf (! builtins ? readFileType) "Unsupported Nix version in use."
strictDeps = true; strictDeps = true;
cargoArtifacts = cargoArtifactsNoDefault; cargoArtifacts = cargoArtifactsNoDefault;
cargoClippyExtraArgs = "--all-targets ${maybeWorkspace} --no-default-features -- --deny warnings"; cargoClippyExtraArgs = "--all-targets ${maybeWorkspace} --no-default-features -- --deny warnings";
buildInputs = config.buildInputs pkgs; inherit ((buildDeps pkgs)) buildInputs nativeBuildInputs;
nativeBuildInputs = config.nativeBuildInputs pkgs;
}; };
}); });
@ -258,8 +279,8 @@ warnIf (! builtins ? readFileType) "Unsupported Nix version in use."
default = { default = {
packages = pkgs: with pkgs; [ latestRustToolchain ] packages = pkgs: with pkgs; [ latestRustToolchain ]
++ (config.tools pkgs) ++ (config.tools pkgs)
++ (config.buildInputs pkgs) ++ (buildDeps pkgs).buildInputs
++ (config.nativeBuildInputs pkgs); ++ (buildDeps pkgs).nativeBuildInputs;
env = { rustPlatform, ... }: { env = { rustPlatform, ... }: {
RUST_SRC_PATH = toString rustPlatform.rustLibSrc; RUST_SRC_PATH = toString rustPlatform.rustLibSrc;
@ -268,8 +289,8 @@ warnIf (! builtins ? readFileType) "Unsupported Nix version in use."
miri = { miri = {
packages = pkgs: with pkgs; [ miriRustToolchain ] packages = pkgs: with pkgs; [ miriRustToolchain ]
++ (config.tools pkgs) ++ (config.tools pkgs)
++ (config.buildInputs pkgs) ++ (buildDeps pkgs).buildInputs
++ (config.nativeBuildInputs pkgs); ++ (buildDeps pkgs).nativeBuildInputs;
inherit (default) env; inherit (default) env;
}; };
@ -277,8 +298,8 @@ warnIf (! builtins ? readFileType) "Unsupported Nix version in use."
msrv = { msrv = {
packages = pkgs: with pkgs; [ msrvRustToolchain ] packages = pkgs: with pkgs; [ msrvRustToolchain ]
++ (config.tools pkgs) ++ (config.tools pkgs)
++ (config.buildInputs pkgs) ++ (buildDeps pkgs).buildInputs
++ (config.nativeBuildInputs pkgs); ++ (buildDeps pkgs).nativeBuildInputs;
inherit (devShells.default) env; inherit (devShells.default) env;
}; };