diff options
author | John Ericson <John.Ericson@Obsidian.Systems> | 2018-01-16 13:05:39 -0500 |
---|---|---|
committer | John Ericson <John.Ericson@Obsidian.Systems> | 2018-01-16 13:05:39 -0500 |
commit | 5a754e75b4ac35a419a7fdb6d0a535f20f0ffad7 (patch) | |
tree | 6803d6cd9ce50244ee428f975fcd5c2d0d02e72a /pkgs/stdenv | |
parent | 990ff97c6d82eb27486ec8dc3e9dbc453da88aa8 (diff) | |
parent | 5d8b359db7b680d5f6c77f92b789ceea43d3ee92 (diff) | |
download | nixpkgs-5a754e75b4ac35a419a7fdb6d0a535f20f0ffad7.tar nixpkgs-5a754e75b4ac35a419a7fdb6d0a535f20f0ffad7.tar.gz nixpkgs-5a754e75b4ac35a419a7fdb6d0a535f20f0ffad7.tar.bz2 nixpkgs-5a754e75b4ac35a419a7fdb6d0a535f20f0ffad7.tar.lz nixpkgs-5a754e75b4ac35a419a7fdb6d0a535f20f0ffad7.tar.xz nixpkgs-5a754e75b4ac35a419a7fdb6d0a535f20f0ffad7.tar.zst nixpkgs-5a754e75b4ac35a419a7fdb6d0a535f20f0ffad7.zip |
Merge branch 'ericson2314-cross-master' into staging
Diffstat (limited to 'pkgs/stdenv')
-rw-r--r-- | pkgs/stdenv/generic/check-meta.nix | 23 | ||||
-rw-r--r-- | pkgs/stdenv/generic/make-derivation.nix | 75 |
2 files changed, 58 insertions, 40 deletions
diff --git a/pkgs/stdenv/generic/check-meta.nix b/pkgs/stdenv/generic/check-meta.nix index 6ae6e646e98..745ad14bc08 100644 --- a/pkgs/stdenv/generic/check-meta.nix +++ b/pkgs/stdenv/generic/check-meta.nix @@ -1,6 +1,5 @@ -# Extend a derivation with checks for brokenness, license, etc. Throw a -# descriptive error when the check fails; return `derivationArg` otherwise. -# Note: no dependencies are checked in this step. +# Checks derivation meta and attrs for problems (like brokenness, +# licenses, etc). { lib, config, system, meta, derivationArg, mkDerivationArg }: @@ -154,12 +153,14 @@ let # Weirder stuff that doesn't appear in the documentation? knownVulnerabilities = listOf str; + name = str; version = str; tag = str; updateWalker = bool; executables = listOf str; outputsToInstall = listOf str; position = str; + evaluates = bool; repositories = attrsOf str; isBuildPythonPackage = platforms; schedulingPriority = int; @@ -196,13 +197,11 @@ let { valid = false; reason = "unknown-meta"; errormsg = "has an invalid meta attrset:${lib.concatMapStrings (x: "\n\t - " + x) res}"; } else { valid = true; }; + validity = checkValidity attrs; + +in validity // { # Throw an error if trying to evaluate an non-valid derivation - validityCondition = - let v = checkValidity attrs; - in if !v.valid - then handleEvalIssue (removeAttrs v ["valid"]) - else true; - -in - assert validityCondition; - derivationArg + handled = if !validity.valid + then handleEvalIssue (removeAttrs validity ["valid"]) + else true; +} diff --git a/pkgs/stdenv/generic/make-derivation.nix b/pkgs/stdenv/generic/make-derivation.nix index 396ed553999..e021b284a12 100644 --- a/pkgs/stdenv/generic/make-derivation.nix +++ b/pkgs/stdenv/generic/make-derivation.nix @@ -81,6 +81,9 @@ rec { inherit erroneousHardeningFlags hardeningDisable hardeningEnable supportedHardeningFlags; }) else let + references = nativeBuildInputs ++ buildInputs + ++ propagatedNativeBuildInputs ++ propagatedBuildInputs; + dependencies = map (map lib.chooseDevOutputs) [ [ (map (drv: drv.__spliced.buildBuild or drv) depsBuildBuild) @@ -140,9 +143,12 @@ rec { (lib.concatLists propagatedDependencies)); in { - name = name + lib.optionalString + # A hack to make `nix-env -qa` and `nix search` ignore broken packages. + # TODO(@oxij): remove this assert when something like NixOS/nix#1771 gets merged into nix. + name = assert validity.handled; name + lib.optionalString (stdenv.hostPlatform != stdenv.buildPlatform) ("-" + stdenv.hostPlatform.config); + builder = attrs.realBuilder or stdenv.shell; args = attrs.args or ["-e" (attrs.builder or ./default-builder.sh)]; inherit stdenv; @@ -197,46 +203,59 @@ rec { doInstallCheck = doInstallCheck && (stdenv.hostPlatform == stdenv.buildPlatform); }); + validity = import ./check-meta.nix { + inherit lib config meta derivationArg; + mkDerivationArg = attrs; + # Nix itself uses the `system` field of a derivation to decide where + # to build it. This is a bit confusing for cross compilation. + inherit (stdenv) system; + }; + # 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 = { } + meta = { + # `name` above includes cross-compilation cruft (and is under assert), + # lets have a clean always accessible version here. + inherit name; + # If the packager hasn't specified `outputsToInstall`, choose a default, # which is the name of `p.bin or p.out or p`; # if he 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 - outs = outputs'; # the value passed to derivation primitive - hasOutput = out: builtins.elem out outs; - in [( lib.findFirst hasOutput null (["bin" "out"] ++ outs) )]; + outputsToInstall = + let + outs = outputs'; # the value passed to derivation primitive + hasOutput = out: builtins.elem out outs; + in [( lib.findFirst hasOutput null (["bin" "out"] ++ outs) )]; } // attrs.meta or {} - # Fill `meta.position` to identify the source location of the package. - // lib.optionalAttrs (pos != null) - { position = pos.file + ":" + toString pos.line; } - ; + # 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. + } // { + evaluates = validity.valid + && (if config.checkMetaRecursively or false + then lib.all (d: d.meta.evaluates or true) references + else true); + }; in - lib.addPassthru - (derivation (import ./check-meta.nix - { - inherit lib config meta derivationArg; - mkDerivationArg = attrs; - # Nix itself uses the `system` field of a derivation to decide where - # to build it. This is a bit confusing for cross compilation. - inherit (stdenv) system; - })) - ( { - overrideAttrs = f: mkDerivation (attrs // (f attrs)); - inherit meta passthru; - } // - # Pass through extra attributes that are not inputs, but - # should be made available to Nix expressions using the - # derivation (e.g., in assertions). - passthru); + lib.extendDerivation + validity.handled + ({ + overrideAttrs = f: mkDerivation (attrs // (f attrs)); + inherit meta passthru; + } // + # Pass through extra attributes that are not inputs, but + # should be made available to Nix expressions using the + # derivation (e.g., in assertions). + passthru) + (derivation derivationArg); + } |