From dbd3a833037a3735be0d1480392171beaee9c46b Mon Sep 17 00:00:00 2001 From: sternenseemann Date: Tue, 8 Feb 2022 18:53:57 +0100 Subject: [PATCH 1/4] haskell-language-server: make linking configureable in wrapper haskell-language-server will now default to building a shared executable, as upstream does, complete with a huge closure. By passing { dynamic = false; } via override, it is still possible to build a "statically linked" variant of HLS, as it used to be. Note: Before this change HLS would fail to compile on aarch64. --- .../haskell-language-server/withWrapper.nix | 29 ++++++++++++------- 1 file changed, 18 insertions(+), 11 deletions(-) diff --git a/pkgs/development/tools/haskell/haskell-language-server/withWrapper.nix b/pkgs/development/tools/haskell/haskell-language-server/withWrapper.nix index f8f1f85b2703..b55fd6aa6ba7 100644 --- a/pkgs/development/tools/haskell/haskell-language-server/withWrapper.nix +++ b/pkgs/development/tools/haskell/haskell-language-server/withWrapper.nix @@ -2,6 +2,7 @@ , stdenv , supportedGhcVersions ? [ "884" "8107" "902" ] ++ lib.optionals (!stdenv.hostPlatform.isAarch64) [ "921" ] +, dynamic ? true , haskellPackages , haskell }: @@ -13,19 +14,25 @@ # for example. Read more about this in the haskell-language-server section of the nixpkgs manual. # let - inherit (lib) concatStringsSep concatMapStringsSep take splitString; + inherit (lib) concatStringsSep concatMapStringsSep take splitString pipe optionals; + inherit (haskell.lib.compose) justStaticExecutables overrideCabal enableCabalFlag disableCabalFlag; getPackages = version: haskell.packages."ghc${version}"; tunedHls = hsPkgs: - haskell.lib.compose.justStaticExecutables - (haskell.lib.compose.overrideCabal (old: { - postInstall = '' - remove-references-to -t ${hsPkgs.ghc} $out/bin/haskell-language-server - remove-references-to -t ${hsPkgs.shake.data} $out/bin/haskell-language-server - remove-references-to -t ${hsPkgs.js-jquery.data} $out/bin/haskell-language-server - remove-references-to -t ${hsPkgs.js-dgtable.data} $out/bin/haskell-language-server - remove-references-to -t ${hsPkgs.js-flot.data} $out/bin/haskell-language-server - ''; - }) hsPkgs.haskell-language-server); + lib.pipe hsPkgs.haskell-language-server ([ + (haskell.lib.compose.overrideCabal (old: { + enableSharedExecutables = dynamic; + postInstall = '' + remove-references-to -t ${hsPkgs.ghc} $out/bin/haskell-language-server + remove-references-to -t ${hsPkgs.shake.data} $out/bin/haskell-language-server + remove-references-to -t ${hsPkgs.js-jquery.data} $out/bin/haskell-language-server + remove-references-to -t ${hsPkgs.js-dgtable.data} $out/bin/haskell-language-server + remove-references-to -t ${hsPkgs.js-flot.data} $out/bin/haskell-language-server + ''; + })) + ((if dynamic then enableCabalFlag else disableCabalFlag) "dynamic") + ] ++ optionals (!dynamic) [ + justStaticExecutables + ]); targets = version: let packages = getPackages version; in [ From a7c18f7a90b3c97a90453c06e72ef558c858298a Mon Sep 17 00:00:00 2001 From: sternenseemann Date: Tue, 8 Feb 2022 19:03:18 +0100 Subject: [PATCH 2/4] haskell-language-server: retain old postInstall if any --- .../tools/haskell/haskell-language-server/withWrapper.nix | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pkgs/development/tools/haskell/haskell-language-server/withWrapper.nix b/pkgs/development/tools/haskell/haskell-language-server/withWrapper.nix index b55fd6aa6ba7..ff1f4323cead 100644 --- a/pkgs/development/tools/haskell/haskell-language-server/withWrapper.nix +++ b/pkgs/development/tools/haskell/haskell-language-server/withWrapper.nix @@ -22,6 +22,8 @@ let (haskell.lib.compose.overrideCabal (old: { enableSharedExecutables = dynamic; postInstall = '' + ${old.postInstall or ""} + remove-references-to -t ${hsPkgs.ghc} $out/bin/haskell-language-server remove-references-to -t ${hsPkgs.shake.data} $out/bin/haskell-language-server remove-references-to -t ${hsPkgs.js-jquery.data} $out/bin/haskell-language-server From ea5e442833495d5ebef2a81ba3d5933e5fe880d5 Mon Sep 17 00:00:00 2001 From: sternenseemann Date: Tue, 8 Feb 2022 21:55:48 +0100 Subject: [PATCH 3/4] haskell-language-server: default to statically linking haskell deps This means we don't use the system linker by default, but decreases closure size significantly, as we no longer reference every supported version GHC. --- .../tools/haskell/haskell-language-server/withWrapper.nix | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkgs/development/tools/haskell/haskell-language-server/withWrapper.nix b/pkgs/development/tools/haskell/haskell-language-server/withWrapper.nix index ff1f4323cead..511412ef155c 100644 --- a/pkgs/development/tools/haskell/haskell-language-server/withWrapper.nix +++ b/pkgs/development/tools/haskell/haskell-language-server/withWrapper.nix @@ -2,7 +2,7 @@ , stdenv , supportedGhcVersions ? [ "884" "8107" "902" ] ++ lib.optionals (!stdenv.hostPlatform.isAarch64) [ "921" ] -, dynamic ? true +, dynamic ? false , haskellPackages , haskell }: From a386d540d8db6fd4a611279f1d440ebaee4f3510 Mon Sep 17 00:00:00 2001 From: sternenseemann Date: Thu, 10 Feb 2022 13:02:13 +0100 Subject: [PATCH 4/4] haskell-language-server: fix reference logic MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit If we are linking dynamically, it's practically no use removing references, as we depend on GHC either way via linking. I've also elected to keep the references to the data outputs in all cases — they are a bit arcane (there's no easy way to tell they definitely are not necessary) and don't contribute too much to the overall closure size. --- .../tools/haskell/haskell-language-server/withWrapper.nix | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/pkgs/development/tools/haskell/haskell-language-server/withWrapper.nix b/pkgs/development/tools/haskell/haskell-language-server/withWrapper.nix index 511412ef155c..8c8f016510f2 100644 --- a/pkgs/development/tools/haskell/haskell-language-server/withWrapper.nix +++ b/pkgs/development/tools/haskell/haskell-language-server/withWrapper.nix @@ -21,14 +21,10 @@ let lib.pipe hsPkgs.haskell-language-server ([ (haskell.lib.compose.overrideCabal (old: { enableSharedExecutables = dynamic; - postInstall = '' + ${if !dynamic then "postInstall" else null} = '' ${old.postInstall or ""} remove-references-to -t ${hsPkgs.ghc} $out/bin/haskell-language-server - remove-references-to -t ${hsPkgs.shake.data} $out/bin/haskell-language-server - remove-references-to -t ${hsPkgs.js-jquery.data} $out/bin/haskell-language-server - remove-references-to -t ${hsPkgs.js-dgtable.data} $out/bin/haskell-language-server - remove-references-to -t ${hsPkgs.js-flot.data} $out/bin/haskell-language-server ''; })) ((if dynamic then enableCabalFlag else disableCabalFlag) "dynamic")