From 544475cb45d3dc38ff91f2f7cd28fd826d00a1a0 Mon Sep 17 00:00:00 2001 From: Eelco Dolstra Date: Tue, 19 Nov 2013 14:44:05 +0100 Subject: [PATCH] mkDerivation: Set meta.position to the source file of the derivation This requires Nix 1.7. --- pkgs/stdenv/generic/default.nix | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/pkgs/stdenv/generic/default.nix b/pkgs/stdenv/generic/default.nix index fcd7439e97e8..a139d47a8ccd 100644 --- a/pkgs/stdenv/generic/default.nix +++ b/pkgs/stdenv/generic/default.nix @@ -20,6 +20,8 @@ let allowBroken = builtins.getEnv "NIXPKGS_ALLOW_BROKEN" == "1"; + unsafeGetAttrPos = builtins.unsafeGetAttrPos or (n: as: null); + stdenvGenerator = setupScript: rec { # The stdenv that we are producing. @@ -51,12 +53,20 @@ let # Add a utility function to produce derivations that use this # stdenv and its shell. mkDerivation = attrs: + let + pos = + if attrs.meta.description or null != null then + unsafeGetAttrPos "description" attrs.meta + else + unsafeGetAttrPos "name" attrs; + pos' = if pos != null then "‘" + pos.file + ":" + toString pos.line + "’" else "«unknown-file»"; + in if !allowUnfree && (let l = lib.lists.toList attrs.meta.license or []; in lib.lists.elem "unfree" l || lib.lists.elem "unfree-redistributable" l) then - throw "package ‘${attrs.name}’ has an unfree license, refusing to evaluate" + throw "package ‘${attrs.name}’ in ${pos'} has an unfree license, refusing to evaluate" else if !allowBroken && attrs.meta.broken or false then - throw "you can't use package ‘${attrs.name}’ because it has been marked as broken" + throw "you can't use package ‘${attrs.name}’ in ${pos'} because it has been marked as broken" else if !allowBroken && attrs.meta.platforms or null != null && !lib.lists.elem result.system attrs.meta.platforms then - throw "the package ‘${attrs.name}’ is not supported on ‘${result.system}’" + throw "the package ‘${attrs.name}’ in ${pos'} is not supported on ‘${result.system}’" else lib.addPassthru (derivation ( (removeAttrs attrs ["meta" "passthru" "crossAttrs"]) @@ -89,8 +99,11 @@ let # 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 = attrs.meta or {}; + # queries. We also a meta.position attribute here to + # identify the source location of the package. + meta = attrs.meta or {} // (if pos != null then { + position = pos.file + ":" + (toString pos.line); + } else {}); passthru = attrs.passthru or {}; } // # Pass through extra attributes that are not inputs, but