From ef24a2815ed949c86110339e048cef2b33b84297 Mon Sep 17 00:00:00 2001 From: Andrew Childs Date: Thu, 11 Mar 2021 17:12:41 +0900 Subject: [PATCH] openssl: cross compilation without host perl The perl reference is in the interpreter line for c_rehash, so fix that while we're here. --- .../development/libraries/openssl/default.nix | 28 ++++++++++++++++--- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/pkgs/development/libraries/openssl/default.nix b/pkgs/development/libraries/openssl/default.nix index 2edf02e738f..d203d693af0 100644 --- a/pkgs/development/libraries/openssl/default.nix +++ b/pkgs/development/libraries/openssl/default.nix @@ -3,8 +3,17 @@ , enableSSL2 ? false , enableSSL3 ? false , static ? stdenv.hostPlatform.isStatic +# Used to avoid cross compiling perl, for example, in darwin bootstrap tools. +# This will cause c_rehash to refer to perl via the environment, but otherwise +# will produce a perfectly functional openssl binary and library. +, withPerl ? true }: +assert ( + lib.assertMsg (!withPerl -> stdenv.hostPlatform != stdenv.buildPlatform) + "withPerl should not be disabled unless cross compiling" +); + # Note: this package is used for bootstrapping fetchurl, and thus # cannot use fetchpatch! All mutable patches (generated by GitHub or # cgit) that are needed here should be included directly in Nixpkgs as @@ -46,7 +55,10 @@ let separateDebugInfo = !(stdenv.hostPlatform.useLLVM or false) && stdenv.cc.isGNU; nativeBuildInputs = [ perl ]; - buildInputs = lib.optional withCryptodev cryptodev; + buildInputs = lib.optional withCryptodev cryptodev + # perl is included to allow the interpreter path fixup hook to set the + # correct interpreter in c_rehash. + ++ lib.optional withPerl perl; # TODO(@Ericson2314): Improve with mass rebuild configurePlatforms = []; @@ -108,12 +120,20 @@ let rm "$out/lib/"*.a fi - '' + - '' mkdir -p $bin '' + lib.optionalString (!stdenv.hostPlatform.isWindows) + # Fix bin/c_rehash's perl interpreter line + # + # - openssl 1_0_2: embeds a reference to buildPackages.perl + # - openssl 1_1: emits "#!/usr/bin/env perl" + # + # In the case of openssl_1_0_2, reset the invalid reference and let the + # interpreter hook take care of it. + # + # In both cases, if withPerl = false, the intepreter line is expected be + # "#!/usr/bin/env perl" '' - substituteInPlace $out/bin/c_rehash --replace ${buildPackages.perl} ${perl} + substituteInPlace $out/bin/c_rehash --replace ${buildPackages.perl}/bin/perl "/usr/bin/env perl" '' + '' mv $out/bin $bin/