From 9eb3e6c076cceaed3b24123b15df1feaf267bbdf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20M=C3=BChlbacher?= Date: Thu, 25 Sep 2025 00:17:31 +0000 Subject: [PATCH] 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 --- crane-build.nix | 139 +++++++++++++++++++++++++++++++++++ flake.nix | 189 ++++++------------------------------------------ 2 files changed, 163 insertions(+), 165 deletions(-) create mode 100644 crane-build.nix diff --git a/crane-build.nix b/crane-build.nix new file mode 100644 index 00000000..9b764ec9 --- /dev/null +++ b/crane-build.nix @@ -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 + ; +} diff --git a/flake.nix b/flake.nix index c2ee9fd6..8b38ba19 100644 --- a/flake.nix +++ b/flake.nix @@ -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