about summary refs log tree commit diff
diff options
context:
space:
mode:
authorWill Dietz <w@wdtz.org>2017-12-22 16:05:33 -0500
committerJohn Ericson <John.Ericson@Obsidian.Systems>2018-07-09 11:07:10 -0400
commit218d4dc154faca85c5e0024c6ab7bf2d1ddac0a5 (patch)
tree031fea218d440643effc32610e71929c899c040d
parent5c271db791c1538c5cbcbb8845e0fa0f1e1abfd8 (diff)
downloadnixlib-218d4dc154faca85c5e0024c6ab7bf2d1ddac0a5.tar
nixlib-218d4dc154faca85c5e0024c6ab7bf2d1ddac0a5.tar.gz
nixlib-218d4dc154faca85c5e0024c6ab7bf2d1ddac0a5.tar.bz2
nixlib-218d4dc154faca85c5e0024c6ab7bf2d1ddac0a5.tar.lz
nixlib-218d4dc154faca85c5e0024c6ab7bf2d1ddac0a5.tar.xz
nixlib-218d4dc154faca85c5e0024c6ab7bf2d1ddac0a5.tar.zst
nixlib-218d4dc154faca85c5e0024c6ab7bf2d1ddac0a5.zip
make-derivation: Don't add host-suffix to fixed-output derivations names
Not only does the suffix unnecessarily reduce sharing, but it also breaks
unpacker setup hooks (e.g. that of `unzip`) which identify interesting tarballs
using the file extension.

This also means we can get rid of the splicing hacks for fetchers.
-rw-r--r--pkgs/stdenv/generic/make-derivation.nix13
-rw-r--r--pkgs/top-level/splice.nix9
2 files changed, 13 insertions, 9 deletions
diff --git a/pkgs/stdenv/generic/make-derivation.nix b/pkgs/stdenv/generic/make-derivation.nix
index dce715a6a53e..778f107f71e1 100644
--- a/pkgs/stdenv/generic/make-derivation.nix
+++ b/pkgs/stdenv/generic/make-derivation.nix
@@ -77,8 +77,13 @@ rec {
 
     , ... } @ attrs:
 
-    # TODO(@Ericson2314): Make this more modular, and not O(n^2).
     let
+      fixedOutputDrv = attrs ? outputHash;
+      noNonNativeDeps = builtins.length (depsBuildTarget ++ depsBuildTargetPropagated
+                                      ++ depsHostHost ++ depsHostHostPropagated
+                                      ++ buildInputs ++ propagatedBuildInputs
+                                      ++ depsTargetTarget ++ depsTargetTargetPropagated) == 0;
+      runtimeSensativeIfFixedOutput = fixedOutputDrv -> !noNonNativeDeps;
       supportedHardeningFlags = [ "fortify" "stackprotector" "pie" "pic" "strictoverflow" "format" "relro" "bindnow" ];
       defaultHardeningFlags = lib.remove "pie" supportedHardeningFlags;
       enabledHardeningOptions =
@@ -168,7 +173,11 @@ rec {
           # 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)
+            # Fixed-output derivations like source tarballs shouldn't get a host
+            # suffix. But we have some weird ones with run-time deps that are
+            # just used for their side-affects. Those might as well since the
+            # hash can't be the same. See #32986.
+            (stdenv.hostPlatform != stdenv.buildPlatform && runtimeSensativeIfFixedOutput)
             ("-" + stdenv.hostPlatform.config);
 
           builder = attrs.realBuilder or stdenv.shell;
diff --git a/pkgs/top-level/splice.nix b/pkgs/top-level/splice.nix
index 1fde08d1d48b..078075323dd0 100644
--- a/pkgs/top-level/splice.nix
+++ b/pkgs/top-level/splice.nix
@@ -31,13 +31,8 @@ let
     then defaultBuildHostScope
     else assert pkgs.hostPlatform == pkgs.buildPlatform; defaultHostTargetScope;
   defaultHostHostScope = {}; # unimplemented
-  # TODO(@Ericson2314): we shouldn't preclude run-time fetching by removing
-  # these attributes. We should have a more general solution for selecting
-  # whether `nativeDrv` or `crossDrv` is the default in `defaultScope`.
-  pkgsWithoutFetchers = lib.filterAttrs (n: _: !lib.hasPrefix "fetch" n) pkgs;
-  targetPkgsWithoutFetchers = lib.filterAttrs (n: _: !lib.hasPrefix "fetch" n) pkgs.targetPackages;
-  defaultHostTargetScope = pkgsWithoutFetchers // pkgs.xorg;
-  defaultTargetTargetScope = targetPkgsWithoutFetchers // targetPkgsWithoutFetchers.xorg or {};
+  defaultHostTargetScope = pkgs // pkgs.xorg;
+  defaultTargetTargetScope = pkgs.targetPackages // pkgs.targetPackages.xorg or {};
 
   splicer = pkgsBuildBuild: pkgsBuildHost: pkgsBuildTarget:
             pkgsHostHost: pkgsHostTarget: