add (native)buildinputs option

This commit is contained in:
Robin Appelman 2024-09-28 21:51:27 +02:00
commit 8bd977cc48

View file

@ -7,7 +7,7 @@ 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;
inherit (lib.fileset) fileFilter toSource; inherit (lib.fileset) fileFilter toSource;
inherit (flakelight.types) fileset; inherit (flakelight.types) fileset function;
cargoToml = fromTOML (readFile (src + /Cargo.toml)); cargoToml = fromTOML (readFile (src + /Cargo.toml));
tomlPackage = cargoToml.package or cargoToml.workspace.package; tomlPackage = cargoToml.package or cargoToml.workspace.package;
@ -16,7 +16,6 @@ let
hasFeatures = cargoToml ? features && isAttrs cargoToml.features; hasFeatures = cargoToml ? features && isAttrs cargoToml.features;
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;
tools = pkgs: with pkgs; [ cargo-edit bacon ];
maybeWorkspace = optionalString hasWorkspace "--workspace"; maybeWorkspace = optionalString hasWorkspace "--workspace";
in in
warnIf (! builtins ? readFileType) "Unsupported Nix version in use." warnIf (! builtins ? readFileType) "Unsupported Nix version in use."
@ -36,6 +35,21 @@ warnIf (! builtins ? readFileType) "Unsupported Nix version in use."
type = with types; listOf str; type = with types; listOf str;
default = [ ]; default = [ ];
}; };
buildInputs = mkOption {
type = function;
default = pkgs: [ ];
description = "build inputs for the package";
};
nativeBuildInputs = mkOption {
type = function;
default = pkgs: [ ];
description = "native build inputs for the package";
};
tools = mkOption {
type = function;
default = pkgs: with pkgs; [ cargo-edit bacon ];
description = "extra packages to make available in the dev shells";
};
}; };
config = mkMerge [ config = mkMerge [
@ -51,6 +65,8 @@ warnIf (! builtins ? readFileType) "Unsupported Nix version in use."
{ {
inherit src; inherit src;
strictDeps = true; strictDeps = true;
buildInputs = config.buildInputs final;
nativeBuildInputs = config.nativeBuildInputs final;
}; };
cargoArtifactsAllFeatures = craneLib.buildDepsOnly cargoArtifactsAllFeatures = craneLib.buildDepsOnly
{ {
@ -58,6 +74,8 @@ 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;
nativeBuildInputs = config.nativeBuildInputs final;
}; };
cargoArtifactsNoDefault = craneLib.buildDepsOnly cargoArtifactsNoDefault = craneLib.buildDepsOnly
{ {
@ -65,6 +83,8 @@ 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;
nativeBuildInputs = config.nativeBuildInputs final;
}; };
cargoArtifactsMsrv = craneLibMsrv.buildDepsOnly cargoArtifactsMsrv = craneLibMsrv.buildDepsOnly
{ {
@ -72,6 +92,8 @@ 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;
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;
@ -105,15 +127,17 @@ warnIf (! builtins ? readFileType) "Unsupported Nix version in use."
pname = tomlPackage.name; pname = tomlPackage.name;
packages = { packages = {
default = { craneLib, cargoArtifacts, defaultMeta }: craneLib.buildPackage { default = { craneLib, cargoArtifacts, defaultMeta, pkgs }: craneLib.buildPackage {
src = toSource { root = src; inherit (config) fileset; }; src = toSource { root = src; inherit (config) fileset; };
inherit cargoArtifacts; inherit cargoArtifacts;
doCheck = false; doCheck = false;
strictDeps = true; strictDeps = true;
meta = defaultMeta; meta = defaultMeta;
buildInputs = config.buildInputs pkgs;
nativeBuildInputs = config.nativeBuildInputs pkgs;
}; };
} // (genAttrs config.crossTargets ( } // (genAttrs config.crossTargets (
target: { craneLibForTargets, cargoArtifacts, defaultMeta, callPackage, crateName }: target: { craneLibForTargets, cargoArtifacts, defaultMeta, callPackage, crateName, pkgs }:
let let
targetCraneLib = craneLibForTargets [ target ]; targetCraneLib = craneLibForTargets [ target ];
crossArgs = callPackage ./crossArgs.nix { } target; crossArgs = callPackage ./crossArgs.nix { } target;
@ -129,14 +153,18 @@ warnIf (! builtins ? readFileType) "Unsupported Nix version in use."
}; };
pname = "${crateName}-${target}"; pname = "${crateName}-${target}";
cargoExtraArgs = "--target ${target}"; cargoExtraArgs = "--target ${target}";
buildInputs = config.buildInputs pkgs;
nativeBuildInputs = config.nativeBuildInputs pkgs;
} // crossArgs) } // crossArgs)
)); ));
outputs = { outputs = {
crossMatrix = map (target: { lib.crossMatrix = map
(target: {
inherit target; inherit target;
binary-suffix = optionalString (hasInfix "windows" target) ".exe"; binary-suffix = optionalString (hasInfix "windows" target) ".exe";
}) config.crossTargets; })
config.crossTargets;
}; };
checks = checks =
@ -147,16 +175,21 @@ warnIf (! builtins ? readFileType) "Unsupported Nix version in use."
, cargoArtifactsAllFeatures , cargoArtifactsAllFeatures
, cargoArtifactsNoDefault , cargoArtifactsNoDefault
, crateName , crateName
, pkgs
, ... , ...
}: { }: {
test = craneLib.cargoTest { test = craneLib.cargoTest {
inherit src cargoArtifacts; inherit src cargoArtifacts;
cargoExtraArgs = "--locked --all-targets --workspace"; cargoExtraArgs = "--locked --all-targets --workspace";
buildInputs = config.buildInputs pkgs;
nativeBuildInputs = config.nativeBuildInputs pkgs;
}; };
clippy = craneLib.cargoClippy { clippy = craneLib.cargoClippy {
inherit src cargoArtifacts; inherit src cargoArtifacts;
strictDeps = true; strictDeps = true;
cargoClippyExtraArgs = "--all-targets ${maybeWorkspace} -- --deny warnings"; cargoClippyExtraArgs = "--all-targets ${maybeWorkspace} -- --deny warnings";
buildInputs = config.buildInputs pkgs;
nativeBuildInputs = config.nativeBuildInputs pkgs;
}; };
} // (optionalAttrs hasMsrv { } // (optionalAttrs hasMsrv {
msrv = craneLibMsrv.buildPackage { msrv = craneLibMsrv.buildPackage {
@ -168,6 +201,8 @@ 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;
nativeBuildInputs = config.nativeBuildInputs pkgs;
}; };
}) // (optionalAttrs hasFeatures { }) // (optionalAttrs hasFeatures {
test-all-features = craneLib.cargoTest { test-all-features = craneLib.cargoTest {
@ -176,6 +211,8 @@ 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;
nativeBuildInputs = config.nativeBuildInputs pkgs;
}; };
clippy-all-features = craneLib.cargoClippy { clippy-all-features = craneLib.cargoClippy {
inherit src; inherit src;
@ -183,6 +220,8 @@ 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;
nativeBuildInputs = config.nativeBuildInputs pkgs;
}; };
}) // (optionalAttrs hasDefaultFeatures { }) // (optionalAttrs hasDefaultFeatures {
test-no-default-features = craneLib.cargoTest { test-no-default-features = craneLib.cargoTest {
@ -191,6 +230,8 @@ 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;
nativeBuildInputs = config.nativeBuildInputs pkgs;
}; };
clippy-no-default-features = craneLib.cargoClippy { clippy-no-default-features = craneLib.cargoClippy {
inherit src; inherit src;
@ -198,6 +239,8 @@ 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;
nativeBuildInputs = config.nativeBuildInputs pkgs;
}; };
}); });
@ -210,20 +253,29 @@ warnIf (! builtins ? readFileType) "Unsupported Nix version in use."
rec { rec {
devShells = rec { devShells = rec {
default = { default = {
packages = pkgs: with pkgs; [ latestRustToolchain ] ++ tools pkgs; packages = pkgs: with pkgs; [ latestRustToolchain ]
++ (config.tools pkgs)
++ (config.buildInputs pkgs)
++ (config.nativeBuildInputs pkgs);
env = { rustPlatform, ... }: { env = { rustPlatform, ... }: {
RUST_SRC_PATH = toString rustPlatform.rustLibSrc; RUST_SRC_PATH = toString rustPlatform.rustLibSrc;
}; };
}; };
miri = { miri = {
packages = pkgs: with pkgs; [ miriRustToolchain cargo-edit bacon ] ++ tools pkgs; packages = pkgs: with pkgs; [ miriRustToolchain ]
++ (config.tools pkgs)
++ (config.buildInputs pkgs)
++ (config.nativeBuildInputs pkgs);
inherit (default) env; inherit (default) env;
}; };
} // (optionalAttrs hasMsrv { } // (optionalAttrs hasMsrv {
msrv = { msrv = {
packages = pkgs: with pkgs; [ msrvRustToolchain cargo-edit bacon ] ++ tools pkgs; packages = pkgs: with pkgs; [ msrvRustToolchain ]
++ (config.tools pkgs)
++ (config.buildInputs pkgs)
++ (config.nativeBuildInputs pkgs);
inherit (devShells.default) env; inherit (devShells.default) env;
}; };