summary refs log tree commit diff
path: root/pkgs/stdenv/generic
diff options
context:
space:
mode:
authorEmily Trau <me@angus.ws>2023-04-26 13:43:44 +1000
committerArtturin <Artturin@artturin.com>2023-05-01 20:18:11 +0300
commit2ad68a7d90ba08dbdd426cf0d8e4dd1f53d1af1f (patch)
treef3e76510b15cf2fbfde6b0ff5acea7e61810794f /pkgs/stdenv/generic
parente852acf2f0c2cac713f325f4bf8b51e4615bb241 (diff)
downloadnixpkgs-2ad68a7d90ba08dbdd426cf0d8e4dd1f53d1af1f.tar
nixpkgs-2ad68a7d90ba08dbdd426cf0d8e4dd1f53d1af1f.tar.gz
nixpkgs-2ad68a7d90ba08dbdd426cf0d8e4dd1f53d1af1f.tar.bz2
nixpkgs-2ad68a7d90ba08dbdd426cf0d8e4dd1f53d1af1f.tar.lz
nixpkgs-2ad68a7d90ba08dbdd426cf0d8e4dd1f53d1af1f.tar.xz
nixpkgs-2ad68a7d90ba08dbdd426cf0d8e4dd1f53d1af1f.tar.zst
nixpkgs-2ad68a7d90ba08dbdd426cf0d8e4dd1f53d1af1f.zip
stdenv: factor out `meta` attr augmentation for reusability
stdenv: check if separating commonMeta from assertValidity fixes laziness issue

```
error: cannot coerce null to a string

at /var/lib/ofborg/checkout/repo/38dca4e3aa6bca43ea96d2fcc04e8229/mr-est/ofborg-evaluator-3/pkgs/development/coq-modules/coq-lsp/default.nix:34:60:

    33|     homepage = "https://github.com/ejgallego/coq-lsp";
    34|     changelog = "https://github.com/ejgallego/coq-lsp/blob/${defaultVersion}/CHANGES.md";
```
Diffstat (limited to 'pkgs/stdenv/generic')
-rw-r--r--pkgs/stdenv/generic/check-meta.nix52
-rw-r--r--pkgs/stdenv/generic/make-derivation.nix45
2 files changed, 55 insertions, 42 deletions
diff --git a/pkgs/stdenv/generic/check-meta.nix b/pkgs/stdenv/generic/check-meta.nix
index 7f317c787b0..63fd00d266e 100644
--- a/pkgs/stdenv/generic/check-meta.nix
+++ b/pkgs/stdenv/generic/check-meta.nix
@@ -390,6 +390,55 @@ let
     # -----
     else { valid = "yes"; });
 
+
+  # The meta attribute is passed in the resulting attribute set,
+  # but it's not part of the actual derivation, i.e., it's not
+  # passed to the builder and is not a dependency.  But since we
+  # include it in the result, it *is* available to nix-env for queries.
+  # Example:
+  #   meta = checkMeta.commonMeta { inherit validity attrs pos references; };
+  #   validity = checkMeta.assertValidity { inherit meta attrs; };
+  commonMeta = { validity, attrs, pos ? null, references ? [ ] }:
+    let
+      outputs = attrs.outputs or [ "out" ];
+    in
+    {
+      # `name` derivation attribute includes cross-compilation cruft,
+      # is under assert, and is sanitized.
+      # Let's have a clean always accessible version here.
+      name = attrs.name or "${attrs.pname}-${attrs.version}";
+
+      # If the packager hasn't specified `outputsToInstall`, choose a default,
+      # which is the name of `p.bin or p.out or p` along with `p.man` when
+      # present.
+      #
+      # If the packager has specified it, it will be overridden below in
+      # `// meta`.
+      #
+      #   Note: This default probably shouldn't be globally configurable.
+      #   Services and users should specify outputs explicitly,
+      #   unless they are comfortable with this default.
+      outputsToInstall =
+        let
+          hasOutput = out: builtins.elem out outputs;
+        in
+        [ (lib.findFirst hasOutput null ([ "bin" "out" ] ++ outputs)) ]
+        ++ lib.optional (hasOutput "man") "man";
+    }
+    // attrs.meta or { }
+    # Fill `meta.position` to identify the source location of the package.
+    // lib.optionalAttrs (pos != null) {
+      position = pos.file + ":" + toString pos.line;
+    } // {
+      # Expose the result of the checks for everyone to see.
+      inherit (validity) unfree broken unsupported insecure;
+
+      available = validity.valid != "no"
+      && (if config.checkMetaRecursively or false
+      then lib.all (d: d.meta.available or true) references
+      else true);
+    };
+
   assertValidity = { meta, attrs }: let
       validity = checkValidity attrs;
     in validity // {
@@ -401,6 +450,7 @@ let
           warn = handleEvalWarning { inherit meta attrs; } { inherit (validity) reason errormsg; };
           yes = true;
         }.${validity.valid};
+
   };
 
-in assertValidity
+in { inherit assertValidity commonMeta; }
diff --git a/pkgs/stdenv/generic/make-derivation.nix b/pkgs/stdenv/generic/make-derivation.nix
index 6cb494d46e5..d34785dca94 100644
--- a/pkgs/stdenv/generic/make-derivation.nix
+++ b/pkgs/stdenv/generic/make-derivation.nix
@@ -501,46 +501,8 @@ else let
         lib.mapNullable unsafeDerivationToUntrackedOutpath attrs.allowedRequisites;
     };
 
-  validity = checkMeta { inherit meta attrs; };
-
-  # The meta attribute is passed in the resulting attribute set,
-  # but it's not part of the actual derivation, i.e., it's not
-  # passed to the builder and is not a dependency.  But since we
-  # include it in the result, it *is* available to nix-env for queries.
-  meta = {
-      # `name` above includes cross-compilation cruft,
-      # is under assert, and is sanitized.
-      # Let's have a clean always accessible version here.
-      name = attrs.name or "${attrs.pname}-${attrs.version}";
-
-      # If the packager hasn't specified `outputsToInstall`, choose a default,
-      # which is the name of `p.bin or p.out or p` along with `p.man` when
-      # present.
-      #
-      # If the packager has specified it, it will be overridden below in
-      # `// meta`.
-      #
-      #   Note: This default probably shouldn't be globally configurable.
-      #   Services and users should specify outputs explicitly,
-      #   unless they are comfortable with this default.
-      outputsToInstall =
-        let
-          hasOutput = out: builtins.elem out outputs;
-        in [( lib.findFirst hasOutput null (["bin" "out"] ++ outputs) )]
-          ++ lib.optional (hasOutput "man") "man";
-    }
-    // attrs.meta or {}
-    # Fill `meta.position` to identify the source location of the package.
-    // lib.optionalAttrs (pos != null) {
-      position = pos.file + ":" + toString pos.line;
-    } // {
-      # Expose the result of the checks for everyone to see.
-      inherit (validity) unfree broken unsupported insecure;
-      available = validity.valid != "no"
-               && (if config.checkMetaRecursively or false
-                   then lib.all (d: d.meta.available or true) references
-                   else true);
-    };
+  meta = checkMeta.commonMeta { inherit validity attrs pos references; };
+  validity = checkMeta.assertValidity { inherit meta attrs; };
 
   checkedEnv =
     let
@@ -591,7 +553,8 @@ lib.extendDerivation
        disallowedRequisites = [ ];
      });
 
-     inherit meta passthru overrideAttrs;
+     inherit passthru overrideAttrs;
+     inherit meta;
    } //
    # Pass through extra attributes that are not inputs, but
    # should be made available to Nix expressions using the