summary refs log tree commit diff
diff options
context:
space:
mode:
authorAlyssa Ross <hi@alyssa.is>2021-06-11 18:42:26 +0000
committerJonathan Ringer <jonringer@users.noreply.github.com>2021-06-11 14:16:05 -0700
commitb0b5ef7286dca098f40f5075175105c3c0dfbe05 (patch)
tree072ca704392f8968f06410a1e996192cfd939586
parent8f3ead7190b97ce1f0458766105832d5a6e02dcf (diff)
downloadnixpkgs-b0b5ef7286dca098f40f5075175105c3c0dfbe05.tar
nixpkgs-b0b5ef7286dca098f40f5075175105c3c0dfbe05.tar.gz
nixpkgs-b0b5ef7286dca098f40f5075175105c3c0dfbe05.tar.bz2
nixpkgs-b0b5ef7286dca098f40f5075175105c3c0dfbe05.tar.lz
nixpkgs-b0b5ef7286dca098f40f5075175105c3c0dfbe05.tar.xz
nixpkgs-b0b5ef7286dca098f40f5075175105c3c0dfbe05.tar.zst
nixpkgs-b0b5ef7286dca098f40f5075175105c3c0dfbe05.zip
stdenv: introduce dontAddStaticConfigureFlags
With removeUnknownConfigureFlags, it's impossible to express a package
that needs --enable-static, but will not accept --disable-shared,
without overriding the result of removeUnknownConfigureFlags _again_
in pkgs/top-level/static.nix.

It would be much better (and more in line with the rest of Nixpkgs) if
we encoded changes needed for static builds in package definitions
themselves, rather than in an ever-expanding list in static.nix.  This
is especially true when doing it in static.nix is going to require
multiple overrides to express what could be expressed with stdenv
options.

So as a step in that direction, and to fix the problem described
above, here I replace removeUnknownConfigureFlags with a new stdenv
option, dontAddStaticConfigureFlags.  With this mechanism, a package
that needs one but not both of the flags just needs to set
dontAddStaticConfigureFlags and then set up configureFlags manually
based on stdenv.hostPlatform.isStatic.
-rw-r--r--doc/stdenv/stdenv.chapter.md8
-rw-r--r--pkgs/development/libraries/openssl/default.nix2
-rw-r--r--pkgs/stdenv/adapters.nix2
-rw-r--r--pkgs/top-level/static.nix14
4 files changed, 14 insertions, 12 deletions
diff --git a/doc/stdenv/stdenv.chapter.md b/doc/stdenv/stdenv.chapter.md
index 4daeaf7c8c2..7219b5e80f7 100644
--- a/doc/stdenv/stdenv.chapter.md
+++ b/doc/stdenv/stdenv.chapter.md
@@ -463,6 +463,12 @@ The prefix under which the package must be installed, passed via the `--prefix`
 
 The key to use when specifying the prefix. By default, this is set to `--prefix=` as that is used by the majority of packages.
 
+##### `dontAddStaticConfigureFlags`
+
+By default, when building statically, stdenv will try to add build system appropriate configure flags to try to enable static builds.
+
+If this is undesirable, set this variable to true.
+
 ##### `dontAddDisableDepTrack` {#var-stdenv-dontAddDisableDepTrack}
 
 By default, the flag `--disable-dependency-tracking` is added to the configure flags to speed up Automake-based builds. If this is undesirable, set this variable to true.
@@ -475,7 +481,7 @@ By default, the configure phase applies some special hackery to all files called
 
 By default, when the configure script has `--enable-static`, the option `--disable-static` is added to the configure flags.
 
-If this is undesirable, set this variable to true.
+If this is undesirable, set this variable to true.  It is automatically set to true when building statically, for example through `pkgsStatic`.
 
 ##### `configurePlatforms` {#var-stdenv-configurePlatforms}
 
diff --git a/pkgs/development/libraries/openssl/default.nix b/pkgs/development/libraries/openssl/default.nix
index 2a586f9e9ef..f4d6e9e2956 100644
--- a/pkgs/development/libraries/openssl/default.nix
+++ b/pkgs/development/libraries/openssl/default.nix
@@ -93,6 +93,8 @@ let
           throw "Not sure what configuration to use for ${stdenv.hostPlatform.config}"
       );
 
+    # OpenSSL doesn't like the `--enable-static` / `--disable-shared` flags.
+    dontAddStaticConfigureFlags = true;
     configureFlags = [
       "shared" # "shared" builds both shared and static libraries
       "--libdir=lib"
diff --git a/pkgs/stdenv/adapters.nix b/pkgs/stdenv/adapters.nix
index d8f73d5a7e3..a8e984d6174 100644
--- a/pkgs/stdenv/adapters.nix
+++ b/pkgs/stdenv/adapters.nix
@@ -44,6 +44,7 @@ rec {
       then throw "Cannot build fully static binaries on Darwin/macOS"
       else stdenv'.mkDerivation (args // {
         NIX_CFLAGS_LINK = toString (args.NIX_CFLAGS_LINK or "") + " -static";
+      } // pkgs.lib.optionalAttrs (!(args.dontAddStaticConfigureFlags or false)) {
         configureFlags = (args.configureFlags or []) ++ [
             "--disable-shared" # brrr...
           ];
@@ -56,6 +57,7 @@ rec {
   makeStaticLibraries = stdenv: stdenv //
     { mkDerivation = args: stdenv.mkDerivation (args // {
         dontDisableStatic = true;
+      } // pkgs.lib.optionalAttrs (!(args.dontAddStaticConfigureFlags or false)) {
         configureFlags = (args.configureFlags or []) ++ [
           "--enable-static"
           "--disable-shared"
diff --git a/pkgs/top-level/static.nix b/pkgs/top-level/static.nix
index 32559c0e799..0c9af250e87 100644
--- a/pkgs/top-level/static.nix
+++ b/pkgs/top-level/static.nix
@@ -50,14 +50,10 @@ self: super: let
     # ++ optional (super.stdenv.hostPlatform.libc == "glibc") ((flip overrideInStdenv) [ self.stdenv.glibc.static ])
   ;
 
-  removeUnknownConfigureFlags = f: with self.lib;
-    remove "--disable-shared"
-    (remove "--enable-static" f);
-
   ocamlFixPackage = b:
     b.overrideAttrs (o: {
       configurePlatforms = [ ];
-      configureFlags = removeUnknownConfigureFlags (o.configureFlags or [ ]);
+      dontAddStaticConfigureFlags = true;
       buildInputs = o.buildInputs ++ o.nativeBuildInputs or [ ];
       propagatedNativeBuildInputs = o.propagatedBuildInputs or [ ];
     });
@@ -75,7 +71,8 @@ self: super: let
         preConfigure = ''
           configureFlagsArray+=("-cc" "$CC" "-as" "$AS" "-partialld" "$LD -r")
         '';
-        configureFlags = (removeUnknownConfigureFlags o.configureFlags) ++ [
+        dontAddStaticConfigureFlags = true;
+        configureFlags = [
           "--no-shared-libs"
           "-host ${o.stdenv.hostPlatform.config}"
           "-target ${o.stdenv.targetPlatform.config}"
@@ -124,11 +121,6 @@ in {
     if set ? overrideScope' then set.overrideScope' ocamlStaticAdapter else set
   ) super.ocaml-ng;
 
-  openssl = super.openssl_1_1.overrideAttrs (o: {
-    # OpenSSL doesn't like the `--enable-static` / `--disable-shared` flags.
-    configureFlags = (removeUnknownConfigureFlags o.configureFlags);
-  });
-
   perl = super.perl.override {
     # Don’t use new stdenv zlib because
     # it doesn’t like the --disable-shared flag