-
Notifications
You must be signed in to change notification settings - Fork 237
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
WIP builder: Add a shell env for development
- Loading branch information
Showing
14 changed files
with
455 additions
and
6 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,29 @@ | ||
{ lib, stdenv, haskellLib }: | ||
|
||
{ ghcEnv, shellHook }: | ||
let | ||
inherit (ghcEnv) baseGhc package; | ||
ghcCommand' = if baseGhc.isGhcjs or false then "ghcjs" else "ghc"; | ||
ghcCommand = "${baseGhc.targetPrefix}${ghcCommand'}"; | ||
ghcCommandCaps = lib.toUpper ghcCommand'; | ||
in stdenv.mkDerivation { | ||
name = "shell-for-${package.identifier.name}"; | ||
|
||
CABAL_CONFIG = package.configFiles + "/cabal.config"; | ||
|
||
"NIX_${ghcCommandCaps}" = "${ghcEnv}/bin/${ghcCommand}"; | ||
"NIX_${ghcCommandCaps}PKG" = "${ghcEnv}/bin/${ghcCommand}-pkg"; | ||
"NIX_${ghcCommandCaps}_LIBDIR" = if baseGhc.isHaLVM or false | ||
then "${ghcEnv}/lib/HaLVM-${baseGhc.version}" | ||
else "${ghcEnv}/lib/${ghcCommand}-${baseGhc.version}"; | ||
# fixme: docs, haddock, hoogle | ||
# NIX_${ghcCommandCaps}_DOCDIR" = package.configFiles; | ||
|
||
nativeBuildInputs = [ ghcEnv ]; | ||
phases = ["installPhase"]; | ||
installPhase = "echo $nativeBuildInputs $buildInputs > $out"; | ||
|
||
passthru = { | ||
ghc = ghcEnv; | ||
}; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,149 @@ | ||
# Copied from nixpkgs and adapted to work with the package database of | ||
# a single component-builder package. | ||
{ lib, stdenv, ghc, llvmPackages, package, runCommand, lndir, makeWrapper | ||
, withLLVM ? false | ||
, postBuild ? "" | ||
, ghcLibdir ? null # only used by ghcjs, when resolving plugins | ||
}: | ||
|
||
assert ghcLibdir != null -> (ghc.isGhcjs or false); | ||
|
||
# This wrapper works only with GHC 6.12 or later. | ||
assert lib.versionOlder "6.12" ghc.version || ghc.isGhcjs || ghc.isHaLVM; | ||
|
||
# It's probably a good idea to include the library "ghc-paths" in the | ||
# compiler environment, because we have a specially patched version of | ||
# that package in Nix that honors these environment variables | ||
# | ||
# NIX_GHC | ||
# NIX_GHCPKG | ||
# NIX_GHC_DOCDIR | ||
# NIX_GHC_LIBDIR | ||
# | ||
# instead of hard-coding the paths. The wrapper sets these variables | ||
# appropriately to configure ghc-paths to point back to the wrapper | ||
# instead of to the pristine GHC package, which doesn't know any of the | ||
# additional libraries. | ||
# | ||
# A good way to import the environment set by the wrapper below into | ||
# your shell is to add the following snippet to your ~/.bashrc: | ||
# | ||
# if [ -e ~/.nix-profile/bin/ghc ]; then | ||
# eval $(grep export ~/.nix-profile/bin/ghc) | ||
# fi | ||
|
||
let | ||
isGhcjs = ghc.isGhcjs or false; | ||
isHaLVM = ghc.isHaLVM or false; | ||
ghc761OrLater = isGhcjs || isHaLVM || lib.versionOlder "7.6.1" ghc.version; | ||
packageDBFlag = if ghc761OrLater then "--global-package-db" else "--global-conf"; | ||
ghcCommand' = if isGhcjs then "ghcjs" else "ghc"; | ||
ghcCommand = "${ghc.targetPrefix}${ghcCommand'}"; | ||
ghcCommandCaps= lib.toUpper ghcCommand'; | ||
libDir = if isHaLVM then "$out/lib/HaLVM-${ghc.version}" | ||
else "$out/lib/${ghcCommand}-${ghc.version}"; | ||
docDir = "$out/share/doc/ghc/html"; | ||
packageCfgDir = "${libDir}/package.conf.d"; | ||
# CLang is needed on Darwin for -fllvm to work: | ||
# https://downloads.haskell.org/~ghc/latest/docs/html/users_guide/codegens.html#llvm-code-generator-fllvm | ||
llvm = lib.makeBinPath | ||
([ llvmPackages.llvm ] | ||
++ lib.optional stdenv.targetPlatform.isDarwin llvmPackages.clang); | ||
|
||
in runCommand "${ghc.name}-with-${package.identifier.name}" { | ||
preferLocalBuild = true; | ||
passthru = { | ||
inherit (ghc) version meta; | ||
baseGhc = ghc; | ||
inherit package; | ||
}; | ||
} ( | ||
'' | ||
. ${makeWrapper}/nix-support/setup-hook | ||
# Start with a ghc... | ||
mkdir -p $out | ||
${lndir}/bin/lndir -silent ${ghc} $out | ||
# ...and replace package database with the one from target package config. | ||
rm -rf ${packageCfgDir} | ||
cp -R --no-preserve=mode ${package.configFiles}/package.conf.d ${packageCfgDir} | ||
# wrap compiler executables with correct env variables | ||
for prg in ${ghcCommand} ${ghcCommand}i ${ghcCommand}-${ghc.version} ${ghcCommand}i-${ghc.version}; do | ||
if [[ -x "${ghc}/bin/$prg" ]]; then | ||
rm -f $out/bin/$prg | ||
makeWrapper ${ghc}/bin/$prg $out/bin/$prg \ | ||
--add-flags '"-B$NIX_${ghcCommandCaps}_LIBDIR"' \ | ||
--set "NIX_${ghcCommandCaps}" "$out/bin/${ghcCommand}" \ | ||
--set "NIX_${ghcCommandCaps}PKG" "$out/bin/${ghcCommand}-pkg" \ | ||
--set "NIX_${ghcCommandCaps}_DOCDIR" "${docDir}" \ | ||
--set "NIX_${ghcCommandCaps}_LIBDIR" "${libDir}" \ | ||
${lib.optionalString (ghc.isGhcjs or false) | ||
''--set NODE_PATH "${ghc.socket-io}/lib/node_modules"'' | ||
} \ | ||
${lib.optionalString withLLVM ''--prefix "PATH" ":" "${llvm}"''} | ||
fi | ||
done | ||
for prg in runghc runhaskell; do | ||
if [[ -x "${ghc}/bin/$prg" ]]; then | ||
rm -f $out/bin/$prg | ||
makeWrapper ${ghc}/bin/$prg $out/bin/$prg \ | ||
--add-flags "-f $out/bin/${ghcCommand}" \ | ||
--set "NIX_${ghcCommandCaps}" "$out/bin/${ghcCommand}" \ | ||
--set "NIX_${ghcCommandCaps}PKG" "$out/bin/${ghcCommand}-pkg" \ | ||
--set "NIX_${ghcCommandCaps}_DOCDIR" "${docDir}" \ | ||
--set "NIX_${ghcCommandCaps}_LIBDIR" "${libDir}" | ||
fi | ||
done | ||
for prg in ${ghcCommand}-pkg ${ghcCommand}-pkg-${ghc.version}; do | ||
if [[ -x "${ghc}/bin/$prg" ]]; then | ||
rm -f $out/bin/$prg | ||
makeWrapper ${ghc}/bin/$prg $out/bin/$prg --add-flags "${packageDBFlag}=${packageCfgDir}" | ||
fi | ||
done | ||
# haddock was referring to the base ghc, https://github.com/NixOS/nixpkgs/issues/36976 | ||
if [[ -x "${ghc}/bin/haddock" ]]; then | ||
rm -f $out/bin/haddock | ||
makeWrapper ${ghc}/bin/haddock $out/bin/haddock \ | ||
--add-flags '"-B$NIX_${ghcCommandCaps}_LIBDIR"' \ | ||
--set "NIX_${ghcCommandCaps}_LIBDIR" "${libDir}" | ||
fi | ||
'' + (lib.optionalString (stdenv.targetPlatform.isDarwin && !isGhcjs && !stdenv.targetPlatform.isiOS) '' | ||
# Work around a linker limit in macOS Sierra (see generic-builder.nix): | ||
local packageConfDir="$out/lib/${ghc.name}/package.conf.d"; | ||
local dynamicLinksDir="$out/lib/links" | ||
mkdir -p $dynamicLinksDir | ||
# Clean up the old links that may have been (transitively) included by | ||
# symlinkJoin: | ||
rm -f $dynamicLinksDir/* | ||
for d in $(grep dynamic-library-dirs $packageConfDir/*|awk '{print $2}'|sort -u); do | ||
ln -s $d/*.dylib $dynamicLinksDir | ||
done | ||
for f in $packageConfDir/*.conf; do | ||
# Initially, $f is a symlink to a read-only file in one of the inputs | ||
# (as a result of this symlinkJoin derivation). | ||
# Replace it with a copy whose dynamic-library-dirs points to | ||
# $dynamicLinksDir | ||
cp $f $f-tmp | ||
rm $f | ||
sed "s,dynamic-library-dirs: .*,dynamic-library-dirs: $dynamicLinksDir," $f-tmp > $f | ||
rm $f-tmp | ||
done | ||
'') + '' | ||
$out/bin/${ghcCommand}-pkg recache | ||
${# ghcjs will read the ghc_libdir file when resolving plugins. | ||
lib.optionalString (isGhcjs && ghcLibdir != null) '' | ||
mkdir -p "${libDir}" | ||
rm -f "${libDir}/ghc_libdir" | ||
printf '%s' '${ghcLibdir}' > "${libDir}/ghc_libdir" | ||
''} | ||
# fixme: the check doesn't work | ||
$out/bin/${ghcCommand}-pkg check || true | ||
'' + postBuild | ||
) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,12 @@ | ||
{-# LANGUAGE TemplateHaskell #-} | ||
module Main where | ||
|
||
import Control.Lens | ||
|
||
data Point = Point { _x :: Double, _y :: Double } | ||
makeLenses ''Point | ||
|
||
main :: IO () | ||
main = print (point^.x + point^.y) | ||
where | ||
point = Point { _x = 40.0, _y = 2.0 } |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,2 @@ | ||
import Distribution.Simple | ||
main = defaultMain |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,6 @@ | ||
-- | Haddock test stuff | ||
module TestWithPackages (hello) where | ||
|
||
-- | Standard hello text. | ||
hello :: String | ||
hello = "Hello, world!" |
Oops, something went wrong.