refactor(nix): move out build into separate file

flake.nix is getting too big and this makes it easier to understand what
is going on with e.g. callPackage.

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
This commit is contained in:
Thomas Mühlbacher 2025-09-25 00:17:31 +00:00 committed by Kent Overstreet
parent 126829decf
commit 9eb3e6c076
2 changed files with 163 additions and 165 deletions

139
crane-build.nix Normal file
View File

@ -0,0 +1,139 @@
{
lib,
pkgs,
# build time
pkg-config,
rustPlatform,
# run time
fuse3,
keyutils,
libaio,
libsodium,
liburcu,
libuuid,
lz4,
udev,
zlib,
zstd,
crane,
rustVersion ? "latest",
version,
}:
let
craneLib = (crane.mkLib pkgs).overrideToolchain (
p: p.rust-bin.stable."${rustVersion}".minimal.override { extensions = [ "clippy" ]; }
);
args = {
inherit version;
src = ./.;
strictDeps = true;
env = {
PKG_CONFIG_SYSTEMD_SYSTEMDSYSTEMUNITDIR = "${placeholder "out"}/lib/systemd/system";
PKG_CONFIG_UDEV_UDEVDIR = "${placeholder "out"}/lib/udev";
};
makeFlags = [
"INITRAMFS_DIR=${placeholder "out"}/etc/initramfs-tools"
"PREFIX=${placeholder "out"}"
"VERSION=${version}"
];
dontStrip = true;
nativeBuildInputs = [
pkg-config
rustPlatform.bindgenHook
];
buildInputs = [
keyutils
libaio
libsodium
liburcu
libuuid
lz4
udev
zlib
zstd
];
};
cargoArtifacts = craneLib.buildDepsOnly args;
package = craneLib.buildPackage (
args
// {
inherit cargoArtifacts;
enableParallelBuilding = true;
buildPhaseCargoCommand = ''
make ''${enableParallelBuilding:+-j''${NIX_BUILD_CORES}} $makeFlags
'';
doNotPostBuildInstallCargoBinaries = true;
installPhaseCommand = ''
make ''${enableParallelBuilding:+-j''${NIX_BUILD_CORES}} $makeFlags install
'';
doInstallCheck = true;
installCheckPhase = ''
runHook preInstallCheck
test "$($out/bin/bcachefs version)" = "${version}"
runHook postInstallCheck
'';
meta = {
description = "Userspace tools for bcachefs";
license = lib.licenses.gpl2Only;
mainProgram = "bcachefs";
};
}
);
packageFuse = package.overrideAttrs (
final: prev: {
makeFlags = prev.makeFlags ++ [ "BCACHEFS_FUSE=1" ];
buildInputs = prev.buildInputs ++ [ fuse3 ];
}
);
cargo-clippy = craneLib.cargoClippy (
args
// {
inherit cargoArtifacts;
cargoClippyExtraArgs = "--all-targets --all-features -- --deny warnings";
}
);
# we have to build our own `craneLib.cargoTest`
cargo-test = craneLib.mkCargoDerivation (
args
// {
inherit cargoArtifacts;
doCheck = true;
enableParallelChecking = true;
pnameSuffix = "-test";
buildPhaseCargoCommand = "";
checkPhaseCargoCommand = ''
make ''${enableParallelChecking:+-j''${NIX_BUILD_CORES}} $makeFlags libbcachefs.a
cargo test --profile release -- --nocapture
'';
}
);
in
{
inherit
cargo-clippy
cargo-test
package
packageFuse
;
}

189
flake.nix
View File

@ -74,113 +74,9 @@
rev = self.shortRev or self.dirtyShortRev or (lib.substring 0 8 self.lastModifiedDate);
version = "${cargoToml.package.version}+${rev}";
mkCommon =
{
crane,
pkgs,
rustVersion ? "latest",
# build time
buildPackages,
pkg-config,
rustPlatform,
# run time
keyutils,
libaio,
libsodium,
liburcu,
libuuid,
lz4,
udev,
zlib,
zstd,
}:
let
craneLib = (crane.mkLib pkgs).overrideToolchain (
p: p.rust-bin.stable."${rustVersion}".minimal.override { extensions = [ "clippy" ]; }
);
args = {
inherit version;
src = self;
strictDeps = true;
env = {
PKG_CONFIG_SYSTEMD_SYSTEMDSYSTEMUNITDIR = "${placeholder "out"}/lib/systemd/system";
PKG_CONFIG_UDEV_UDEVDIR = "${placeholder "out"}/lib/udev";
};
makeFlags = [
"INITRAMFS_DIR=${placeholder "out"}/etc/initramfs-tools"
"PREFIX=${placeholder "out"}"
"VERSION=${version}"
];
dontStrip = true;
nativeBuildInputs = [
pkg-config
rustPlatform.bindgenHook
];
buildInputs = [
keyutils
libaio
libsodium
liburcu
libuuid
lz4
udev
zlib
zstd
];
meta = {
description = "Userspace tools for bcachefs";
license = lib.licenses.gpl2Only;
mainProgram = "bcachefs";
};
};
cargoArtifacts = craneLib.buildDepsOnly args;
in
{
inherit args cargoArtifacts craneLib;
};
common = pkgs.callPackage mkCommon { inherit crane; };
mkPackage =
{ common, name }:
common.craneLib.buildPackage (
common.args
// {
inherit (common) cargoArtifacts;
pname = name;
enableParallelBuilding = true;
buildPhaseCargoCommand = ''
make ''${enableParallelBuilding:+-j''${NIX_BUILD_CORES}} $makeFlags
'';
doNotPostBuildInstallCargoBinaries = true;
installPhaseCommand = ''
make ''${enableParallelBuilding:+-j''${NIX_BUILD_CORES}} $makeFlags install
'';
doInstallCheck = true;
installCheckPhase = ''
runHook preInstallCheck
test "$($out/bin/bcachefs version)" = "${version}"
runHook postInstallCheck
'';
}
);
mkPackages =
name: systems:
in
{
packages =
let
packagesForSystem =
crossSystem:
@ -190,90 +86,53 @@
inherit crossSystem localSystem;
overlays = [ (import rust-overlay) ];
};
withCrossName =
set: lib.mapAttrs' (name: value: lib.nameValuePair "${name}-${crossSystem}" value) set;
common = pkgs'.callPackage mkCommon { inherit crane; };
package = pkgs'.callPackage mkPackage { inherit common name; };
packageFuse = package.overrideAttrs (
final: prev: {
makeFlags = prev.makeFlags ++ [ "BCACHEFS_FUSE=1" ];
buildInputs = prev.buildInputs ++ [ pkgs'.fuse3 ];
}
);
craneBuild = pkgs'.callPackage ./crane-build.nix { inherit crane version; };
crossPackages = {
"bcachefs-tools" = craneBuild.package;
"bcachefs-tools-fuse" = craneBuild.packageFuse;
};
in
[
(lib.nameValuePair "${name}-${crossSystem}" package)
(lib.nameValuePair "${name}-fuse-${crossSystem}" packageFuse)
];
(withCrossName crossPackages) // lib.optionalAttrs (crossSystem == localSystem) crossPackages;
packages = lib.mergeAttrsList (map packagesForSystem systems);
in
lib.listToAttrs (lib.flatten (map packagesForSystem systems));
in
{
packages =
let
inherit (cargoToml.package) name;
in
(mkPackages name systems)
packages
// {
${name} = config.packages."${name}-${system}";
"${name}-fuse" = config.packages."${name}-fuse-${system}";
default = config.packages.${name};
default = self'.packages.${cargoToml.package.name};
};
checks = {
inherit (config.packages)
inherit (self'.packages)
bcachefs-tools
bcachefs-tools-aarch64-linux
bcachefs-tools-fuse
bcachefs-tools-fuse-i686-linux
;
#cargo-clippy = common.craneLib.cargoClippy (
# common.args
# // {
# inherit (common) cargoArtifacts;
# cargoClippyExtraArgs = "--all-targets --all-features -- --deny warnings";
# }
#);
# we have to build our own `craneLib.cargoTest`
cargo-test = common.craneLib.mkCargoDerivation (
common.args
// {
inherit (common) cargoArtifacts;
doCheck = true;
enableParallelChecking = true;
pnameSuffix = "-test";
buildPhaseCargoCommand = "";
checkPhaseCargoCommand = ''
make ''${enableParallelChecking:+-j''${NIX_BUILD_CORES}} $makeFlags libbcachefs.a
cargo test --profile release -- --nocapture
'';
}
);
inherit (pkgs.callPackage ./crane-build.nix { inherit crane version; })
# cargo-clippy
cargo-test
;
# cargo clippy with the current minimum supported rust version
# according to Cargo.toml
msrv =
let
rustVersion = cargoToml.package.rust-version;
common = pkgs.callPackage mkCommon { inherit crane rustVersion; };
craneBuild = pkgs.callPackage ./crane-build.nix { inherit crane rustVersion version; };
in
common.craneLib.cargoClippy (
common.args
// {
pname = "msrv";
inherit (common) cargoArtifacts;
cargoClippyExtraArgs = "--all-targets --all-features";
craneBuild.cargo-test.overrideAttrs (
final: prev: {
pname = "${prev.pname}-msrv";
}
);
};
devShells.default = pkgs.mkShell {
inputsFrom = [
config.packages.default
config.treefmt.build.devShell
self'.packages.default
];
# here go packages that aren't required for builds but are used for