From 385529d56865665d8e20ed0d436788dd08034edc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20M=C3=BCller?= Date: Tue, 4 Mar 2025 09:51:03 +0100 Subject: [PATCH] Add abstraction to use multiple toolchains MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Marcel Müller --- flake.nix | 19 ++++++++-------- lib/cargo-dylint-driver.nix | 27 ----------------------- lib/cargo-dylint.nix | 2 -- lib/default.nix | 5 ++++- lib/mk-cargo-dylint-driver.nix | 22 +++++++++++++++++++ lib/mk-dylint.nix | 40 ++++++++++++++++++++++++++++++++++ lib/mk-lint.nix | 7 ++++++ 7 files changed, 83 insertions(+), 39 deletions(-) delete mode 100644 lib/cargo-dylint-driver.nix create mode 100644 lib/mk-cargo-dylint-driver.nix create mode 100644 lib/mk-dylint.nix create mode 100644 lib/mk-lint.nix diff --git a/flake.nix b/flake.nix index 62337fb..7bc926b 100644 --- a/flake.nix +++ b/flake.nix @@ -37,24 +37,25 @@ pkgs ; }; - drivers = pkgs.runCommandLocal "dylint-drivers" { } '' - mkdir -p $out/nightly-2025-01-09 - ln -s ${lib.cargo-dylint-driver}/bin/dylint_driver-nix $out/nightly-2025-01-09/dylint-driver - ''; + + lints = [ + { + toolchain = "2025-01-09"; + package = lib.cargo-dylint-general; + } + ]; + dylint = lib.mkDylint { inherit lints; }; in { packages = lib // { - inherit craneLib drivers; + inherit craneLib; rust = rustTarget; }; devShells.default = pkgs.mkShell { - RUSTUP_TOOLCHAIN = "nightly-2025-01-09"; - DYLINT_LIBRARY_PATH = "${lib.cargo-dylint-general}/lib/"; - DYLINT_DRIVER_PATH = drivers; nativeBuildInputs = [ rustTarget - lib.cargo-dylint + dylint ]; }; } diff --git a/lib/cargo-dylint-driver.nix b/lib/cargo-dylint-driver.nix deleted file mode 100644 index e181971..0000000 --- a/lib/cargo-dylint-driver.nix +++ /dev/null @@ -1,27 +0,0 @@ -{ - craneLib, -}: - -let - pname = "cargo-dylint-driver"; - version = "4.0.0"; - - src = ../dylint_driver; - - commonArgs = { - inherit pname version src; - - strictDeps = true; - - RUSTUP_TOOLCHAIN = "nightly-2025-01-09"; - }; -in - -craneLib.buildPackage ( - commonArgs - // { - cargoArtifacts = craneLib.buildDepsOnly commonArgs; - - doNotRemoveReferencesToRustToolchain = true; - } -) diff --git a/lib/cargo-dylint.nix b/lib/cargo-dylint.nix index 9b506ec..6215960 100644 --- a/lib/cargo-dylint.nix +++ b/lib/cargo-dylint.nix @@ -4,8 +4,6 @@ pkg-config, openssl, - - cargo-dylint-driver, }: let diff --git a/lib/default.nix b/lib/default.nix index aafe179..e0ca238 100644 --- a/lib/default.nix +++ b/lib/default.nix @@ -9,8 +9,11 @@ let callPackage = pkgs.lib.callPackageWith (pkgs // packages // { inherit inputs craneLib; }); packages = { cargo-dylint = callPackage ./cargo-dylint.nix { }; - cargo-dylint-driver = callPackage ./cargo-dylint-driver.nix { }; cargo-dylint-general = callPackage ./cargo-dylint-general.nix { }; + + mkCargoDylintDriver = callPackage ./mk-cargo-dylint-driver.nix { }; + mkLint = callPackage ./mk-lint.nix { }; + mkDylint = callPackage ./mk-dylint.nix { }; }; in diff --git a/lib/mk-cargo-dylint-driver.nix b/lib/mk-cargo-dylint-driver.nix new file mode 100644 index 0000000..2286a99 --- /dev/null +++ b/lib/mk-cargo-dylint-driver.nix @@ -0,0 +1,22 @@ +{ + craneLib, +}: + +toolchainName: toolchain: + +let + pname = "cargo-dylint-driver-${toolchainName}"; + version = "4.0.0"; + src = ../dylint_driver; +in + +(craneLib.overrideToolchain toolchain).buildPackage ({ + inherit pname version src; + + strictDeps = true; + cargoArtifacts = null; + + RUSTUP_TOOLCHAIN = toolchainName; + + doNotRemoveReferencesToRustToolchain = true; +}) diff --git a/lib/mk-dylint.nix b/lib/mk-dylint.nix new file mode 100644 index 0000000..c1831e5 --- /dev/null +++ b/lib/mk-dylint.nix @@ -0,0 +1,40 @@ +{ + pkgs, + + cargo-dylint, + + mkCargoDylintDriver, +}: + +{ lints }: + +let + inherit (pkgs) lib; + driver_names = lib.groupBy (v: v.toolchain) lints; + driverMap = builtins.mapAttrs ( + name: _: + mkCargoDylintDriver "nightly-${name}" ( + pkgs.rust-bin.nightly."${name}".default.override { + extensions = [ + "rustc-dev" + ]; + } + ) + ) driver_names; + drivers = pkgs.runCommandLocal "dylint-drivers" { } ( + lib.strings.concatMapAttrsStringSep "\n" (name: driver: '' + mkdir -p $out/nightly-${name} + ln -s ${driver}/bin/dylint_driver-nix $out/nightly-${name}/dylint-driver + '') driverMap + ); +in +pkgs.runCommandLocal "cargo-dylint-wrapped" + { + nativeBuildInputs = [ pkgs.makeWrapper ]; + meta.mainProgram = "cargo-dylint"; + } + '' + makeWrapper ${cargo-dylint}/bin/cargo-dylint $out/bin/cargo-dylint \ + --set DYLINT_LIBRARY_PATH ${lib.strings.makeLibraryPath (builtins.map (v: v.package) lints)} \ + --set DYLINT_DRIVER_PATH ${drivers}; + '' diff --git a/lib/mk-lint.nix b/lib/mk-lint.nix new file mode 100644 index 0000000..4ff7bbb --- /dev/null +++ b/lib/mk-lint.nix @@ -0,0 +1,7 @@ +{ ... }: + +{ package, toolchain }: + +{ + inherit toolchain package; +}