mirror of
https://codeberg.org/icewind/mill-scale.git
synced 2026-06-03 09:54:19 +02:00
switch to alejandra for nix formatting
This commit is contained in:
parent
ad3de3f170
commit
576d0418c8
8 changed files with 500 additions and 386 deletions
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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"];};
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,38 +1,48 @@
|
||||||
{ 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
|
),
|
||||||
isHostTarget = targetStdenv.targetPlatform.config == stdenv.targetPlatform.config;
|
cFlags ? "",
|
||||||
# don't use the pkgsCross cc if the target is the host platform
|
targetStdenv,
|
||||||
targetCc = if isHostTarget then stdenv.cc else targetStdenv.cc;
|
...
|
||||||
targetUnderscore = replaceStrings [ "-" ] [ "_" ] target;
|
} @ args: let
|
||||||
targetUpperCase = toUpper targetUnderscore;
|
isHostTarget = targetStdenv.targetPlatform.config == stdenv.targetPlatform.config;
|
||||||
rest = removeAttrs args [ "rustFlags" "cc" "cFlags" "targetDeps" "targetStdenv" "nativeBuildInputs" ];
|
# don't use the pkgsCross cc if the target is the host platform
|
||||||
# by adding the dependency in the (target specific) linker args instead of buildInputs
|
targetCc =
|
||||||
# we can prevent it trying to link to it for host build dependencies
|
if isHostTarget
|
||||||
rustFlagsWithDeps = rustFlags + concatStrings (map (targetDep: " -Clink-arg=-L${targetDep}/lib") targetDeps);
|
then stdenv.cc
|
||||||
in
|
else targetStdenv.cc;
|
||||||
(
|
targetUnderscore = replaceStrings ["-"] ["_"] target;
|
||||||
{
|
targetUpperCase = toUpper targetUnderscore;
|
||||||
nativeBuildInputs = (args.nativeBuildInputs or [ ]) ++ [ targetCc stdenv.cc ];
|
rest = removeAttrs args ["rustFlags" "cc" "cFlags" "targetDeps" "targetStdenv" "nativeBuildInputs"];
|
||||||
"CARGO_TARGET_${targetUpperCase}_RUSTFLAGS" = rustFlagsWithDeps;
|
# by adding the dependency in the (target specific) linker args instead of buildInputs
|
||||||
"CARGO_TARGET_${targetUpperCase}_LINKER" = "${targetCc.targetPrefix}cc";
|
# we can prevent it trying to link to it for host build dependencies
|
||||||
"AR_${targetUnderscore}" = "${targetCc.targetPrefix}ar";
|
rustFlagsWithDeps = rustFlags + concatStrings (map (targetDep: " -Clink-arg=-L${targetDep}/lib") targetDeps);
|
||||||
"CC_${targetUnderscore}" = "${targetCc.targetPrefix}cc";
|
in (
|
||||||
"CCX_${targetUnderscore}" = "${targetCc.targetPrefix}ccx";
|
{
|
||||||
"HOST_CC" = "${stdenv.cc.targetPrefix}cc";
|
nativeBuildInputs = (args.nativeBuildInputs or []) ++ [targetCc stdenv.cc];
|
||||||
"CFLAGS_${targetUnderscore}" = cFlags;
|
"CARGO_TARGET_${targetUpperCase}_RUSTFLAGS" = rustFlagsWithDeps;
|
||||||
} //
|
"CARGO_TARGET_${targetUpperCase}_LINKER" = "${targetCc.targetPrefix}cc";
|
||||||
rest
|
"AR_${targetUnderscore}" = "${targetCc.targetPrefix}ar";
|
||||||
);
|
"CC_${targetUnderscore}" = "${targetCc.targetPrefix}cc";
|
||||||
|
"CCX_${targetUnderscore}" = "${targetCc.targetPrefix}ccx";
|
||||||
|
"HOST_CC" = "${stdenv.cc.targetPrefix}cc";
|
||||||
|
"CFLAGS_${targetUnderscore}" = cFlags;
|
||||||
|
}
|
||||||
|
// rest
|
||||||
|
);
|
||||||
in
|
in
|
||||||
target: buildCrossArgs target crossOpts.${target}
|
target: buildCrossArgs target crossOpts.${target}
|
||||||
|
|
|
||||||
|
|
@ -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/*
|
||||||
|
|
|
||||||
25
flake.nix
25
flake.nix
|
|
@ -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,12 +11,22 @@
|
||||||
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,
|
||||||
inputs.crane = lib.mkDefault crane;
|
...
|
||||||
inputs.rust-overlay = lib.mkDefault 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.rust-overlay = lib.mkDefault rust-overlay;
|
||||||
|
};
|
||||||
};
|
};
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,9 +1,9 @@
|
||||||
{ stdenv
|
{
|
||||||
, fetchzip
|
stdenv,
|
||||||
, arch
|
fetchzip,
|
||||||
, version
|
arch,
|
||||||
, sha256
|
version,
|
||||||
,
|
sha256,
|
||||||
}:
|
}:
|
||||||
stdenv.mkDerivation {
|
stdenv.mkDerivation {
|
||||||
pname = "freebsd-sysroot";
|
pname = "freebsd-sysroot";
|
||||||
|
|
|
||||||
655
mill-scale.nix
655
mill-scale.nix
|
|
@ -1,314 +1,403 @@
|
||||||
# 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 {
|
|
||||||
type = with types; listOf str;
|
|
||||||
default = [ ];
|
|
||||||
};
|
|
||||||
extraPaths = mkOption {
|
|
||||||
type = with types; listOf path;
|
|
||||||
default = [ ];
|
|
||||||
};
|
|
||||||
fileset = mkOption {
|
|
||||||
type = fileset;
|
|
||||||
default = fileFilter
|
|
||||||
(file:
|
|
||||||
file.hasExt "rs" ||
|
|
||||||
match "snapshot__.*\.snap" file.name != null ||
|
|
||||||
elem file.name ([ "Cargo.toml" "Cargo.lock" ] ++ config.extraFiles) ||
|
|
||||||
any (re: match re file.name != null) config.extraFilesRegex)
|
|
||||||
src;
|
|
||||||
};
|
|
||||||
crossTargets = mkOption {
|
|
||||||
type = with types; listOf str;
|
|
||||||
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";
|
|
||||||
};
|
|
||||||
buildEnv = mkOption {
|
|
||||||
type = function;
|
|
||||||
default = pkgs: { };
|
|
||||||
description = "build environent variables for the package";
|
|
||||||
};
|
|
||||||
runtimeInputs = mkOption {
|
|
||||||
type = function;
|
|
||||||
default = pkgs: [ ];
|
|
||||||
description = "runtime 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";
|
|
||||||
};
|
|
||||||
autodeps = mkOption {
|
|
||||||
type = types.bool;
|
|
||||||
default = true;
|
|
||||||
description = "Automatically detect (some) of the build dependencies";
|
|
||||||
};
|
|
||||||
packageOpts = mkOption {
|
|
||||||
type = optFunctionTo types.attrs;
|
|
||||||
default = { };
|
|
||||||
};
|
|
||||||
toolchain = mkOption {
|
|
||||||
type = function;
|
|
||||||
default = pkgs: pkgs.rust-bin.stable.latest.default;
|
|
||||||
description = "rust toolchain to use";
|
|
||||||
};
|
|
||||||
msrvToolchain = mkOption {
|
|
||||||
type = function;
|
|
||||||
default = pkgs: pkgs.rust-bin.stable.${msrv}.default;
|
|
||||||
description = "rust toolchain to use for msrv check";
|
|
||||||
};
|
|
||||||
miriToolchain = mkOption {
|
|
||||||
type = function;
|
|
||||||
default = pkgs: pkgs.rust-bin.selectLatestNightlyWith (toolchain: toolchain.default.override {
|
|
||||||
extensions = [ "miri" "rust-src" ];
|
|
||||||
});
|
|
||||||
description = "rust toolchain to use for miri";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
config = mkMerge [
|
|
||||||
(mkIf (pathExists (src + /Cargo.toml)) {
|
|
||||||
withOverlays = [
|
|
||||||
(import inputs.rust-overlay)
|
|
||||||
(final: { inputs, rust-bin, writeShellApplication, stdenvNoCC, ... } @ prev: rec {
|
|
||||||
|
|
||||||
commonCraneArgs = {
|
|
||||||
src = filteredSrc;
|
|
||||||
strictDeps = true;
|
|
||||||
doCheck = false;
|
|
||||||
inherit ((buildDeps final)) buildInputs nativeBuildInputs;
|
|
||||||
};
|
|
||||||
allFeaturesCraneArgs = commonCraneArgs // {
|
|
||||||
cargoExtraArgs = "--locked --all-features ${maybeWorkspace}";
|
|
||||||
pname = "${crateName}-all-features";
|
|
||||||
};
|
|
||||||
noDefaultFeaturesCraneArgs = commonCraneArgs // {
|
|
||||||
cargoExtraArgs = "--locked --no-default-features ${maybeWorkspace}";
|
|
||||||
pname = "${crateName}-all-features";
|
|
||||||
};
|
|
||||||
msrvCraneArgs = commonCraneArgs // {
|
|
||||||
cargoExtraArgs = "--locked --all-features ${maybeWorkspace}";
|
|
||||||
pname = "${crateName}-msrv";
|
|
||||||
};
|
|
||||||
|
|
||||||
crateName = (craneLib.crateNameFromCargoToml { inherit src; }).pname;
|
|
||||||
craneLib = (inputs.crane.mkLib final).overrideToolchain (p: p.rustToolchain);
|
|
||||||
craneLibForTargets = targets: (inputs.crane.mkLib final).overrideToolchain (p: p.rustToolchain.override { inherit targets; });
|
|
||||||
craneLibMsrv = (inputs.crane.mkLib final).overrideToolchain (p: p.msrvRustToolchain);
|
|
||||||
|
|
||||||
cargoArtifacts = craneLib.buildDepsOnly commonCraneArgs;
|
|
||||||
cargoArtifactsAllFeatures = craneLib.buildDepsOnly allFeaturesCraneArgs;
|
|
||||||
cargoArtifactsNoDefault = craneLib.buildDepsOnly noDefaultFeaturesCraneArgs;
|
|
||||||
cargoArtifactsMsrv = craneLibMsrv.buildDepsOnly msrvCraneArgs;
|
|
||||||
|
|
||||||
rustToolchain = config.toolchain prev;
|
|
||||||
msrvRustToolchain = config.msrvToolchain prev;
|
|
||||||
miriRustToolchain = config.miriToolchain prev;
|
|
||||||
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 = (optionalAttrs (!hasDefaultPackage) {
|
|
||||||
default = { craneLib, cargoArtifacts, defaultMeta, commonCraneArgs, pkgs }: craneLib.buildPackage (commonCraneArgs // {
|
|
||||||
inherit cargoArtifacts;
|
|
||||||
meta = defaultMeta;
|
|
||||||
} // (config.packageOpts pkgs));
|
|
||||||
}) // (genAttrs config.crossTargets (
|
|
||||||
target: { craneLibForTargets, cargoArtifacts, defaultMeta, callPackage, crateName, commonCraneArgs, pkgs }:
|
|
||||||
let
|
|
||||||
targetCraneLib = craneLibForTargets [ target ];
|
|
||||||
crossArgs = callPackage ./crossArgs.nix { } target;
|
|
||||||
in
|
|
||||||
targetCraneLib.buildPackage
|
|
||||||
(commonCraneArgs // {
|
|
||||||
meta = defaultMeta // {
|
|
||||||
targetPlatform = target;
|
|
||||||
binarySuffix = crossArgs.BINARY_SUFFIX or "";
|
|
||||||
};
|
|
||||||
pname = "${crateName}-${target}";
|
|
||||||
cargoExtraArgs = "--target ${target}";
|
|
||||||
} // crossArgs // (config.packageOpts pkgs))
|
|
||||||
));
|
|
||||||
|
|
||||||
outputs = {
|
|
||||||
lib.crossMatrix = map
|
|
||||||
(target: {
|
|
||||||
inherit target;
|
|
||||||
binary-suffix = optionalString (hasInfix "windows" target) ".exe";
|
|
||||||
})
|
|
||||||
config.crossTargets;
|
|
||||||
};
|
};
|
||||||
|
extraFilesRegex = mkOption {
|
||||||
|
type = with types; listOf str;
|
||||||
|
default = [];
|
||||||
|
};
|
||||||
|
extraPaths = mkOption {
|
||||||
|
type = with types; listOf path;
|
||||||
|
default = [];
|
||||||
|
};
|
||||||
|
fileset = mkOption {
|
||||||
|
type = fileset;
|
||||||
|
default =
|
||||||
|
fileFilter
|
||||||
|
(file:
|
||||||
|
file.hasExt "rs"
|
||||||
|
|| match "snapshot__.*\.snap" file.name != null
|
||||||
|
|| elem file.name (["Cargo.toml" "Cargo.lock"] ++ config.extraFiles)
|
||||||
|
|| any (re: match re file.name != null) config.extraFilesRegex)
|
||||||
|
src;
|
||||||
|
};
|
||||||
|
crossTargets = mkOption {
|
||||||
|
type = with types; listOf str;
|
||||||
|
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";
|
||||||
|
};
|
||||||
|
buildEnv = mkOption {
|
||||||
|
type = function;
|
||||||
|
default = pkgs: {};
|
||||||
|
description = "build environent variables for the package";
|
||||||
|
};
|
||||||
|
runtimeInputs = mkOption {
|
||||||
|
type = function;
|
||||||
|
default = pkgs: [];
|
||||||
|
description = "runtime 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";
|
||||||
|
};
|
||||||
|
autodeps = mkOption {
|
||||||
|
type = types.bool;
|
||||||
|
default = true;
|
||||||
|
description = "Automatically detect (some) of the build dependencies";
|
||||||
|
};
|
||||||
|
packageOpts = mkOption {
|
||||||
|
type = optFunctionTo types.attrs;
|
||||||
|
default = {};
|
||||||
|
};
|
||||||
|
toolchain = mkOption {
|
||||||
|
type = function;
|
||||||
|
default = pkgs: pkgs.rust-bin.stable.latest.default;
|
||||||
|
description = "rust toolchain to use";
|
||||||
|
};
|
||||||
|
msrvToolchain = mkOption {
|
||||||
|
type = function;
|
||||||
|
default = pkgs: pkgs.rust-bin.stable.${msrv}.default;
|
||||||
|
description = "rust toolchain to use for msrv check";
|
||||||
|
};
|
||||||
|
miriToolchain = mkOption {
|
||||||
|
type = function;
|
||||||
|
default = pkgs:
|
||||||
|
pkgs.rust-bin.selectLatestNightlyWith (toolchain:
|
||||||
|
toolchain.default.override {
|
||||||
|
extensions = ["miri" "rust-src"];
|
||||||
|
});
|
||||||
|
description = "rust toolchain to use for miri";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
checks =
|
config = mkMerge [
|
||||||
{ craneLib
|
(mkIf (pathExists (src + /Cargo.toml)) {
|
||||||
, craneLibMsrv
|
withOverlays = [
|
||||||
, cargoArtifacts
|
(import inputs.rust-overlay)
|
||||||
, cargoArtifactsMsrv
|
(final: {
|
||||||
, cargoArtifactsAllFeatures
|
inputs,
|
||||||
, cargoArtifactsNoDefault
|
rust-bin,
|
||||||
, crateName
|
writeShellApplication,
|
||||||
, commonCraneArgs
|
stdenvNoCC,
|
||||||
, allFeaturesCraneArgs
|
...
|
||||||
, noDefaultFeaturesCraneArgs
|
} @ prev: rec {
|
||||||
, msrvCraneArgs
|
commonCraneArgs = {
|
||||||
, pkgs
|
src = filteredSrc;
|
||||||
, ...
|
strictDeps = true;
|
||||||
}:
|
doCheck = false;
|
||||||
let
|
inherit ((buildDeps final)) buildInputs nativeBuildInputs;
|
||||||
|
};
|
||||||
|
allFeaturesCraneArgs =
|
||||||
|
commonCraneArgs
|
||||||
|
// {
|
||||||
|
cargoExtraArgs = "--locked --all-features ${maybeWorkspace}";
|
||||||
|
pname = "${crateName}-all-features";
|
||||||
|
};
|
||||||
|
noDefaultFeaturesCraneArgs =
|
||||||
|
commonCraneArgs
|
||||||
|
// {
|
||||||
|
cargoExtraArgs = "--locked --no-default-features ${maybeWorkspace}";
|
||||||
|
pname = "${crateName}-all-features";
|
||||||
|
};
|
||||||
|
msrvCraneArgs =
|
||||||
|
commonCraneArgs
|
||||||
|
// {
|
||||||
|
cargoExtraArgs = "--locked --all-features ${maybeWorkspace}";
|
||||||
|
pname = "${crateName}-msrv";
|
||||||
|
};
|
||||||
|
|
||||||
|
crateName = (craneLib.crateNameFromCargoToml {inherit src;}).pname;
|
||||||
|
craneLib = (inputs.crane.mkLib final).overrideToolchain (p: p.rustToolchain);
|
||||||
|
craneLibForTargets = targets: (inputs.crane.mkLib final).overrideToolchain (p: p.rustToolchain.override {inherit targets;});
|
||||||
|
craneLibMsrv = (inputs.crane.mkLib final).overrideToolchain (p: p.msrvRustToolchain);
|
||||||
|
|
||||||
|
cargoArtifacts = craneLib.buildDepsOnly commonCraneArgs;
|
||||||
|
cargoArtifactsAllFeatures = craneLib.buildDepsOnly allFeaturesCraneArgs;
|
||||||
|
cargoArtifactsNoDefault = craneLib.buildDepsOnly noDefaultFeaturesCraneArgs;
|
||||||
|
cargoArtifactsMsrv = craneLibMsrv.buildDepsOnly msrvCraneArgs;
|
||||||
|
|
||||||
|
rustToolchain = config.toolchain prev;
|
||||||
|
msrvRustToolchain = config.msrvToolchain prev;
|
||||||
|
miriRustToolchain = config.miriToolchain prev;
|
||||||
|
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 =
|
||||||
|
(optionalAttrs (!hasDefaultPackage) {
|
||||||
|
default = {
|
||||||
|
craneLib,
|
||||||
|
cargoArtifacts,
|
||||||
|
defaultMeta,
|
||||||
|
commonCraneArgs,
|
||||||
|
pkgs,
|
||||||
|
}:
|
||||||
|
craneLib.buildPackage (commonCraneArgs
|
||||||
|
// {
|
||||||
|
inherit cargoArtifacts;
|
||||||
|
meta = defaultMeta;
|
||||||
|
}
|
||||||
|
// (config.packageOpts pkgs));
|
||||||
|
})
|
||||||
|
// (genAttrs config.crossTargets (
|
||||||
|
target: {
|
||||||
|
craneLibForTargets,
|
||||||
|
cargoArtifacts,
|
||||||
|
defaultMeta,
|
||||||
|
callPackage,
|
||||||
|
crateName,
|
||||||
|
commonCraneArgs,
|
||||||
|
pkgs,
|
||||||
|
}: let
|
||||||
|
targetCraneLib = craneLibForTargets [target];
|
||||||
|
crossArgs = callPackage ./crossArgs.nix {} target;
|
||||||
|
in
|
||||||
|
targetCraneLib.buildPackage
|
||||||
|
(commonCraneArgs
|
||||||
|
// {
|
||||||
|
meta =
|
||||||
|
defaultMeta
|
||||||
|
// {
|
||||||
|
targetPlatform = target;
|
||||||
|
binarySuffix = crossArgs.BINARY_SUFFIX or "";
|
||||||
|
};
|
||||||
|
pname = "${crateName}-${target}";
|
||||||
|
cargoExtraArgs = "--target ${target}";
|
||||||
|
}
|
||||||
|
// crossArgs
|
||||||
|
// (config.packageOpts pkgs))
|
||||||
|
));
|
||||||
|
|
||||||
|
outputs = {
|
||||||
|
lib.crossMatrix =
|
||||||
|
map
|
||||||
|
(target: {
|
||||||
|
inherit target;
|
||||||
|
binary-suffix = optionalString (hasInfix "windows" target) ".exe";
|
||||||
|
})
|
||||||
|
config.crossTargets;
|
||||||
|
};
|
||||||
|
|
||||||
|
checks = {
|
||||||
|
craneLib,
|
||||||
|
craneLibMsrv,
|
||||||
|
cargoArtifacts,
|
||||||
|
cargoArtifactsMsrv,
|
||||||
|
cargoArtifactsAllFeatures,
|
||||||
|
cargoArtifactsNoDefault,
|
||||||
|
crateName,
|
||||||
|
commonCraneArgs,
|
||||||
|
allFeaturesCraneArgs,
|
||||||
|
noDefaultFeaturesCraneArgs,
|
||||||
|
msrvCraneArgs,
|
||||||
|
pkgs,
|
||||||
|
...
|
||||||
|
}: let
|
||||||
packageOpts = config.packageOpts pkgs;
|
packageOpts = config.packageOpts pkgs;
|
||||||
in
|
in
|
||||||
{
|
|
||||||
test = craneLib.cargoTest (commonCraneArgs // {
|
|
||||||
inherit cargoArtifacts;
|
|
||||||
doCheck = true;
|
|
||||||
cargoExtraArgs = "--locked --all-targets ${maybeWorkspace}";
|
|
||||||
} // packageOpts);
|
|
||||||
clippy = craneLib.cargoClippy (commonCraneArgs // {
|
|
||||||
inherit cargoArtifacts;
|
|
||||||
cargoClippyExtraArgs = "--all-targets -- --deny warnings";
|
|
||||||
} // packageOpts);
|
|
||||||
} // (optionalAttrs hasMsrv
|
|
||||||
{
|
{
|
||||||
msrv = craneLibMsrv.buildPackage
|
test = craneLib.cargoTest (commonCraneArgs
|
||||||
(msrvCraneArgs // {
|
// {
|
||||||
pname = "${crateName}-msrv";
|
inherit cargoArtifacts;
|
||||||
cargoArtifacts = cargoArtifactsMsrv;
|
doCheck = true;
|
||||||
cargoBuildCommand = "cargo check";
|
cargoExtraArgs = "--locked --all-targets ${maybeWorkspace}";
|
||||||
cargoExtraArgs = "--release --locked --all-targets --all-features ${maybeWorkspace}";
|
}
|
||||||
installPhaseCommand = "mkdir $out";
|
// packageOpts);
|
||||||
} // packageOpts);
|
clippy = craneLib.cargoClippy (commonCraneArgs
|
||||||
}) // (optionalAttrs hasNonDefaultFeatures {
|
// {
|
||||||
test-all-features = craneLib.cargoTest (allFeaturesCraneArgs // {
|
inherit cargoArtifacts;
|
||||||
cargoArtifacts = cargoArtifactsAllFeatures;
|
cargoClippyExtraArgs = "--all-targets -- --deny warnings";
|
||||||
doCheck = true;
|
}
|
||||||
} // packageOpts);
|
// packageOpts);
|
||||||
clippy-all-features = craneLib.cargoClippy (allFeaturesCraneArgs // {
|
}
|
||||||
cargoArtifacts = cargoArtifactsAllFeatures;
|
// (optionalAttrs hasMsrv
|
||||||
cargoClippyExtraArgs = "--all-targets -- --deny warnings";
|
{
|
||||||
} // packageOpts);
|
msrv =
|
||||||
}) // (optionalAttrs hasDefaultFeatures {
|
craneLibMsrv.buildPackage
|
||||||
test-no-default-features = craneLib.cargoTest (noDefaultFeaturesCraneArgs // {
|
(msrvCraneArgs
|
||||||
cargoArtifacts = cargoArtifactsNoDefault;
|
// {
|
||||||
doCheck = true;
|
pname = "${crateName}-msrv";
|
||||||
} // packageOpts);
|
cargoArtifacts = cargoArtifactsMsrv;
|
||||||
clippy-no-default-features = craneLib.cargoClippy (noDefaultFeaturesCraneArgs // {
|
cargoBuildCommand = "cargo check";
|
||||||
cargoArtifacts = cargoArtifactsNoDefault;
|
cargoExtraArgs = "--release --locked --all-targets --all-features ${maybeWorkspace}";
|
||||||
cargoClippyExtraArgs = "--all-targets -- --deny warnings";
|
installPhaseCommand = "mkdir $out";
|
||||||
} // packageOpts);
|
}
|
||||||
}) // (optionalAttrs hasExamples {
|
// packageOpts);
|
||||||
examples = craneLibMsrv.buildPackage (commonCraneArgs // {
|
})
|
||||||
pname = "${crateName}-examples";
|
// (optionalAttrs hasNonDefaultFeatures {
|
||||||
cargoExtraArgs = "--examples ${optionalString hasNonDefaultFeatures "--all-features"} ${maybeWorkspace}";
|
test-all-features = craneLib.cargoTest (allFeaturesCraneArgs
|
||||||
} // packageOpts);
|
// {
|
||||||
});
|
cargoArtifacts = cargoArtifactsAllFeatures;
|
||||||
|
doCheck = true;
|
||||||
|
}
|
||||||
|
// packageOpts);
|
||||||
|
clippy-all-features = craneLib.cargoClippy (allFeaturesCraneArgs
|
||||||
|
// {
|
||||||
|
cargoArtifacts = cargoArtifactsAllFeatures;
|
||||||
|
cargoClippyExtraArgs = "--all-targets -- --deny warnings";
|
||||||
|
}
|
||||||
|
// packageOpts);
|
||||||
|
})
|
||||||
|
// (optionalAttrs hasDefaultFeatures {
|
||||||
|
test-no-default-features = craneLib.cargoTest (noDefaultFeaturesCraneArgs
|
||||||
|
// {
|
||||||
|
cargoArtifacts = cargoArtifactsNoDefault;
|
||||||
|
doCheck = true;
|
||||||
|
}
|
||||||
|
// packageOpts);
|
||||||
|
clippy-no-default-features = craneLib.cargoClippy (noDefaultFeaturesCraneArgs
|
||||||
|
// {
|
||||||
|
cargoArtifacts = cargoArtifactsNoDefault;
|
||||||
|
cargoClippyExtraArgs = "--all-targets -- --deny warnings";
|
||||||
|
}
|
||||||
|
// packageOpts);
|
||||||
|
})
|
||||||
|
// (optionalAttrs hasExamples {
|
||||||
|
examples = craneLibMsrv.buildPackage (commonCraneArgs
|
||||||
|
// {
|
||||||
|
pname = "${crateName}-examples";
|
||||||
|
cargoExtraArgs = "--examples ${optionalString hasNonDefaultFeatures "--all-features"} ${maybeWorkspace}";
|
||||||
|
}
|
||||||
|
// packageOpts);
|
||||||
|
});
|
||||||
|
|
||||||
apps = { cargo-miri, cargo-semver-checks, ... }: {
|
apps = {
|
||||||
miri = "${cargo-miri}/bin/cargo-miri";
|
cargo-miri,
|
||||||
semver-checks = "${cargo-semver-checks}/bin/cargo-semver-checks semver-checks";
|
cargo-semver-checks,
|
||||||
};
|
...
|
||||||
})
|
}: {
|
||||||
|
miri = "${cargo-miri}/bin/cargo-miri";
|
||||||
rec {
|
semver-checks = "${cargo-semver-checks}/bin/cargo-semver-checks semver-checks";
|
||||||
devShells = rec {
|
|
||||||
default = {
|
|
||||||
packages = pkgs: with pkgs; [ rustToolchain ]
|
|
||||||
++ (config.tools pkgs)
|
|
||||||
++ (buildDeps pkgs).buildInputs
|
|
||||||
++ (buildDeps pkgs).nativeBuildInputs;
|
|
||||||
|
|
||||||
env = { rustPlatform, pkgs, ... }: {
|
|
||||||
RUST_SRC_PATH = toString rustPlatform.rustLibSrc;
|
|
||||||
} // (buildDeps pkgs).env;
|
|
||||||
};
|
};
|
||||||
miri = {
|
})
|
||||||
packages = pkgs: with pkgs; [ miriRustToolchain ]
|
|
||||||
++ (config.tools pkgs)
|
|
||||||
++ (buildDeps pkgs).buildInputs
|
|
||||||
++ (buildDeps pkgs).nativeBuildInputs;
|
|
||||||
|
|
||||||
inherit (default) env;
|
rec {
|
||||||
};
|
devShells =
|
||||||
} // (optionalAttrs hasMsrv {
|
rec {
|
||||||
msrv = {
|
default = {
|
||||||
packages = pkgs: with pkgs; [ msrvRustToolchain ]
|
packages = pkgs:
|
||||||
++ (config.tools pkgs)
|
with pkgs;
|
||||||
++ (buildDeps pkgs).buildInputs
|
[rustToolchain]
|
||||||
++ (buildDeps pkgs).nativeBuildInputs;
|
++ (config.tools pkgs)
|
||||||
|
++ (buildDeps pkgs).buildInputs
|
||||||
|
++ (buildDeps pkgs).nativeBuildInputs;
|
||||||
|
|
||||||
inherit (devShells.default) env;
|
env = {
|
||||||
};
|
rustPlatform,
|
||||||
});
|
pkgs,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
{
|
||||||
|
RUST_SRC_PATH = toString rustPlatform.rustLibSrc;
|
||||||
|
}
|
||||||
|
// (buildDeps pkgs).env;
|
||||||
|
};
|
||||||
|
miri = {
|
||||||
|
packages = pkgs:
|
||||||
|
with pkgs;
|
||||||
|
[miriRustToolchain]
|
||||||
|
++ (config.tools pkgs)
|
||||||
|
++ (buildDeps pkgs).buildInputs
|
||||||
|
++ (buildDeps pkgs).nativeBuildInputs;
|
||||||
|
|
||||||
formatters = pkgs: {
|
inherit (default) env;
|
||||||
"*.rs" = "${pkgs.rustfmt}/bin/rustfmt";
|
};
|
||||||
};
|
}
|
||||||
}
|
// (optionalAttrs hasMsrv {
|
||||||
];
|
msrv = {
|
||||||
}
|
packages = pkgs:
|
||||||
|
with pkgs;
|
||||||
|
[msrvRustToolchain]
|
||||||
|
++ (config.tools pkgs)
|
||||||
|
++ (buildDeps pkgs).buildInputs
|
||||||
|
++ (buildDeps pkgs).nativeBuildInputs;
|
||||||
|
|
||||||
|
inherit (devShells.default) env;
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
|
formatters = pkgs:
|
||||||
|
with pkgs; {
|
||||||
|
"*.nix" = getExe alejandra;
|
||||||
|
"*.rs" = getExe rustfmt;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue