d068aa9861
When the ghc-paths library is compiled, the paths of the compiler it is compiled with are being hardcoded in the library (and can then be queried from other applications using the library). But on Nix, packages are compiled with ghc-wrapper, and subsequently possibly used with a special version of ghc generated for a particular environment of packages. So one version of ghc-paths may potentially end up being used by lots of different instances of ghc. The hardcoding approach fails. As a work-around, we now patch ghc-paths so that it allows setting the paths that can be queried via environment variables. Specific GHC environments can then set these environment variables in the wrapper shell script that invokes GHC. This should at least partially solve issue #213.
111 lines
3 KiB
Nix
111 lines
3 KiB
Nix
{stdenv, ghc, packages ? [], makeWrapper}:
|
|
|
|
stdenv.mkDerivation rec {
|
|
name = "haskell-env-${ghc.name}";
|
|
|
|
allPackages = stdenv.lib.closePropagation packages;
|
|
buildInputs = allPackages ++ [makeWrapper];
|
|
propagatedBuildInputs = packages;
|
|
|
|
unpackPhase = "true";
|
|
|
|
installPhase = ''
|
|
numversion=$(${ghc}/bin/ghc --numeric-version)
|
|
majorversion=''${numversion%%.*}
|
|
minorversion=''${numversion#*.}
|
|
minorversion=''${minorversion%%.*}
|
|
|
|
if [[ $majorversion -gt 6 ]] && [[ $minorversion -gt 4 ]]; then
|
|
globalConf="--global-package-db"
|
|
else
|
|
globalConf="--global-conf"
|
|
fi
|
|
|
|
originalTopDir="${ghc}/lib/ghc-${ghc.version}"
|
|
originalPkgDir="$originalTopDir/package.conf.d"
|
|
linkedTopDir="$out/lib"
|
|
linkedPkgDir="$linkedTopDir/package.conf.d"
|
|
|
|
mkdir -p $out/bin
|
|
mkdir -p $linkedTopDir
|
|
mkdir -p $linkedPkgDir
|
|
|
|
echo "Linking GHC core libraries:"
|
|
|
|
echo -n "Linking $originalTopDir "
|
|
for f in "$originalTopDir/"*; do
|
|
if test -f $f; then
|
|
ln -s $f $linkedTopDir
|
|
echo -n .
|
|
fi
|
|
done
|
|
echo
|
|
|
|
echo -n "Linking $originalPkgDir "
|
|
for f in "$originalPkgDir/"*.conf; do
|
|
ln -s $f $linkedPkgDir
|
|
echo -n .
|
|
done
|
|
echo
|
|
|
|
echo "Linking selected packages and dependencies:"
|
|
|
|
for currentPath in ${stdenv.lib.concatStringsSep " " allPackages}; do
|
|
currentPkgDir="$currentPath/lib/ghc-pkgs/ghc-${ghc.version}"
|
|
# Check if current path is a Cabal package for the current GHC
|
|
if test -d $currentPkgDir; then
|
|
echo -n "Linking $currentPath "
|
|
for f in "$currentPath/bin/"*; do
|
|
ln -s $f $out/bin
|
|
echo -n .
|
|
done
|
|
for f in "$currentPath/etc/bash_completion.d/"*; do
|
|
mkdir -p $out/etc/bash_completion.d
|
|
ln -s $f $out/etc/bash_completion.d/
|
|
echo -n .
|
|
done
|
|
for f in "$currentPkgDir/"*.conf; do
|
|
ln -s $f $linkedPkgDir
|
|
echo -n .
|
|
done
|
|
echo
|
|
fi
|
|
done
|
|
|
|
echo -n "Generating package cache "
|
|
${ghc}/bin/ghc-pkg $globalConf $linkedPkgDir recache
|
|
echo .
|
|
|
|
echo -n "Generating wrappers "
|
|
|
|
for prg in ghc ghci ghc-${ghc.version} ghci-${ghc.version}; do
|
|
# The NIX env-vars are picked up by our patched version of ghc-paths.
|
|
makeWrapper ${ghc}/bin/$prg $out/bin/$prg \
|
|
--add-flags "-B$linkedTopDir" \
|
|
--set "NIX_GHC" "$out/bin/ghc" \
|
|
--set "NIX_GHCPKG" "$out/bin/ghc-pkg" \
|
|
--set "NIX_GHC_LIBDIR" "$linkedTopDir"
|
|
echo -n .
|
|
done
|
|
|
|
for prg in runghc runhaskell; do
|
|
makeWrapper ${ghc}/bin/$prg $out/bin/$prg --add-flags "-f $out/bin/ghc"
|
|
echo -n .
|
|
done
|
|
|
|
for prg in ghc-pkg ghc-pkg-${ghc.version}; do
|
|
makeWrapper ${ghc}/bin/$prg $out/bin/$prg --add-flags "$globalConf $linkedPkgDir"
|
|
echo -n .
|
|
done
|
|
|
|
for prg in hp2ps hpc hasktags hsc2hs haddock haddock-${ghc.version}; do
|
|
if test -x ${ghc}/bin/$prg -a ! -x $out/bin/$prg; then
|
|
ln -s ${ghc}/bin/$prg $out/bin/$prg && echo -n .
|
|
fi
|
|
done
|
|
echo
|
|
'';
|
|
|
|
meta = ghc.meta;
|
|
}
|