From b0b5ef7286dca098f40f5075175105c3c0dfbe05 Mon Sep 17 00:00:00 2001 From: Alyssa Ross Date: Fri, 11 Jun 2021 18:42:26 +0000 Subject: 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. --- doc/stdenv/stdenv.chapter.md | 8 +++++++- pkgs/development/libraries/openssl/default.nix | 2 ++ pkgs/stdenv/adapters.nix | 2 ++ pkgs/top-level/static.nix | 14 +++----------- 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 -- cgit 1.4.1