From bf7550d0cc6c94365d5c83f3ec2749775e6ac83b Mon Sep 17 00:00:00 2001 From: Aliaksandr Date: Tue, 10 Feb 2026 17:22:08 +0200 Subject: [PATCH] top-level/stage: assert no callPackage with by-name paths This asserts that no packages in all-packages.nix use callPackage with paths pointing to pkgs/by-name/. Instead, packages should use .override { } to customize by-name packages. --- pkgs/top-level/stage.nix | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/pkgs/top-level/stage.nix b/pkgs/top-level/stage.nix index 34edecf6d968e..0be44a2290abc 100644 --- a/pkgs/top-level/stage.nix +++ b/pkgs/top-level/stage.nix @@ -185,7 +185,23 @@ let overlays ; } res self super; + # Check for callPackage calls that reference by-name paths + allPackagesPath = toString ./all-packages.nix; + allPackagesLines = lib.splitString "\n" (builtins.readFile ./all-packages.nix); + callPackageByNameAttrs = lib.filter ( + name: + let + pos = builtins.unsafeGetAttrPos name res; + isFromAllPackages = pos != null && pos.file == allPackagesPath; + lineContent = if isFromAllPackages then lib.elemAt allPackagesLines (pos.line - 1) else ""; + usesCallPackage = lib.hasInfix "callPackage" lineContent; + callsByName = lib.hasInfix "by-name" lineContent; + in + isFromAllPackages && usesCallPackage && callsByName + ) (lib.attrNames res); in + assert lib.assertMsg (callPackageByNameAttrs == [ ]) + "The following attributes in `pkgs/top-level/all-packages.nix` used `callPackage` with a `pkgs/by-name/` path. Use `.override { }` instead: ${lib.concatStringsSep ", " callPackageByNameAttrs}"; res; aliases = self: super: lib.optionalAttrs config.allowAliases (import ./aliases.nix lib self super);