Skip to content

Commit 3287181

Browse files
SamirTalwarplcplc
authored andcommitted
Nix: Wrap GHC and HLS, specifically, to provide (DY)?LD_LIBRARY_PATH.
We clearly do need this environment variable (at least on macOS); otherwise GHC spits out a slew of errors along the lines of "cannot find libodbc.dylib". However, adding it directly to the shell causes serious problems. Wrapping GHC should limit the damage. We've seen similar issues on macOS. PR-URL: hasura/graphql-engine-mono#9203 Co-authored-by: Philip Lykke Carlsen <[email protected]> GitOrigin-RevId: 9468d31e5b8ec86196809844842a1668386054bc
1 parent 4b50704 commit 3287181

File tree

2 files changed

+45
-5
lines changed

2 files changed

+45
-5
lines changed

flake.nix

+1-1
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@
3939

4040
formatter = pkgs.nixpkgs-fmt;
4141

42-
devShells.default = import ./nix/shell.nix { inherit pkgs; };
42+
devShells.default = import ./nix/shell.nix { inherit pkgs system; };
4343
}
4444
);
4545
}

nix/shell.nix

+44-4
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,14 @@
1-
{ pkgs }:
1+
{ pkgs, system }:
22
let
33
versions = import ./versions.nix { inherit pkgs; };
44

5+
# empty package, for shenanigans
6+
empty = builtins.derivation {
7+
inherit system;
8+
name = "empty";
9+
builder = pkgs.writeShellScript "null.sh" "${pkgs.coreutils}/bin/mkdir $out";
10+
};
11+
512
# Unix ODBC Support
613
freetdsWithODBC = pkgs.freetds.override {
714
odbcSupport = true;
@@ -28,6 +35,40 @@ let
2835
configureFlags = [ "--disable-gui" "--sysconfdir=${odbcConfiguration}" ];
2936
});
3037

38+
# Ensure that GHC and HLS have access to all the dynamic libraries we have kicking around.
39+
ghc =
40+
let original = pkgs.haskell.compiler.${pkgs.ghcName};
41+
in pkgs.stdenv.mkDerivation
42+
{
43+
name = original.name;
44+
src = empty;
45+
buildInputs = [ original pkgs.makeWrapper ];
46+
installPhase = ''
47+
mkdir -p "$out/bin"
48+
makeWrapper ${original}/bin/ghc "$out/bin/ghc" \
49+
--set LD_LIBRARY_PATH ${pkgs.lib.strings.makeLibraryPath dynamicLibraries} \
50+
--set DYLD_LIBRARY_PATH ${pkgs.lib.strings.makeLibraryPath dynamicLibraries}
51+
'';
52+
};
53+
54+
hls =
55+
let original = pkgs.haskell.packages.${pkgs.ghcName}.haskell-language-server;
56+
in pkgs.stdenv.mkDerivation
57+
{
58+
name = original.name;
59+
src = empty;
60+
buildInputs = [ original pkgs.makeWrapper ];
61+
installPhase = ''
62+
mkdir -p "$out/bin"
63+
makeWrapper ${original}/bin/haskell-language-server "$out/bin/haskell-language-server" \
64+
--set LD_LIBRARY_PATH ${pkgs.lib.strings.makeLibraryPath dynamicLibraries} \
65+
--set DYLD_LIBRARY_PATH ${pkgs.lib.strings.makeLibraryPath dynamicLibraries}
66+
makeWrapper ${original}/bin/haskell-language-server-wrapper "$out/bin/haskell-language-server-wrapper" \
67+
--set LD_LIBRARY_PATH ${pkgs.lib.strings.makeLibraryPath dynamicLibraries} \
68+
--set DYLD_LIBRARY_PATH ${pkgs.lib.strings.makeLibraryPath dynamicLibraries}
69+
'';
70+
};
71+
3172
baseInputs = [
3273
pkgs.stdenv
3374
pkgs.jq
@@ -56,15 +97,14 @@ let
5697
haskellInputs = [
5798
pkgs.cabal2nix
5899

59-
# The correct version of GHC.
60-
pkgs.haskell.compiler.${pkgs.ghcName}
100+
ghc
101+
hls
61102

62103
pkgs.haskell.packages.${pkgs.ghcName}.alex
63104
pkgs.haskell.packages.${pkgs.ghcName}.apply-refact
64105
(versions.ensureVersion pkgs.haskell.packages.${pkgs.ghcName}.cabal-install)
65106
pkgs.haskell.packages.${pkgs.ghcName}.ghcid
66107
pkgs.haskell.packages.${pkgs.ghcName}.happy
67-
pkgs.haskell.packages.${pkgs.ghcName}.haskell-language-server
68108
(versions.ensureVersion pkgs.haskell.packages.${pkgs.ghcName}.hlint)
69109
pkgs.haskell.packages.${pkgs.ghcName}.hoogle
70110
pkgs.haskell.packages.${pkgs.ghcName}.hspec-discover

0 commit comments

Comments
 (0)