haskell: init
This commit is contained in:
parent
823445c069
commit
8148c3ee3c
11
pkgs/by-name/al/all-cabal-hashes/default.nix
Normal file
11
pkgs/by-name/al/all-cabal-hashes/default.nix
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
# Hackage database snapshot, used by maintainers/scripts/regenerate-hackage-packages.sh
|
||||||
|
# and callHackage
|
||||||
|
{ lib, fetchurl }:
|
||||||
|
let
|
||||||
|
pin = lib.importJSON ./pin.json;
|
||||||
|
in
|
||||||
|
fetchurl {
|
||||||
|
inherit (pin) url sha256;
|
||||||
|
name = "all-cabal-hashes-${lib.substring 0 7 pin.commit}.tar.gz";
|
||||||
|
passthru.updateScript = ../../../../maintainers/scripts/haskell/update-hackage.sh;
|
||||||
|
}
|
6
pkgs/by-name/al/all-cabal-hashes/pin.json
Normal file
6
pkgs/by-name/al/all-cabal-hashes/pin.json
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
{
|
||||||
|
"commit": "4eb9a5fde06b5d7343665582243debaf1d77e0a9",
|
||||||
|
"url": "https://github.com/commercialhaskell/all-cabal-hashes/archive/4eb9a5fde06b5d7343665582243debaf1d77e0a9.tar.gz",
|
||||||
|
"sha256": "0dzyfr1gv79riy2vh840b5hqly8rs10zhj01zi9nfn7jd9pzql28",
|
||||||
|
"msg": "Update from Hackage at 2024-04-16T17:36:35Z"
|
||||||
|
}
|
25
pkgs/by-name/ar/argp-standalone/default.nix
Normal file
25
pkgs/by-name/ar/argp-standalone/default.nix
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
{ lib, stdenv, fetchFromGitHub, meson, ninja }:
|
||||||
|
|
||||||
|
stdenv.mkDerivation rec {
|
||||||
|
pname = "argp-standalone";
|
||||||
|
version = "1.5.0";
|
||||||
|
|
||||||
|
src = fetchFromGitHub {
|
||||||
|
owner = "argp-standalone";
|
||||||
|
repo = "argp-standalone";
|
||||||
|
rev = version;
|
||||||
|
sha256 = "jWnoWVnUVDQlsC9ru7oB9PdtZuyCCNqGnMqF/f2m0ZY=";
|
||||||
|
};
|
||||||
|
|
||||||
|
nativeBuildInputs = [ meson ninja ];
|
||||||
|
|
||||||
|
doCheck = true;
|
||||||
|
|
||||||
|
meta = with lib; {
|
||||||
|
homepage = "https://github.com/argp-standalone/argp-standalone";
|
||||||
|
description = "Standalone version of arguments parsing functions from Glibc";
|
||||||
|
platforms = platforms.unix;
|
||||||
|
maintainers = with maintainers; [ amar1729 ];
|
||||||
|
license = licenses.lgpl21Plus;
|
||||||
|
};
|
||||||
|
}
|
37
pkgs/by-name/dn/dns-root-data/default.nix
Normal file
37
pkgs/by-name/dn/dns-root-data/default.nix
Normal file
|
@ -0,0 +1,37 @@
|
||||||
|
{ stdenv, lib, fetchurl }:
|
||||||
|
|
||||||
|
let
|
||||||
|
|
||||||
|
rootHints = fetchurl {
|
||||||
|
# Original source https://www.internic.net/domain/named.root
|
||||||
|
# occasionally suffers from pointless hash changes,
|
||||||
|
# and having stable sources for older versions has advantages, too.
|
||||||
|
urls = map (prefix: prefix + "d9c96ae96f066a85d7/etc/root.hints") [
|
||||||
|
"https://gitlab.nic.cz/knot/knot-resolver/raw/"
|
||||||
|
"https://raw.githubusercontent.com/CZ-NIC/knot-resolver/"
|
||||||
|
];
|
||||||
|
hash = "sha256-4lG/uPnNHBNIZ/XIeDM1w3iukrpeW0JIjTnGSwkJ8U4=";
|
||||||
|
};
|
||||||
|
|
||||||
|
rootKey = ./root.key;
|
||||||
|
rootDs = ./root.ds;
|
||||||
|
|
||||||
|
in
|
||||||
|
|
||||||
|
stdenv.mkDerivation {
|
||||||
|
pname = "dns-root-data";
|
||||||
|
version = "2023-11-27";
|
||||||
|
|
||||||
|
buildCommand = ''
|
||||||
|
mkdir $out
|
||||||
|
cp ${rootHints} $out/root.hints
|
||||||
|
cp ${rootKey} $out/root.key
|
||||||
|
cp ${rootDs} $out/root.ds
|
||||||
|
'';
|
||||||
|
|
||||||
|
meta = with lib; {
|
||||||
|
description = "DNS root data including root zone and DNSSEC key";
|
||||||
|
maintainers = with maintainers; [ fpletz vcunat ];
|
||||||
|
license = licenses.gpl3Plus;
|
||||||
|
};
|
||||||
|
}
|
1
pkgs/by-name/dn/dns-root-data/root.ds
Normal file
1
pkgs/by-name/dn/dns-root-data/root.ds
Normal file
|
@ -0,0 +1 @@
|
||||||
|
. IN DS 20326 8 2 E06D44B80B8F1D39A95C0B0D7C65D08458E880409BBC683457104237C7F8EC8D
|
1
pkgs/by-name/dn/dns-root-data/root.key
Normal file
1
pkgs/by-name/dn/dns-root-data/root.key
Normal file
|
@ -0,0 +1 @@
|
||||||
|
. 172800 IN DNSKEY 257 3 8 AwEAAaz/tAm8yTn4Mfeh5eyI96WSVexTBAvkMgJzkKTOiW1vkIbzxeF3+/4RgWOq7HrxRixHlFlExOLAJr5emLvN7SWXgnLh4+B5xQlNVz8Og8kvArMtNROxVQuCaSnIDdD5LKyWbRd2n9WGe2R8PzgCmr3EgVLrjyBxWezF0jLHwVN8efS3rCj/EWgvIWgb9tarpVUDK/b58Da+sqqls3eNbuv7pr+eoZG+SrDK6nWeL3c6H5Apxz7LjVc1uTIdsIXxuOLYA4/ilBmSVIzuDWfdRUfhHdY6+cn8HFRm+2hM8AnXGXws9555KrUB5qihylGa8subX2Nn6UwNR1AkUTV74bU= ;{id = 20326 (ksk), size = 2048b}
|
10
pkgs/by-name/dn/dns-root-data/update-root-key.sh
Executable file
10
pkgs/by-name/dn/dns-root-data/update-root-key.sh
Executable file
|
@ -0,0 +1,10 @@
|
||||||
|
#!/usr/bin/env nix-shell
|
||||||
|
#!nix-shell -i bash -p busybox unbound
|
||||||
|
|
||||||
|
TMP=`mktemp`
|
||||||
|
unbound-anchor -a "$TMP"
|
||||||
|
grep -Ev "^($$|;)" "$TMP" | sed -e 's/ ;;.*//' > root.key
|
||||||
|
|
||||||
|
unbound-anchor -F -a "$TMP"
|
||||||
|
sed '/^;/d' < "$TMP" > root.ds
|
||||||
|
rm $TMP
|
|
@ -2,7 +2,8 @@
|
||||||
, musl-obstack, m4, zlib, zstd, bzip2, bison, flex, gettext, xz, setupDebugInfoDirs
|
, musl-obstack, m4, zlib, zstd, bzip2, bison, flex, gettext, xz, setupDebugInfoDirs
|
||||||
, argp-standalone
|
, argp-standalone
|
||||||
, enableDebuginfod ? true, sqlite, curl, libmicrohttpd, libarchive
|
, enableDebuginfod ? true, sqlite, curl, libmicrohttpd, libarchive
|
||||||
, gitUpdater
|
# for passthru.tests
|
||||||
|
# , gitUpdater
|
||||||
}:
|
}:
|
||||||
|
|
||||||
# TODO: Look at the hardcoded paths to kernel, modules etc.
|
# TODO: Look at the hardcoded paths to kernel, modules etc.
|
||||||
|
@ -89,10 +90,10 @@ stdenv.mkDerivation rec {
|
||||||
doInstallCheck = !stdenv.hostPlatform.isMusl
|
doInstallCheck = !stdenv.hostPlatform.isMusl
|
||||||
&& (stdenv.hostPlatform == stdenv.buildPlatform);
|
&& (stdenv.hostPlatform == stdenv.buildPlatform);
|
||||||
|
|
||||||
passthru.updateScript = gitUpdater {
|
# passthru.updateScript = gitUpdater {
|
||||||
url = "https://sourceware.org/git/elfutils.git";
|
# url = "https://sourceware.org/git/elfutils.git";
|
||||||
rev-prefix = "elfutils-";
|
# rev-prefix = "elfutils-";
|
||||||
};
|
# };
|
||||||
|
|
||||||
meta = with lib; {
|
meta = with lib; {
|
||||||
homepage = "https://sourceware.org/elfutils/";
|
homepage = "https://sourceware.org/elfutils/";
|
||||||
|
|
451
pkgs/by-name/ha/haskell/ghc/8.10.7-binary.nix
Normal file
451
pkgs/by-name/ha/haskell/ghc/8.10.7-binary.nix
Normal file
|
@ -0,0 +1,451 @@
|
||||||
|
{ lib, stdenv
|
||||||
|
, fetchurl, perl, gcc
|
||||||
|
, ncurses5
|
||||||
|
, ncurses6, gmp, libiconv, numactl
|
||||||
|
, llvmPackages
|
||||||
|
, coreutils
|
||||||
|
, targetPackages
|
||||||
|
|
||||||
|
# minimal = true; will remove files that aren't strictly necessary for
|
||||||
|
# regular builds and GHC bootstrapping.
|
||||||
|
# This is "useful" for staying within hydra's output limits for at least the
|
||||||
|
# aarch64-linux architecture.
|
||||||
|
, minimal ? false
|
||||||
|
}:
|
||||||
|
|
||||||
|
# Prebuilt only does native
|
||||||
|
assert stdenv.targetPlatform == stdenv.hostPlatform;
|
||||||
|
|
||||||
|
let
|
||||||
|
downloadsUrl = "https://downloads.haskell.org/ghc";
|
||||||
|
|
||||||
|
# Copy sha256 from https://downloads.haskell.org/~ghc/8.10.7/SHA256SUMS
|
||||||
|
version = "8.10.7";
|
||||||
|
|
||||||
|
# Information about available bindists that we use in the build.
|
||||||
|
#
|
||||||
|
# # Bindist library checking
|
||||||
|
#
|
||||||
|
# The field `archSpecificLibraries` also provides a way for us get notified
|
||||||
|
# early when the upstream bindist changes its dependencies (e.g. because a
|
||||||
|
# newer Debian version is used that uses a new `ncurses` version).
|
||||||
|
#
|
||||||
|
# Usage:
|
||||||
|
#
|
||||||
|
# * You can find the `fileToCheckFor` of libraries by running `readelf -d`
|
||||||
|
# on the compiler binary (`exePathForLibraryCheck`).
|
||||||
|
# * To skip library checking for an architecture,
|
||||||
|
# set `exePathForLibraryCheck = null`.
|
||||||
|
# * To skip file checking for a specific arch specfic library,
|
||||||
|
# set `fileToCheckFor = null`.
|
||||||
|
ghcBinDists = {
|
||||||
|
# Binary distributions for the default libc (e.g. glibc, or libSystem on Darwin)
|
||||||
|
# nixpkgs uses for the respective system.
|
||||||
|
defaultLibc = {
|
||||||
|
i686-linux = {
|
||||||
|
variantSuffix = "";
|
||||||
|
src = {
|
||||||
|
url = "${downloadsUrl}/${version}/ghc-${version}-i386-deb9-linux.tar.xz";
|
||||||
|
sha256 = "fbfc1ef194f4e7a4c0da8c11cc69b17458a4b928b609b3622c97acc4acd5c5ab";
|
||||||
|
};
|
||||||
|
exePathForLibraryCheck = "ghc/stage2/build/tmp/ghc-stage2";
|
||||||
|
archSpecificLibraries = [
|
||||||
|
{ nixPackage = gmp; fileToCheckFor = null; }
|
||||||
|
# The i686-linux bindist provided by GHC HQ is currently built on Debian 9,
|
||||||
|
# which link it against `libtinfo.so.5` (ncurses 5).
|
||||||
|
# Other bindists are linked `libtinfo.so.6` (ncurses 6).
|
||||||
|
{ nixPackage = ncurses5; fileToCheckFor = "libtinfo.so.5"; }
|
||||||
|
];
|
||||||
|
};
|
||||||
|
x86_64-linux = {
|
||||||
|
variantSuffix = "";
|
||||||
|
src = {
|
||||||
|
url = "${downloadsUrl}/${version}/ghc-${version}-x86_64-deb10-linux.tar.xz";
|
||||||
|
sha256 = "a13719bca87a0d3ac0c7d4157a4e60887009a7f1a8dbe95c4759ec413e086d30";
|
||||||
|
};
|
||||||
|
exePathForLibraryCheck = "ghc/stage2/build/tmp/ghc-stage2";
|
||||||
|
archSpecificLibraries = [
|
||||||
|
{ nixPackage = gmp; fileToCheckFor = null; }
|
||||||
|
{ nixPackage = ncurses6; fileToCheckFor = "libtinfo.so.6"; }
|
||||||
|
];
|
||||||
|
};
|
||||||
|
armv7l-linux = {
|
||||||
|
variantSuffix = "";
|
||||||
|
src = {
|
||||||
|
url = "${downloadsUrl}/${version}/ghc-${version}-armv7-deb10-linux.tar.xz";
|
||||||
|
sha256 = "3949c31bdf7d3b4afb765ea8246bca4ca9707c5d988d9961a244f0da100956a2";
|
||||||
|
};
|
||||||
|
exePathForLibraryCheck = "ghc/stage2/build/tmp/ghc-stage2";
|
||||||
|
archSpecificLibraries = [
|
||||||
|
{ nixPackage = gmp; fileToCheckFor = null; }
|
||||||
|
{ nixPackage = ncurses6; fileToCheckFor = "libtinfo.so.6"; }
|
||||||
|
];
|
||||||
|
};
|
||||||
|
aarch64-linux = {
|
||||||
|
variantSuffix = "";
|
||||||
|
src = {
|
||||||
|
url = "${downloadsUrl}/${version}/ghc-${version}-aarch64-deb10-linux.tar.xz";
|
||||||
|
sha256 = "fad2417f9b295233bf8ade79c0e6140896359e87be46cb61cd1d35863d9d0e55";
|
||||||
|
};
|
||||||
|
exePathForLibraryCheck = "ghc/stage2/build/tmp/ghc-stage2";
|
||||||
|
archSpecificLibraries = [
|
||||||
|
{ nixPackage = gmp; fileToCheckFor = null; }
|
||||||
|
{ nixPackage = ncurses6; fileToCheckFor = "libtinfo.so.6"; }
|
||||||
|
{ nixPackage = numactl; fileToCheckFor = null; }
|
||||||
|
];
|
||||||
|
};
|
||||||
|
x86_64-darwin = {
|
||||||
|
variantSuffix = "";
|
||||||
|
src = {
|
||||||
|
url = "${downloadsUrl}/${version}/ghc-${version}-x86_64-apple-darwin.tar.xz";
|
||||||
|
sha256 = "287db0f9c338c9f53123bfa8731b0996803ee50f6ee847fe388092e5e5132047";
|
||||||
|
};
|
||||||
|
exePathForLibraryCheck = null; # we don't have a library check for darwin yet
|
||||||
|
archSpecificLibraries = [
|
||||||
|
{ nixPackage = gmp; fileToCheckFor = null; }
|
||||||
|
{ nixPackage = ncurses6; fileToCheckFor = null; }
|
||||||
|
{ nixPackage = libiconv; fileToCheckFor = null; }
|
||||||
|
];
|
||||||
|
};
|
||||||
|
aarch64-darwin = {
|
||||||
|
variantSuffix = "";
|
||||||
|
src = {
|
||||||
|
url = "${downloadsUrl}/${version}/ghc-${version}-aarch64-apple-darwin.tar.xz";
|
||||||
|
sha256 = "dc469fc3c35fd2a33a5a575ffce87f13de7b98c2d349a41002e200a56d9bba1c";
|
||||||
|
};
|
||||||
|
exePathForLibraryCheck = null; # we don't have a library check for darwin yet
|
||||||
|
archSpecificLibraries = [
|
||||||
|
{ nixPackage = gmp; fileToCheckFor = null; }
|
||||||
|
{ nixPackage = ncurses6; fileToCheckFor = null; }
|
||||||
|
{ nixPackage = libiconv; fileToCheckFor = null; }
|
||||||
|
];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
# Binary distributions for the musl libc for the respective system.
|
||||||
|
musl = {
|
||||||
|
x86_64-linux = {
|
||||||
|
variantSuffix = "-musl-integer-simple";
|
||||||
|
src = {
|
||||||
|
url = "${downloadsUrl}/${version}/ghc-${version}-x86_64-alpine3.10-linux-integer-simple.tar.xz";
|
||||||
|
sha256 = "16903df850ef73d5246f2ff169cbf57ecab76c2ac5acfa9928934282cfad575c";
|
||||||
|
};
|
||||||
|
exePathForLibraryCheck = "bin/ghc";
|
||||||
|
archSpecificLibraries = [
|
||||||
|
# No `gmp` here, since this is an `integer-simple` bindist.
|
||||||
|
|
||||||
|
# In contrast to glibc builds, the musl-bindist uses `libncursesw.so.*`
|
||||||
|
# instead of `libtinfo.so.*.`
|
||||||
|
{ nixPackage = ncurses6; fileToCheckFor = "libncursesw.so.6"; }
|
||||||
|
];
|
||||||
|
isHadrian = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
distSetName = if stdenv.hostPlatform.isMusl then "musl" else "defaultLibc";
|
||||||
|
|
||||||
|
binDistUsed = ghcBinDists.${distSetName}.${stdenv.hostPlatform.system}
|
||||||
|
or (throw "cannot bootstrap GHC on this platform ('${stdenv.hostPlatform.system}' with libc '${distSetName}')");
|
||||||
|
|
||||||
|
useLLVM = !stdenv.targetPlatform.isx86;
|
||||||
|
|
||||||
|
libPath =
|
||||||
|
lib.makeLibraryPath (
|
||||||
|
# Add arch-specific libraries.
|
||||||
|
map ({ nixPackage, ... }: nixPackage) binDistUsed.archSpecificLibraries
|
||||||
|
);
|
||||||
|
|
||||||
|
libEnvVar = lib.optionalString stdenv.hostPlatform.isDarwin "DY"
|
||||||
|
+ "LD_LIBRARY_PATH";
|
||||||
|
|
||||||
|
runtimeDeps = [
|
||||||
|
targetPackages.stdenv.cc
|
||||||
|
targetPackages.stdenv.cc.bintools
|
||||||
|
coreutils # for cat
|
||||||
|
]
|
||||||
|
++ lib.optionals useLLVM [
|
||||||
|
(lib.getBin llvmPackages.llvm)
|
||||||
|
]
|
||||||
|
# On darwin, we need unwrapped bintools as well (for otool)
|
||||||
|
++ lib.optionals (stdenv.targetPlatform.linker == "cctools") [
|
||||||
|
targetPackages.stdenv.cc.bintools.bintools
|
||||||
|
];
|
||||||
|
|
||||||
|
in
|
||||||
|
|
||||||
|
stdenv.mkDerivation rec {
|
||||||
|
inherit version;
|
||||||
|
pname = "ghc-binary${binDistUsed.variantSuffix}";
|
||||||
|
|
||||||
|
src = fetchurl binDistUsed.src;
|
||||||
|
|
||||||
|
# Note that for GHC 8.10 versions >= 8.10.6, the GHC HQ musl bindist
|
||||||
|
# uses `integer-simple` and has no `gmp` dependency:
|
||||||
|
# https://gitlab.haskell.org/ghc/ghc/-/commit/8306501020cd66f683ad9c215fa8e16c2d62357d
|
||||||
|
# Related nixpkgs issues:
|
||||||
|
# * https://github.com/NixOS/nixpkgs/pull/130441#issuecomment-922452843
|
||||||
|
# TODO: When this file is copied to `ghc-9.*-binary.nix`, determine whether
|
||||||
|
# the GHC 9 branch also switched from `gmp` to `integer-simple` via the
|
||||||
|
# currently-open issue:
|
||||||
|
# https://gitlab.haskell.org/ghc/ghc/-/issues/20059
|
||||||
|
# and update this comment accordingly.
|
||||||
|
|
||||||
|
nativeBuildInputs = [ perl ];
|
||||||
|
|
||||||
|
# Set LD_LIBRARY_PATH or equivalent so that the programs running as part
|
||||||
|
# of the bindist installer can find the libraries they expect.
|
||||||
|
# Cannot patchelf beforehand due to relative RPATHs that anticipate
|
||||||
|
# the final install location.
|
||||||
|
${libEnvVar} = libPath;
|
||||||
|
|
||||||
|
postUnpack =
|
||||||
|
# Verify our assumptions of which `libtinfo.so` (ncurses) version is used,
|
||||||
|
# so that we know when ghc bindists upgrade that and we need to update the
|
||||||
|
# version used in `libPath`.
|
||||||
|
lib.optionalString
|
||||||
|
(binDistUsed.exePathForLibraryCheck != null)
|
||||||
|
# Note the `*` glob because some GHCs have a suffix when unpacked, e.g.
|
||||||
|
# the musl bindist has dir `ghc-VERSION-x86_64-unknown-linux/`.
|
||||||
|
# As a result, don't shell-quote this glob when splicing the string.
|
||||||
|
(let buildExeGlob = ''ghc-${version}*/"${binDistUsed.exePathForLibraryCheck}"''; in
|
||||||
|
lib.concatStringsSep "\n" [
|
||||||
|
(''
|
||||||
|
shopt -u nullglob
|
||||||
|
echo "Checking that ghc binary exists in bindist at ${buildExeGlob}"
|
||||||
|
if ! test -e ${buildExeGlob}; then
|
||||||
|
echo >&2 "GHC binary ${binDistUsed.exePathForLibraryCheck} could not be found in the bindist build directory (at ${buildExeGlob}) for arch ${stdenv.hostPlatform.system}, please check that ghcBinDists correctly reflect the bindist dependencies!"; exit 1;
|
||||||
|
fi
|
||||||
|
'')
|
||||||
|
(lib.concatMapStringsSep
|
||||||
|
"\n"
|
||||||
|
({ fileToCheckFor, nixPackage }:
|
||||||
|
lib.optionalString (fileToCheckFor != null) ''
|
||||||
|
echo "Checking bindist for ${fileToCheckFor} to ensure that is still used"
|
||||||
|
if ! readelf -d ${buildExeGlob} | grep "${fileToCheckFor}"; then
|
||||||
|
echo >&2 "File ${fileToCheckFor} could not be found in ${binDistUsed.exePathForLibraryCheck} for arch ${stdenv.hostPlatform.system}, please check that ghcBinDists correctly reflect the bindist dependencies!"; exit 1;
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "Checking that the nix package ${nixPackage} contains ${fileToCheckFor}"
|
||||||
|
if ! test -e "${lib.getLib nixPackage}/lib/${fileToCheckFor}"; then
|
||||||
|
echo >&2 "Nix package ${nixPackage} did not contain ${fileToCheckFor} for arch ${stdenv.hostPlatform.system}, please check that ghcBinDists correctly reflect the bindist dependencies!"; exit 1;
|
||||||
|
fi
|
||||||
|
''
|
||||||
|
)
|
||||||
|
binDistUsed.archSpecificLibraries
|
||||||
|
)
|
||||||
|
])
|
||||||
|
# GHC has dtrace probes, which causes ld to try to open /usr/lib/libdtrace.dylib
|
||||||
|
# during linking
|
||||||
|
+ lib.optionalString stdenv.isDarwin ''
|
||||||
|
export NIX_LDFLAGS+=" -no_dtrace_dof"
|
||||||
|
# not enough room in the object files for the full path to libiconv :(
|
||||||
|
for exe in $(find . -type f -executable); do
|
||||||
|
isScript $exe && continue
|
||||||
|
ln -fs ${libiconv}/lib/libiconv.dylib $(dirname $exe)/libiconv.dylib
|
||||||
|
install_name_tool -change /usr/lib/libiconv.2.dylib @executable_path/libiconv.dylib -change /usr/local/lib/gcc/6/libgcc_s.1.dylib ${gcc.cc.lib}/lib/libgcc_s.1.dylib $exe
|
||||||
|
done
|
||||||
|
'' +
|
||||||
|
|
||||||
|
# Some scripts used during the build need to have their shebangs patched
|
||||||
|
''
|
||||||
|
patchShebangs ghc-${version}/utils/
|
||||||
|
patchShebangs ghc-${version}/configure
|
||||||
|
test -d ghc-${version}/inplace/bin && \
|
||||||
|
patchShebangs ghc-${version}/inplace/bin
|
||||||
|
'' +
|
||||||
|
# We have to patch the GMP paths for the integer-gmp package.
|
||||||
|
# Note that musl bindists do not contain them,
|
||||||
|
# see: https://gitlab.haskell.org/ghc/ghc/-/issues/20073#note_363231
|
||||||
|
# However, musl bindists >= 8.10.6 use `integer-simple`, not `gmp`.
|
||||||
|
''
|
||||||
|
find . -name integer-gmp.buildinfo \
|
||||||
|
-exec sed -i "s@extra-lib-dirs: @extra-lib-dirs: ${gmp.out}/lib@" {} \;
|
||||||
|
'' + lib.optionalString stdenv.isDarwin ''
|
||||||
|
find . -name base.buildinfo \
|
||||||
|
-exec sed -i "s@extra-lib-dirs: @extra-lib-dirs: ${libiconv}/lib@" {} \;
|
||||||
|
'' +
|
||||||
|
# aarch64 does HAVE_NUMA so -lnuma requires it in library-dirs in rts/package.conf.in
|
||||||
|
# FFI_LIB_DIR is a good indication of places it must be needed.
|
||||||
|
lib.optionalString (stdenv.hostPlatform.isLinux && stdenv.hostPlatform.isAarch64) ''
|
||||||
|
find . -name package.conf.in \
|
||||||
|
-exec sed -i "s@FFI_LIB_DIR@FFI_LIB_DIR ${numactl.out}/lib@g" {} \;
|
||||||
|
'' +
|
||||||
|
# Rename needed libraries and binaries, fix interpreter
|
||||||
|
lib.optionalString stdenv.isLinux ''
|
||||||
|
find . -type f -executable -exec patchelf \
|
||||||
|
--interpreter ${stdenv.cc.bintools.dynamicLinker} {} \;
|
||||||
|
'' +
|
||||||
|
# The hadrian install Makefile uses 'xxx' as a temporary placeholder in path
|
||||||
|
# substitution. Which can break the build if the store path / prefix happens
|
||||||
|
# to contain this string. This will be fixed with 9.4 bindists.
|
||||||
|
# https://gitlab.haskell.org/ghc/ghc/-/issues/21402
|
||||||
|
''
|
||||||
|
# Detect hadrian Makefile by checking for the target that has the problem
|
||||||
|
if grep '^update_package_db' ghc-${version}*/Makefile > /dev/null; then
|
||||||
|
echo Hadrian bindist, applying workaround for xxx path substitution.
|
||||||
|
# based on https://gitlab.haskell.org/ghc/ghc/-/commit/dd5fecb0e2990b192d92f4dfd7519ecb33164fad.patch
|
||||||
|
substituteInPlace ghc-${version}*/Makefile --replace 'xxx' '\0xxx\0'
|
||||||
|
else
|
||||||
|
echo Not a hadrian bindist, not applying xxx path workaround.
|
||||||
|
fi
|
||||||
|
'';
|
||||||
|
|
||||||
|
# fix for `configure: error: Your linker is affected by binutils #16177`
|
||||||
|
preConfigure = lib.optionalString
|
||||||
|
stdenv.targetPlatform.isAarch32
|
||||||
|
"LD=ld.gold";
|
||||||
|
|
||||||
|
configurePlatforms = [ ];
|
||||||
|
configureFlags = [
|
||||||
|
"--with-gmp-includes=${lib.getDev gmp}/include"
|
||||||
|
# Note `--with-gmp-libraries` does nothing for GHC bindists:
|
||||||
|
# https://gitlab.haskell.org/ghc/ghc/-/merge_requests/6124
|
||||||
|
] ++ lib.optional stdenv.isDarwin "--with-gcc=${./gcc-clang-wrapper.sh}"
|
||||||
|
# From: https://github.com/NixOS/nixpkgs/pull/43369/commits
|
||||||
|
++ lib.optional stdenv.hostPlatform.isMusl "--disable-ld-override";
|
||||||
|
|
||||||
|
# No building is necessary, but calling make without flags ironically
|
||||||
|
# calls install-strip ...
|
||||||
|
dontBuild = true;
|
||||||
|
|
||||||
|
# Patch scripts to include runtime dependencies in $PATH.
|
||||||
|
postInstall = ''
|
||||||
|
for i in "$out/bin/"*; do
|
||||||
|
test ! -h "$i" || continue
|
||||||
|
isScript "$i" || continue
|
||||||
|
sed -i -e '2i export PATH="${lib.makeBinPath runtimeDeps}:$PATH"' "$i"
|
||||||
|
done
|
||||||
|
'';
|
||||||
|
|
||||||
|
# Apparently necessary for the ghc Alpine (musl) bindist:
|
||||||
|
# When we strip, and then run the
|
||||||
|
# patchelf --set-rpath "${libPath}:$(patchelf --print-rpath $p)" $p
|
||||||
|
# below, running ghc (e.g. during `installCheckPhase)` gives some apparently
|
||||||
|
# corrupted rpath or whatever makes the loader work on nonsensical strings:
|
||||||
|
# running install tests
|
||||||
|
# Error relocating /nix/store/...-ghc-8.10.2-binary/lib/ghc-8.10.5/bin/ghc: : symbol not found
|
||||||
|
# Error relocating /nix/store/...-ghc-8.10.2-binary/lib/ghc-8.10.5/bin/ghc: ir6zf6c9f86pfx8sr30n2vjy-ghc-8.10.2-binary/lib/ghc-8.10.5/bin/../lib/x86_64-linux-ghc-8.10.5/libHSexceptions-0.10.4-ghc8.10.5.so: symbol not found
|
||||||
|
# Error relocating /nix/store/...-ghc-8.10.2-binary/lib/ghc-8.10.5/bin/ghc: y/lib/ghc-8.10.5/bin/../lib/x86_64-linux-ghc-8.10.5/libHStemplate-haskell-2.16.0.0-ghc8.10.5.so: symbol not found
|
||||||
|
# Error relocating /nix/store/...-ghc-8.10.2-binary/lib/ghc-8.10.5/bin/ghc: 8.10.5/libHStemplate-haskell-2.16.0.0-ghc8.10.5.so: symbol not found
|
||||||
|
# Error relocating /nix/store/...-ghc-8.10.2-binary/lib/ghc-8.10.5/bin/ghc: <20>: symbol not found
|
||||||
|
# Error relocating /nix/store/...-ghc-8.10.2-binary/lib/ghc-8.10.5/bin/ghc: <20>?: symbol not found
|
||||||
|
# Error relocating /nix/store/...-ghc-8.10.2-binary/lib/ghc-8.10.5/bin/ghc: 64-linux-ghc-8.10.5/libHSexceptions-0.10.4-ghc8.10.5.so: symbol not found
|
||||||
|
# This is extremely bogus and should be investigated.
|
||||||
|
dontStrip = if stdenv.hostPlatform.isMusl then true else false; # `if` for explicitness
|
||||||
|
|
||||||
|
# On Linux, use patchelf to modify the executables so that they can
|
||||||
|
# find editline/gmp.
|
||||||
|
postFixup = lib.optionalString stdenv.isLinux
|
||||||
|
(if stdenv.hostPlatform.isAarch64 then
|
||||||
|
# Keep rpath as small as possible on aarch64 for patchelf#244. All Elfs
|
||||||
|
# are 2 directories deep from $out/lib, so pooling symlinks there makes
|
||||||
|
# a short rpath.
|
||||||
|
''
|
||||||
|
(cd $out/lib; ln -s ${ncurses6.out}/lib/libtinfo.so.6)
|
||||||
|
(cd $out/lib; ln -s ${gmp.out}/lib/libgmp.so.10)
|
||||||
|
(cd $out/lib; ln -s ${numactl.out}/lib/libnuma.so.1)
|
||||||
|
for p in $(find "$out/lib" -type f -name "*\.so*"); do
|
||||||
|
(cd $out/lib; ln -s $p)
|
||||||
|
done
|
||||||
|
|
||||||
|
for p in $(find "$out/lib" -type f -executable); do
|
||||||
|
if isELF "$p"; then
|
||||||
|
echo "Patchelfing $p"
|
||||||
|
patchelf --set-rpath "\$ORIGIN:\$ORIGIN/../.." $p
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
''
|
||||||
|
else
|
||||||
|
''
|
||||||
|
for p in $(find "$out" -type f -executable); do
|
||||||
|
if isELF "$p"; then
|
||||||
|
echo "Patchelfing $p"
|
||||||
|
patchelf --set-rpath "${libPath}:$(patchelf --print-rpath $p)" $p
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
'') + lib.optionalString stdenv.isDarwin ''
|
||||||
|
# not enough room in the object files for the full path to libiconv :(
|
||||||
|
for exe in $(find "$out" -type f -executable); do
|
||||||
|
isScript $exe && continue
|
||||||
|
ln -fs ${libiconv}/lib/libiconv.dylib $(dirname $exe)/libiconv.dylib
|
||||||
|
install_name_tool -change /usr/lib/libiconv.2.dylib @executable_path/libiconv.dylib -change /usr/local/lib/gcc/6/libgcc_s.1.dylib ${gcc.cc.lib}/lib/libgcc_s.1.dylib $exe
|
||||||
|
done
|
||||||
|
|
||||||
|
for file in $(find "$out" -name setup-config); do
|
||||||
|
substituteInPlace $file --replace /usr/bin/ranlib "$(type -P ranlib)"
|
||||||
|
done
|
||||||
|
'' +
|
||||||
|
lib.optionalString minimal ''
|
||||||
|
# Remove profiling files
|
||||||
|
find $out -type f -name '*.p_o' -delete
|
||||||
|
find $out -type f -name '*.p_hi' -delete
|
||||||
|
find $out -type f -name '*_p.a' -delete
|
||||||
|
# `-f` because e.g. musl bindist does not have this file.
|
||||||
|
rm -f $out/lib/ghc-*/bin/ghc-iserv-prof
|
||||||
|
# Hydra will redistribute this derivation, so we have to keep the docs for
|
||||||
|
# legal reasons (retaining the legal notices etc)
|
||||||
|
# As a last resort we could unpack the docs separately and symlink them in.
|
||||||
|
# They're in $out/share/{doc,man}.
|
||||||
|
'';
|
||||||
|
|
||||||
|
# In nixpkgs, musl based builds currently enable `pie` hardening by default
|
||||||
|
# (see `defaultHardeningFlags` in `make-derivation.nix`).
|
||||||
|
# But GHC cannot currently produce outputs that are ready for `-pie` linking.
|
||||||
|
# Thus, disable `pie` hardening, otherwise `recompile with -fPIE` errors appear.
|
||||||
|
# See:
|
||||||
|
# * https://github.com/NixOS/nixpkgs/issues/129247
|
||||||
|
# * https://gitlab.haskell.org/ghc/ghc/-/issues/19580
|
||||||
|
hardeningDisable = lib.optional stdenv.targetPlatform.isMusl "pie";
|
||||||
|
|
||||||
|
doInstallCheck = true;
|
||||||
|
installCheckPhase = ''
|
||||||
|
# Sanity check, can ghc create executables?
|
||||||
|
cd $TMP
|
||||||
|
mkdir test-ghc; cd test-ghc
|
||||||
|
cat > main.hs << EOF
|
||||||
|
{-# LANGUAGE TemplateHaskell #-}
|
||||||
|
module Main where
|
||||||
|
main = putStrLn \$([|"yes"|])
|
||||||
|
EOF
|
||||||
|
env -i $out/bin/ghc --make main.hs || exit 1
|
||||||
|
echo compilation ok
|
||||||
|
[ $(./main) == "yes" ]
|
||||||
|
'';
|
||||||
|
|
||||||
|
passthru = {
|
||||||
|
targetPrefix = "";
|
||||||
|
enableShared = true;
|
||||||
|
|
||||||
|
inherit llvmPackages;
|
||||||
|
|
||||||
|
# Our Cabal compiler name
|
||||||
|
haskellCompilerName = "ghc-${version}";
|
||||||
|
}
|
||||||
|
# We duplicate binDistUsed here since we have a sensible default even if no bindist is avaible,
|
||||||
|
# this makes sure that getting the `meta` attribute doesn't throw even on unsupported platforms.
|
||||||
|
// lib.optionalAttrs (ghcBinDists.${distSetName}.${stdenv.hostPlatform.system}.isHadrian or false) {
|
||||||
|
# Normal GHC derivations expose the hadrian derivation used to build them
|
||||||
|
# here. In the case of bindists we just make sure that the attribute exists,
|
||||||
|
# as it is used for checking if a GHC derivation has been built with hadrian.
|
||||||
|
# The isHadrian mechanism will become obsolete with GHCs that use hadrian
|
||||||
|
# exclusively, i.e. 9.6 (and 9.4?).
|
||||||
|
hadrian = null;
|
||||||
|
};
|
||||||
|
|
||||||
|
meta = rec {
|
||||||
|
homepage = "http://haskell.org/ghc";
|
||||||
|
description = "The Glasgow Haskell Compiler";
|
||||||
|
license = lib.licenses.bsd3;
|
||||||
|
# HACK: since we can't encode the libc / abi in platforms, we need
|
||||||
|
# to make the platform list dependent on the evaluation platform
|
||||||
|
# in order to avoid eval errors with musl which supports less
|
||||||
|
# platforms than the default libcs (i. e. glibc / libSystem).
|
||||||
|
# This is done for the benefit of Hydra, so `packagePlatforms`
|
||||||
|
# won't return any platforms that would cause an evaluation
|
||||||
|
# failure for `pkgsMusl.haskell.compiler.ghc8107Binary`, as
|
||||||
|
# long as the evaluator runs on a platform that supports
|
||||||
|
# `pkgsMusl`.
|
||||||
|
platforms = builtins.attrNames ghcBinDists.${distSetName};
|
||||||
|
maintainers = with lib.maintainers; [ ];
|
||||||
|
};
|
||||||
|
}
|
411
pkgs/by-name/ha/haskell/ghc/8.10.7.nix
Normal file
411
pkgs/by-name/ha/haskell/ghc/8.10.7.nix
Normal file
|
@ -0,0 +1,411 @@
|
||||||
|
{ lib, stdenv, pkgsBuildTarget, pkgsHostTarget, targetPackages
|
||||||
|
|
||||||
|
# build-tools
|
||||||
|
, bootPkgs
|
||||||
|
, autoreconfHook, autoconf, automake, coreutils, fetchpatch, fetchurl, perl, python3, m4, sphinx
|
||||||
|
, xattr, autoSignDarwinBinariesHook
|
||||||
|
, bash
|
||||||
|
|
||||||
|
, libiconv ? null, ncurses
|
||||||
|
|
||||||
|
, # GHC can be built with system libffi or a bundled one.
|
||||||
|
libffi ? null
|
||||||
|
|
||||||
|
, useLLVM ? !(stdenv.targetPlatform.isx86
|
||||||
|
|| stdenv.targetPlatform.isPower
|
||||||
|
|| stdenv.targetPlatform.isSparc)
|
||||||
|
, # LLVM is conceptually a run-time-only dependency, but for
|
||||||
|
# non-x86, we need LLVM to bootstrap later stages, so it becomes a
|
||||||
|
# build-time dependency too.
|
||||||
|
buildTargetLlvmPackages, llvmPackages
|
||||||
|
|
||||||
|
, # If enabled, GHC will be built with the GPL-free but slower integer-simple
|
||||||
|
# library instead of the faster but GPLed integer-gmp library.
|
||||||
|
enableIntegerSimple ? !(lib.meta.availableOn stdenv.hostPlatform gmp
|
||||||
|
&& lib.meta.availableOn stdenv.targetPlatform gmp)
|
||||||
|
, gmp
|
||||||
|
|
||||||
|
, # If enabled, use -fPIC when compiling static libs.
|
||||||
|
enableRelocatedStaticLibs ? stdenv.targetPlatform != stdenv.hostPlatform
|
||||||
|
|
||||||
|
, enableProfiledLibs ? true
|
||||||
|
|
||||||
|
, # Whether to build dynamic libs for the standard library (on the target
|
||||||
|
# platform). Static libs are always built.
|
||||||
|
enableShared ? !stdenv.targetPlatform.isWindows && !stdenv.targetPlatform.useiOSPrebuilt
|
||||||
|
|
||||||
|
, # Whether to build terminfo.
|
||||||
|
enableTerminfo ? !stdenv.targetPlatform.isWindows
|
||||||
|
|
||||||
|
, # What flavour to build. An empty string indicates no
|
||||||
|
# specific flavour and falls back to ghc default values.
|
||||||
|
ghcFlavour ? lib.optionalString (stdenv.targetPlatform != stdenv.hostPlatform)
|
||||||
|
(if useLLVM then "perf-cross" else "perf-cross-ncg")
|
||||||
|
|
||||||
|
, # Whether to build sphinx documentation.
|
||||||
|
enableDocs ? (
|
||||||
|
# Docs disabled if we are building on musl because it's a large task to keep
|
||||||
|
# all `sphinx` dependencies building in this environment.
|
||||||
|
!stdenv.buildPlatform.isMusl
|
||||||
|
)
|
||||||
|
|
||||||
|
, enableHaddockProgram ?
|
||||||
|
# Disabled for cross; see note [HADDOCK_DOCS].
|
||||||
|
(stdenv.targetPlatform == stdenv.hostPlatform)
|
||||||
|
|
||||||
|
, # Whether to disable the large address space allocator
|
||||||
|
# necessary fix for iOS: https://www.reddit.com/r/haskell/comments/4ttdz1/building_an_osxi386_to_iosarm64_cross_compiler/d5qvd67/
|
||||||
|
disableLargeAddressSpace ? stdenv.targetPlatform.isiOS
|
||||||
|
}:
|
||||||
|
|
||||||
|
assert !enableIntegerSimple -> gmp != null;
|
||||||
|
|
||||||
|
# Cross cannot currently build the `haddock` program for silly reasons,
|
||||||
|
# see note [HADDOCK_DOCS].
|
||||||
|
assert (stdenv.targetPlatform != stdenv.hostPlatform) -> !enableHaddockProgram;
|
||||||
|
|
||||||
|
let
|
||||||
|
inherit (stdenv) buildPlatform hostPlatform targetPlatform;
|
||||||
|
|
||||||
|
inherit (bootPkgs) ghc;
|
||||||
|
|
||||||
|
# TODO(@Ericson2314) Make unconditional
|
||||||
|
targetPrefix = lib.optionalString
|
||||||
|
(targetPlatform != hostPlatform)
|
||||||
|
"${targetPlatform.config}-";
|
||||||
|
|
||||||
|
buildMK = ''
|
||||||
|
BuildFlavour = ${ghcFlavour}
|
||||||
|
ifneq \"\$(BuildFlavour)\" \"\"
|
||||||
|
include mk/flavours/\$(BuildFlavour).mk
|
||||||
|
endif
|
||||||
|
BUILD_SPHINX_HTML = ${if enableDocs then "YES" else "NO"}
|
||||||
|
BUILD_SPHINX_PDF = NO
|
||||||
|
'' +
|
||||||
|
# Note [HADDOCK_DOCS]:
|
||||||
|
# Unfortunately currently `HADDOCK_DOCS` controls both whether the `haddock`
|
||||||
|
# program is built (which we generally always want to have a complete GHC install)
|
||||||
|
# and whether it is run on the GHC sources to generate hyperlinked source code
|
||||||
|
# (which is impossible for cross-compilation); see:
|
||||||
|
# https://gitlab.haskell.org/ghc/ghc/-/issues/20077
|
||||||
|
# This implies that currently a cross-compiled GHC will never have a `haddock`
|
||||||
|
# program, so it can never generate haddocks for any packages.
|
||||||
|
# If this is solved in the future, we'd like to unconditionally
|
||||||
|
# build the haddock program (removing the `enableHaddockProgram` option).
|
||||||
|
''
|
||||||
|
HADDOCK_DOCS = ${if enableHaddockProgram then "YES" else "NO"}
|
||||||
|
# Build haddocks for boot packages with hyperlinking
|
||||||
|
EXTRA_HADDOCK_OPTS += --hyperlinked-source --quickjump
|
||||||
|
|
||||||
|
DYNAMIC_GHC_PROGRAMS = ${if enableShared then "YES" else "NO"}
|
||||||
|
INTEGER_LIBRARY = ${if enableIntegerSimple then "integer-simple" else "integer-gmp"}
|
||||||
|
'' + lib.optionalString (targetPlatform != hostPlatform) ''
|
||||||
|
Stage1Only = ${if targetPlatform.system == hostPlatform.system then "NO" else "YES"}
|
||||||
|
CrossCompilePrefix = ${targetPrefix}
|
||||||
|
'' + lib.optionalString (!enableProfiledLibs) ''
|
||||||
|
BUILD_PROF_LIBS = NO
|
||||||
|
'' + lib.optionalString enableRelocatedStaticLibs ''
|
||||||
|
GhcLibHcOpts += -fPIC
|
||||||
|
GhcRtsHcOpts += -fPIC
|
||||||
|
'' + lib.optionalString targetPlatform.useAndroidPrebuilt ''
|
||||||
|
EXTRA_CC_OPTS += -std=gnu99
|
||||||
|
''
|
||||||
|
# While split sections are now enabled by default in ghc 8.8 for windows,
|
||||||
|
# they seem to lead to `too many sections` errors when building base for
|
||||||
|
# profiling.
|
||||||
|
+ lib.optionalString targetPlatform.isWindows ''
|
||||||
|
SplitSections = NO
|
||||||
|
'';
|
||||||
|
|
||||||
|
# Splicer will pull out correct variations
|
||||||
|
libDeps = platform: lib.optional enableTerminfo ncurses
|
||||||
|
++ [libffi]
|
||||||
|
++ lib.optional (!enableIntegerSimple) gmp
|
||||||
|
++ lib.optional (platform.libc != "glibc" && !targetPlatform.isWindows) libiconv;
|
||||||
|
|
||||||
|
# TODO(@sternenseemann): is buildTarget LLVM unnecessary?
|
||||||
|
# GHC doesn't seem to have {LLC,OPT}_HOST
|
||||||
|
toolsForTarget = [
|
||||||
|
pkgsBuildTarget.targetPackages.stdenv.cc
|
||||||
|
] ++ lib.optional useLLVM buildTargetLlvmPackages.llvm;
|
||||||
|
|
||||||
|
targetCC = builtins.head toolsForTarget;
|
||||||
|
|
||||||
|
# Sometimes we have to dispatch between the bintools wrapper and the unwrapped
|
||||||
|
# derivation for certain tools depending on the platform.
|
||||||
|
bintoolsFor = {
|
||||||
|
# GHC needs install_name_tool on all darwin platforms. On aarch64-darwin it is
|
||||||
|
# part of the bintools wrapper (due to codesigning requirements), but not on
|
||||||
|
# x86_64-darwin.
|
||||||
|
install_name_tool =
|
||||||
|
if stdenv.targetPlatform.isAarch64
|
||||||
|
then targetCC.bintools
|
||||||
|
else targetCC.bintools.bintools;
|
||||||
|
# Same goes for strip.
|
||||||
|
strip =
|
||||||
|
# TODO(@sternenseemann): also use wrapper if linker == "bfd" or "gold"
|
||||||
|
if stdenv.targetPlatform.isAarch64 && stdenv.targetPlatform.isDarwin
|
||||||
|
then targetCC.bintools
|
||||||
|
else targetCC.bintools.bintools;
|
||||||
|
};
|
||||||
|
|
||||||
|
# Use gold either following the default, or to avoid the BFD linker due to some bugs / perf issues.
|
||||||
|
# But we cannot avoid BFD when using musl libc due to https://sourceware.org/bugzilla/show_bug.cgi?id=23856
|
||||||
|
# see #84670 and #49071 for more background.
|
||||||
|
useLdGold = targetPlatform.linker == "gold" ||
|
||||||
|
(targetPlatform.linker == "bfd" && (targetCC.bintools.bintools.hasGold or false) && !targetPlatform.isMusl);
|
||||||
|
|
||||||
|
# Makes debugging easier to see which variant is at play in `nix-store -q --tree`.
|
||||||
|
variantSuffix = lib.concatStrings [
|
||||||
|
(lib.optionalString stdenv.hostPlatform.isMusl "-musl")
|
||||||
|
(lib.optionalString enableIntegerSimple "-integer-simple")
|
||||||
|
];
|
||||||
|
|
||||||
|
in
|
||||||
|
|
||||||
|
# C compiler, bintools and LLVM are used at build time, but will also leak into
|
||||||
|
# the resulting GHC's settings file and used at runtime. This means that we are
|
||||||
|
# currently only able to build GHC if hostPlatform == buildPlatform.
|
||||||
|
assert targetCC == pkgsHostTarget.targetPackages.stdenv.cc;
|
||||||
|
assert buildTargetLlvmPackages.llvm == llvmPackages.llvm;
|
||||||
|
assert stdenv.targetPlatform.isDarwin -> buildTargetLlvmPackages.clang == llvmPackages.clang;
|
||||||
|
|
||||||
|
stdenv.mkDerivation (rec {
|
||||||
|
version = "8.10.7";
|
||||||
|
pname = "${targetPrefix}ghc${variantSuffix}";
|
||||||
|
|
||||||
|
src = fetchurl {
|
||||||
|
url = "https://downloads.haskell.org/ghc/${version}/ghc-${version}-src.tar.xz";
|
||||||
|
sha256 = "e3eef6229ce9908dfe1ea41436befb0455fefb1932559e860ad4c606b0d03c9d";
|
||||||
|
};
|
||||||
|
|
||||||
|
enableParallelBuilding = true;
|
||||||
|
|
||||||
|
outputs = [ "out" "doc" ];
|
||||||
|
|
||||||
|
patches = [
|
||||||
|
# Fix docs build with sphinx >= 6.0
|
||||||
|
# https://gitlab.haskell.org/ghc/ghc/-/issues/22766
|
||||||
|
(fetchpatch {
|
||||||
|
name = "ghc-docs-sphinx-6.0.patch";
|
||||||
|
url = "https://gitlab.haskell.org/ghc/ghc/-/commit/10e94a556b4f90769b7fd718b9790d58ae566600.patch";
|
||||||
|
sha256 = "0kmhfamr16w8gch0lgln2912r8aryjky1hfcda3jkcwa5cdzgjdv";
|
||||||
|
})
|
||||||
|
|
||||||
|
# See upstream patch at
|
||||||
|
# https://gitlab.haskell.org/ghc/ghc/-/merge_requests/4885. Since we build
|
||||||
|
# from source distributions, the auto-generated configure script needs to be
|
||||||
|
# patched as well, therefore we use an in-tree patch instead of pulling the
|
||||||
|
# upstream patch. Don't forget to check backport status of the upstream patch
|
||||||
|
# when adding new GHC releases in nixpkgs.
|
||||||
|
./respect-ar-path.patch
|
||||||
|
|
||||||
|
# fix hyperlinked haddock sources: https://github.com/haskell/haddock/pull/1482
|
||||||
|
(fetchpatch {
|
||||||
|
url = "https://patch-diff.githubusercontent.com/raw/haskell/haddock/pull/1482.patch";
|
||||||
|
sha256 = "sha256-8w8QUCsODaTvknCDGgTfFNZa8ZmvIKaKS+2ZJZ9foYk=";
|
||||||
|
extraPrefix = "utils/haddock/";
|
||||||
|
stripLen = 1;
|
||||||
|
})
|
||||||
|
|
||||||
|
# cabal passes incorrect --host= when cross-compiling
|
||||||
|
# https://github.com/haskell/cabal/issues/5887
|
||||||
|
(fetchpatch {
|
||||||
|
url = "https://raw.githubusercontent.com/input-output-hk/haskell.nix/122bd81150386867da07fdc9ad5096db6719545a/overlays/patches/ghc/cabal-host.patch";
|
||||||
|
sha256 = "sha256:0yd0sajgi24sc1w5m55lkg2lp6kfkgpp3lgija2c8y3cmkwfpdc1";
|
||||||
|
})
|
||||||
|
|
||||||
|
# In order to build ghcjs packages, the Cabal of the ghc used for the ghcjs
|
||||||
|
# needs to be patched. Ref https://github.com/haskell/cabal/pull/7575
|
||||||
|
(fetchpatch {
|
||||||
|
url = "https://github.com/haskell/cabal/commit/369c4a0a54ad08a9e6b0d3bd303fedd7b5e5a336.patch";
|
||||||
|
sha256 = "120f11hwyaqa0pq9g5l1300crqij49jg0rh83hnp9sa49zfdwx1n";
|
||||||
|
stripLen = 3;
|
||||||
|
extraPrefix = "libraries/Cabal/Cabal/";
|
||||||
|
})
|
||||||
|
|
||||||
|
# We need to be able to set AR_STAGE0 and LD_STAGE0 when cross-compiling
|
||||||
|
(fetchpatch {
|
||||||
|
url = "https://gitlab.haskell.org/ghc/ghc/-/commit/8f7dd5710b80906ea7a3e15b7bb56a883a49fed8.patch";
|
||||||
|
hash = "sha256-C636Nq2U8YOG/av7XQmG3L1rU0bmC9/7m7Hty5pm5+s=";
|
||||||
|
})
|
||||||
|
] ++ lib.optionals stdenv.isDarwin [
|
||||||
|
# Make Block.h compile with c++ compilers. Remove with the next release
|
||||||
|
(fetchpatch {
|
||||||
|
url = "https://gitlab.haskell.org/ghc/ghc/-/commit/97d0b0a367e4c6a52a17c3299439ac7de129da24.patch";
|
||||||
|
sha256 = "0r4zjj0bv1x1m2dgxp3adsf2xkr94fjnyj1igsivd9ilbs5ja0b5";
|
||||||
|
})
|
||||||
|
] ++ lib.optionals (stdenv.targetPlatform.isDarwin && stdenv.targetPlatform.isAarch64) [
|
||||||
|
# Prevent the paths module from emitting symbols that we don't use
|
||||||
|
# when building with separate outputs.
|
||||||
|
#
|
||||||
|
# These cause problems as they're not eliminated by GHC's dead code
|
||||||
|
# elimination on aarch64-darwin. (see
|
||||||
|
# https://github.com/NixOS/nixpkgs/issues/140774 for details).
|
||||||
|
./Cabal-3.2-3.4-paths-fix-cycle-aarch64-darwin.patch
|
||||||
|
];
|
||||||
|
|
||||||
|
postPatch = "patchShebangs .";
|
||||||
|
|
||||||
|
# GHC is a bit confused on its cross terminology.
|
||||||
|
# TODO(@sternenseemann): investigate coreutils dependencies and pass absolute paths
|
||||||
|
preConfigure = ''
|
||||||
|
for env in $(env | grep '^TARGET_' | sed -E 's|\+?=.*||'); do
|
||||||
|
export "''${env#TARGET_}=''${!env}"
|
||||||
|
done
|
||||||
|
# GHC is a bit confused on its cross terminology, as these would normally be
|
||||||
|
# the *host* tools.
|
||||||
|
export CC="${targetCC}/bin/${targetCC.targetPrefix}cc"
|
||||||
|
export CXX="${targetCC}/bin/${targetCC.targetPrefix}c++"
|
||||||
|
# Use gold to work around https://sourceware.org/bugzilla/show_bug.cgi?id=16177
|
||||||
|
export LD="${targetCC.bintools}/bin/${targetCC.bintools.targetPrefix}ld${lib.optionalString useLdGold ".gold"}"
|
||||||
|
export AS="${targetCC.bintools.bintools}/bin/${targetCC.bintools.targetPrefix}as"
|
||||||
|
export AR="${targetCC.bintools.bintools}/bin/${targetCC.bintools.targetPrefix}ar"
|
||||||
|
export NM="${targetCC.bintools.bintools}/bin/${targetCC.bintools.targetPrefix}nm"
|
||||||
|
export RANLIB="${targetCC.bintools.bintools}/bin/${targetCC.bintools.targetPrefix}ranlib"
|
||||||
|
export READELF="${targetCC.bintools.bintools}/bin/${targetCC.bintools.targetPrefix}readelf"
|
||||||
|
export STRIP="${bintoolsFor.strip}/bin/${bintoolsFor.strip.targetPrefix}strip"
|
||||||
|
'' + lib.optionalString (stdenv.targetPlatform.linker == "cctools") ''
|
||||||
|
export OTOOL="${targetCC.bintools.bintools}/bin/${targetCC.bintools.targetPrefix}otool"
|
||||||
|
export INSTALL_NAME_TOOL="${bintoolsFor.install_name_tool}/bin/${bintoolsFor.install_name_tool.targetPrefix}install_name_tool"
|
||||||
|
'' + lib.optionalString useLLVM ''
|
||||||
|
export LLC="${lib.getBin buildTargetLlvmPackages.llvm}/bin/llc"
|
||||||
|
export OPT="${lib.getBin buildTargetLlvmPackages.llvm}/bin/opt"
|
||||||
|
'' + lib.optionalString (useLLVM && stdenv.targetPlatform.isDarwin) ''
|
||||||
|
# LLVM backend on Darwin needs clang: https://downloads.haskell.org/~ghc/latest/docs/html/users_guide/codegens.html#llvm-code-generator-fllvm
|
||||||
|
export CLANG="${buildTargetLlvmPackages.clang}/bin/${buildTargetLlvmPackages.clang.targetPrefix}clang"
|
||||||
|
'' + ''
|
||||||
|
|
||||||
|
echo -n "${buildMK}" > mk/build.mk
|
||||||
|
sed -i -e 's|-isysroot /Developer/SDKs/MacOSX10.5.sdk||' configure
|
||||||
|
'' + lib.optionalString (!stdenv.isDarwin) ''
|
||||||
|
export NIX_LDFLAGS+=" -rpath $out/lib/ghc-${version}"
|
||||||
|
'' + lib.optionalString stdenv.isDarwin ''
|
||||||
|
export NIX_LDFLAGS+=" -no_dtrace_dof"
|
||||||
|
|
||||||
|
# GHC tries the host xattr /usr/bin/xattr by default which fails since it expects python to be 2.7
|
||||||
|
export XATTR=${lib.getBin xattr}/bin/xattr
|
||||||
|
'' + lib.optionalString targetPlatform.useAndroidPrebuilt ''
|
||||||
|
sed -i -e '5i ,("armv7a-unknown-linux-androideabi", ("e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64", "cortex-a8", ""))' llvm-targets
|
||||||
|
'' + lib.optionalString targetPlatform.isMusl ''
|
||||||
|
echo "patching llvm-targets for musl targets..."
|
||||||
|
echo "Cloning these existing '*-linux-gnu*' targets:"
|
||||||
|
grep linux-gnu llvm-targets | sed 's/^/ /'
|
||||||
|
echo "(go go gadget sed)"
|
||||||
|
sed -i 's,\(^.*linux-\)gnu\(.*\)$,\0\n\1musl\2,' llvm-targets
|
||||||
|
echo "llvm-targets now contains these '*-linux-musl*' targets:"
|
||||||
|
grep linux-musl llvm-targets | sed 's/^/ /'
|
||||||
|
|
||||||
|
echo "And now patching to preserve '-musleabi' as done with '-gnueabi'"
|
||||||
|
# (aclocal.m4 is actual source, but patch configure as well since we don't re-gen)
|
||||||
|
for x in configure aclocal.m4; do
|
||||||
|
substituteInPlace $x \
|
||||||
|
--replace '*-android*|*-gnueabi*)' \
|
||||||
|
'*-android*|*-gnueabi*|*-musleabi*)'
|
||||||
|
done
|
||||||
|
'';
|
||||||
|
|
||||||
|
# TODO(@Ericson2314): Always pass "--target" and always prefix.
|
||||||
|
configurePlatforms = [ "build" "host" ]
|
||||||
|
++ lib.optional (targetPlatform != hostPlatform) "target";
|
||||||
|
|
||||||
|
# `--with` flags for libraries needed for RTS linker
|
||||||
|
configureFlags = [
|
||||||
|
"--datadir=$doc/share/doc/ghc"
|
||||||
|
"--with-curses-includes=${ncurses.dev}/include" "--with-curses-libraries=${ncurses.out}/lib"
|
||||||
|
] ++ lib.optionals (libffi != null) [
|
||||||
|
"--with-system-libffi"
|
||||||
|
"--with-ffi-includes=${targetPackages.libffi.dev}/include"
|
||||||
|
"--with-ffi-libraries=${targetPackages.libffi.out}/lib"
|
||||||
|
] ++ lib.optionals (targetPlatform == hostPlatform && !enableIntegerSimple) [
|
||||||
|
"--with-gmp-includes=${targetPackages.gmp.dev}/include"
|
||||||
|
"--with-gmp-libraries=${targetPackages.gmp.out}/lib"
|
||||||
|
] ++ lib.optionals (targetPlatform == hostPlatform && hostPlatform.libc != "glibc" && !targetPlatform.isWindows) [
|
||||||
|
"--with-iconv-includes=${libiconv}/include"
|
||||||
|
"--with-iconv-libraries=${libiconv}/lib"
|
||||||
|
] ++ lib.optionals (targetPlatform != hostPlatform) [
|
||||||
|
"--enable-bootstrap-with-devel-snapshot"
|
||||||
|
] ++ lib.optionals useLdGold [
|
||||||
|
"CFLAGS=-fuse-ld=gold"
|
||||||
|
"CONF_GCC_LINKER_OPTS_STAGE1=-fuse-ld=gold"
|
||||||
|
"CONF_GCC_LINKER_OPTS_STAGE2=-fuse-ld=gold"
|
||||||
|
] ++ lib.optionals (disableLargeAddressSpace) [
|
||||||
|
"--disable-large-address-space"
|
||||||
|
];
|
||||||
|
|
||||||
|
# Make sure we never relax`$PATH` and hooks support for compatibility.
|
||||||
|
strictDeps = true;
|
||||||
|
|
||||||
|
# Don’t add -liconv to LDFLAGS automatically so that GHC will add it itself.
|
||||||
|
dontAddExtraLibs = true;
|
||||||
|
|
||||||
|
nativeBuildInputs = [
|
||||||
|
perl autoreconfHook autoconf automake m4 python3
|
||||||
|
ghc bootPkgs.alex bootPkgs.happy bootPkgs.hscolour
|
||||||
|
] ++ lib.optionals (stdenv.isDarwin && stdenv.isAarch64) [
|
||||||
|
autoSignDarwinBinariesHook
|
||||||
|
] ++ lib.optionals enableDocs [
|
||||||
|
sphinx
|
||||||
|
];
|
||||||
|
|
||||||
|
# For building runtime libs
|
||||||
|
depsBuildTarget = toolsForTarget;
|
||||||
|
|
||||||
|
buildInputs = [ perl bash ] ++ (libDeps hostPlatform);
|
||||||
|
|
||||||
|
depsTargetTarget = map lib.getDev (libDeps targetPlatform);
|
||||||
|
depsTargetTargetPropagated = map (lib.getOutput "out") (libDeps targetPlatform);
|
||||||
|
|
||||||
|
# required, because otherwise all symbols from HSffi.o are stripped, and
|
||||||
|
# that in turn causes GHCi to abort
|
||||||
|
stripDebugFlags = [ "-S" ] ++ lib.optional (!targetPlatform.isDarwin) "--keep-file-symbols";
|
||||||
|
|
||||||
|
checkTarget = "test";
|
||||||
|
|
||||||
|
hardeningDisable =
|
||||||
|
[ "format" ]
|
||||||
|
# In nixpkgs, musl based builds currently enable `pie` hardening by default
|
||||||
|
# (see `defaultHardeningFlags` in `make-derivation.nix`).
|
||||||
|
# But GHC cannot currently produce outputs that are ready for `-pie` linking.
|
||||||
|
# Thus, disable `pie` hardening, otherwise `recompile with -fPIE` errors appear.
|
||||||
|
# See:
|
||||||
|
# * https://github.com/NixOS/nixpkgs/issues/129247
|
||||||
|
# * https://gitlab.haskell.org/ghc/ghc/-/issues/19580
|
||||||
|
++ lib.optional stdenv.targetPlatform.isMusl "pie";
|
||||||
|
|
||||||
|
# big-parallel allows us to build with more than 2 cores on
|
||||||
|
# Hydra which already warrants a significant speedup
|
||||||
|
requiredSystemFeatures = [ "big-parallel" ];
|
||||||
|
|
||||||
|
postInstall = ''
|
||||||
|
# Install the bash completion file.
|
||||||
|
install -D -m 444 utils/completion/ghc.bash $out/share/bash-completion/completions/${targetPrefix}ghc
|
||||||
|
'';
|
||||||
|
|
||||||
|
passthru = {
|
||||||
|
inherit bootPkgs targetPrefix;
|
||||||
|
|
||||||
|
inherit llvmPackages;
|
||||||
|
inherit enableShared;
|
||||||
|
|
||||||
|
# This is used by the haskell builder to query
|
||||||
|
# the presence of the haddock program.
|
||||||
|
hasHaddock = enableHaddockProgram;
|
||||||
|
|
||||||
|
# Our Cabal compiler name
|
||||||
|
haskellCompilerName = "ghc-${version}";
|
||||||
|
};
|
||||||
|
|
||||||
|
meta = {
|
||||||
|
homepage = "http://haskell.org/ghc";
|
||||||
|
description = "The Glasgow Haskell Compiler";
|
||||||
|
maintainers = with lib.maintainers; [ ];
|
||||||
|
timeout = 24 * 3600;
|
||||||
|
inherit (ghc.meta) license platforms;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // lib.optionalAttrs targetPlatform.useAndroidPrebuilt {
|
||||||
|
dontStrip = true;
|
||||||
|
dontPatchELF = true;
|
||||||
|
noAuditTmpdir = true;
|
||||||
|
})
|
229
pkgs/by-name/ha/haskell/ghc/8.6.5-binary.nix
Normal file
229
pkgs/by-name/ha/haskell/ghc/8.6.5-binary.nix
Normal file
|
@ -0,0 +1,229 @@
|
||||||
|
{ lib, stdenv
|
||||||
|
, fetchurl, perl, gcc
|
||||||
|
, ncurses5, ncurses6, gmp, glibc, libiconv
|
||||||
|
, llvmPackages
|
||||||
|
, coreutils
|
||||||
|
, targetPackages
|
||||||
|
}:
|
||||||
|
|
||||||
|
# Prebuilt only does native
|
||||||
|
assert stdenv.targetPlatform == stdenv.hostPlatform;
|
||||||
|
|
||||||
|
let
|
||||||
|
useLLVM = !(stdenv.targetPlatform.isx86
|
||||||
|
|| stdenv.targetPlatform.isPower
|
||||||
|
|| stdenv.targetPlatform.isSparc);
|
||||||
|
|
||||||
|
useNcurses6 = stdenv.hostPlatform.system == "x86_64-linux"
|
||||||
|
|| (with stdenv.hostPlatform; isPower64 && isLittleEndian);
|
||||||
|
|
||||||
|
ourNcurses = if useNcurses6 then ncurses6 else ncurses5;
|
||||||
|
|
||||||
|
libPath = lib.makeLibraryPath ([
|
||||||
|
ourNcurses gmp
|
||||||
|
] ++ lib.optional (stdenv.hostPlatform.isDarwin) libiconv);
|
||||||
|
|
||||||
|
libEnvVar = lib.optionalString stdenv.hostPlatform.isDarwin "DY"
|
||||||
|
+ "LD_LIBRARY_PATH";
|
||||||
|
|
||||||
|
glibcDynLinker = assert stdenv.isLinux;
|
||||||
|
if stdenv.hostPlatform.libc == "glibc" then
|
||||||
|
# Could be stdenv.cc.bintools.dynamicLinker, keeping as-is to avoid rebuild.
|
||||||
|
''"$(cat $NIX_CC/nix-support/dynamic-linker)"''
|
||||||
|
else
|
||||||
|
"${lib.getLib glibc}/lib/ld-linux*";
|
||||||
|
|
||||||
|
downloadsUrl = "https://downloads.haskell.org/ghc";
|
||||||
|
|
||||||
|
runtimeDeps = [
|
||||||
|
targetPackages.stdenv.cc
|
||||||
|
targetPackages.stdenv.cc.bintools
|
||||||
|
coreutils # for cat
|
||||||
|
]
|
||||||
|
++ lib.optionals (assert useLLVM -> !(llvmPackages == null); useLLVM) [
|
||||||
|
(lib.getBin llvmPackages.llvm)
|
||||||
|
]
|
||||||
|
# On darwin, we need unwrapped bintools as well (for otool)
|
||||||
|
++ lib.optionals (stdenv.targetPlatform.linker == "cctools") [
|
||||||
|
targetPackages.stdenv.cc.bintools.bintools
|
||||||
|
];
|
||||||
|
|
||||||
|
in
|
||||||
|
|
||||||
|
stdenv.mkDerivation rec {
|
||||||
|
version = "8.6.5";
|
||||||
|
pname = "ghc-binary";
|
||||||
|
|
||||||
|
# https://downloads.haskell.org/~ghc/8.6.5/
|
||||||
|
src = fetchurl ({
|
||||||
|
i686-linux = {
|
||||||
|
# Don't use the Fedora27 build (as below) because there isn't one!
|
||||||
|
url = "${downloadsUrl}/${version}/ghc-${version}-i386-deb9-linux.tar.xz";
|
||||||
|
sha256 = "1p2h29qghql19ajk755xa0yxkn85slbds8m9n5196ris743vkp8w";
|
||||||
|
};
|
||||||
|
x86_64-linux = {
|
||||||
|
# This is the Fedora build because it links against ncurses6 where the
|
||||||
|
# deb9 one links against ncurses5, see here
|
||||||
|
# https://github.com/NixOS/nixpkgs/issues/85924 for a discussion
|
||||||
|
url = "${downloadsUrl}/${version}/ghc-${version}-x86_64-fedora27-linux.tar.xz";
|
||||||
|
sha256 = "18dlqm5d028fqh6ghzn7pgjspr5smw030jjzl3kq6q1kmwzbay6g";
|
||||||
|
};
|
||||||
|
x86_64-darwin = {
|
||||||
|
url = "${downloadsUrl}/${version}/ghc-${version}-x86_64-apple-darwin.tar.xz";
|
||||||
|
sha256 = "0s9188vhhgf23q3rjarwhbr524z6h2qga5xaaa2pma03sfqvvhfz";
|
||||||
|
};
|
||||||
|
powerpc64le-linux = {
|
||||||
|
url = "https://downloads.haskell.org/~ghc/${version}/ghc-${version}-powerpc64le-fedora29-linux.tar.xz";
|
||||||
|
sha256 = "sha256-tWSsJdPVrCiqDyIKzpBt5DaXb3b6j951tCya584kWs4=";
|
||||||
|
};
|
||||||
|
}.${stdenv.hostPlatform.system}
|
||||||
|
or (throw "cannot bootstrap GHC on this platform"));
|
||||||
|
|
||||||
|
nativeBuildInputs = [ perl ];
|
||||||
|
|
||||||
|
# Cannot patchelf beforehand due to relative RPATHs that anticipate
|
||||||
|
# the final install location/
|
||||||
|
${libEnvVar} = libPath;
|
||||||
|
|
||||||
|
postUnpack =
|
||||||
|
# GHC has dtrace probes, which causes ld to try to open /usr/lib/libdtrace.dylib
|
||||||
|
# during linking
|
||||||
|
lib.optionalString stdenv.isDarwin ''
|
||||||
|
export NIX_LDFLAGS+=" -no_dtrace_dof"
|
||||||
|
# not enough room in the object files for the full path to libiconv :(
|
||||||
|
for exe in $(find . -type f -executable); do
|
||||||
|
isScript $exe && continue
|
||||||
|
ln -fs ${libiconv}/lib/libiconv.dylib $(dirname $exe)/libiconv.dylib
|
||||||
|
install_name_tool -change /usr/lib/libiconv.2.dylib @executable_path/libiconv.dylib -change /usr/local/lib/gcc/6/libgcc_s.1.dylib ${gcc.cc.lib}/lib/libgcc_s.1.dylib $exe
|
||||||
|
done
|
||||||
|
'' +
|
||||||
|
|
||||||
|
# Some scripts used during the build need to have their shebangs patched
|
||||||
|
''
|
||||||
|
patchShebangs ghc-${version}/utils/
|
||||||
|
patchShebangs ghc-${version}/configure
|
||||||
|
test -d ghc-${version}/inplace/bin && \
|
||||||
|
patchShebangs ghc-${version}/inplace/bin
|
||||||
|
'' +
|
||||||
|
|
||||||
|
# We have to patch the GMP paths for the integer-gmp package.
|
||||||
|
''
|
||||||
|
find . -name integer-gmp.buildinfo \
|
||||||
|
-exec sed -i "s@extra-lib-dirs: @extra-lib-dirs: ${gmp.out}/lib@" {} \;
|
||||||
|
'' + lib.optionalString stdenv.isDarwin ''
|
||||||
|
find . -name base.buildinfo \
|
||||||
|
-exec sed -i "s@extra-lib-dirs: @extra-lib-dirs: ${libiconv}/lib@" {} \;
|
||||||
|
'' +
|
||||||
|
# Rename needed libraries and binaries, fix interpreter
|
||||||
|
lib.optionalString stdenv.isLinux ''
|
||||||
|
find . -type f -perm -0100 \
|
||||||
|
-exec patchelf \
|
||||||
|
--replace-needed libncurses${lib.optionalString stdenv.is64bit "w"}.so.5 libncurses.so \
|
||||||
|
${ # This isn't required for x86_64-linux where we use ncurses6
|
||||||
|
lib.optionalString (!useNcurses6) "--replace-needed libtinfo.so libtinfo.so.5"
|
||||||
|
} \
|
||||||
|
--interpreter ${glibcDynLinker} {} \;
|
||||||
|
|
||||||
|
sed -i "s|/usr/bin/perl|perl\x00 |" ghc-${version}/ghc/stage2/build/tmp/ghc-stage2
|
||||||
|
sed -i "s|/usr/bin/gcc|gcc\x00 |" ghc-${version}/ghc/stage2/build/tmp/ghc-stage2
|
||||||
|
'' +
|
||||||
|
# We're kludging a glibc bindist into working with non-glibc...
|
||||||
|
# Here we patch up the use of `__strdup` (part of glibc binary ABI)
|
||||||
|
# to instead use `strdup` since musl doesn't provide __strdup
|
||||||
|
# (`__strdup` is defined to be an alias of `strdup` anyway[1]).
|
||||||
|
# [1] http://refspecs.linuxbase.org/LSB_4.0.0/LSB-Core-generic/LSB-Core-generic/baselib---strdup-1.html
|
||||||
|
# Use objcopy magic to make the change:
|
||||||
|
lib.optionalString stdenv.hostPlatform.isMusl ''
|
||||||
|
find ./ghc-${version}/rts -name "libHSrts*.a" -exec ''${OBJCOPY:-objcopy} --redefine-sym __strdup=strdup {} \;
|
||||||
|
'';
|
||||||
|
|
||||||
|
configurePlatforms = [ ];
|
||||||
|
configureFlags = [
|
||||||
|
"--with-gmp-includes=${lib.getDev gmp}/include"
|
||||||
|
# Note `--with-gmp-libraries` does nothing for GHC bindists:
|
||||||
|
# https://gitlab.haskell.org/ghc/ghc/-/merge_requests/6124
|
||||||
|
] ++ lib.optional stdenv.isDarwin "--with-gcc=${./gcc-clang-wrapper.sh}"
|
||||||
|
++ lib.optional stdenv.hostPlatform.isMusl "--disable-ld-override";
|
||||||
|
|
||||||
|
# No building is necessary, but calling make without flags ironically
|
||||||
|
# calls install-strip ...
|
||||||
|
dontBuild = true;
|
||||||
|
|
||||||
|
# Patch scripts to include runtime dependencies in $PATH.
|
||||||
|
postInstall = ''
|
||||||
|
for i in "$out/bin/"*; do
|
||||||
|
test ! -h "$i" || continue
|
||||||
|
isScript "$i" || continue
|
||||||
|
sed -i -e '2i export PATH="${lib.makeBinPath runtimeDeps}:$PATH"' "$i"
|
||||||
|
done
|
||||||
|
'';
|
||||||
|
|
||||||
|
# On Linux, use patchelf to modify the executables so that they can
|
||||||
|
# find editline/gmp.
|
||||||
|
postFixup = lib.optionalString stdenv.isLinux ''
|
||||||
|
for p in $(find "$out" -type f -executable); do
|
||||||
|
if isELF "$p"; then
|
||||||
|
echo "Patchelfing $p"
|
||||||
|
patchelf --set-rpath "${libPath}:$(patchelf --print-rpath $p)" $p
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
'' + lib.optionalString stdenv.isDarwin ''
|
||||||
|
# not enough room in the object files for the full path to libiconv :(
|
||||||
|
for exe in $(find "$out" -type f -executable); do
|
||||||
|
isScript $exe && continue
|
||||||
|
ln -fs ${libiconv}/lib/libiconv.dylib $(dirname $exe)/libiconv.dylib
|
||||||
|
install_name_tool -change /usr/lib/libiconv.2.dylib @executable_path/libiconv.dylib -change /usr/local/lib/gcc/6/libgcc_s.1.dylib ${gcc.cc.lib}/lib/libgcc_s.1.dylib $exe
|
||||||
|
done
|
||||||
|
|
||||||
|
for file in $(find "$out" -name setup-config); do
|
||||||
|
substituteInPlace $file --replace /usr/bin/ranlib "$(type -P ranlib)"
|
||||||
|
done
|
||||||
|
'';
|
||||||
|
|
||||||
|
# In nixpkgs, musl based builds currently enable `pie` hardening by default
|
||||||
|
# (see `defaultHardeningFlags` in `make-derivation.nix`).
|
||||||
|
# But GHC cannot currently produce outputs that are ready for `-pie` linking.
|
||||||
|
# Thus, disable `pie` hardening, otherwise `recompile with -fPIE` errors appear.
|
||||||
|
# See:
|
||||||
|
# * https://github.com/NixOS/nixpkgs/issues/129247
|
||||||
|
# * https://gitlab.haskell.org/ghc/ghc/-/issues/19580
|
||||||
|
hardeningDisable = lib.optional stdenv.targetPlatform.isMusl "pie";
|
||||||
|
|
||||||
|
doInstallCheck = true;
|
||||||
|
installCheckPhase = ''
|
||||||
|
# Sanity check, can ghc create executables?
|
||||||
|
cd $TMP
|
||||||
|
mkdir test-ghc; cd test-ghc
|
||||||
|
cat > main.hs << EOF
|
||||||
|
{-# LANGUAGE TemplateHaskell #-}
|
||||||
|
module Main where
|
||||||
|
main = putStrLn \$([|"yes"|])
|
||||||
|
EOF
|
||||||
|
env -i $out/bin/ghc --make main.hs || exit 1
|
||||||
|
echo compilation ok
|
||||||
|
[ $(./main) == "yes" ]
|
||||||
|
'';
|
||||||
|
|
||||||
|
passthru = {
|
||||||
|
targetPrefix = "";
|
||||||
|
enableShared = true;
|
||||||
|
|
||||||
|
inherit llvmPackages;
|
||||||
|
|
||||||
|
# Our Cabal compiler name
|
||||||
|
haskellCompilerName = "ghc-${version}";
|
||||||
|
};
|
||||||
|
|
||||||
|
meta = rec {
|
||||||
|
license = lib.licenses.bsd3;
|
||||||
|
platforms = [
|
||||||
|
"x86_64-linux"
|
||||||
|
"i686-linux"
|
||||||
|
"x86_64-darwin"
|
||||||
|
"powerpc64le-linux"
|
||||||
|
];
|
||||||
|
# build segfaults, use ghc8107Binary which has proper musl support instead
|
||||||
|
broken = stdenv.hostPlatform.isMusl;
|
||||||
|
maintainers = with lib.maintainers; [ ];
|
||||||
|
};
|
||||||
|
}
|
391
pkgs/by-name/ha/haskell/ghc/9.0.2.nix
Normal file
391
pkgs/by-name/ha/haskell/ghc/9.0.2.nix
Normal file
|
@ -0,0 +1,391 @@
|
||||||
|
{ lib, stdenv, pkgsBuildTarget, pkgsHostTarget, targetPackages
|
||||||
|
|
||||||
|
# build-tools
|
||||||
|
, bootPkgs
|
||||||
|
, autoconf, automake, coreutils, fetchurl, perl, python3, m4, sphinx, xattr
|
||||||
|
, autoSignDarwinBinariesHook
|
||||||
|
, bash
|
||||||
|
, fetchpatch
|
||||||
|
|
||||||
|
, libiconv ? null, ncurses
|
||||||
|
, glibcLocales ? null
|
||||||
|
|
||||||
|
, # GHC can be built with system libffi or a bundled one.
|
||||||
|
libffi ? null
|
||||||
|
|
||||||
|
, useLLVM ? !(stdenv.targetPlatform.isx86
|
||||||
|
|| stdenv.targetPlatform.isPower
|
||||||
|
|| stdenv.targetPlatform.isSparc)
|
||||||
|
, # LLVM is conceptually a run-time-only dependency, but for
|
||||||
|
# non-x86, we need LLVM to bootstrap later stages, so it becomes a
|
||||||
|
# build-time dependency too.
|
||||||
|
buildTargetLlvmPackages, llvmPackages
|
||||||
|
|
||||||
|
, # If enabled, GHC will be built with the GPL-free but slightly slower native
|
||||||
|
# bignum backend instead of the faster but GPLed gmp backend.
|
||||||
|
enableNativeBignum ? !(lib.meta.availableOn stdenv.hostPlatform gmp
|
||||||
|
&& lib.meta.availableOn stdenv.targetPlatform gmp)
|
||||||
|
, gmp
|
||||||
|
|
||||||
|
, # If enabled, use -fPIC when compiling static libs.
|
||||||
|
enableRelocatedStaticLibs ? stdenv.targetPlatform != stdenv.hostPlatform
|
||||||
|
|
||||||
|
, enableProfiledLibs ? true
|
||||||
|
|
||||||
|
, # Whether to build dynamic libs for the standard library (on the target
|
||||||
|
# platform). Static libs are always built.
|
||||||
|
enableShared ? with stdenv.targetPlatform; !isWindows && !useiOSPrebuilt && !isStatic
|
||||||
|
|
||||||
|
, # Whether to build terminfo.
|
||||||
|
enableTerminfo ? !stdenv.targetPlatform.isWindows
|
||||||
|
|
||||||
|
, # What flavour to build. An empty string indicates no
|
||||||
|
# specific flavour and falls back to ghc default values.
|
||||||
|
ghcFlavour ? lib.optionalString (stdenv.targetPlatform != stdenv.hostPlatform)
|
||||||
|
(if useLLVM then "perf-cross" else "perf-cross-ncg")
|
||||||
|
|
||||||
|
, # Whether to build sphinx documentation.
|
||||||
|
enableDocs ? (
|
||||||
|
# Docs disabled if we are building on musl because it's a large task to keep
|
||||||
|
# all `sphinx` dependencies building in this environment.
|
||||||
|
!stdenv.buildPlatform.isMusl
|
||||||
|
)
|
||||||
|
|
||||||
|
, enableHaddockProgram ?
|
||||||
|
# Disabled for cross; see note [HADDOCK_DOCS].
|
||||||
|
(stdenv.targetPlatform == stdenv.hostPlatform)
|
||||||
|
|
||||||
|
, # Whether to disable the large address space allocator
|
||||||
|
# necessary fix for iOS: https://www.reddit.com/r/haskell/comments/4ttdz1/building_an_osxi386_to_iosarm64_cross_compiler/d5qvd67/
|
||||||
|
disableLargeAddressSpace ? stdenv.targetPlatform.isiOS
|
||||||
|
}:
|
||||||
|
|
||||||
|
assert !enableNativeBignum -> gmp != null;
|
||||||
|
|
||||||
|
# Cross cannot currently build the `haddock` program for silly reasons,
|
||||||
|
# see note [HADDOCK_DOCS].
|
||||||
|
assert (stdenv.targetPlatform != stdenv.hostPlatform) -> !enableHaddockProgram;
|
||||||
|
|
||||||
|
let
|
||||||
|
inherit (stdenv) buildPlatform hostPlatform targetPlatform;
|
||||||
|
|
||||||
|
inherit (bootPkgs) ghc;
|
||||||
|
|
||||||
|
# TODO(@Ericson2314) Make unconditional
|
||||||
|
targetPrefix = lib.optionalString
|
||||||
|
(targetPlatform != hostPlatform)
|
||||||
|
"${targetPlatform.config}-";
|
||||||
|
|
||||||
|
buildMK = ''
|
||||||
|
BuildFlavour = ${ghcFlavour}
|
||||||
|
ifneq \"\$(BuildFlavour)\" \"\"
|
||||||
|
include mk/flavours/\$(BuildFlavour).mk
|
||||||
|
endif
|
||||||
|
BUILD_SPHINX_HTML = ${if enableDocs then "YES" else "NO"}
|
||||||
|
BUILD_SPHINX_PDF = NO
|
||||||
|
'' +
|
||||||
|
# Note [HADDOCK_DOCS]:
|
||||||
|
# Unfortunately currently `HADDOCK_DOCS` controls both whether the `haddock`
|
||||||
|
# program is built (which we generally always want to have a complete GHC install)
|
||||||
|
# and whether it is run on the GHC sources to generate hyperlinked source code
|
||||||
|
# (which is impossible for cross-compilation); see:
|
||||||
|
# https://gitlab.haskell.org/ghc/ghc/-/issues/20077
|
||||||
|
# This implies that currently a cross-compiled GHC will never have a `haddock`
|
||||||
|
# program, so it can never generate haddocks for any packages.
|
||||||
|
# If this is solved in the future, we'd like to unconditionally
|
||||||
|
# build the haddock program (removing the `enableHaddockProgram` option).
|
||||||
|
''
|
||||||
|
HADDOCK_DOCS = ${if enableHaddockProgram then "YES" else "NO"}
|
||||||
|
# Build haddocks for boot packages with hyperlinking
|
||||||
|
EXTRA_HADDOCK_OPTS += --hyperlinked-source --quickjump
|
||||||
|
|
||||||
|
DYNAMIC_GHC_PROGRAMS = ${if enableShared then "YES" else "NO"}
|
||||||
|
BIGNUM_BACKEND = ${if enableNativeBignum then "native" else "gmp"}
|
||||||
|
'' + lib.optionalString (targetPlatform != hostPlatform) ''
|
||||||
|
Stage1Only = ${if targetPlatform.system == hostPlatform.system then "NO" else "YES"}
|
||||||
|
CrossCompilePrefix = ${targetPrefix}
|
||||||
|
'' + lib.optionalString (!enableProfiledLibs) ''
|
||||||
|
BUILD_PROF_LIBS = NO
|
||||||
|
'' +
|
||||||
|
# -fexternal-dynamic-refs apparently (because it's not clear from the documentation)
|
||||||
|
# makes the GHC RTS able to load static libraries, which may be needed for TemplateHaskell.
|
||||||
|
# This solution was described in https://www.tweag.io/blog/2020-09-30-bazel-static-haskell
|
||||||
|
lib.optionalString enableRelocatedStaticLibs ''
|
||||||
|
GhcLibHcOpts += -fPIC -fexternal-dynamic-refs
|
||||||
|
GhcRtsHcOpts += -fPIC -fexternal-dynamic-refs
|
||||||
|
'' + lib.optionalString targetPlatform.useAndroidPrebuilt ''
|
||||||
|
EXTRA_CC_OPTS += -std=gnu99
|
||||||
|
'';
|
||||||
|
|
||||||
|
# Splicer will pull out correct variations
|
||||||
|
libDeps = platform: lib.optional enableTerminfo ncurses
|
||||||
|
++ [libffi]
|
||||||
|
++ lib.optional (!enableNativeBignum) gmp
|
||||||
|
++ lib.optional (platform.libc != "glibc" && !targetPlatform.isWindows) libiconv;
|
||||||
|
|
||||||
|
# TODO(@sternenseemann): is buildTarget LLVM unnecessary?
|
||||||
|
# GHC doesn't seem to have {LLC,OPT}_HOST
|
||||||
|
toolsForTarget = [
|
||||||
|
pkgsBuildTarget.targetPackages.stdenv.cc
|
||||||
|
] ++ lib.optional useLLVM buildTargetLlvmPackages.llvm;
|
||||||
|
|
||||||
|
targetCC = builtins.head toolsForTarget;
|
||||||
|
|
||||||
|
# Sometimes we have to dispatch between the bintools wrapper and the unwrapped
|
||||||
|
# derivation for certain tools depending on the platform.
|
||||||
|
bintoolsFor = {
|
||||||
|
# GHC needs install_name_tool on all darwin platforms. On aarch64-darwin it is
|
||||||
|
# part of the bintools wrapper (due to codesigning requirements), but not on
|
||||||
|
# x86_64-darwin.
|
||||||
|
install_name_tool =
|
||||||
|
if stdenv.targetPlatform.isAarch64
|
||||||
|
then targetCC.bintools
|
||||||
|
else targetCC.bintools.bintools;
|
||||||
|
# Same goes for strip.
|
||||||
|
strip =
|
||||||
|
# TODO(@sternenseemann): also use wrapper if linker == "bfd" or "gold"
|
||||||
|
if stdenv.targetPlatform.isAarch64 && stdenv.targetPlatform.isDarwin
|
||||||
|
then targetCC.bintools
|
||||||
|
else targetCC.bintools.bintools;
|
||||||
|
};
|
||||||
|
|
||||||
|
# Use gold either following the default, or to avoid the BFD linker due to some bugs / perf issues.
|
||||||
|
# But we cannot avoid BFD when using musl libc due to https://sourceware.org/bugzilla/show_bug.cgi?id=23856
|
||||||
|
# see #84670 and #49071 for more background.
|
||||||
|
useLdGold = targetPlatform.linker == "gold" ||
|
||||||
|
(targetPlatform.linker == "bfd" && (targetCC.bintools.bintools.hasGold or false) && !targetPlatform.isMusl);
|
||||||
|
|
||||||
|
# Makes debugging easier to see which variant is at play in `nix-store -q --tree`.
|
||||||
|
variantSuffix = lib.concatStrings [
|
||||||
|
(lib.optionalString stdenv.hostPlatform.isMusl "-musl")
|
||||||
|
(lib.optionalString enableNativeBignum "-native-bignum")
|
||||||
|
];
|
||||||
|
|
||||||
|
in
|
||||||
|
|
||||||
|
# C compiler, bintools and LLVM are used at build time, but will also leak into
|
||||||
|
# the resulting GHC's settings file and used at runtime. This means that we are
|
||||||
|
# currently only able to build GHC if hostPlatform == buildPlatform.
|
||||||
|
assert targetCC == pkgsHostTarget.targetPackages.stdenv.cc;
|
||||||
|
assert buildTargetLlvmPackages.llvm == llvmPackages.llvm;
|
||||||
|
assert stdenv.targetPlatform.isDarwin -> buildTargetLlvmPackages.clang == llvmPackages.clang;
|
||||||
|
|
||||||
|
stdenv.mkDerivation (rec {
|
||||||
|
version = "9.0.2";
|
||||||
|
pname = "${targetPrefix}ghc${variantSuffix}";
|
||||||
|
|
||||||
|
src = fetchurl {
|
||||||
|
url = "https://downloads.haskell.org/ghc/${version}/ghc-${version}-src.tar.xz";
|
||||||
|
sha256 = "140e42b96346322d1a39eb17602bcdc76e292028ad4a69286b230bab188a9197";
|
||||||
|
};
|
||||||
|
|
||||||
|
enableParallelBuilding = true;
|
||||||
|
|
||||||
|
outputs = [ "out" "doc" ];
|
||||||
|
|
||||||
|
patches = [
|
||||||
|
# Fix docs build with sphinx >= 6.0
|
||||||
|
# https://gitlab.haskell.org/ghc/ghc/-/issues/22766
|
||||||
|
(fetchpatch {
|
||||||
|
name = "ghc-docs-sphinx-6.0.patch";
|
||||||
|
url = "https://gitlab.haskell.org/ghc/ghc/-/commit/10e94a556b4f90769b7fd718b9790d58ae566600.patch";
|
||||||
|
sha256 = "0kmhfamr16w8gch0lgln2912r8aryjky1hfcda3jkcwa5cdzgjdv";
|
||||||
|
})
|
||||||
|
# Fix docs build with Sphinx >= 7 https://gitlab.haskell.org/ghc/ghc/-/issues/24129
|
||||||
|
./docs-sphinx-7.patch
|
||||||
|
# fix hyperlinked haddock sources: https://github.com/haskell/haddock/pull/1482
|
||||||
|
(fetchpatch {
|
||||||
|
url = "https://patch-diff.githubusercontent.com/raw/haskell/haddock/pull/1482.patch";
|
||||||
|
sha256 = "sha256-8w8QUCsODaTvknCDGgTfFNZa8ZmvIKaKS+2ZJZ9foYk=";
|
||||||
|
extraPrefix = "utils/haddock/";
|
||||||
|
stripLen = 1;
|
||||||
|
})
|
||||||
|
|
||||||
|
# Add flag that fixes C++ exception handling; opt-in. Merged in 9.4 and 9.2.2.
|
||||||
|
# https://gitlab.haskell.org/ghc/ghc/-/merge_requests/7423
|
||||||
|
(fetchpatch {
|
||||||
|
name = "ghc-9.0.2-fcompact-unwind.patch";
|
||||||
|
# Note that the test suite is not packaged.
|
||||||
|
url = "https://gitlab.haskell.org/ghc/ghc/-/commit/c6132c782d974a7701e7f6447bdcd2bf6db4299a.patch?merge_request_iid=7423";
|
||||||
|
sha256 = "sha256-b4feGZIaKDj/UKjWTNY6/jH4s2iate0wAgMxG3rAbZI=";
|
||||||
|
})
|
||||||
|
] ++ lib.optionals (stdenv.targetPlatform.isDarwin && stdenv.targetPlatform.isAarch64) [
|
||||||
|
# Prevent the paths module from emitting symbols that we don't use
|
||||||
|
# when building with separate outputs.
|
||||||
|
#
|
||||||
|
# These cause problems as they're not eliminated by GHC's dead code
|
||||||
|
# elimination on aarch64-darwin. (see
|
||||||
|
# https://github.com/NixOS/nixpkgs/issues/140774 for details).
|
||||||
|
./Cabal-3.2-3.4-paths-fix-cycle-aarch64-darwin.patch
|
||||||
|
];
|
||||||
|
|
||||||
|
postPatch = "patchShebangs .";
|
||||||
|
|
||||||
|
# GHC needs the locale configured during the Haddock phase.
|
||||||
|
LANG = "en_US.UTF-8";
|
||||||
|
|
||||||
|
# GHC is a bit confused on its cross terminology.
|
||||||
|
# TODO(@sternenseemann): investigate coreutils dependencies and pass absolute paths
|
||||||
|
preConfigure = ''
|
||||||
|
for env in $(env | grep '^TARGET_' | sed -E 's|\+?=.*||'); do
|
||||||
|
export "''${env#TARGET_}=''${!env}"
|
||||||
|
done
|
||||||
|
# GHC is a bit confused on its cross terminology, as these would normally be
|
||||||
|
# the *host* tools.
|
||||||
|
export CC="${targetCC}/bin/${targetCC.targetPrefix}cc"
|
||||||
|
export CXX="${targetCC}/bin/${targetCC.targetPrefix}c++"
|
||||||
|
# Use gold to work around https://sourceware.org/bugzilla/show_bug.cgi?id=16177
|
||||||
|
export LD="${targetCC.bintools}/bin/${targetCC.bintools.targetPrefix}ld${lib.optionalString useLdGold ".gold"}"
|
||||||
|
export AS="${targetCC.bintools.bintools}/bin/${targetCC.bintools.targetPrefix}as"
|
||||||
|
export AR="${targetCC.bintools.bintools}/bin/${targetCC.bintools.targetPrefix}ar"
|
||||||
|
export NM="${targetCC.bintools.bintools}/bin/${targetCC.bintools.targetPrefix}nm"
|
||||||
|
export RANLIB="${targetCC.bintools.bintools}/bin/${targetCC.bintools.targetPrefix}ranlib"
|
||||||
|
export READELF="${targetCC.bintools.bintools}/bin/${targetCC.bintools.targetPrefix}readelf"
|
||||||
|
export STRIP="${bintoolsFor.strip}/bin/${bintoolsFor.strip.targetPrefix}strip"
|
||||||
|
'' + lib.optionalString (stdenv.targetPlatform.linker == "cctools") ''
|
||||||
|
export OTOOL="${targetCC.bintools.bintools}/bin/${targetCC.bintools.targetPrefix}otool"
|
||||||
|
export INSTALL_NAME_TOOL="${bintoolsFor.install_name_tool}/bin/${bintoolsFor.install_name_tool.targetPrefix}install_name_tool"
|
||||||
|
'' + lib.optionalString useLLVM ''
|
||||||
|
export LLC="${lib.getBin buildTargetLlvmPackages.llvm}/bin/llc"
|
||||||
|
export OPT="${lib.getBin buildTargetLlvmPackages.llvm}/bin/opt"
|
||||||
|
'' + lib.optionalString (useLLVM && stdenv.targetPlatform.isDarwin) ''
|
||||||
|
# LLVM backend on Darwin needs clang: https://downloads.haskell.org/~ghc/latest/docs/html/users_guide/codegens.html#llvm-code-generator-fllvm
|
||||||
|
export CLANG="${buildTargetLlvmPackages.clang}/bin/${buildTargetLlvmPackages.clang.targetPrefix}clang"
|
||||||
|
'' + ''
|
||||||
|
|
||||||
|
echo -n "${buildMK}" > mk/build.mk
|
||||||
|
sed -i -e 's|-isysroot /Developer/SDKs/MacOSX10.5.sdk||' configure
|
||||||
|
'' + lib.optionalString (stdenv.isLinux && hostPlatform.libc == "glibc") ''
|
||||||
|
export LOCALE_ARCHIVE="${glibcLocales}/lib/locale/locale-archive"
|
||||||
|
'' + lib.optionalString (!stdenv.isDarwin) ''
|
||||||
|
export NIX_LDFLAGS+=" -rpath $out/lib/ghc-${version}"
|
||||||
|
'' + lib.optionalString stdenv.isDarwin ''
|
||||||
|
export NIX_LDFLAGS+=" -no_dtrace_dof"
|
||||||
|
'' + lib.optionalString targetPlatform.useAndroidPrebuilt ''
|
||||||
|
sed -i -e '5i ,("armv7a-unknown-linux-androideabi", ("e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64", "cortex-a8", ""))' llvm-targets
|
||||||
|
'' + lib.optionalString targetPlatform.isMusl ''
|
||||||
|
echo "patching llvm-targets for musl targets..."
|
||||||
|
echo "Cloning these existing '*-linux-gnu*' targets:"
|
||||||
|
grep linux-gnu llvm-targets | sed 's/^/ /'
|
||||||
|
echo "(go go gadget sed)"
|
||||||
|
sed -i 's,\(^.*linux-\)gnu\(.*\)$,\0\n\1musl\2,' llvm-targets
|
||||||
|
echo "llvm-targets now contains these '*-linux-musl*' targets:"
|
||||||
|
grep linux-musl llvm-targets | sed 's/^/ /'
|
||||||
|
|
||||||
|
echo "And now patching to preserve '-musleabi' as done with '-gnueabi'"
|
||||||
|
# (aclocal.m4 is actual source, but patch configure as well since we don't re-gen)
|
||||||
|
for x in configure aclocal.m4; do
|
||||||
|
substituteInPlace $x \
|
||||||
|
--replace '*-android*|*-gnueabi*)' \
|
||||||
|
'*-android*|*-gnueabi*|*-musleabi*)'
|
||||||
|
done
|
||||||
|
'';
|
||||||
|
|
||||||
|
# TODO(@Ericson2314): Always pass "--target" and always prefix.
|
||||||
|
configurePlatforms = [ "build" "host" ]
|
||||||
|
++ lib.optional (targetPlatform != hostPlatform) "target";
|
||||||
|
|
||||||
|
# `--with` flags for libraries needed for RTS linker
|
||||||
|
configureFlags = [
|
||||||
|
"--datadir=$doc/share/doc/ghc"
|
||||||
|
"--with-curses-includes=${ncurses.dev}/include" "--with-curses-libraries=${ncurses.out}/lib"
|
||||||
|
] ++ lib.optionals (libffi != null) [
|
||||||
|
"--with-system-libffi"
|
||||||
|
"--with-ffi-includes=${targetPackages.libffi.dev}/include"
|
||||||
|
"--with-ffi-libraries=${targetPackages.libffi.out}/lib"
|
||||||
|
] ++ lib.optionals (targetPlatform == hostPlatform && !enableNativeBignum) [
|
||||||
|
"--with-gmp-includes=${targetPackages.gmp.dev}/include"
|
||||||
|
"--with-gmp-libraries=${targetPackages.gmp.out}/lib"
|
||||||
|
] ++ lib.optionals (targetPlatform == hostPlatform && hostPlatform.libc != "glibc" && !targetPlatform.isWindows) [
|
||||||
|
"--with-iconv-includes=${libiconv}/include"
|
||||||
|
"--with-iconv-libraries=${libiconv}/lib"
|
||||||
|
] ++ lib.optionals (targetPlatform != hostPlatform) [
|
||||||
|
"--enable-bootstrap-with-devel-snapshot"
|
||||||
|
] ++ lib.optionals useLdGold [
|
||||||
|
"CFLAGS=-fuse-ld=gold"
|
||||||
|
"CONF_GCC_LINKER_OPTS_STAGE1=-fuse-ld=gold"
|
||||||
|
"CONF_GCC_LINKER_OPTS_STAGE2=-fuse-ld=gold"
|
||||||
|
] ++ lib.optionals (disableLargeAddressSpace) [
|
||||||
|
"--disable-large-address-space"
|
||||||
|
];
|
||||||
|
|
||||||
|
# Make sure we never relax`$PATH` and hooks support for compatibility.
|
||||||
|
strictDeps = true;
|
||||||
|
|
||||||
|
# Don’t add -liconv to LDFLAGS automatically so that GHC will add it itself.
|
||||||
|
dontAddExtraLibs = true;
|
||||||
|
|
||||||
|
nativeBuildInputs = [
|
||||||
|
perl autoconf automake m4 python3
|
||||||
|
ghc bootPkgs.alex bootPkgs.happy bootPkgs.hscolour
|
||||||
|
] ++ lib.optionals (stdenv.isDarwin && stdenv.isAarch64) [
|
||||||
|
autoSignDarwinBinariesHook
|
||||||
|
] ++ lib.optionals enableDocs [
|
||||||
|
sphinx
|
||||||
|
] ++ lib.optionals stdenv.isDarwin [
|
||||||
|
# TODO(@sternenseemann): backport addition of XATTR env var like
|
||||||
|
# https://gitlab.haskell.org/ghc/ghc/-/merge_requests/6447
|
||||||
|
xattr
|
||||||
|
];
|
||||||
|
|
||||||
|
# For building runtime libs
|
||||||
|
depsBuildTarget = toolsForTarget;
|
||||||
|
|
||||||
|
buildInputs = [ perl bash ] ++ (libDeps hostPlatform);
|
||||||
|
|
||||||
|
depsTargetTarget = map lib.getDev (libDeps targetPlatform);
|
||||||
|
depsTargetTargetPropagated = map (lib.getOutput "out") (libDeps targetPlatform);
|
||||||
|
|
||||||
|
# required, because otherwise all symbols from HSffi.o are stripped, and
|
||||||
|
# that in turn causes GHCi to abort
|
||||||
|
stripDebugFlags = [ "-S" ] ++ lib.optional (!targetPlatform.isDarwin) "--keep-file-symbols";
|
||||||
|
|
||||||
|
checkTarget = "test";
|
||||||
|
|
||||||
|
hardeningDisable =
|
||||||
|
[ "format" ]
|
||||||
|
# In nixpkgs, musl based builds currently enable `pie` hardening by default
|
||||||
|
# (see `defaultHardeningFlags` in `make-derivation.nix`).
|
||||||
|
# But GHC cannot currently produce outputs that are ready for `-pie` linking.
|
||||||
|
# Thus, disable `pie` hardening, otherwise `recompile with -fPIE` errors appear.
|
||||||
|
# See:
|
||||||
|
# * https://github.com/NixOS/nixpkgs/issues/129247
|
||||||
|
# * https://gitlab.haskell.org/ghc/ghc/-/issues/19580
|
||||||
|
++ lib.optional stdenv.targetPlatform.isMusl "pie";
|
||||||
|
|
||||||
|
# big-parallel allows us to build with more than 2 cores on
|
||||||
|
# Hydra which already warrants a significant speedup
|
||||||
|
requiredSystemFeatures = [ "big-parallel" ];
|
||||||
|
|
||||||
|
postInstall = ''
|
||||||
|
# Install the bash completion file.
|
||||||
|
install -D -m 444 utils/completion/ghc.bash $out/share/bash-completion/completions/${targetPrefix}ghc
|
||||||
|
'';
|
||||||
|
|
||||||
|
passthru = {
|
||||||
|
inherit bootPkgs targetPrefix;
|
||||||
|
|
||||||
|
inherit llvmPackages;
|
||||||
|
inherit enableShared;
|
||||||
|
|
||||||
|
# This is used by the haskell builder to query
|
||||||
|
# the presence of the haddock program.
|
||||||
|
hasHaddock = enableHaddockProgram;
|
||||||
|
|
||||||
|
# Our Cabal compiler name
|
||||||
|
haskellCompilerName = "ghc-${version}";
|
||||||
|
};
|
||||||
|
|
||||||
|
meta = {
|
||||||
|
homepage = "http://haskell.org/ghc";
|
||||||
|
description = "The Glasgow Haskell Compiler";
|
||||||
|
maintainers = with lib.maintainers; [ ];
|
||||||
|
timeout = 24 * 3600;
|
||||||
|
inherit (ghc.meta) license platforms;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // lib.optionalAttrs targetPlatform.useAndroidPrebuilt {
|
||||||
|
dontStrip = true;
|
||||||
|
dontPatchELF = true;
|
||||||
|
noAuditTmpdir = true;
|
||||||
|
})
|
439
pkgs/by-name/ha/haskell/ghc/9.2.4-binary.nix
Normal file
439
pkgs/by-name/ha/haskell/ghc/9.2.4-binary.nix
Normal file
|
@ -0,0 +1,439 @@
|
||||||
|
{ lib, stdenv
|
||||||
|
, fetchurl, perl, gcc
|
||||||
|
, ncurses5
|
||||||
|
, ncurses6, gmp, libiconv, numactl, libffi
|
||||||
|
, llvmPackages
|
||||||
|
, coreutils
|
||||||
|
, targetPackages
|
||||||
|
|
||||||
|
# minimal = true; will remove files that aren't strictly necessary for
|
||||||
|
# regular builds and GHC bootstrapping.
|
||||||
|
# This is "useful" for staying within hydra's output limits for at least the
|
||||||
|
# aarch64-linux architecture.
|
||||||
|
, minimal ? false
|
||||||
|
}:
|
||||||
|
|
||||||
|
# Prebuilt only does native
|
||||||
|
assert stdenv.targetPlatform == stdenv.hostPlatform;
|
||||||
|
|
||||||
|
let
|
||||||
|
downloadsUrl = "https://downloads.haskell.org/ghc";
|
||||||
|
|
||||||
|
# Copy sha256 from https://downloads.haskell.org/~ghc/9.2.4/SHA256SUMS
|
||||||
|
version = "9.2.4";
|
||||||
|
|
||||||
|
# Information about available bindists that we use in the build.
|
||||||
|
#
|
||||||
|
# # Bindist library checking
|
||||||
|
#
|
||||||
|
# The field `archSpecificLibraries` also provides a way for us get notified
|
||||||
|
# early when the upstream bindist changes its dependencies (e.g. because a
|
||||||
|
# newer Debian version is used that uses a new `ncurses` version).
|
||||||
|
#
|
||||||
|
# Usage:
|
||||||
|
#
|
||||||
|
# * You can find the `fileToCheckFor` of libraries by running `readelf -d`
|
||||||
|
# on the compiler binary (`exePathForLibraryCheck`).
|
||||||
|
# * To skip library checking for an architecture,
|
||||||
|
# set `exePathForLibraryCheck = null`.
|
||||||
|
# * To skip file checking for a specific arch specfic library,
|
||||||
|
# set `fileToCheckFor = null`.
|
||||||
|
ghcBinDists = {
|
||||||
|
# Binary distributions for the default libc (e.g. glibc, or libSystem on Darwin)
|
||||||
|
# nixpkgs uses for the respective system.
|
||||||
|
defaultLibc = {
|
||||||
|
i686-linux = {
|
||||||
|
variantSuffix = "";
|
||||||
|
src = {
|
||||||
|
url = "${downloadsUrl}/${version}/ghc-${version}-i386-deb9-linux.tar.xz";
|
||||||
|
sha256 = "5dc1eb9c65f01b1e5c5693af72af07a4e9e75c6920e620fd598daeefa804487a";
|
||||||
|
};
|
||||||
|
exePathForLibraryCheck = "ghc/stage2/build/tmp/ghc-stage2";
|
||||||
|
archSpecificLibraries = [
|
||||||
|
{ nixPackage = gmp; fileToCheckFor = null; }
|
||||||
|
# The i686-linux bindist provided by GHC HQ is currently built on Debian 9,
|
||||||
|
# which link it against `libtinfo.so.5` (ncurses 5).
|
||||||
|
# Other bindists are linked `libtinfo.so.6` (ncurses 6).
|
||||||
|
{ nixPackage = ncurses5; fileToCheckFor = "libtinfo.so.5"; }
|
||||||
|
];
|
||||||
|
};
|
||||||
|
x86_64-linux = {
|
||||||
|
variantSuffix = "";
|
||||||
|
src = {
|
||||||
|
url = "${downloadsUrl}/${version}/ghc-${version}-x86_64-deb10-linux.tar.xz";
|
||||||
|
sha256 = "a77a91a39d9b0167124b7e97648b2b52973ae0978cb259e0d44f0752a75037cb";
|
||||||
|
};
|
||||||
|
exePathForLibraryCheck = "ghc/stage2/build/tmp/ghc-stage2";
|
||||||
|
archSpecificLibraries = [
|
||||||
|
{ nixPackage = gmp; fileToCheckFor = null; }
|
||||||
|
{ nixPackage = ncurses6; fileToCheckFor = "libtinfo.so.6"; }
|
||||||
|
];
|
||||||
|
};
|
||||||
|
aarch64-linux = {
|
||||||
|
variantSuffix = "";
|
||||||
|
src = {
|
||||||
|
url = "${downloadsUrl}/${version}/ghc-${version}-aarch64-deb10-linux.tar.xz";
|
||||||
|
sha256 = "fc7dbc6bae36ea5ac30b7e9a263b7e5be3b45b0eb3e893ad0bc2c950a61f14ec";
|
||||||
|
};
|
||||||
|
exePathForLibraryCheck = "ghc/stage2/build/tmp/ghc-stage2";
|
||||||
|
archSpecificLibraries = [
|
||||||
|
{ nixPackage = gmp; fileToCheckFor = null; }
|
||||||
|
{ nixPackage = ncurses6; fileToCheckFor = "libtinfo.so.6"; }
|
||||||
|
{ nixPackage = numactl; fileToCheckFor = null; }
|
||||||
|
];
|
||||||
|
};
|
||||||
|
x86_64-darwin = {
|
||||||
|
variantSuffix = "";
|
||||||
|
src = {
|
||||||
|
url = "${downloadsUrl}/${version}/ghc-${version}-x86_64-apple-darwin.tar.xz";
|
||||||
|
sha256 = "f2e8366fd3754dd9388510792aba2d2abecb1c2f7f1e5555f6065c3c5e2ffec4";
|
||||||
|
};
|
||||||
|
exePathForLibraryCheck = null; # we don't have a library check for darwin yet
|
||||||
|
archSpecificLibraries = [
|
||||||
|
{ nixPackage = gmp; fileToCheckFor = null; }
|
||||||
|
{ nixPackage = ncurses6; fileToCheckFor = null; }
|
||||||
|
{ nixPackage = libiconv; fileToCheckFor = null; }
|
||||||
|
];
|
||||||
|
isHadrian = true;
|
||||||
|
};
|
||||||
|
aarch64-darwin = {
|
||||||
|
variantSuffix = "";
|
||||||
|
src = {
|
||||||
|
url = "${downloadsUrl}/${version}/ghc-${version}-aarch64-apple-darwin.tar.xz";
|
||||||
|
sha256 = "8cf8408544a1a43adf1bbbb0dd6b074efadffc68bfa1a792947c52e825171224";
|
||||||
|
};
|
||||||
|
exePathForLibraryCheck = null; # we don't have a library check for darwin yet
|
||||||
|
archSpecificLibraries = [
|
||||||
|
{ nixPackage = gmp; fileToCheckFor = null; }
|
||||||
|
{ nixPackage = ncurses6; fileToCheckFor = null; }
|
||||||
|
{ nixPackage = libiconv; fileToCheckFor = null; }
|
||||||
|
];
|
||||||
|
isHadrian = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
# Binary distributions for the musl libc for the respective system.
|
||||||
|
musl = {
|
||||||
|
x86_64-linux = {
|
||||||
|
variantSuffix = "-musl";
|
||||||
|
src = {
|
||||||
|
url = "${downloadsUrl}/${version}/ghc-${version}-x86_64-alpine3.12-linux-gmp.tar.xz";
|
||||||
|
sha256 = "026348947d30a156b84de5d6afeaa48fdcb2795b47954cd8341db00d3263a481";
|
||||||
|
};
|
||||||
|
isStatic = true;
|
||||||
|
isHadrian = true;
|
||||||
|
# We can't check the RPATH for statically linked executable
|
||||||
|
exePathForLibraryCheck = null;
|
||||||
|
archSpecificLibraries = [
|
||||||
|
{ nixPackage = gmp.override { withStatic = true; }; fileToCheckFor = null; }
|
||||||
|
];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
distSetName = if stdenv.hostPlatform.isMusl then "musl" else "defaultLibc";
|
||||||
|
|
||||||
|
binDistUsed = ghcBinDists.${distSetName}.${stdenv.hostPlatform.system}
|
||||||
|
or (throw "cannot bootstrap GHC on this platform ('${stdenv.hostPlatform.system}' with libc '${distSetName}')");
|
||||||
|
|
||||||
|
gmpUsed = (builtins.head (
|
||||||
|
builtins.filter (
|
||||||
|
drv: lib.hasPrefix "gmp" (drv.nixPackage.name or "")
|
||||||
|
) binDistUsed.archSpecificLibraries
|
||||||
|
)).nixPackage;
|
||||||
|
|
||||||
|
# GHC has other native backends (like PowerPC), but here only the ones
|
||||||
|
# we ship bindists for matter.
|
||||||
|
useLLVM = !(stdenv.targetPlatform.isx86
|
||||||
|
|| (stdenv.targetPlatform.isAarch64 && stdenv.targetPlatform.isDarwin));
|
||||||
|
|
||||||
|
libPath =
|
||||||
|
lib.makeLibraryPath (
|
||||||
|
# Add arch-specific libraries.
|
||||||
|
map ({ nixPackage, ... }: nixPackage) binDistUsed.archSpecificLibraries
|
||||||
|
);
|
||||||
|
|
||||||
|
libEnvVar = lib.optionalString stdenv.hostPlatform.isDarwin "DY"
|
||||||
|
+ "LD_LIBRARY_PATH";
|
||||||
|
|
||||||
|
runtimeDeps = [
|
||||||
|
targetPackages.stdenv.cc
|
||||||
|
targetPackages.stdenv.cc.bintools
|
||||||
|
coreutils # for cat
|
||||||
|
]
|
||||||
|
++ lib.optionals useLLVM [
|
||||||
|
(lib.getBin llvmPackages.llvm)
|
||||||
|
]
|
||||||
|
# On darwin, we need unwrapped bintools as well (for otool)
|
||||||
|
++ lib.optionals (stdenv.targetPlatform.linker == "cctools") [
|
||||||
|
targetPackages.stdenv.cc.bintools.bintools
|
||||||
|
];
|
||||||
|
|
||||||
|
in
|
||||||
|
|
||||||
|
stdenv.mkDerivation rec {
|
||||||
|
inherit version;
|
||||||
|
pname = "ghc-binary${binDistUsed.variantSuffix}";
|
||||||
|
|
||||||
|
src = fetchurl binDistUsed.src;
|
||||||
|
|
||||||
|
nativeBuildInputs = [ perl ];
|
||||||
|
|
||||||
|
# Set LD_LIBRARY_PATH or equivalent so that the programs running as part
|
||||||
|
# of the bindist installer can find the libraries they expect.
|
||||||
|
# Cannot patchelf beforehand due to relative RPATHs that anticipate
|
||||||
|
# the final install location.
|
||||||
|
${libEnvVar} = libPath;
|
||||||
|
|
||||||
|
postUnpack =
|
||||||
|
# Verify our assumptions of which `libtinfo.so` (ncurses) version is used,
|
||||||
|
# so that we know when ghc bindists upgrade that and we need to update the
|
||||||
|
# version used in `libPath`.
|
||||||
|
lib.optionalString
|
||||||
|
(binDistUsed.exePathForLibraryCheck != null)
|
||||||
|
# Note the `*` glob because some GHCs have a suffix when unpacked, e.g.
|
||||||
|
# the musl bindist has dir `ghc-VERSION-x86_64-unknown-linux/`.
|
||||||
|
# As a result, don't shell-quote this glob when splicing the string.
|
||||||
|
(let buildExeGlob = ''ghc-${version}*/"${binDistUsed.exePathForLibraryCheck}"''; in
|
||||||
|
lib.concatStringsSep "\n" [
|
||||||
|
(''
|
||||||
|
shopt -u nullglob
|
||||||
|
echo "Checking that ghc binary exists in bindist at ${buildExeGlob}"
|
||||||
|
if ! test -e ${buildExeGlob}; then
|
||||||
|
echo >&2 "GHC binary ${binDistUsed.exePathForLibraryCheck} could not be found in the bindist build directory (at ${buildExeGlob}) for arch ${stdenv.hostPlatform.system}, please check that ghcBinDists correctly reflect the bindist dependencies!"; exit 1;
|
||||||
|
fi
|
||||||
|
'')
|
||||||
|
(lib.concatMapStringsSep
|
||||||
|
"\n"
|
||||||
|
({ fileToCheckFor, nixPackage }:
|
||||||
|
lib.optionalString (fileToCheckFor != null) ''
|
||||||
|
echo "Checking bindist for ${fileToCheckFor} to ensure that is still used"
|
||||||
|
if ! readelf -d ${buildExeGlob} | grep "${fileToCheckFor}"; then
|
||||||
|
echo >&2 "File ${fileToCheckFor} could not be found in ${binDistUsed.exePathForLibraryCheck} for arch ${stdenv.hostPlatform.system}, please check that ghcBinDists correctly reflect the bindist dependencies!"; exit 1;
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "Checking that the nix package ${nixPackage} contains ${fileToCheckFor}"
|
||||||
|
if ! test -e "${lib.getLib nixPackage}/lib/${fileToCheckFor}"; then
|
||||||
|
echo >&2 "Nix package ${nixPackage} did not contain ${fileToCheckFor} for arch ${stdenv.hostPlatform.system}, please check that ghcBinDists correctly reflect the bindist dependencies!"; exit 1;
|
||||||
|
fi
|
||||||
|
''
|
||||||
|
)
|
||||||
|
binDistUsed.archSpecificLibraries
|
||||||
|
)
|
||||||
|
])
|
||||||
|
# GHC has dtrace probes, which causes ld to try to open /usr/lib/libdtrace.dylib
|
||||||
|
# during linking
|
||||||
|
+ lib.optionalString stdenv.isDarwin ''
|
||||||
|
export NIX_LDFLAGS+=" -no_dtrace_dof"
|
||||||
|
# not enough room in the object files for the full path to libiconv :(
|
||||||
|
for exe in $(find . -type f -executable); do
|
||||||
|
isScript $exe && continue
|
||||||
|
ln -fs ${libiconv}/lib/libiconv.dylib $(dirname $exe)/libiconv.dylib
|
||||||
|
install_name_tool -change /usr/lib/libiconv.2.dylib @executable_path/libiconv.dylib -change /usr/local/lib/gcc/6/libgcc_s.1.dylib ${gcc.cc.lib}/lib/libgcc_s.1.dylib $exe
|
||||||
|
done
|
||||||
|
'' +
|
||||||
|
|
||||||
|
# Some scripts used during the build need to have their shebangs patched
|
||||||
|
''
|
||||||
|
patchShebangs ghc-${version}/utils/
|
||||||
|
patchShebangs ghc-${version}/configure
|
||||||
|
test -d ghc-${version}/inplace/bin && \
|
||||||
|
patchShebangs ghc-${version}/inplace/bin
|
||||||
|
'' +
|
||||||
|
# We have to patch the GMP paths for the integer-gmp package.
|
||||||
|
''
|
||||||
|
find . -name ghc-bignum.buildinfo \
|
||||||
|
-exec sed -i "s@extra-lib-dirs: @extra-lib-dirs: ${lib.getLib gmpUsed}/lib@" {} \;
|
||||||
|
|
||||||
|
# we need to modify the package db directly for hadrian bindists
|
||||||
|
find . -name 'ghc-bignum*.conf' \
|
||||||
|
-exec sed -e '/^[a-z-]*library-dirs/a \ ${lib.getLib gmpUsed}/lib' -i {} \;
|
||||||
|
'' + lib.optionalString stdenv.isDarwin ''
|
||||||
|
# we need to modify the package db directly for hadrian bindists
|
||||||
|
# (all darwin bindists are hadrian-based for 9.2.2)
|
||||||
|
find . -name 'base*.conf' \
|
||||||
|
-exec sed -e '/^[a-z-]*library-dirs/a \ ${lib.getLib libiconv}/lib' -i {} \;
|
||||||
|
|
||||||
|
# To link RTS in the end we also need libffi now
|
||||||
|
find . -name 'rts*.conf' \
|
||||||
|
-exec sed -e '/^[a-z-]*library-dirs/a \ ${lib.getLib libffi}/lib' \
|
||||||
|
-e 's@/Library/Developer/.*/usr/include/ffi@${lib.getDev libffi}/include@' \
|
||||||
|
-i {} \;
|
||||||
|
'' +
|
||||||
|
# aarch64 does HAVE_NUMA so -lnuma requires it in library-dirs in rts/package.conf.in
|
||||||
|
# FFI_LIB_DIR is a good indication of places it must be needed.
|
||||||
|
lib.optionalString (stdenv.hostPlatform.isLinux && stdenv.hostPlatform.isAarch64) ''
|
||||||
|
find . -name package.conf.in \
|
||||||
|
-exec sed -i "s@FFI_LIB_DIR@FFI_LIB_DIR ${numactl.out}/lib@g" {} \;
|
||||||
|
'' +
|
||||||
|
# Rename needed libraries and binaries, fix interpreter
|
||||||
|
lib.optionalString stdenv.isLinux ''
|
||||||
|
find . -type f -executable -exec patchelf \
|
||||||
|
--interpreter ${stdenv.cc.bintools.dynamicLinker} {} \;
|
||||||
|
'';
|
||||||
|
|
||||||
|
# fix for `configure: error: Your linker is affected by binutils #16177`
|
||||||
|
preConfigure = lib.optionalString
|
||||||
|
stdenv.targetPlatform.isAarch32
|
||||||
|
"LD=ld.gold";
|
||||||
|
|
||||||
|
configurePlatforms = [ ];
|
||||||
|
configureFlags = [
|
||||||
|
"--with-gmp-includes=${lib.getDev gmpUsed}/include"
|
||||||
|
# Note `--with-gmp-libraries` does nothing for GHC bindists:
|
||||||
|
# https://gitlab.haskell.org/ghc/ghc/-/merge_requests/6124
|
||||||
|
] ++ lib.optional stdenv.isDarwin "--with-gcc=${./gcc-clang-wrapper.sh}"
|
||||||
|
# From: https://github.com/NixOS/nixpkgs/pull/43369/commits
|
||||||
|
++ lib.optional stdenv.hostPlatform.isMusl "--disable-ld-override";
|
||||||
|
|
||||||
|
# No building is necessary, but calling make without flags ironically
|
||||||
|
# calls install-strip ...
|
||||||
|
dontBuild = true;
|
||||||
|
|
||||||
|
# Patch scripts to include runtime dependencies in $PATH.
|
||||||
|
postInstall = ''
|
||||||
|
for i in "$out/bin/"*; do
|
||||||
|
test ! -h "$i" || continue
|
||||||
|
isScript "$i" || continue
|
||||||
|
sed -i -e '2i export PATH="${lib.makeBinPath runtimeDeps}:$PATH"' "$i"
|
||||||
|
done
|
||||||
|
'';
|
||||||
|
|
||||||
|
# Apparently necessary for the ghc Alpine (musl) bindist:
|
||||||
|
# When we strip, and then run the
|
||||||
|
# patchelf --set-rpath "${libPath}:$(patchelf --print-rpath $p)" $p
|
||||||
|
# below, running ghc (e.g. during `installCheckPhase)` gives some apparently
|
||||||
|
# corrupted rpath or whatever makes the loader work on nonsensical strings:
|
||||||
|
# running install tests
|
||||||
|
# Error relocating /nix/store/...-ghc-8.10.2-binary/lib/ghc-8.10.5/bin/ghc: : symbol not found
|
||||||
|
# Error relocating /nix/store/...-ghc-8.10.2-binary/lib/ghc-8.10.5/bin/ghc: ir6zf6c9f86pfx8sr30n2vjy-ghc-8.10.2-binary/lib/ghc-8.10.5/bin/../lib/x86_64-linux-ghc-8.10.5/libHSexceptions-0.10.4-ghc8.10.5.so: symbol not found
|
||||||
|
# Error relocating /nix/store/...-ghc-8.10.2-binary/lib/ghc-8.10.5/bin/ghc: y/lib/ghc-8.10.5/bin/../lib/x86_64-linux-ghc-8.10.5/libHStemplate-haskell-2.16.0.0-ghc8.10.5.so: symbol not found
|
||||||
|
# Error relocating /nix/store/...-ghc-8.10.2-binary/lib/ghc-8.10.5/bin/ghc: 8.10.5/libHStemplate-haskell-2.16.0.0-ghc8.10.5.so: symbol not found
|
||||||
|
# Error relocating /nix/store/...-ghc-8.10.2-binary/lib/ghc-8.10.5/bin/ghc: <20>: symbol not found
|
||||||
|
# Error relocating /nix/store/...-ghc-8.10.2-binary/lib/ghc-8.10.5/bin/ghc: <20>?: symbol not found
|
||||||
|
# Error relocating /nix/store/...-ghc-8.10.2-binary/lib/ghc-8.10.5/bin/ghc: 64-linux-ghc-8.10.5/libHSexceptions-0.10.4-ghc8.10.5.so: symbol not found
|
||||||
|
# This is extremely bogus and should be investigated.
|
||||||
|
dontStrip = if stdenv.hostPlatform.isMusl then true else false; # `if` for explicitness
|
||||||
|
|
||||||
|
# On Linux, use patchelf to modify the executables so that they can
|
||||||
|
# find editline/gmp.
|
||||||
|
postFixup = lib.optionalString (stdenv.isLinux && !(binDistUsed.isStatic or false))
|
||||||
|
(if stdenv.hostPlatform.isAarch64 then
|
||||||
|
# Keep rpath as small as possible on aarch64 for patchelf#244. All Elfs
|
||||||
|
# are 2 directories deep from $out/lib, so pooling symlinks there makes
|
||||||
|
# a short rpath.
|
||||||
|
''
|
||||||
|
(cd $out/lib; ln -s ${ncurses6.out}/lib/libtinfo.so.6)
|
||||||
|
(cd $out/lib; ln -s ${lib.getLib gmpUsed}/lib/libgmp.so.10)
|
||||||
|
(cd $out/lib; ln -s ${numactl.out}/lib/libnuma.so.1)
|
||||||
|
for p in $(find "$out/lib" -type f -name "*\.so*"); do
|
||||||
|
(cd $out/lib; ln -s $p)
|
||||||
|
done
|
||||||
|
|
||||||
|
for p in $(find "$out/lib" -type f -executable); do
|
||||||
|
if isELF "$p"; then
|
||||||
|
echo "Patchelfing $p"
|
||||||
|
patchelf --set-rpath "\$ORIGIN:\$ORIGIN/../.." $p
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
''
|
||||||
|
else
|
||||||
|
''
|
||||||
|
for p in $(find "$out" -type f -executable); do
|
||||||
|
if isELF "$p"; then
|
||||||
|
echo "Patchelfing $p"
|
||||||
|
patchelf --set-rpath "${libPath}:$(patchelf --print-rpath $p)" $p
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
'') + lib.optionalString stdenv.isDarwin ''
|
||||||
|
# not enough room in the object files for the full path to libiconv :(
|
||||||
|
for exe in $(find "$out" -type f -executable); do
|
||||||
|
isScript $exe && continue
|
||||||
|
ln -fs ${libiconv}/lib/libiconv.dylib $(dirname $exe)/libiconv.dylib
|
||||||
|
install_name_tool -change /usr/lib/libiconv.2.dylib @executable_path/libiconv.dylib -change /usr/local/lib/gcc/6/libgcc_s.1.dylib ${gcc.cc.lib}/lib/libgcc_s.1.dylib $exe
|
||||||
|
done
|
||||||
|
|
||||||
|
for file in $(find "$out" -name setup-config); do
|
||||||
|
substituteInPlace $file --replace /usr/bin/ranlib "$(type -P ranlib)"
|
||||||
|
done
|
||||||
|
'' +
|
||||||
|
lib.optionalString minimal ''
|
||||||
|
# Remove profiling files
|
||||||
|
find $out -type f -name '*.p_o' -delete
|
||||||
|
find $out -type f -name '*.p_hi' -delete
|
||||||
|
find $out -type f -name '*_p.a' -delete
|
||||||
|
# `-f` because e.g. musl bindist does not have this file.
|
||||||
|
rm -f $out/lib/ghc-*/bin/ghc-iserv-prof
|
||||||
|
# Hydra will redistribute this derivation, so we have to keep the docs for
|
||||||
|
# legal reasons (retaining the legal notices etc)
|
||||||
|
# As a last resort we could unpack the docs separately and symlink them in.
|
||||||
|
# They're in $out/share/{doc,man}.
|
||||||
|
''
|
||||||
|
# Recache package db which needs to happen for Hadrian bindists
|
||||||
|
# where we modify the package db before installing
|
||||||
|
+ ''
|
||||||
|
shopt -s nullglob
|
||||||
|
package_db=("$out"/lib/ghc-*/lib/package.conf.d "$out"/lib/ghc-*/package.conf.d)
|
||||||
|
"$out/bin/ghc-pkg" --package-db="$package_db" recache
|
||||||
|
'';
|
||||||
|
|
||||||
|
# In nixpkgs, musl based builds currently enable `pie` hardening by default
|
||||||
|
# (see `defaultHardeningFlags` in `make-derivation.nix`).
|
||||||
|
# But GHC cannot currently produce outputs that are ready for `-pie` linking.
|
||||||
|
# Thus, disable `pie` hardening, otherwise `recompile with -fPIE` errors appear.
|
||||||
|
# See:
|
||||||
|
# * https://github.com/NixOS/nixpkgs/issues/129247
|
||||||
|
# * https://gitlab.haskell.org/ghc/ghc/-/issues/19580
|
||||||
|
hardeningDisable = lib.optional stdenv.targetPlatform.isMusl "pie";
|
||||||
|
|
||||||
|
doInstallCheck = true;
|
||||||
|
installCheckPhase = ''
|
||||||
|
# Sanity check, can ghc create executables?
|
||||||
|
cd $TMP
|
||||||
|
mkdir test-ghc; cd test-ghc
|
||||||
|
cat > main.hs << EOF
|
||||||
|
{-# LANGUAGE TemplateHaskell #-}
|
||||||
|
module Main where
|
||||||
|
main = putStrLn \$([|"yes"|])
|
||||||
|
EOF
|
||||||
|
env -i $out/bin/ghc --make main.hs || exit 1
|
||||||
|
echo compilation ok
|
||||||
|
[ $(./main) == "yes" ]
|
||||||
|
'';
|
||||||
|
|
||||||
|
passthru = {
|
||||||
|
targetPrefix = "";
|
||||||
|
enableShared = true;
|
||||||
|
|
||||||
|
inherit llvmPackages;
|
||||||
|
|
||||||
|
# Our Cabal compiler name
|
||||||
|
haskellCompilerName = "ghc-${version}";
|
||||||
|
}
|
||||||
|
# We duplicate binDistUsed here since we have a sensible default even if no bindist is avaible,
|
||||||
|
# this makes sure that getting the `meta` attribute doesn't throw even on unsupported platforms.
|
||||||
|
// lib.optionalAttrs (ghcBinDists.${distSetName}.${stdenv.hostPlatform.system}.isHadrian or false) {
|
||||||
|
# Normal GHC derivations expose the hadrian derivation used to build them
|
||||||
|
# here. In the case of bindists we just make sure that the attribute exists,
|
||||||
|
# as it is used for checking if a GHC derivation has been built with hadrian.
|
||||||
|
# The isHadrian mechanism will become obsolete with GHCs that use hadrian
|
||||||
|
# exclusively, i.e. 9.6 (and 9.4?).
|
||||||
|
hadrian = null;
|
||||||
|
};
|
||||||
|
|
||||||
|
meta = rec {
|
||||||
|
homepage = "http://haskell.org/ghc";
|
||||||
|
description = "The Glasgow Haskell Compiler";
|
||||||
|
license = lib.licenses.bsd3;
|
||||||
|
# HACK: since we can't encode the libc / abi in platforms, we need
|
||||||
|
# to make the platform list dependent on the evaluation platform
|
||||||
|
# in order to avoid eval errors with musl which supports less
|
||||||
|
# platforms than the default libcs (i. e. glibc / libSystem).
|
||||||
|
# This is done for the benefit of Hydra, so `packagePlatforms`
|
||||||
|
# won't return any platforms that would cause an evaluation
|
||||||
|
# failure for `pkgsMusl.haskell.compiler.ghc922Binary`, as
|
||||||
|
# long as the evaluator runs on a platform that supports
|
||||||
|
# `pkgsMusl`.
|
||||||
|
platforms = builtins.attrNames ghcBinDists.${distSetName};
|
||||||
|
maintainers = [ ];
|
||||||
|
};
|
||||||
|
}
|
387
pkgs/by-name/ha/haskell/ghc/9.2.5.nix
Normal file
387
pkgs/by-name/ha/haskell/ghc/9.2.5.nix
Normal file
|
@ -0,0 +1,387 @@
|
||||||
|
{ lib, stdenv, pkgsBuildTarget, pkgsHostTarget, targetPackages
|
||||||
|
|
||||||
|
# build-tools
|
||||||
|
, bootPkgs
|
||||||
|
, autoconf, automake, coreutils, fetchpatch, fetchurl, perl, python3, m4, sphinx
|
||||||
|
, xattr, autoSignDarwinBinariesHook
|
||||||
|
, bash
|
||||||
|
|
||||||
|
, libiconv ? null, ncurses
|
||||||
|
, glibcLocales ? null
|
||||||
|
|
||||||
|
, # GHC can be built with system libffi or a bundled one.
|
||||||
|
libffi ? null
|
||||||
|
|
||||||
|
, useLLVM ? !(stdenv.targetPlatform.isx86
|
||||||
|
|| stdenv.targetPlatform.isPower
|
||||||
|
|| stdenv.targetPlatform.isSparc
|
||||||
|
|| stdenv.targetPlatform.isAarch64)
|
||||||
|
, # LLVM is conceptually a run-time-only dependency, but for
|
||||||
|
# non-x86, we need LLVM to bootstrap later stages, so it becomes a
|
||||||
|
# build-time dependency too.
|
||||||
|
buildTargetLlvmPackages, llvmPackages
|
||||||
|
|
||||||
|
, # If enabled, GHC will be built with the GPL-free but slightly slower native
|
||||||
|
# bignum backend instead of the faster but GPLed gmp backend.
|
||||||
|
enableNativeBignum ? !(lib.meta.availableOn stdenv.hostPlatform gmp
|
||||||
|
&& lib.meta.availableOn stdenv.targetPlatform gmp)
|
||||||
|
, gmp
|
||||||
|
|
||||||
|
, # If enabled, use -fPIC when compiling static libs.
|
||||||
|
enableRelocatedStaticLibs ? stdenv.targetPlatform != stdenv.hostPlatform
|
||||||
|
|
||||||
|
, enableProfiledLibs ? true
|
||||||
|
|
||||||
|
, # Whether to build dynamic libs for the standard library (on the target
|
||||||
|
# platform). Static libs are always built.
|
||||||
|
enableShared ? with stdenv.targetPlatform; !isWindows && !useiOSPrebuilt && !isStatic
|
||||||
|
|
||||||
|
, # Whether to build terminfo.
|
||||||
|
enableTerminfo ? !stdenv.targetPlatform.isWindows
|
||||||
|
|
||||||
|
, # What flavour to build. An empty string indicates no
|
||||||
|
# specific flavour and falls back to ghc default values.
|
||||||
|
ghcFlavour ? lib.optionalString (stdenv.targetPlatform != stdenv.hostPlatform)
|
||||||
|
(if useLLVM then "perf-cross" else "perf-cross-ncg")
|
||||||
|
|
||||||
|
, # Whether to build sphinx documentation.
|
||||||
|
enableDocs ? (
|
||||||
|
# Docs disabled if we are building on musl because it's a large task to keep
|
||||||
|
# all `sphinx` dependencies building in this environment.
|
||||||
|
!stdenv.buildPlatform.isMusl
|
||||||
|
)
|
||||||
|
|
||||||
|
, enableHaddockProgram ?
|
||||||
|
# Disabled for cross; see note [HADDOCK_DOCS].
|
||||||
|
(stdenv.targetPlatform == stdenv.hostPlatform)
|
||||||
|
|
||||||
|
, # Whether to disable the large address space allocator
|
||||||
|
# necessary fix for iOS: https://www.reddit.com/r/haskell/comments/4ttdz1/building_an_osxi386_to_iosarm64_cross_compiler/d5qvd67/
|
||||||
|
disableLargeAddressSpace ? stdenv.targetPlatform.isiOS
|
||||||
|
}:
|
||||||
|
|
||||||
|
assert !enableNativeBignum -> gmp != null;
|
||||||
|
|
||||||
|
# Cross cannot currently build the `haddock` program for silly reasons,
|
||||||
|
# see note [HADDOCK_DOCS].
|
||||||
|
assert (stdenv.targetPlatform != stdenv.hostPlatform) -> !enableHaddockProgram;
|
||||||
|
|
||||||
|
let
|
||||||
|
inherit (stdenv) buildPlatform hostPlatform targetPlatform;
|
||||||
|
|
||||||
|
inherit (bootPkgs) ghc;
|
||||||
|
|
||||||
|
# TODO(@Ericson2314) Make unconditional
|
||||||
|
targetPrefix = lib.optionalString
|
||||||
|
(targetPlatform != hostPlatform)
|
||||||
|
"${targetPlatform.config}-";
|
||||||
|
|
||||||
|
buildMK = ''
|
||||||
|
BuildFlavour = ${ghcFlavour}
|
||||||
|
ifneq \"\$(BuildFlavour)\" \"\"
|
||||||
|
include mk/flavours/\$(BuildFlavour).mk
|
||||||
|
endif
|
||||||
|
BUILD_SPHINX_HTML = ${if enableDocs then "YES" else "NO"}
|
||||||
|
BUILD_SPHINX_PDF = NO
|
||||||
|
'' +
|
||||||
|
# Note [HADDOCK_DOCS]:
|
||||||
|
# Unfortunately currently `HADDOCK_DOCS` controls both whether the `haddock`
|
||||||
|
# program is built (which we generally always want to have a complete GHC install)
|
||||||
|
# and whether it is run on the GHC sources to generate hyperlinked source code
|
||||||
|
# (which is impossible for cross-compilation); see:
|
||||||
|
# https://gitlab.haskell.org/ghc/ghc/-/issues/20077
|
||||||
|
# This implies that currently a cross-compiled GHC will never have a `haddock`
|
||||||
|
# program, so it can never generate haddocks for any packages.
|
||||||
|
# If this is solved in the future, we'd like to unconditionally
|
||||||
|
# build the haddock program (removing the `enableHaddockProgram` option).
|
||||||
|
''
|
||||||
|
HADDOCK_DOCS = ${if enableHaddockProgram then "YES" else "NO"}
|
||||||
|
# Build haddocks for boot packages with hyperlinking
|
||||||
|
EXTRA_HADDOCK_OPTS += --hyperlinked-source --quickjump
|
||||||
|
|
||||||
|
DYNAMIC_GHC_PROGRAMS = ${if enableShared then "YES" else "NO"}
|
||||||
|
BIGNUM_BACKEND = ${if enableNativeBignum then "native" else "gmp"}
|
||||||
|
'' + lib.optionalString (targetPlatform != hostPlatform) ''
|
||||||
|
Stage1Only = ${if targetPlatform.system == hostPlatform.system then "NO" else "YES"}
|
||||||
|
CrossCompilePrefix = ${targetPrefix}
|
||||||
|
'' + lib.optionalString (!enableProfiledLibs) ''
|
||||||
|
BUILD_PROF_LIBS = NO
|
||||||
|
'' +
|
||||||
|
# -fexternal-dynamic-refs apparently (because it's not clear from the documentation)
|
||||||
|
# makes the GHC RTS able to load static libraries, which may be needed for TemplateHaskell.
|
||||||
|
# This solution was described in https://www.tweag.io/blog/2020-09-30-bazel-static-haskell
|
||||||
|
lib.optionalString enableRelocatedStaticLibs ''
|
||||||
|
GhcLibHcOpts += -fPIC -fexternal-dynamic-refs
|
||||||
|
GhcRtsHcOpts += -fPIC -fexternal-dynamic-refs
|
||||||
|
'' + lib.optionalString targetPlatform.useAndroidPrebuilt ''
|
||||||
|
EXTRA_CC_OPTS += -std=gnu99
|
||||||
|
'';
|
||||||
|
|
||||||
|
# Splicer will pull out correct variations
|
||||||
|
libDeps = platform: lib.optional enableTerminfo ncurses
|
||||||
|
++ [libffi]
|
||||||
|
++ lib.optional (!enableNativeBignum) gmp
|
||||||
|
++ lib.optional (platform.libc != "glibc" && !targetPlatform.isWindows) libiconv;
|
||||||
|
|
||||||
|
# TODO(@sternenseemann): is buildTarget LLVM unnecessary?
|
||||||
|
# GHC doesn't seem to have {LLC,OPT}_HOST
|
||||||
|
toolsForTarget = [
|
||||||
|
pkgsBuildTarget.targetPackages.stdenv.cc
|
||||||
|
] ++ lib.optional useLLVM buildTargetLlvmPackages.llvm;
|
||||||
|
|
||||||
|
targetCC = builtins.head toolsForTarget;
|
||||||
|
|
||||||
|
# Sometimes we have to dispatch between the bintools wrapper and the unwrapped
|
||||||
|
# derivation for certain tools depending on the platform.
|
||||||
|
bintoolsFor = {
|
||||||
|
# GHC needs install_name_tool on all darwin platforms. On aarch64-darwin it is
|
||||||
|
# part of the bintools wrapper (due to codesigning requirements), but not on
|
||||||
|
# x86_64-darwin.
|
||||||
|
install_name_tool =
|
||||||
|
if stdenv.targetPlatform.isAarch64
|
||||||
|
then targetCC.bintools
|
||||||
|
else targetCC.bintools.bintools;
|
||||||
|
# Same goes for strip.
|
||||||
|
strip =
|
||||||
|
# TODO(@sternenseemann): also use wrapper if linker == "bfd" or "gold"
|
||||||
|
if stdenv.targetPlatform.isAarch64 && stdenv.targetPlatform.isDarwin
|
||||||
|
then targetCC.bintools
|
||||||
|
else targetCC.bintools.bintools;
|
||||||
|
};
|
||||||
|
|
||||||
|
# Use gold either following the default, or to avoid the BFD linker due to some bugs / perf issues.
|
||||||
|
# But we cannot avoid BFD when using musl libc due to https://sourceware.org/bugzilla/show_bug.cgi?id=23856
|
||||||
|
# see #84670 and #49071 for more background.
|
||||||
|
useLdGold = targetPlatform.linker == "gold" ||
|
||||||
|
(targetPlatform.linker == "bfd" && (targetCC.bintools.bintools.hasGold or false) && !targetPlatform.isMusl);
|
||||||
|
|
||||||
|
# Makes debugging easier to see which variant is at play in `nix-store -q --tree`.
|
||||||
|
variantSuffix = lib.concatStrings [
|
||||||
|
(lib.optionalString stdenv.hostPlatform.isMusl "-musl")
|
||||||
|
(lib.optionalString enableNativeBignum "-native-bignum")
|
||||||
|
];
|
||||||
|
|
||||||
|
in
|
||||||
|
|
||||||
|
# C compiler, bintools and LLVM are used at build time, but will also leak into
|
||||||
|
# the resulting GHC's settings file and used at runtime. This means that we are
|
||||||
|
# currently only able to build GHC if hostPlatform == buildPlatform.
|
||||||
|
assert targetCC == pkgsHostTarget.targetPackages.stdenv.cc;
|
||||||
|
assert buildTargetLlvmPackages.llvm == llvmPackages.llvm;
|
||||||
|
assert stdenv.targetPlatform.isDarwin -> buildTargetLlvmPackages.clang == llvmPackages.clang;
|
||||||
|
|
||||||
|
stdenv.mkDerivation (rec {
|
||||||
|
version = "9.2.5";
|
||||||
|
pname = "${targetPrefix}ghc${variantSuffix}";
|
||||||
|
|
||||||
|
src = fetchurl {
|
||||||
|
url = "https://downloads.haskell.org/ghc/${version}/ghc-${version}-src.tar.xz";
|
||||||
|
sha256 = "0606797d1b38e2d88ee2243f38ec6b9a1aa93e9b578e95f0de9a9c0a4144021c";
|
||||||
|
};
|
||||||
|
|
||||||
|
enableParallelBuilding = true;
|
||||||
|
|
||||||
|
outputs = [ "out" "doc" ];
|
||||||
|
|
||||||
|
patches = [
|
||||||
|
# Fix docs build with sphinx >= 6.0
|
||||||
|
# https://gitlab.haskell.org/ghc/ghc/-/issues/22766
|
||||||
|
(fetchpatch {
|
||||||
|
name = "ghc-docs-sphinx-6.0.patch";
|
||||||
|
url = "https://gitlab.haskell.org/ghc/ghc/-/commit/10e94a556b4f90769b7fd718b9790d58ae566600.patch";
|
||||||
|
sha256 = "0kmhfamr16w8gch0lgln2912r8aryjky1hfcda3jkcwa5cdzgjdv";
|
||||||
|
})
|
||||||
|
# Fix docs build with Sphinx >= 7 https://gitlab.haskell.org/ghc/ghc/-/issues/24129
|
||||||
|
./docs-sphinx-7.patch
|
||||||
|
# fix hyperlinked haddock sources: https://github.com/haskell/haddock/pull/1482
|
||||||
|
(fetchpatch {
|
||||||
|
url = "https://patch-diff.githubusercontent.com/raw/haskell/haddock/pull/1482.patch";
|
||||||
|
sha256 = "sha256-8w8QUCsODaTvknCDGgTfFNZa8ZmvIKaKS+2ZJZ9foYk=";
|
||||||
|
extraPrefix = "utils/haddock/";
|
||||||
|
stripLen = 1;
|
||||||
|
})
|
||||||
|
# Don't generate code that doesn't compile when --enable-relocatable is passed to Setup.hs
|
||||||
|
# Can be removed if the Cabal library included with ghc backports the linked fix
|
||||||
|
(fetchpatch {
|
||||||
|
url = "https://github.com/haskell/cabal/commit/6c796218c92f93c95e94d5ec2d077f6956f68e98.patch";
|
||||||
|
stripLen = 1;
|
||||||
|
extraPrefix = "libraries/Cabal/";
|
||||||
|
sha256 = "sha256-yRQ6YmMiwBwiYseC5BsrEtDgFbWvst+maGgDtdD0vAY=";
|
||||||
|
})
|
||||||
|
] ++ lib.optionals (stdenv.targetPlatform.isDarwin && stdenv.targetPlatform.isAarch64) [
|
||||||
|
# Prevent the paths module from emitting symbols that we don't use
|
||||||
|
# when building with separate outputs.
|
||||||
|
#
|
||||||
|
# These cause problems as they're not eliminated by GHC's dead code
|
||||||
|
# elimination on aarch64-darwin. (see
|
||||||
|
# https://github.com/NixOS/nixpkgs/issues/140774 for details).
|
||||||
|
./Cabal-at-least-3.6-paths-fix-cycle-aarch64-darwin.patch
|
||||||
|
];
|
||||||
|
|
||||||
|
postPatch = "patchShebangs .";
|
||||||
|
|
||||||
|
# GHC needs the locale configured during the Haddock phase.
|
||||||
|
LANG = "en_US.UTF-8";
|
||||||
|
|
||||||
|
# GHC is a bit confused on its cross terminology.
|
||||||
|
# TODO(@sternenseemann): investigate coreutils dependencies and pass absolute paths
|
||||||
|
preConfigure = ''
|
||||||
|
for env in $(env | grep '^TARGET_' | sed -E 's|\+?=.*||'); do
|
||||||
|
export "''${env#TARGET_}=''${!env}"
|
||||||
|
done
|
||||||
|
# GHC is a bit confused on its cross terminology, as these would normally be
|
||||||
|
# the *host* tools.
|
||||||
|
export CC="${targetCC}/bin/${targetCC.targetPrefix}cc"
|
||||||
|
export CXX="${targetCC}/bin/${targetCC.targetPrefix}c++"
|
||||||
|
# Use gold to work around https://sourceware.org/bugzilla/show_bug.cgi?id=16177
|
||||||
|
export LD="${targetCC.bintools}/bin/${targetCC.bintools.targetPrefix}ld${lib.optionalString useLdGold ".gold"}"
|
||||||
|
export AS="${targetCC.bintools.bintools}/bin/${targetCC.bintools.targetPrefix}as"
|
||||||
|
export AR="${targetCC.bintools.bintools}/bin/${targetCC.bintools.targetPrefix}ar"
|
||||||
|
export NM="${targetCC.bintools.bintools}/bin/${targetCC.bintools.targetPrefix}nm"
|
||||||
|
export RANLIB="${targetCC.bintools.bintools}/bin/${targetCC.bintools.targetPrefix}ranlib"
|
||||||
|
export READELF="${targetCC.bintools.bintools}/bin/${targetCC.bintools.targetPrefix}readelf"
|
||||||
|
export STRIP="${bintoolsFor.strip}/bin/${bintoolsFor.strip.targetPrefix}strip"
|
||||||
|
'' + lib.optionalString (stdenv.targetPlatform.linker == "cctools") ''
|
||||||
|
export OTOOL="${targetCC.bintools.bintools}/bin/${targetCC.bintools.targetPrefix}otool"
|
||||||
|
export INSTALL_NAME_TOOL="${bintoolsFor.install_name_tool}/bin/${bintoolsFor.install_name_tool.targetPrefix}install_name_tool"
|
||||||
|
'' + lib.optionalString useLLVM ''
|
||||||
|
export LLC="${lib.getBin buildTargetLlvmPackages.llvm}/bin/llc"
|
||||||
|
export OPT="${lib.getBin buildTargetLlvmPackages.llvm}/bin/opt"
|
||||||
|
'' + lib.optionalString (useLLVM && stdenv.targetPlatform.isDarwin) ''
|
||||||
|
# LLVM backend on Darwin needs clang: https://downloads.haskell.org/~ghc/latest/docs/html/users_guide/codegens.html#llvm-code-generator-fllvm
|
||||||
|
export CLANG="${buildTargetLlvmPackages.clang}/bin/${buildTargetLlvmPackages.clang.targetPrefix}clang"
|
||||||
|
'' + ''
|
||||||
|
echo -n "${buildMK}" > mk/build.mk
|
||||||
|
'' + lib.optionalString (stdenv.isLinux && hostPlatform.libc == "glibc") ''
|
||||||
|
export LOCALE_ARCHIVE="${glibcLocales}/lib/locale/locale-archive"
|
||||||
|
'' + lib.optionalString (!stdenv.isDarwin) ''
|
||||||
|
export NIX_LDFLAGS+=" -rpath $out/lib/ghc-${version}"
|
||||||
|
'' + lib.optionalString stdenv.isDarwin ''
|
||||||
|
export NIX_LDFLAGS+=" -no_dtrace_dof"
|
||||||
|
|
||||||
|
# GHC tries the host xattr /usr/bin/xattr by default which fails since it expects python to be 2.7
|
||||||
|
export XATTR=${lib.getBin xattr}/bin/xattr
|
||||||
|
'' + lib.optionalString targetPlatform.useAndroidPrebuilt ''
|
||||||
|
sed -i -e '5i ,("armv7a-unknown-linux-androideabi", ("e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64", "cortex-a8", ""))' llvm-targets
|
||||||
|
'' + lib.optionalString targetPlatform.isMusl ''
|
||||||
|
echo "patching llvm-targets for musl targets..."
|
||||||
|
echo "Cloning these existing '*-linux-gnu*' targets:"
|
||||||
|
grep linux-gnu llvm-targets | sed 's/^/ /'
|
||||||
|
echo "(go go gadget sed)"
|
||||||
|
sed -i 's,\(^.*linux-\)gnu\(.*\)$,\0\n\1musl\2,' llvm-targets
|
||||||
|
echo "llvm-targets now contains these '*-linux-musl*' targets:"
|
||||||
|
grep linux-musl llvm-targets | sed 's/^/ /'
|
||||||
|
|
||||||
|
echo "And now patching to preserve '-musleabi' as done with '-gnueabi'"
|
||||||
|
# (aclocal.m4 is actual source, but patch configure as well since we don't re-gen)
|
||||||
|
for x in configure aclocal.m4; do
|
||||||
|
substituteInPlace $x \
|
||||||
|
--replace '*-android*|*-gnueabi*)' \
|
||||||
|
'*-android*|*-gnueabi*|*-musleabi*)'
|
||||||
|
done
|
||||||
|
'';
|
||||||
|
|
||||||
|
# TODO(@Ericson2314): Always pass "--target" and always prefix.
|
||||||
|
configurePlatforms = [ "build" "host" ]
|
||||||
|
++ lib.optional (targetPlatform != hostPlatform) "target";
|
||||||
|
|
||||||
|
# `--with` flags for libraries needed for RTS linker
|
||||||
|
configureFlags = [
|
||||||
|
"--datadir=$doc/share/doc/ghc"
|
||||||
|
"--with-curses-includes=${ncurses.dev}/include" "--with-curses-libraries=${ncurses.out}/lib"
|
||||||
|
] ++ lib.optionals (libffi != null) [
|
||||||
|
"--with-system-libffi"
|
||||||
|
"--with-ffi-includes=${targetPackages.libffi.dev}/include"
|
||||||
|
"--with-ffi-libraries=${targetPackages.libffi.out}/lib"
|
||||||
|
] ++ lib.optionals (targetPlatform == hostPlatform && !enableNativeBignum) [
|
||||||
|
"--with-gmp-includes=${targetPackages.gmp.dev}/include"
|
||||||
|
"--with-gmp-libraries=${targetPackages.gmp.out}/lib"
|
||||||
|
] ++ lib.optionals (targetPlatform == hostPlatform && hostPlatform.libc != "glibc" && !targetPlatform.isWindows) [
|
||||||
|
"--with-iconv-includes=${libiconv}/include"
|
||||||
|
"--with-iconv-libraries=${libiconv}/lib"
|
||||||
|
] ++ lib.optionals (targetPlatform != hostPlatform) [
|
||||||
|
"--enable-bootstrap-with-devel-snapshot"
|
||||||
|
] ++ lib.optionals useLdGold [
|
||||||
|
"CFLAGS=-fuse-ld=gold"
|
||||||
|
"CONF_GCC_LINKER_OPTS_STAGE1=-fuse-ld=gold"
|
||||||
|
"CONF_GCC_LINKER_OPTS_STAGE2=-fuse-ld=gold"
|
||||||
|
] ++ lib.optionals (disableLargeAddressSpace) [
|
||||||
|
"--disable-large-address-space"
|
||||||
|
];
|
||||||
|
|
||||||
|
# Make sure we never relax`$PATH` and hooks support for compatibility.
|
||||||
|
strictDeps = true;
|
||||||
|
|
||||||
|
# Don’t add -liconv to LDFLAGS automatically so that GHC will add it itself.
|
||||||
|
dontAddExtraLibs = true;
|
||||||
|
|
||||||
|
nativeBuildInputs = [
|
||||||
|
perl autoconf automake m4 python3
|
||||||
|
ghc bootPkgs.alex bootPkgs.happy bootPkgs.hscolour
|
||||||
|
] ++ lib.optionals (stdenv.isDarwin && stdenv.isAarch64) [
|
||||||
|
autoSignDarwinBinariesHook
|
||||||
|
] ++ lib.optionals enableDocs [
|
||||||
|
sphinx
|
||||||
|
];
|
||||||
|
|
||||||
|
# For building runtime libs
|
||||||
|
depsBuildTarget = toolsForTarget;
|
||||||
|
|
||||||
|
buildInputs = [ perl bash ] ++ (libDeps hostPlatform);
|
||||||
|
|
||||||
|
depsTargetTarget = map lib.getDev (libDeps targetPlatform);
|
||||||
|
depsTargetTargetPropagated = map (lib.getOutput "out") (libDeps targetPlatform);
|
||||||
|
|
||||||
|
# required, because otherwise all symbols from HSffi.o are stripped, and
|
||||||
|
# that in turn causes GHCi to abort
|
||||||
|
stripDebugFlags = [ "-S" ] ++ lib.optional (!targetPlatform.isDarwin) "--keep-file-symbols";
|
||||||
|
|
||||||
|
checkTarget = "test";
|
||||||
|
|
||||||
|
hardeningDisable =
|
||||||
|
[ "format" ]
|
||||||
|
# In nixpkgs, musl based builds currently enable `pie` hardening by default
|
||||||
|
# (see `defaultHardeningFlags` in `make-derivation.nix`).
|
||||||
|
# But GHC cannot currently produce outputs that are ready for `-pie` linking.
|
||||||
|
# Thus, disable `pie` hardening, otherwise `recompile with -fPIE` errors appear.
|
||||||
|
# See:
|
||||||
|
# * https://github.com/NixOS/nixpkgs/issues/129247
|
||||||
|
# * https://gitlab.haskell.org/ghc/ghc/-/issues/19580
|
||||||
|
++ lib.optional stdenv.targetPlatform.isMusl "pie";
|
||||||
|
|
||||||
|
# big-parallel allows us to build with more than 2 cores on
|
||||||
|
# Hydra which already warrants a significant speedup
|
||||||
|
requiredSystemFeatures = [ "big-parallel" ];
|
||||||
|
|
||||||
|
postInstall = ''
|
||||||
|
# Install the bash completion file.
|
||||||
|
install -D -m 444 utils/completion/ghc.bash $out/share/bash-completion/completions/${targetPrefix}ghc
|
||||||
|
'';
|
||||||
|
|
||||||
|
passthru = {
|
||||||
|
inherit bootPkgs targetPrefix;
|
||||||
|
|
||||||
|
inherit llvmPackages;
|
||||||
|
inherit enableShared;
|
||||||
|
|
||||||
|
# This is used by the haskell builder to query
|
||||||
|
# the presence of the haddock program.
|
||||||
|
hasHaddock = enableHaddockProgram;
|
||||||
|
|
||||||
|
# Our Cabal compiler name
|
||||||
|
haskellCompilerName = "ghc-${version}";
|
||||||
|
};
|
||||||
|
|
||||||
|
meta = {
|
||||||
|
homepage = "http://haskell.org/ghc";
|
||||||
|
description = "The Glasgow Haskell Compiler";
|
||||||
|
maintainers = with lib.maintainers; [ ];
|
||||||
|
timeout = 24 * 3600;
|
||||||
|
inherit (ghc.meta) license platforms;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // lib.optionalAttrs targetPlatform.useAndroidPrebuilt {
|
||||||
|
dontStrip = true;
|
||||||
|
dontPatchELF = true;
|
||||||
|
noAuditTmpdir = true;
|
||||||
|
})
|
387
pkgs/by-name/ha/haskell/ghc/9.2.6.nix
Normal file
387
pkgs/by-name/ha/haskell/ghc/9.2.6.nix
Normal file
|
@ -0,0 +1,387 @@
|
||||||
|
{ lib, stdenv, pkgsBuildTarget, pkgsHostTarget, targetPackages
|
||||||
|
|
||||||
|
# build-tools
|
||||||
|
, bootPkgs
|
||||||
|
, autoconf, automake, coreutils, fetchpatch, fetchurl, perl, python3, m4, sphinx
|
||||||
|
, xattr, autoSignDarwinBinariesHook
|
||||||
|
, bash
|
||||||
|
|
||||||
|
, libiconv ? null, ncurses
|
||||||
|
, glibcLocales ? null
|
||||||
|
|
||||||
|
, # GHC can be built with system libffi or a bundled one.
|
||||||
|
libffi ? null
|
||||||
|
|
||||||
|
, useLLVM ? !(stdenv.targetPlatform.isx86
|
||||||
|
|| stdenv.targetPlatform.isPower
|
||||||
|
|| stdenv.targetPlatform.isSparc
|
||||||
|
|| stdenv.targetPlatform.isAarch64)
|
||||||
|
, # LLVM is conceptually a run-time-only dependency, but for
|
||||||
|
# non-x86, we need LLVM to bootstrap later stages, so it becomes a
|
||||||
|
# build-time dependency too.
|
||||||
|
buildTargetLlvmPackages, llvmPackages
|
||||||
|
|
||||||
|
, # If enabled, GHC will be built with the GPL-free but slightly slower native
|
||||||
|
# bignum backend instead of the faster but GPLed gmp backend.
|
||||||
|
enableNativeBignum ? !(lib.meta.availableOn stdenv.hostPlatform gmp
|
||||||
|
&& lib.meta.availableOn stdenv.targetPlatform gmp)
|
||||||
|
, gmp
|
||||||
|
|
||||||
|
, # If enabled, use -fPIC when compiling static libs.
|
||||||
|
enableRelocatedStaticLibs ? stdenv.targetPlatform != stdenv.hostPlatform
|
||||||
|
|
||||||
|
, enableProfiledLibs ? true
|
||||||
|
|
||||||
|
, # Whether to build dynamic libs for the standard library (on the target
|
||||||
|
# platform). Static libs are always built.
|
||||||
|
enableShared ? with stdenv.targetPlatform; !isWindows && !useiOSPrebuilt && !isStatic
|
||||||
|
|
||||||
|
, # Whether to build terminfo.
|
||||||
|
enableTerminfo ? !stdenv.targetPlatform.isWindows
|
||||||
|
|
||||||
|
, # What flavour to build. An empty string indicates no
|
||||||
|
# specific flavour and falls back to ghc default values.
|
||||||
|
ghcFlavour ? lib.optionalString (stdenv.targetPlatform != stdenv.hostPlatform)
|
||||||
|
(if useLLVM then "perf-cross" else "perf-cross-ncg")
|
||||||
|
|
||||||
|
, # Whether to build sphinx documentation.
|
||||||
|
enableDocs ? (
|
||||||
|
# Docs disabled if we are building on musl because it's a large task to keep
|
||||||
|
# all `sphinx` dependencies building in this environment.
|
||||||
|
!stdenv.buildPlatform.isMusl
|
||||||
|
)
|
||||||
|
|
||||||
|
, enableHaddockProgram ?
|
||||||
|
# Disabled for cross; see note [HADDOCK_DOCS].
|
||||||
|
(stdenv.targetPlatform == stdenv.hostPlatform)
|
||||||
|
|
||||||
|
, # Whether to disable the large address space allocator
|
||||||
|
# necessary fix for iOS: https://www.reddit.com/r/haskell/comments/4ttdz1/building_an_osxi386_to_iosarm64_cross_compiler/d5qvd67/
|
||||||
|
disableLargeAddressSpace ? stdenv.targetPlatform.isiOS
|
||||||
|
}:
|
||||||
|
|
||||||
|
assert !enableNativeBignum -> gmp != null;
|
||||||
|
|
||||||
|
# Cross cannot currently build the `haddock` program for silly reasons,
|
||||||
|
# see note [HADDOCK_DOCS].
|
||||||
|
assert (stdenv.targetPlatform != stdenv.hostPlatform) -> !enableHaddockProgram;
|
||||||
|
|
||||||
|
let
|
||||||
|
inherit (stdenv) buildPlatform hostPlatform targetPlatform;
|
||||||
|
|
||||||
|
inherit (bootPkgs) ghc;
|
||||||
|
|
||||||
|
# TODO(@Ericson2314) Make unconditional
|
||||||
|
targetPrefix = lib.optionalString
|
||||||
|
(targetPlatform != hostPlatform)
|
||||||
|
"${targetPlatform.config}-";
|
||||||
|
|
||||||
|
buildMK = ''
|
||||||
|
BuildFlavour = ${ghcFlavour}
|
||||||
|
ifneq \"\$(BuildFlavour)\" \"\"
|
||||||
|
include mk/flavours/\$(BuildFlavour).mk
|
||||||
|
endif
|
||||||
|
BUILD_SPHINX_HTML = ${if enableDocs then "YES" else "NO"}
|
||||||
|
BUILD_SPHINX_PDF = NO
|
||||||
|
'' +
|
||||||
|
# Note [HADDOCK_DOCS]:
|
||||||
|
# Unfortunately currently `HADDOCK_DOCS` controls both whether the `haddock`
|
||||||
|
# program is built (which we generally always want to have a complete GHC install)
|
||||||
|
# and whether it is run on the GHC sources to generate hyperlinked source code
|
||||||
|
# (which is impossible for cross-compilation); see:
|
||||||
|
# https://gitlab.haskell.org/ghc/ghc/-/issues/20077
|
||||||
|
# This implies that currently a cross-compiled GHC will never have a `haddock`
|
||||||
|
# program, so it can never generate haddocks for any packages.
|
||||||
|
# If this is solved in the future, we'd like to unconditionally
|
||||||
|
# build the haddock program (removing the `enableHaddockProgram` option).
|
||||||
|
''
|
||||||
|
HADDOCK_DOCS = ${if enableHaddockProgram then "YES" else "NO"}
|
||||||
|
# Build haddocks for boot packages with hyperlinking
|
||||||
|
EXTRA_HADDOCK_OPTS += --hyperlinked-source --quickjump
|
||||||
|
|
||||||
|
DYNAMIC_GHC_PROGRAMS = ${if enableShared then "YES" else "NO"}
|
||||||
|
BIGNUM_BACKEND = ${if enableNativeBignum then "native" else "gmp"}
|
||||||
|
'' + lib.optionalString (targetPlatform != hostPlatform) ''
|
||||||
|
Stage1Only = ${if targetPlatform.system == hostPlatform.system then "NO" else "YES"}
|
||||||
|
CrossCompilePrefix = ${targetPrefix}
|
||||||
|
'' + lib.optionalString (!enableProfiledLibs) ''
|
||||||
|
BUILD_PROF_LIBS = NO
|
||||||
|
'' +
|
||||||
|
# -fexternal-dynamic-refs apparently (because it's not clear from the documentation)
|
||||||
|
# makes the GHC RTS able to load static libraries, which may be needed for TemplateHaskell.
|
||||||
|
# This solution was described in https://www.tweag.io/blog/2020-09-30-bazel-static-haskell
|
||||||
|
lib.optionalString enableRelocatedStaticLibs ''
|
||||||
|
GhcLibHcOpts += -fPIC -fexternal-dynamic-refs
|
||||||
|
GhcRtsHcOpts += -fPIC -fexternal-dynamic-refs
|
||||||
|
'' + lib.optionalString targetPlatform.useAndroidPrebuilt ''
|
||||||
|
EXTRA_CC_OPTS += -std=gnu99
|
||||||
|
'';
|
||||||
|
|
||||||
|
# Splicer will pull out correct variations
|
||||||
|
libDeps = platform: lib.optional enableTerminfo ncurses
|
||||||
|
++ [libffi]
|
||||||
|
++ lib.optional (!enableNativeBignum) gmp
|
||||||
|
++ lib.optional (platform.libc != "glibc" && !targetPlatform.isWindows) libiconv;
|
||||||
|
|
||||||
|
# TODO(@sternenseemann): is buildTarget LLVM unnecessary?
|
||||||
|
# GHC doesn't seem to have {LLC,OPT}_HOST
|
||||||
|
toolsForTarget = [
|
||||||
|
pkgsBuildTarget.targetPackages.stdenv.cc
|
||||||
|
] ++ lib.optional useLLVM buildTargetLlvmPackages.llvm;
|
||||||
|
|
||||||
|
targetCC = builtins.head toolsForTarget;
|
||||||
|
|
||||||
|
# Sometimes we have to dispatch between the bintools wrapper and the unwrapped
|
||||||
|
# derivation for certain tools depending on the platform.
|
||||||
|
bintoolsFor = {
|
||||||
|
# GHC needs install_name_tool on all darwin platforms. On aarch64-darwin it is
|
||||||
|
# part of the bintools wrapper (due to codesigning requirements), but not on
|
||||||
|
# x86_64-darwin.
|
||||||
|
install_name_tool =
|
||||||
|
if stdenv.targetPlatform.isAarch64
|
||||||
|
then targetCC.bintools
|
||||||
|
else targetCC.bintools.bintools;
|
||||||
|
# Same goes for strip.
|
||||||
|
strip =
|
||||||
|
# TODO(@sternenseemann): also use wrapper if linker == "bfd" or "gold"
|
||||||
|
if stdenv.targetPlatform.isAarch64 && stdenv.targetPlatform.isDarwin
|
||||||
|
then targetCC.bintools
|
||||||
|
else targetCC.bintools.bintools;
|
||||||
|
};
|
||||||
|
|
||||||
|
# Use gold either following the default, or to avoid the BFD linker due to some bugs / perf issues.
|
||||||
|
# But we cannot avoid BFD when using musl libc due to https://sourceware.org/bugzilla/show_bug.cgi?id=23856
|
||||||
|
# see #84670 and #49071 for more background.
|
||||||
|
useLdGold = targetPlatform.linker == "gold" ||
|
||||||
|
(targetPlatform.linker == "bfd" && (targetCC.bintools.bintools.hasGold or false) && !targetPlatform.isMusl);
|
||||||
|
|
||||||
|
# Makes debugging easier to see which variant is at play in `nix-store -q --tree`.
|
||||||
|
variantSuffix = lib.concatStrings [
|
||||||
|
(lib.optionalString stdenv.hostPlatform.isMusl "-musl")
|
||||||
|
(lib.optionalString enableNativeBignum "-native-bignum")
|
||||||
|
];
|
||||||
|
|
||||||
|
in
|
||||||
|
|
||||||
|
# C compiler, bintools and LLVM are used at build time, but will also leak into
|
||||||
|
# the resulting GHC's settings file and used at runtime. This means that we are
|
||||||
|
# currently only able to build GHC if hostPlatform == buildPlatform.
|
||||||
|
assert targetCC == pkgsHostTarget.targetPackages.stdenv.cc;
|
||||||
|
assert buildTargetLlvmPackages.llvm == llvmPackages.llvm;
|
||||||
|
assert stdenv.targetPlatform.isDarwin -> buildTargetLlvmPackages.clang == llvmPackages.clang;
|
||||||
|
|
||||||
|
stdenv.mkDerivation (rec {
|
||||||
|
version = "9.2.6";
|
||||||
|
pname = "${targetPrefix}ghc${variantSuffix}";
|
||||||
|
|
||||||
|
src = fetchurl {
|
||||||
|
url = "https://downloads.haskell.org/ghc/${version}/ghc-${version}-src.tar.xz";
|
||||||
|
sha256 = "7a54cf0398ad488b4ed219e15d1d1e64c0b6876c43a0564550dd11f0540d7305";
|
||||||
|
};
|
||||||
|
|
||||||
|
enableParallelBuilding = true;
|
||||||
|
|
||||||
|
outputs = [ "out" "doc" ];
|
||||||
|
|
||||||
|
patches = [
|
||||||
|
# Fix docs build with sphinx >= 6.0
|
||||||
|
# https://gitlab.haskell.org/ghc/ghc/-/issues/22766
|
||||||
|
(fetchpatch {
|
||||||
|
name = "ghc-docs-sphinx-6.0.patch";
|
||||||
|
url = "https://gitlab.haskell.org/ghc/ghc/-/commit/10e94a556b4f90769b7fd718b9790d58ae566600.patch";
|
||||||
|
sha256 = "0kmhfamr16w8gch0lgln2912r8aryjky1hfcda3jkcwa5cdzgjdv";
|
||||||
|
})
|
||||||
|
# Fix docs build with Sphinx >= 7 https://gitlab.haskell.org/ghc/ghc/-/issues/24129
|
||||||
|
./docs-sphinx-7.patch
|
||||||
|
# fix hyperlinked haddock sources: https://github.com/haskell/haddock/pull/1482
|
||||||
|
(fetchpatch {
|
||||||
|
url = "https://patch-diff.githubusercontent.com/raw/haskell/haddock/pull/1482.patch";
|
||||||
|
sha256 = "sha256-8w8QUCsODaTvknCDGgTfFNZa8ZmvIKaKS+2ZJZ9foYk=";
|
||||||
|
extraPrefix = "utils/haddock/";
|
||||||
|
stripLen = 1;
|
||||||
|
})
|
||||||
|
# Don't generate code that doesn't compile when --enable-relocatable is passed to Setup.hs
|
||||||
|
# Can be removed if the Cabal library included with ghc backports the linked fix
|
||||||
|
(fetchpatch {
|
||||||
|
url = "https://github.com/haskell/cabal/commit/6c796218c92f93c95e94d5ec2d077f6956f68e98.patch";
|
||||||
|
stripLen = 1;
|
||||||
|
extraPrefix = "libraries/Cabal/";
|
||||||
|
sha256 = "sha256-yRQ6YmMiwBwiYseC5BsrEtDgFbWvst+maGgDtdD0vAY=";
|
||||||
|
})
|
||||||
|
] ++ lib.optionals (stdenv.targetPlatform.isDarwin && stdenv.targetPlatform.isAarch64) [
|
||||||
|
# Prevent the paths module from emitting symbols that we don't use
|
||||||
|
# when building with separate outputs.
|
||||||
|
#
|
||||||
|
# These cause problems as they're not eliminated by GHC's dead code
|
||||||
|
# elimination on aarch64-darwin. (see
|
||||||
|
# https://github.com/NixOS/nixpkgs/issues/140774 for details).
|
||||||
|
./Cabal-at-least-3.6-paths-fix-cycle-aarch64-darwin.patch
|
||||||
|
];
|
||||||
|
|
||||||
|
postPatch = "patchShebangs .";
|
||||||
|
|
||||||
|
# GHC needs the locale configured during the Haddock phase.
|
||||||
|
LANG = "en_US.UTF-8";
|
||||||
|
|
||||||
|
# GHC is a bit confused on its cross terminology.
|
||||||
|
# TODO(@sternenseemann): investigate coreutils dependencies and pass absolute paths
|
||||||
|
preConfigure = ''
|
||||||
|
for env in $(env | grep '^TARGET_' | sed -E 's|\+?=.*||'); do
|
||||||
|
export "''${env#TARGET_}=''${!env}"
|
||||||
|
done
|
||||||
|
# GHC is a bit confused on its cross terminology, as these would normally be
|
||||||
|
# the *host* tools.
|
||||||
|
export CC="${targetCC}/bin/${targetCC.targetPrefix}cc"
|
||||||
|
export CXX="${targetCC}/bin/${targetCC.targetPrefix}c++"
|
||||||
|
# Use gold to work around https://sourceware.org/bugzilla/show_bug.cgi?id=16177
|
||||||
|
export LD="${targetCC.bintools}/bin/${targetCC.bintools.targetPrefix}ld${lib.optionalString useLdGold ".gold"}"
|
||||||
|
export AS="${targetCC.bintools.bintools}/bin/${targetCC.bintools.targetPrefix}as"
|
||||||
|
export AR="${targetCC.bintools.bintools}/bin/${targetCC.bintools.targetPrefix}ar"
|
||||||
|
export NM="${targetCC.bintools.bintools}/bin/${targetCC.bintools.targetPrefix}nm"
|
||||||
|
export RANLIB="${targetCC.bintools.bintools}/bin/${targetCC.bintools.targetPrefix}ranlib"
|
||||||
|
export READELF="${targetCC.bintools.bintools}/bin/${targetCC.bintools.targetPrefix}readelf"
|
||||||
|
export STRIP="${bintoolsFor.strip}/bin/${bintoolsFor.strip.targetPrefix}strip"
|
||||||
|
'' + lib.optionalString (stdenv.targetPlatform.linker == "cctools") ''
|
||||||
|
export OTOOL="${targetCC.bintools.bintools}/bin/${targetCC.bintools.targetPrefix}otool"
|
||||||
|
export INSTALL_NAME_TOOL="${bintoolsFor.install_name_tool}/bin/${bintoolsFor.install_name_tool.targetPrefix}install_name_tool"
|
||||||
|
'' + lib.optionalString useLLVM ''
|
||||||
|
export LLC="${lib.getBin buildTargetLlvmPackages.llvm}/bin/llc"
|
||||||
|
export OPT="${lib.getBin buildTargetLlvmPackages.llvm}/bin/opt"
|
||||||
|
'' + lib.optionalString (useLLVM && stdenv.targetPlatform.isDarwin) ''
|
||||||
|
# LLVM backend on Darwin needs clang: https://downloads.haskell.org/~ghc/latest/docs/html/users_guide/codegens.html#llvm-code-generator-fllvm
|
||||||
|
export CLANG="${buildTargetLlvmPackages.clang}/bin/${buildTargetLlvmPackages.clang.targetPrefix}clang"
|
||||||
|
'' + ''
|
||||||
|
echo -n "${buildMK}" > mk/build.mk
|
||||||
|
'' + lib.optionalString (stdenv.isLinux && hostPlatform.libc == "glibc") ''
|
||||||
|
export LOCALE_ARCHIVE="${glibcLocales}/lib/locale/locale-archive"
|
||||||
|
'' + lib.optionalString (!stdenv.isDarwin) ''
|
||||||
|
export NIX_LDFLAGS+=" -rpath $out/lib/ghc-${version}"
|
||||||
|
'' + lib.optionalString stdenv.isDarwin ''
|
||||||
|
export NIX_LDFLAGS+=" -no_dtrace_dof"
|
||||||
|
|
||||||
|
# GHC tries the host xattr /usr/bin/xattr by default which fails since it expects python to be 2.7
|
||||||
|
export XATTR=${lib.getBin xattr}/bin/xattr
|
||||||
|
'' + lib.optionalString targetPlatform.useAndroidPrebuilt ''
|
||||||
|
sed -i -e '5i ,("armv7a-unknown-linux-androideabi", ("e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64", "cortex-a8", ""))' llvm-targets
|
||||||
|
'' + lib.optionalString targetPlatform.isMusl ''
|
||||||
|
echo "patching llvm-targets for musl targets..."
|
||||||
|
echo "Cloning these existing '*-linux-gnu*' targets:"
|
||||||
|
grep linux-gnu llvm-targets | sed 's/^/ /'
|
||||||
|
echo "(go go gadget sed)"
|
||||||
|
sed -i 's,\(^.*linux-\)gnu\(.*\)$,\0\n\1musl\2,' llvm-targets
|
||||||
|
echo "llvm-targets now contains these '*-linux-musl*' targets:"
|
||||||
|
grep linux-musl llvm-targets | sed 's/^/ /'
|
||||||
|
|
||||||
|
echo "And now patching to preserve '-musleabi' as done with '-gnueabi'"
|
||||||
|
# (aclocal.m4 is actual source, but patch configure as well since we don't re-gen)
|
||||||
|
for x in configure aclocal.m4; do
|
||||||
|
substituteInPlace $x \
|
||||||
|
--replace '*-android*|*-gnueabi*)' \
|
||||||
|
'*-android*|*-gnueabi*|*-musleabi*)'
|
||||||
|
done
|
||||||
|
'';
|
||||||
|
|
||||||
|
# TODO(@Ericson2314): Always pass "--target" and always prefix.
|
||||||
|
configurePlatforms = [ "build" "host" ]
|
||||||
|
++ lib.optional (targetPlatform != hostPlatform) "target";
|
||||||
|
|
||||||
|
# `--with` flags for libraries needed for RTS linker
|
||||||
|
configureFlags = [
|
||||||
|
"--datadir=$doc/share/doc/ghc"
|
||||||
|
"--with-curses-includes=${ncurses.dev}/include" "--with-curses-libraries=${ncurses.out}/lib"
|
||||||
|
] ++ lib.optionals (libffi != null) [
|
||||||
|
"--with-system-libffi"
|
||||||
|
"--with-ffi-includes=${targetPackages.libffi.dev}/include"
|
||||||
|
"--with-ffi-libraries=${targetPackages.libffi.out}/lib"
|
||||||
|
] ++ lib.optionals (targetPlatform == hostPlatform && !enableNativeBignum) [
|
||||||
|
"--with-gmp-includes=${targetPackages.gmp.dev}/include"
|
||||||
|
"--with-gmp-libraries=${targetPackages.gmp.out}/lib"
|
||||||
|
] ++ lib.optionals (targetPlatform == hostPlatform && hostPlatform.libc != "glibc" && !targetPlatform.isWindows) [
|
||||||
|
"--with-iconv-includes=${libiconv}/include"
|
||||||
|
"--with-iconv-libraries=${libiconv}/lib"
|
||||||
|
] ++ lib.optionals (targetPlatform != hostPlatform) [
|
||||||
|
"--enable-bootstrap-with-devel-snapshot"
|
||||||
|
] ++ lib.optionals useLdGold [
|
||||||
|
"CFLAGS=-fuse-ld=gold"
|
||||||
|
"CONF_GCC_LINKER_OPTS_STAGE1=-fuse-ld=gold"
|
||||||
|
"CONF_GCC_LINKER_OPTS_STAGE2=-fuse-ld=gold"
|
||||||
|
] ++ lib.optionals (disableLargeAddressSpace) [
|
||||||
|
"--disable-large-address-space"
|
||||||
|
];
|
||||||
|
|
||||||
|
# Make sure we never relax`$PATH` and hooks support for compatibility.
|
||||||
|
strictDeps = true;
|
||||||
|
|
||||||
|
# Don’t add -liconv to LDFLAGS automatically so that GHC will add it itself.
|
||||||
|
dontAddExtraLibs = true;
|
||||||
|
|
||||||
|
nativeBuildInputs = [
|
||||||
|
perl autoconf automake m4 python3
|
||||||
|
ghc bootPkgs.alex bootPkgs.happy bootPkgs.hscolour
|
||||||
|
] ++ lib.optionals (stdenv.isDarwin && stdenv.isAarch64) [
|
||||||
|
autoSignDarwinBinariesHook
|
||||||
|
] ++ lib.optionals enableDocs [
|
||||||
|
sphinx
|
||||||
|
];
|
||||||
|
|
||||||
|
# For building runtime libs
|
||||||
|
depsBuildTarget = toolsForTarget;
|
||||||
|
|
||||||
|
buildInputs = [ perl bash ] ++ (libDeps hostPlatform);
|
||||||
|
|
||||||
|
depsTargetTarget = map lib.getDev (libDeps targetPlatform);
|
||||||
|
depsTargetTargetPropagated = map (lib.getOutput "out") (libDeps targetPlatform);
|
||||||
|
|
||||||
|
# required, because otherwise all symbols from HSffi.o are stripped, and
|
||||||
|
# that in turn causes GHCi to abort
|
||||||
|
stripDebugFlags = [ "-S" ] ++ lib.optional (!targetPlatform.isDarwin) "--keep-file-symbols";
|
||||||
|
|
||||||
|
checkTarget = "test";
|
||||||
|
|
||||||
|
hardeningDisable =
|
||||||
|
[ "format" ]
|
||||||
|
# In nixpkgs, musl based builds currently enable `pie` hardening by default
|
||||||
|
# (see `defaultHardeningFlags` in `make-derivation.nix`).
|
||||||
|
# But GHC cannot currently produce outputs that are ready for `-pie` linking.
|
||||||
|
# Thus, disable `pie` hardening, otherwise `recompile with -fPIE` errors appear.
|
||||||
|
# See:
|
||||||
|
# * https://github.com/NixOS/nixpkgs/issues/129247
|
||||||
|
# * https://gitlab.haskell.org/ghc/ghc/-/issues/19580
|
||||||
|
++ lib.optional stdenv.targetPlatform.isMusl "pie";
|
||||||
|
|
||||||
|
# big-parallel allows us to build with more than 2 cores on
|
||||||
|
# Hydra which already warrants a significant speedup
|
||||||
|
requiredSystemFeatures = [ "big-parallel" ];
|
||||||
|
|
||||||
|
postInstall = ''
|
||||||
|
# Install the bash completion file.
|
||||||
|
install -D -m 444 utils/completion/ghc.bash $out/share/bash-completion/completions/${targetPrefix}ghc
|
||||||
|
'';
|
||||||
|
|
||||||
|
passthru = {
|
||||||
|
inherit bootPkgs targetPrefix;
|
||||||
|
|
||||||
|
inherit llvmPackages;
|
||||||
|
inherit enableShared;
|
||||||
|
|
||||||
|
# This is used by the haskell builder to query
|
||||||
|
# the presence of the haddock program.
|
||||||
|
hasHaddock = enableHaddockProgram;
|
||||||
|
|
||||||
|
# Our Cabal compiler name
|
||||||
|
haskellCompilerName = "ghc-${version}";
|
||||||
|
};
|
||||||
|
|
||||||
|
meta = {
|
||||||
|
homepage = "http://haskell.org/ghc";
|
||||||
|
description = "The Glasgow Haskell Compiler";
|
||||||
|
maintainers = with lib.maintainers; [ ];
|
||||||
|
timeout = 24 * 3600;
|
||||||
|
inherit (ghc.meta) license platforms;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // lib.optionalAttrs targetPlatform.useAndroidPrebuilt {
|
||||||
|
dontStrip = true;
|
||||||
|
dontPatchELF = true;
|
||||||
|
noAuditTmpdir = true;
|
||||||
|
})
|
387
pkgs/by-name/ha/haskell/ghc/9.2.7.nix
Normal file
387
pkgs/by-name/ha/haskell/ghc/9.2.7.nix
Normal file
|
@ -0,0 +1,387 @@
|
||||||
|
{ lib, stdenv, pkgsBuildTarget, pkgsHostTarget, targetPackages
|
||||||
|
|
||||||
|
# build-tools
|
||||||
|
, bootPkgs
|
||||||
|
, autoconf, automake, coreutils, fetchpatch, fetchurl, perl, python3, m4, sphinx
|
||||||
|
, xattr, autoSignDarwinBinariesHook
|
||||||
|
, bash
|
||||||
|
|
||||||
|
, libiconv ? null, ncurses
|
||||||
|
, glibcLocales ? null
|
||||||
|
|
||||||
|
, # GHC can be built with system libffi or a bundled one.
|
||||||
|
libffi ? null
|
||||||
|
|
||||||
|
, useLLVM ? !(stdenv.targetPlatform.isx86
|
||||||
|
|| stdenv.targetPlatform.isPower
|
||||||
|
|| stdenv.targetPlatform.isSparc
|
||||||
|
|| stdenv.targetPlatform.isAarch64)
|
||||||
|
, # LLVM is conceptually a run-time-only dependency, but for
|
||||||
|
# non-x86, we need LLVM to bootstrap later stages, so it becomes a
|
||||||
|
# build-time dependency too.
|
||||||
|
buildTargetLlvmPackages, llvmPackages
|
||||||
|
|
||||||
|
, # If enabled, GHC will be built with the GPL-free but slightly slower native
|
||||||
|
# bignum backend instead of the faster but GPLed gmp backend.
|
||||||
|
enableNativeBignum ? !(lib.meta.availableOn stdenv.hostPlatform gmp
|
||||||
|
&& lib.meta.availableOn stdenv.targetPlatform gmp)
|
||||||
|
, gmp
|
||||||
|
|
||||||
|
, # If enabled, use -fPIC when compiling static libs.
|
||||||
|
enableRelocatedStaticLibs ? stdenv.targetPlatform != stdenv.hostPlatform
|
||||||
|
|
||||||
|
, enableProfiledLibs ? true
|
||||||
|
|
||||||
|
, # Whether to build dynamic libs for the standard library (on the target
|
||||||
|
# platform). Static libs are always built.
|
||||||
|
enableShared ? with stdenv.targetPlatform; !isWindows && !useiOSPrebuilt && !isStatic
|
||||||
|
|
||||||
|
, # Whether to build terminfo.
|
||||||
|
enableTerminfo ? !stdenv.targetPlatform.isWindows
|
||||||
|
|
||||||
|
, # What flavour to build. An empty string indicates no
|
||||||
|
# specific flavour and falls back to ghc default values.
|
||||||
|
ghcFlavour ? lib.optionalString (stdenv.targetPlatform != stdenv.hostPlatform)
|
||||||
|
(if useLLVM then "perf-cross" else "perf-cross-ncg")
|
||||||
|
|
||||||
|
, # Whether to build sphinx documentation.
|
||||||
|
enableDocs ? (
|
||||||
|
# Docs disabled if we are building on musl because it's a large task to keep
|
||||||
|
# all `sphinx` dependencies building in this environment.
|
||||||
|
!stdenv.buildPlatform.isMusl
|
||||||
|
)
|
||||||
|
|
||||||
|
, enableHaddockProgram ?
|
||||||
|
# Disabled for cross; see note [HADDOCK_DOCS].
|
||||||
|
(stdenv.targetPlatform == stdenv.hostPlatform)
|
||||||
|
|
||||||
|
, # Whether to disable the large address space allocator
|
||||||
|
# necessary fix for iOS: https://www.reddit.com/r/haskell/comments/4ttdz1/building_an_osxi386_to_iosarm64_cross_compiler/d5qvd67/
|
||||||
|
disableLargeAddressSpace ? stdenv.targetPlatform.isiOS
|
||||||
|
}:
|
||||||
|
|
||||||
|
assert !enableNativeBignum -> gmp != null;
|
||||||
|
|
||||||
|
# Cross cannot currently build the `haddock` program for silly reasons,
|
||||||
|
# see note [HADDOCK_DOCS].
|
||||||
|
assert (stdenv.targetPlatform != stdenv.hostPlatform) -> !enableHaddockProgram;
|
||||||
|
|
||||||
|
let
|
||||||
|
inherit (stdenv) buildPlatform hostPlatform targetPlatform;
|
||||||
|
|
||||||
|
inherit (bootPkgs) ghc;
|
||||||
|
|
||||||
|
# TODO(@Ericson2314) Make unconditional
|
||||||
|
targetPrefix = lib.optionalString
|
||||||
|
(targetPlatform != hostPlatform)
|
||||||
|
"${targetPlatform.config}-";
|
||||||
|
|
||||||
|
buildMK = ''
|
||||||
|
BuildFlavour = ${ghcFlavour}
|
||||||
|
ifneq \"\$(BuildFlavour)\" \"\"
|
||||||
|
include mk/flavours/\$(BuildFlavour).mk
|
||||||
|
endif
|
||||||
|
BUILD_SPHINX_HTML = ${if enableDocs then "YES" else "NO"}
|
||||||
|
BUILD_SPHINX_PDF = NO
|
||||||
|
'' +
|
||||||
|
# Note [HADDOCK_DOCS]:
|
||||||
|
# Unfortunately currently `HADDOCK_DOCS` controls both whether the `haddock`
|
||||||
|
# program is built (which we generally always want to have a complete GHC install)
|
||||||
|
# and whether it is run on the GHC sources to generate hyperlinked source code
|
||||||
|
# (which is impossible for cross-compilation); see:
|
||||||
|
# https://gitlab.haskell.org/ghc/ghc/-/issues/20077
|
||||||
|
# This implies that currently a cross-compiled GHC will never have a `haddock`
|
||||||
|
# program, so it can never generate haddocks for any packages.
|
||||||
|
# If this is solved in the future, we'd like to unconditionally
|
||||||
|
# build the haddock program (removing the `enableHaddockProgram` option).
|
||||||
|
''
|
||||||
|
HADDOCK_DOCS = ${if enableHaddockProgram then "YES" else "NO"}
|
||||||
|
# Build haddocks for boot packages with hyperlinking
|
||||||
|
EXTRA_HADDOCK_OPTS += --hyperlinked-source --quickjump
|
||||||
|
|
||||||
|
DYNAMIC_GHC_PROGRAMS = ${if enableShared then "YES" else "NO"}
|
||||||
|
BIGNUM_BACKEND = ${if enableNativeBignum then "native" else "gmp"}
|
||||||
|
'' + lib.optionalString (targetPlatform != hostPlatform) ''
|
||||||
|
Stage1Only = ${if targetPlatform.system == hostPlatform.system then "NO" else "YES"}
|
||||||
|
CrossCompilePrefix = ${targetPrefix}
|
||||||
|
'' + lib.optionalString (!enableProfiledLibs) ''
|
||||||
|
BUILD_PROF_LIBS = NO
|
||||||
|
'' +
|
||||||
|
# -fexternal-dynamic-refs apparently (because it's not clear from the documentation)
|
||||||
|
# makes the GHC RTS able to load static libraries, which may be needed for TemplateHaskell.
|
||||||
|
# This solution was described in https://www.tweag.io/blog/2020-09-30-bazel-static-haskell
|
||||||
|
lib.optionalString enableRelocatedStaticLibs ''
|
||||||
|
GhcLibHcOpts += -fPIC -fexternal-dynamic-refs
|
||||||
|
GhcRtsHcOpts += -fPIC -fexternal-dynamic-refs
|
||||||
|
'' + lib.optionalString targetPlatform.useAndroidPrebuilt ''
|
||||||
|
EXTRA_CC_OPTS += -std=gnu99
|
||||||
|
'';
|
||||||
|
|
||||||
|
# Splicer will pull out correct variations
|
||||||
|
libDeps = platform: lib.optional enableTerminfo ncurses
|
||||||
|
++ [libffi]
|
||||||
|
++ lib.optional (!enableNativeBignum) gmp
|
||||||
|
++ lib.optional (platform.libc != "glibc" && !targetPlatform.isWindows) libiconv;
|
||||||
|
|
||||||
|
# TODO(@sternenseemann): is buildTarget LLVM unnecessary?
|
||||||
|
# GHC doesn't seem to have {LLC,OPT}_HOST
|
||||||
|
toolsForTarget = [
|
||||||
|
pkgsBuildTarget.targetPackages.stdenv.cc
|
||||||
|
] ++ lib.optional useLLVM buildTargetLlvmPackages.llvm;
|
||||||
|
|
||||||
|
targetCC = builtins.head toolsForTarget;
|
||||||
|
|
||||||
|
# Sometimes we have to dispatch between the bintools wrapper and the unwrapped
|
||||||
|
# derivation for certain tools depending on the platform.
|
||||||
|
bintoolsFor = {
|
||||||
|
# GHC needs install_name_tool on all darwin platforms. On aarch64-darwin it is
|
||||||
|
# part of the bintools wrapper (due to codesigning requirements), but not on
|
||||||
|
# x86_64-darwin.
|
||||||
|
install_name_tool =
|
||||||
|
if stdenv.targetPlatform.isAarch64
|
||||||
|
then targetCC.bintools
|
||||||
|
else targetCC.bintools.bintools;
|
||||||
|
# Same goes for strip.
|
||||||
|
strip =
|
||||||
|
# TODO(@sternenseemann): also use wrapper if linker == "bfd" or "gold"
|
||||||
|
if stdenv.targetPlatform.isAarch64 && stdenv.targetPlatform.isDarwin
|
||||||
|
then targetCC.bintools
|
||||||
|
else targetCC.bintools.bintools;
|
||||||
|
};
|
||||||
|
|
||||||
|
# Use gold either following the default, or to avoid the BFD linker due to some bugs / perf issues.
|
||||||
|
# But we cannot avoid BFD when using musl libc due to https://sourceware.org/bugzilla/show_bug.cgi?id=23856
|
||||||
|
# see #84670 and #49071 for more background.
|
||||||
|
useLdGold = targetPlatform.linker == "gold" ||
|
||||||
|
(targetPlatform.linker == "bfd" && (targetCC.bintools.bintools.hasGold or false) && !targetPlatform.isMusl);
|
||||||
|
|
||||||
|
# Makes debugging easier to see which variant is at play in `nix-store -q --tree`.
|
||||||
|
variantSuffix = lib.concatStrings [
|
||||||
|
(lib.optionalString stdenv.hostPlatform.isMusl "-musl")
|
||||||
|
(lib.optionalString enableNativeBignum "-native-bignum")
|
||||||
|
];
|
||||||
|
|
||||||
|
in
|
||||||
|
|
||||||
|
# C compiler, bintools and LLVM are used at build time, but will also leak into
|
||||||
|
# the resulting GHC's settings file and used at runtime. This means that we are
|
||||||
|
# currently only able to build GHC if hostPlatform == buildPlatform.
|
||||||
|
assert targetCC == pkgsHostTarget.targetPackages.stdenv.cc;
|
||||||
|
assert buildTargetLlvmPackages.llvm == llvmPackages.llvm;
|
||||||
|
assert stdenv.targetPlatform.isDarwin -> buildTargetLlvmPackages.clang == llvmPackages.clang;
|
||||||
|
|
||||||
|
stdenv.mkDerivation (rec {
|
||||||
|
version = "9.2.7";
|
||||||
|
pname = "${targetPrefix}ghc${variantSuffix}";
|
||||||
|
|
||||||
|
src = fetchurl {
|
||||||
|
url = "https://downloads.haskell.org/ghc/${version}/ghc-${version}-src.tar.xz";
|
||||||
|
sha256 = "a253567a17b734a4c0dd0ffa296d33c2a5b5a54a77df988806a2a1e1ca7e88b8";
|
||||||
|
};
|
||||||
|
|
||||||
|
enableParallelBuilding = true;
|
||||||
|
|
||||||
|
outputs = [ "out" "doc" ];
|
||||||
|
|
||||||
|
patches = [
|
||||||
|
# Fix docs build with sphinx >= 6.0
|
||||||
|
# https://gitlab.haskell.org/ghc/ghc/-/issues/22766
|
||||||
|
(fetchpatch {
|
||||||
|
name = "ghc-docs-sphinx-6.0.patch";
|
||||||
|
url = "https://gitlab.haskell.org/ghc/ghc/-/commit/10e94a556b4f90769b7fd718b9790d58ae566600.patch";
|
||||||
|
sha256 = "0kmhfamr16w8gch0lgln2912r8aryjky1hfcda3jkcwa5cdzgjdv";
|
||||||
|
})
|
||||||
|
# Fix docs build with Sphinx >= 7 https://gitlab.haskell.org/ghc/ghc/-/issues/24129
|
||||||
|
./docs-sphinx-7.patch
|
||||||
|
# fix hyperlinked haddock sources: https://github.com/haskell/haddock/pull/1482
|
||||||
|
(fetchpatch {
|
||||||
|
url = "https://patch-diff.githubusercontent.com/raw/haskell/haddock/pull/1482.patch";
|
||||||
|
sha256 = "sha256-8w8QUCsODaTvknCDGgTfFNZa8ZmvIKaKS+2ZJZ9foYk=";
|
||||||
|
extraPrefix = "utils/haddock/";
|
||||||
|
stripLen = 1;
|
||||||
|
})
|
||||||
|
# Don't generate code that doesn't compile when --enable-relocatable is passed to Setup.hs
|
||||||
|
# Can be removed if the Cabal library included with ghc backports the linked fix
|
||||||
|
(fetchpatch {
|
||||||
|
url = "https://github.com/haskell/cabal/commit/6c796218c92f93c95e94d5ec2d077f6956f68e98.patch";
|
||||||
|
stripLen = 1;
|
||||||
|
extraPrefix = "libraries/Cabal/";
|
||||||
|
sha256 = "sha256-yRQ6YmMiwBwiYseC5BsrEtDgFbWvst+maGgDtdD0vAY=";
|
||||||
|
})
|
||||||
|
] ++ lib.optionals (stdenv.targetPlatform.isDarwin && stdenv.targetPlatform.isAarch64) [
|
||||||
|
# Prevent the paths module from emitting symbols that we don't use
|
||||||
|
# when building with separate outputs.
|
||||||
|
#
|
||||||
|
# These cause problems as they're not eliminated by GHC's dead code
|
||||||
|
# elimination on aarch64-darwin. (see
|
||||||
|
# https://github.com/NixOS/nixpkgs/issues/140774 for details).
|
||||||
|
./Cabal-at-least-3.6-paths-fix-cycle-aarch64-darwin.patch
|
||||||
|
];
|
||||||
|
|
||||||
|
postPatch = "patchShebangs .";
|
||||||
|
|
||||||
|
# GHC needs the locale configured during the Haddock phase.
|
||||||
|
LANG = "en_US.UTF-8";
|
||||||
|
|
||||||
|
# GHC is a bit confused on its cross terminology.
|
||||||
|
# TODO(@sternenseemann): investigate coreutils dependencies and pass absolute paths
|
||||||
|
preConfigure = ''
|
||||||
|
for env in $(env | grep '^TARGET_' | sed -E 's|\+?=.*||'); do
|
||||||
|
export "''${env#TARGET_}=''${!env}"
|
||||||
|
done
|
||||||
|
# GHC is a bit confused on its cross terminology, as these would normally be
|
||||||
|
# the *host* tools.
|
||||||
|
export CC="${targetCC}/bin/${targetCC.targetPrefix}cc"
|
||||||
|
export CXX="${targetCC}/bin/${targetCC.targetPrefix}c++"
|
||||||
|
# Use gold to work around https://sourceware.org/bugzilla/show_bug.cgi?id=16177
|
||||||
|
export LD="${targetCC.bintools}/bin/${targetCC.bintools.targetPrefix}ld${lib.optionalString useLdGold ".gold"}"
|
||||||
|
export AS="${targetCC.bintools.bintools}/bin/${targetCC.bintools.targetPrefix}as"
|
||||||
|
export AR="${targetCC.bintools.bintools}/bin/${targetCC.bintools.targetPrefix}ar"
|
||||||
|
export NM="${targetCC.bintools.bintools}/bin/${targetCC.bintools.targetPrefix}nm"
|
||||||
|
export RANLIB="${targetCC.bintools.bintools}/bin/${targetCC.bintools.targetPrefix}ranlib"
|
||||||
|
export READELF="${targetCC.bintools.bintools}/bin/${targetCC.bintools.targetPrefix}readelf"
|
||||||
|
export STRIP="${bintoolsFor.strip}/bin/${bintoolsFor.strip.targetPrefix}strip"
|
||||||
|
'' + lib.optionalString (stdenv.targetPlatform.linker == "cctools") ''
|
||||||
|
export OTOOL="${targetCC.bintools.bintools}/bin/${targetCC.bintools.targetPrefix}otool"
|
||||||
|
export INSTALL_NAME_TOOL="${bintoolsFor.install_name_tool}/bin/${bintoolsFor.install_name_tool.targetPrefix}install_name_tool"
|
||||||
|
'' + lib.optionalString useLLVM ''
|
||||||
|
export LLC="${lib.getBin buildTargetLlvmPackages.llvm}/bin/llc"
|
||||||
|
export OPT="${lib.getBin buildTargetLlvmPackages.llvm}/bin/opt"
|
||||||
|
'' + lib.optionalString (useLLVM && stdenv.targetPlatform.isDarwin) ''
|
||||||
|
# LLVM backend on Darwin needs clang: https://downloads.haskell.org/~ghc/latest/docs/html/users_guide/codegens.html#llvm-code-generator-fllvm
|
||||||
|
export CLANG="${buildTargetLlvmPackages.clang}/bin/${buildTargetLlvmPackages.clang.targetPrefix}clang"
|
||||||
|
'' + ''
|
||||||
|
echo -n "${buildMK}" > mk/build.mk
|
||||||
|
'' + lib.optionalString (stdenv.isLinux && hostPlatform.libc == "glibc") ''
|
||||||
|
export LOCALE_ARCHIVE="${glibcLocales}/lib/locale/locale-archive"
|
||||||
|
'' + lib.optionalString (!stdenv.isDarwin) ''
|
||||||
|
export NIX_LDFLAGS+=" -rpath $out/lib/ghc-${version}"
|
||||||
|
'' + lib.optionalString stdenv.isDarwin ''
|
||||||
|
export NIX_LDFLAGS+=" -no_dtrace_dof"
|
||||||
|
|
||||||
|
# GHC tries the host xattr /usr/bin/xattr by default which fails since it expects python to be 2.7
|
||||||
|
export XATTR=${lib.getBin xattr}/bin/xattr
|
||||||
|
'' + lib.optionalString targetPlatform.useAndroidPrebuilt ''
|
||||||
|
sed -i -e '5i ,("armv7a-unknown-linux-androideabi", ("e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64", "cortex-a8", ""))' llvm-targets
|
||||||
|
'' + lib.optionalString targetPlatform.isMusl ''
|
||||||
|
echo "patching llvm-targets for musl targets..."
|
||||||
|
echo "Cloning these existing '*-linux-gnu*' targets:"
|
||||||
|
grep linux-gnu llvm-targets | sed 's/^/ /'
|
||||||
|
echo "(go go gadget sed)"
|
||||||
|
sed -i 's,\(^.*linux-\)gnu\(.*\)$,\0\n\1musl\2,' llvm-targets
|
||||||
|
echo "llvm-targets now contains these '*-linux-musl*' targets:"
|
||||||
|
grep linux-musl llvm-targets | sed 's/^/ /'
|
||||||
|
|
||||||
|
echo "And now patching to preserve '-musleabi' as done with '-gnueabi'"
|
||||||
|
# (aclocal.m4 is actual source, but patch configure as well since we don't re-gen)
|
||||||
|
for x in configure aclocal.m4; do
|
||||||
|
substituteInPlace $x \
|
||||||
|
--replace '*-android*|*-gnueabi*)' \
|
||||||
|
'*-android*|*-gnueabi*|*-musleabi*)'
|
||||||
|
done
|
||||||
|
'';
|
||||||
|
|
||||||
|
# TODO(@Ericson2314): Always pass "--target" and always prefix.
|
||||||
|
configurePlatforms = [ "build" "host" ]
|
||||||
|
++ lib.optional (targetPlatform != hostPlatform) "target";
|
||||||
|
|
||||||
|
# `--with` flags for libraries needed for RTS linker
|
||||||
|
configureFlags = [
|
||||||
|
"--datadir=$doc/share/doc/ghc"
|
||||||
|
"--with-curses-includes=${ncurses.dev}/include" "--with-curses-libraries=${ncurses.out}/lib"
|
||||||
|
] ++ lib.optionals (libffi != null) [
|
||||||
|
"--with-system-libffi"
|
||||||
|
"--with-ffi-includes=${targetPackages.libffi.dev}/include"
|
||||||
|
"--with-ffi-libraries=${targetPackages.libffi.out}/lib"
|
||||||
|
] ++ lib.optionals (targetPlatform == hostPlatform && !enableNativeBignum) [
|
||||||
|
"--with-gmp-includes=${targetPackages.gmp.dev}/include"
|
||||||
|
"--with-gmp-libraries=${targetPackages.gmp.out}/lib"
|
||||||
|
] ++ lib.optionals (targetPlatform == hostPlatform && hostPlatform.libc != "glibc" && !targetPlatform.isWindows) [
|
||||||
|
"--with-iconv-includes=${libiconv}/include"
|
||||||
|
"--with-iconv-libraries=${libiconv}/lib"
|
||||||
|
] ++ lib.optionals (targetPlatform != hostPlatform) [
|
||||||
|
"--enable-bootstrap-with-devel-snapshot"
|
||||||
|
] ++ lib.optionals useLdGold [
|
||||||
|
"CFLAGS=-fuse-ld=gold"
|
||||||
|
"CONF_GCC_LINKER_OPTS_STAGE1=-fuse-ld=gold"
|
||||||
|
"CONF_GCC_LINKER_OPTS_STAGE2=-fuse-ld=gold"
|
||||||
|
] ++ lib.optionals (disableLargeAddressSpace) [
|
||||||
|
"--disable-large-address-space"
|
||||||
|
];
|
||||||
|
|
||||||
|
# Make sure we never relax`$PATH` and hooks support for compatibility.
|
||||||
|
strictDeps = true;
|
||||||
|
|
||||||
|
# Don’t add -liconv to LDFLAGS automatically so that GHC will add it itself.
|
||||||
|
dontAddExtraLibs = true;
|
||||||
|
|
||||||
|
nativeBuildInputs = [
|
||||||
|
perl autoconf automake m4 python3
|
||||||
|
ghc bootPkgs.alex bootPkgs.happy bootPkgs.hscolour
|
||||||
|
] ++ lib.optionals (stdenv.isDarwin && stdenv.isAarch64) [
|
||||||
|
autoSignDarwinBinariesHook
|
||||||
|
] ++ lib.optionals enableDocs [
|
||||||
|
sphinx
|
||||||
|
];
|
||||||
|
|
||||||
|
# For building runtime libs
|
||||||
|
depsBuildTarget = toolsForTarget;
|
||||||
|
|
||||||
|
buildInputs = [ perl bash ] ++ (libDeps hostPlatform);
|
||||||
|
|
||||||
|
depsTargetTarget = map lib.getDev (libDeps targetPlatform);
|
||||||
|
depsTargetTargetPropagated = map (lib.getOutput "out") (libDeps targetPlatform);
|
||||||
|
|
||||||
|
# required, because otherwise all symbols from HSffi.o are stripped, and
|
||||||
|
# that in turn causes GHCi to abort
|
||||||
|
stripDebugFlags = [ "-S" ] ++ lib.optional (!targetPlatform.isDarwin) "--keep-file-symbols";
|
||||||
|
|
||||||
|
checkTarget = "test";
|
||||||
|
|
||||||
|
hardeningDisable =
|
||||||
|
[ "format" ]
|
||||||
|
# In nixpkgs, musl based builds currently enable `pie` hardening by default
|
||||||
|
# (see `defaultHardeningFlags` in `make-derivation.nix`).
|
||||||
|
# But GHC cannot currently produce outputs that are ready for `-pie` linking.
|
||||||
|
# Thus, disable `pie` hardening, otherwise `recompile with -fPIE` errors appear.
|
||||||
|
# See:
|
||||||
|
# * https://github.com/NixOS/nixpkgs/issues/129247
|
||||||
|
# * https://gitlab.haskell.org/ghc/ghc/-/issues/19580
|
||||||
|
++ lib.optional stdenv.targetPlatform.isMusl "pie";
|
||||||
|
|
||||||
|
# big-parallel allows us to build with more than 2 cores on
|
||||||
|
# Hydra which already warrants a significant speedup
|
||||||
|
requiredSystemFeatures = [ "big-parallel" ];
|
||||||
|
|
||||||
|
postInstall = ''
|
||||||
|
# Install the bash completion file.
|
||||||
|
install -D -m 444 utils/completion/ghc.bash $out/share/bash-completion/completions/${targetPrefix}ghc
|
||||||
|
'';
|
||||||
|
|
||||||
|
passthru = {
|
||||||
|
inherit bootPkgs targetPrefix;
|
||||||
|
|
||||||
|
inherit llvmPackages;
|
||||||
|
inherit enableShared;
|
||||||
|
|
||||||
|
# This is used by the haskell builder to query
|
||||||
|
# the presence of the haddock program.
|
||||||
|
hasHaddock = enableHaddockProgram;
|
||||||
|
|
||||||
|
# Our Cabal compiler name
|
||||||
|
haskellCompilerName = "ghc-${version}";
|
||||||
|
};
|
||||||
|
|
||||||
|
meta = {
|
||||||
|
homepage = "http://haskell.org/ghc";
|
||||||
|
description = "The Glasgow Haskell Compiler";
|
||||||
|
maintainers = with lib.maintainers; [ ];
|
||||||
|
timeout = 24 * 3600;
|
||||||
|
inherit (ghc.meta) license platforms;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // lib.optionalAttrs targetPlatform.useAndroidPrebuilt {
|
||||||
|
dontStrip = true;
|
||||||
|
dontPatchELF = true;
|
||||||
|
noAuditTmpdir = true;
|
||||||
|
})
|
387
pkgs/by-name/ha/haskell/ghc/9.2.8.nix
Normal file
387
pkgs/by-name/ha/haskell/ghc/9.2.8.nix
Normal file
|
@ -0,0 +1,387 @@
|
||||||
|
{ lib, stdenv, pkgsBuildTarget, pkgsHostTarget, targetPackages
|
||||||
|
|
||||||
|
# build-tools
|
||||||
|
, bootPkgs
|
||||||
|
, autoconf, automake, coreutils, fetchpatch, fetchurl, perl, python3, m4, sphinx
|
||||||
|
, xattr, autoSignDarwinBinariesHook
|
||||||
|
, bash
|
||||||
|
|
||||||
|
, libiconv ? null, ncurses
|
||||||
|
, glibcLocales ? null
|
||||||
|
|
||||||
|
, # GHC can be built with system libffi or a bundled one.
|
||||||
|
libffi ? null
|
||||||
|
|
||||||
|
, useLLVM ? !(stdenv.targetPlatform.isx86
|
||||||
|
|| stdenv.targetPlatform.isPower
|
||||||
|
|| stdenv.targetPlatform.isSparc
|
||||||
|
|| stdenv.targetPlatform.isAarch64)
|
||||||
|
, # LLVM is conceptually a run-time-only dependency, but for
|
||||||
|
# non-x86, we need LLVM to bootstrap later stages, so it becomes a
|
||||||
|
# build-time dependency too.
|
||||||
|
buildTargetLlvmPackages, llvmPackages
|
||||||
|
|
||||||
|
, # If enabled, GHC will be built with the GPL-free but slightly slower native
|
||||||
|
# bignum backend instead of the faster but GPLed gmp backend.
|
||||||
|
enableNativeBignum ? !(lib.meta.availableOn stdenv.hostPlatform gmp
|
||||||
|
&& lib.meta.availableOn stdenv.targetPlatform gmp)
|
||||||
|
, gmp
|
||||||
|
|
||||||
|
, # If enabled, use -fPIC when compiling static libs.
|
||||||
|
enableRelocatedStaticLibs ? stdenv.targetPlatform != stdenv.hostPlatform
|
||||||
|
|
||||||
|
, enableProfiledLibs ? true
|
||||||
|
|
||||||
|
, # Whether to build dynamic libs for the standard library (on the target
|
||||||
|
# platform). Static libs are always built.
|
||||||
|
enableShared ? with stdenv.targetPlatform; !isWindows && !useiOSPrebuilt && !isStatic
|
||||||
|
|
||||||
|
, # Whether to build terminfo.
|
||||||
|
enableTerminfo ? !stdenv.targetPlatform.isWindows
|
||||||
|
|
||||||
|
, # What flavour to build. An empty string indicates no
|
||||||
|
# specific flavour and falls back to ghc default values.
|
||||||
|
ghcFlavour ? lib.optionalString (stdenv.targetPlatform != stdenv.hostPlatform)
|
||||||
|
(if useLLVM then "perf-cross" else "perf-cross-ncg")
|
||||||
|
|
||||||
|
, # Whether to build sphinx documentation.
|
||||||
|
enableDocs ? (
|
||||||
|
# Docs disabled if we are building on musl because it's a large task to keep
|
||||||
|
# all `sphinx` dependencies building in this environment.
|
||||||
|
!stdenv.buildPlatform.isMusl
|
||||||
|
)
|
||||||
|
|
||||||
|
, enableHaddockProgram ?
|
||||||
|
# Disabled for cross; see note [HADDOCK_DOCS].
|
||||||
|
(stdenv.targetPlatform == stdenv.hostPlatform)
|
||||||
|
|
||||||
|
, # Whether to disable the large address space allocator
|
||||||
|
# necessary fix for iOS: https://www.reddit.com/r/haskell/comments/4ttdz1/building_an_osxi386_to_iosarm64_cross_compiler/d5qvd67/
|
||||||
|
disableLargeAddressSpace ? stdenv.targetPlatform.isiOS
|
||||||
|
}:
|
||||||
|
|
||||||
|
assert !enableNativeBignum -> gmp != null;
|
||||||
|
|
||||||
|
# Cross cannot currently build the `haddock` program for silly reasons,
|
||||||
|
# see note [HADDOCK_DOCS].
|
||||||
|
assert (stdenv.targetPlatform != stdenv.hostPlatform) -> !enableHaddockProgram;
|
||||||
|
|
||||||
|
let
|
||||||
|
inherit (stdenv) buildPlatform hostPlatform targetPlatform;
|
||||||
|
|
||||||
|
inherit (bootPkgs) ghc;
|
||||||
|
|
||||||
|
# TODO(@Ericson2314) Make unconditional
|
||||||
|
targetPrefix = lib.optionalString
|
||||||
|
(targetPlatform != hostPlatform)
|
||||||
|
"${targetPlatform.config}-";
|
||||||
|
|
||||||
|
buildMK = ''
|
||||||
|
BuildFlavour = ${ghcFlavour}
|
||||||
|
ifneq \"\$(BuildFlavour)\" \"\"
|
||||||
|
include mk/flavours/\$(BuildFlavour).mk
|
||||||
|
endif
|
||||||
|
BUILD_SPHINX_HTML = ${if enableDocs then "YES" else "NO"}
|
||||||
|
BUILD_SPHINX_PDF = NO
|
||||||
|
'' +
|
||||||
|
# Note [HADDOCK_DOCS]:
|
||||||
|
# Unfortunately currently `HADDOCK_DOCS` controls both whether the `haddock`
|
||||||
|
# program is built (which we generally always want to have a complete GHC install)
|
||||||
|
# and whether it is run on the GHC sources to generate hyperlinked source code
|
||||||
|
# (which is impossible for cross-compilation); see:
|
||||||
|
# https://gitlab.haskell.org/ghc/ghc/-/issues/20077
|
||||||
|
# This implies that currently a cross-compiled GHC will never have a `haddock`
|
||||||
|
# program, so it can never generate haddocks for any packages.
|
||||||
|
# If this is solved in the future, we'd like to unconditionally
|
||||||
|
# build the haddock program (removing the `enableHaddockProgram` option).
|
||||||
|
''
|
||||||
|
HADDOCK_DOCS = ${if enableHaddockProgram then "YES" else "NO"}
|
||||||
|
# Build haddocks for boot packages with hyperlinking
|
||||||
|
EXTRA_HADDOCK_OPTS += --hyperlinked-source --quickjump
|
||||||
|
|
||||||
|
DYNAMIC_GHC_PROGRAMS = ${if enableShared then "YES" else "NO"}
|
||||||
|
BIGNUM_BACKEND = ${if enableNativeBignum then "native" else "gmp"}
|
||||||
|
'' + lib.optionalString (targetPlatform != hostPlatform) ''
|
||||||
|
Stage1Only = ${if targetPlatform.system == hostPlatform.system then "NO" else "YES"}
|
||||||
|
CrossCompilePrefix = ${targetPrefix}
|
||||||
|
'' + lib.optionalString (!enableProfiledLibs) ''
|
||||||
|
BUILD_PROF_LIBS = NO
|
||||||
|
'' +
|
||||||
|
# -fexternal-dynamic-refs apparently (because it's not clear from the documentation)
|
||||||
|
# makes the GHC RTS able to load static libraries, which may be needed for TemplateHaskell.
|
||||||
|
# This solution was described in https://www.tweag.io/blog/2020-09-30-bazel-static-haskell
|
||||||
|
lib.optionalString enableRelocatedStaticLibs ''
|
||||||
|
GhcLibHcOpts += -fPIC -fexternal-dynamic-refs
|
||||||
|
GhcRtsHcOpts += -fPIC -fexternal-dynamic-refs
|
||||||
|
'' + lib.optionalString targetPlatform.useAndroidPrebuilt ''
|
||||||
|
EXTRA_CC_OPTS += -std=gnu99
|
||||||
|
'';
|
||||||
|
|
||||||
|
# Splicer will pull out correct variations
|
||||||
|
libDeps = platform: lib.optional enableTerminfo ncurses
|
||||||
|
++ [libffi]
|
||||||
|
++ lib.optional (!enableNativeBignum) gmp
|
||||||
|
++ lib.optional (platform.libc != "glibc" && !targetPlatform.isWindows) libiconv;
|
||||||
|
|
||||||
|
# TODO(@sternenseemann): is buildTarget LLVM unnecessary?
|
||||||
|
# GHC doesn't seem to have {LLC,OPT}_HOST
|
||||||
|
toolsForTarget = [
|
||||||
|
pkgsBuildTarget.targetPackages.stdenv.cc
|
||||||
|
] ++ lib.optional useLLVM buildTargetLlvmPackages.llvm;
|
||||||
|
|
||||||
|
targetCC = builtins.head toolsForTarget;
|
||||||
|
|
||||||
|
# Sometimes we have to dispatch between the bintools wrapper and the unwrapped
|
||||||
|
# derivation for certain tools depending on the platform.
|
||||||
|
bintoolsFor = {
|
||||||
|
# GHC needs install_name_tool on all darwin platforms. On aarch64-darwin it is
|
||||||
|
# part of the bintools wrapper (due to codesigning requirements), but not on
|
||||||
|
# x86_64-darwin.
|
||||||
|
install_name_tool =
|
||||||
|
if stdenv.targetPlatform.isAarch64
|
||||||
|
then targetCC.bintools
|
||||||
|
else targetCC.bintools.bintools;
|
||||||
|
# Same goes for strip.
|
||||||
|
strip =
|
||||||
|
# TODO(@sternenseemann): also use wrapper if linker == "bfd" or "gold"
|
||||||
|
if stdenv.targetPlatform.isAarch64 && stdenv.targetPlatform.isDarwin
|
||||||
|
then targetCC.bintools
|
||||||
|
else targetCC.bintools.bintools;
|
||||||
|
};
|
||||||
|
|
||||||
|
# Use gold either following the default, or to avoid the BFD linker due to some bugs / perf issues.
|
||||||
|
# But we cannot avoid BFD when using musl libc due to https://sourceware.org/bugzilla/show_bug.cgi?id=23856
|
||||||
|
# see #84670 and #49071 for more background.
|
||||||
|
useLdGold = targetPlatform.linker == "gold" ||
|
||||||
|
(targetPlatform.linker == "bfd" && (targetCC.bintools.bintools.hasGold or false) && !targetPlatform.isMusl);
|
||||||
|
|
||||||
|
# Makes debugging easier to see which variant is at play in `nix-store -q --tree`.
|
||||||
|
variantSuffix = lib.concatStrings [
|
||||||
|
(lib.optionalString stdenv.hostPlatform.isMusl "-musl")
|
||||||
|
(lib.optionalString enableNativeBignum "-native-bignum")
|
||||||
|
];
|
||||||
|
|
||||||
|
in
|
||||||
|
|
||||||
|
# C compiler, bintools and LLVM are used at build time, but will also leak into
|
||||||
|
# the resulting GHC's settings file and used at runtime. This means that we are
|
||||||
|
# currently only able to build GHC if hostPlatform == buildPlatform.
|
||||||
|
assert targetCC == pkgsHostTarget.targetPackages.stdenv.cc;
|
||||||
|
assert buildTargetLlvmPackages.llvm == llvmPackages.llvm;
|
||||||
|
assert stdenv.targetPlatform.isDarwin -> buildTargetLlvmPackages.clang == llvmPackages.clang;
|
||||||
|
|
||||||
|
stdenv.mkDerivation (rec {
|
||||||
|
version = "9.2.8";
|
||||||
|
pname = "${targetPrefix}ghc${variantSuffix}";
|
||||||
|
|
||||||
|
src = fetchurl {
|
||||||
|
url = "https://downloads.haskell.org/ghc/${version}/ghc-${version}-src.tar.xz";
|
||||||
|
sha256 = "sha256-XxPReGv0/RL0tF+qN6vttbs/NtXlj32lMH6L/oilZ6E=";
|
||||||
|
};
|
||||||
|
|
||||||
|
enableParallelBuilding = true;
|
||||||
|
|
||||||
|
outputs = [ "out" "doc" ];
|
||||||
|
|
||||||
|
patches = [
|
||||||
|
# Fix docs build with sphinx >= 6.0
|
||||||
|
# https://gitlab.haskell.org/ghc/ghc/-/issues/22766
|
||||||
|
(fetchpatch {
|
||||||
|
name = "ghc-docs-sphinx-6.0.patch";
|
||||||
|
url = "https://gitlab.haskell.org/ghc/ghc/-/commit/10e94a556b4f90769b7fd718b9790d58ae566600.patch";
|
||||||
|
sha256 = "0kmhfamr16w8gch0lgln2912r8aryjky1hfcda3jkcwa5cdzgjdv";
|
||||||
|
})
|
||||||
|
# Fix docs build with Sphinx >= 7 https://gitlab.haskell.org/ghc/ghc/-/issues/24129
|
||||||
|
./docs-sphinx-7.patch
|
||||||
|
# fix hyperlinked haddock sources: https://github.com/haskell/haddock/pull/1482
|
||||||
|
(fetchpatch {
|
||||||
|
url = "https://patch-diff.githubusercontent.com/raw/haskell/haddock/pull/1482.patch";
|
||||||
|
sha256 = "sha256-8w8QUCsODaTvknCDGgTfFNZa8ZmvIKaKS+2ZJZ9foYk=";
|
||||||
|
extraPrefix = "utils/haddock/";
|
||||||
|
stripLen = 1;
|
||||||
|
})
|
||||||
|
# Don't generate code that doesn't compile when --enable-relocatable is passed to Setup.hs
|
||||||
|
# Can be removed if the Cabal library included with ghc backports the linked fix
|
||||||
|
(fetchpatch {
|
||||||
|
url = "https://github.com/haskell/cabal/commit/6c796218c92f93c95e94d5ec2d077f6956f68e98.patch";
|
||||||
|
stripLen = 1;
|
||||||
|
extraPrefix = "libraries/Cabal/";
|
||||||
|
sha256 = "sha256-yRQ6YmMiwBwiYseC5BsrEtDgFbWvst+maGgDtdD0vAY=";
|
||||||
|
})
|
||||||
|
] ++ lib.optionals (stdenv.targetPlatform.isDarwin && stdenv.targetPlatform.isAarch64) [
|
||||||
|
# Prevent the paths module from emitting symbols that we don't use
|
||||||
|
# when building with separate outputs.
|
||||||
|
#
|
||||||
|
# These cause problems as they're not eliminated by GHC's dead code
|
||||||
|
# elimination on aarch64-darwin. (see
|
||||||
|
# https://github.com/NixOS/nixpkgs/issues/140774 for details).
|
||||||
|
./Cabal-at-least-3.6-paths-fix-cycle-aarch64-darwin.patch
|
||||||
|
];
|
||||||
|
|
||||||
|
postPatch = "patchShebangs .";
|
||||||
|
|
||||||
|
# GHC needs the locale configured during the Haddock phase.
|
||||||
|
LANG = "en_US.UTF-8";
|
||||||
|
|
||||||
|
# GHC is a bit confused on its cross terminology.
|
||||||
|
# TODO(@sternenseemann): investigate coreutils dependencies and pass absolute paths
|
||||||
|
preConfigure = ''
|
||||||
|
for env in $(env | grep '^TARGET_' | sed -E 's|\+?=.*||'); do
|
||||||
|
export "''${env#TARGET_}=''${!env}"
|
||||||
|
done
|
||||||
|
# GHC is a bit confused on its cross terminology, as these would normally be
|
||||||
|
# the *host* tools.
|
||||||
|
export CC="${targetCC}/bin/${targetCC.targetPrefix}cc"
|
||||||
|
export CXX="${targetCC}/bin/${targetCC.targetPrefix}c++"
|
||||||
|
# Use gold to work around https://sourceware.org/bugzilla/show_bug.cgi?id=16177
|
||||||
|
export LD="${targetCC.bintools}/bin/${targetCC.bintools.targetPrefix}ld${lib.optionalString useLdGold ".gold"}"
|
||||||
|
export AS="${targetCC.bintools.bintools}/bin/${targetCC.bintools.targetPrefix}as"
|
||||||
|
export AR="${targetCC.bintools.bintools}/bin/${targetCC.bintools.targetPrefix}ar"
|
||||||
|
export NM="${targetCC.bintools.bintools}/bin/${targetCC.bintools.targetPrefix}nm"
|
||||||
|
export RANLIB="${targetCC.bintools.bintools}/bin/${targetCC.bintools.targetPrefix}ranlib"
|
||||||
|
export READELF="${targetCC.bintools.bintools}/bin/${targetCC.bintools.targetPrefix}readelf"
|
||||||
|
export STRIP="${bintoolsFor.strip}/bin/${bintoolsFor.strip.targetPrefix}strip"
|
||||||
|
'' + lib.optionalString (stdenv.targetPlatform.linker == "cctools") ''
|
||||||
|
export OTOOL="${targetCC.bintools.bintools}/bin/${targetCC.bintools.targetPrefix}otool"
|
||||||
|
export INSTALL_NAME_TOOL="${bintoolsFor.install_name_tool}/bin/${bintoolsFor.install_name_tool.targetPrefix}install_name_tool"
|
||||||
|
'' + lib.optionalString useLLVM ''
|
||||||
|
export LLC="${lib.getBin buildTargetLlvmPackages.llvm}/bin/llc"
|
||||||
|
export OPT="${lib.getBin buildTargetLlvmPackages.llvm}/bin/opt"
|
||||||
|
'' + lib.optionalString (useLLVM && stdenv.targetPlatform.isDarwin) ''
|
||||||
|
# LLVM backend on Darwin needs clang: https://downloads.haskell.org/~ghc/latest/docs/html/users_guide/codegens.html#llvm-code-generator-fllvm
|
||||||
|
export CLANG="${buildTargetLlvmPackages.clang}/bin/${buildTargetLlvmPackages.clang.targetPrefix}clang"
|
||||||
|
'' + ''
|
||||||
|
echo -n "${buildMK}" > mk/build.mk
|
||||||
|
'' + lib.optionalString (stdenv.isLinux && hostPlatform.libc == "glibc") ''
|
||||||
|
export LOCALE_ARCHIVE="${glibcLocales}/lib/locale/locale-archive"
|
||||||
|
'' + lib.optionalString (!stdenv.isDarwin) ''
|
||||||
|
export NIX_LDFLAGS+=" -rpath $out/lib/ghc-${version}"
|
||||||
|
'' + lib.optionalString stdenv.isDarwin ''
|
||||||
|
export NIX_LDFLAGS+=" -no_dtrace_dof"
|
||||||
|
|
||||||
|
# GHC tries the host xattr /usr/bin/xattr by default which fails since it expects python to be 2.7
|
||||||
|
export XATTR=${lib.getBin xattr}/bin/xattr
|
||||||
|
'' + lib.optionalString targetPlatform.useAndroidPrebuilt ''
|
||||||
|
sed -i -e '5i ,("armv7a-unknown-linux-androideabi", ("e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64", "cortex-a8", ""))' llvm-targets
|
||||||
|
'' + lib.optionalString targetPlatform.isMusl ''
|
||||||
|
echo "patching llvm-targets for musl targets..."
|
||||||
|
echo "Cloning these existing '*-linux-gnu*' targets:"
|
||||||
|
grep linux-gnu llvm-targets | sed 's/^/ /'
|
||||||
|
echo "(go go gadget sed)"
|
||||||
|
sed -i 's,\(^.*linux-\)gnu\(.*\)$,\0\n\1musl\2,' llvm-targets
|
||||||
|
echo "llvm-targets now contains these '*-linux-musl*' targets:"
|
||||||
|
grep linux-musl llvm-targets | sed 's/^/ /'
|
||||||
|
|
||||||
|
echo "And now patching to preserve '-musleabi' as done with '-gnueabi'"
|
||||||
|
# (aclocal.m4 is actual source, but patch configure as well since we don't re-gen)
|
||||||
|
for x in configure aclocal.m4; do
|
||||||
|
substituteInPlace $x \
|
||||||
|
--replace '*-android*|*-gnueabi*)' \
|
||||||
|
'*-android*|*-gnueabi*|*-musleabi*)'
|
||||||
|
done
|
||||||
|
'';
|
||||||
|
|
||||||
|
# TODO(@Ericson2314): Always pass "--target" and always prefix.
|
||||||
|
configurePlatforms = [ "build" "host" ]
|
||||||
|
++ lib.optional (targetPlatform != hostPlatform) "target";
|
||||||
|
|
||||||
|
# `--with` flags for libraries needed for RTS linker
|
||||||
|
configureFlags = [
|
||||||
|
"--datadir=$doc/share/doc/ghc"
|
||||||
|
"--with-curses-includes=${ncurses.dev}/include" "--with-curses-libraries=${ncurses.out}/lib"
|
||||||
|
] ++ lib.optionals (libffi != null) [
|
||||||
|
"--with-system-libffi"
|
||||||
|
"--with-ffi-includes=${targetPackages.libffi.dev}/include"
|
||||||
|
"--with-ffi-libraries=${targetPackages.libffi.out}/lib"
|
||||||
|
] ++ lib.optionals (targetPlatform == hostPlatform && !enableNativeBignum) [
|
||||||
|
"--with-gmp-includes=${targetPackages.gmp.dev}/include"
|
||||||
|
"--with-gmp-libraries=${targetPackages.gmp.out}/lib"
|
||||||
|
] ++ lib.optionals (targetPlatform == hostPlatform && hostPlatform.libc != "glibc" && !targetPlatform.isWindows) [
|
||||||
|
"--with-iconv-includes=${libiconv}/include"
|
||||||
|
"--with-iconv-libraries=${libiconv}/lib"
|
||||||
|
] ++ lib.optionals (targetPlatform != hostPlatform) [
|
||||||
|
"--enable-bootstrap-with-devel-snapshot"
|
||||||
|
] ++ lib.optionals useLdGold [
|
||||||
|
"CFLAGS=-fuse-ld=gold"
|
||||||
|
"CONF_GCC_LINKER_OPTS_STAGE1=-fuse-ld=gold"
|
||||||
|
"CONF_GCC_LINKER_OPTS_STAGE2=-fuse-ld=gold"
|
||||||
|
] ++ lib.optionals (disableLargeAddressSpace) [
|
||||||
|
"--disable-large-address-space"
|
||||||
|
];
|
||||||
|
|
||||||
|
# Make sure we never relax`$PATH` and hooks support for compatibility.
|
||||||
|
strictDeps = true;
|
||||||
|
|
||||||
|
# Don’t add -liconv to LDFLAGS automatically so that GHC will add it itself.
|
||||||
|
dontAddExtraLibs = true;
|
||||||
|
|
||||||
|
nativeBuildInputs = [
|
||||||
|
perl autoconf automake m4 python3
|
||||||
|
ghc bootPkgs.alex bootPkgs.happy bootPkgs.hscolour
|
||||||
|
] ++ lib.optionals (stdenv.isDarwin && stdenv.isAarch64) [
|
||||||
|
autoSignDarwinBinariesHook
|
||||||
|
] ++ lib.optionals enableDocs [
|
||||||
|
sphinx
|
||||||
|
];
|
||||||
|
|
||||||
|
# For building runtime libs
|
||||||
|
depsBuildTarget = toolsForTarget;
|
||||||
|
|
||||||
|
buildInputs = [ perl bash ] ++ (libDeps hostPlatform);
|
||||||
|
|
||||||
|
depsTargetTarget = map lib.getDev (libDeps targetPlatform);
|
||||||
|
depsTargetTargetPropagated = map (lib.getOutput "out") (libDeps targetPlatform);
|
||||||
|
|
||||||
|
# required, because otherwise all symbols from HSffi.o are stripped, and
|
||||||
|
# that in turn causes GHCi to abort
|
||||||
|
stripDebugFlags = [ "-S" ] ++ lib.optional (!targetPlatform.isDarwin) "--keep-file-symbols";
|
||||||
|
|
||||||
|
checkTarget = "test";
|
||||||
|
|
||||||
|
hardeningDisable =
|
||||||
|
[ "format" ]
|
||||||
|
# In nixpkgs, musl based builds currently enable `pie` hardening by default
|
||||||
|
# (see `defaultHardeningFlags` in `make-derivation.nix`).
|
||||||
|
# But GHC cannot currently produce outputs that are ready for `-pie` linking.
|
||||||
|
# Thus, disable `pie` hardening, otherwise `recompile with -fPIE` errors appear.
|
||||||
|
# See:
|
||||||
|
# * https://github.com/NixOS/nixpkgs/issues/129247
|
||||||
|
# * https://gitlab.haskell.org/ghc/ghc/-/issues/19580
|
||||||
|
++ lib.optional stdenv.targetPlatform.isMusl "pie";
|
||||||
|
|
||||||
|
# big-parallel allows us to build with more than 2 cores on
|
||||||
|
# Hydra which already warrants a significant speedup
|
||||||
|
requiredSystemFeatures = [ "big-parallel" ];
|
||||||
|
|
||||||
|
postInstall = ''
|
||||||
|
# Install the bash completion file.
|
||||||
|
install -D -m 444 utils/completion/ghc.bash $out/share/bash-completion/completions/${targetPrefix}ghc
|
||||||
|
'';
|
||||||
|
|
||||||
|
passthru = {
|
||||||
|
inherit bootPkgs targetPrefix;
|
||||||
|
|
||||||
|
inherit llvmPackages;
|
||||||
|
inherit enableShared;
|
||||||
|
|
||||||
|
# This is used by the haskell builder to query
|
||||||
|
# the presence of the haddock program.
|
||||||
|
hasHaddock = enableHaddockProgram;
|
||||||
|
|
||||||
|
# Our Cabal compiler name
|
||||||
|
haskellCompilerName = "ghc-${version}";
|
||||||
|
};
|
||||||
|
|
||||||
|
meta = {
|
||||||
|
homepage = "http://haskell.org/ghc";
|
||||||
|
description = "The Glasgow Haskell Compiler";
|
||||||
|
maintainers = with lib.maintainers; [ ];
|
||||||
|
timeout = 24 * 3600;
|
||||||
|
inherit (ghc.meta) license platforms;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // lib.optionalAttrs targetPlatform.useAndroidPrebuilt {
|
||||||
|
dontStrip = true;
|
||||||
|
dontPatchELF = true;
|
||||||
|
noAuditTmpdir = true;
|
||||||
|
})
|
394
pkgs/by-name/ha/haskell/ghc/9.4.5.nix
Normal file
394
pkgs/by-name/ha/haskell/ghc/9.4.5.nix
Normal file
|
@ -0,0 +1,394 @@
|
||||||
|
# DO NOT port this expression to hadrian. It is not possible to build a GHC
|
||||||
|
# cross compiler with 9.4.* and hadrian.
|
||||||
|
{ lib, stdenv, pkgsBuildTarget, pkgsHostTarget, targetPackages
|
||||||
|
|
||||||
|
# build-tools
|
||||||
|
, bootPkgs
|
||||||
|
, autoconf, automake, coreutils, fetchpatch, fetchurl, perl, python3, m4, sphinx
|
||||||
|
, xattr, autoSignDarwinBinariesHook
|
||||||
|
, bash
|
||||||
|
|
||||||
|
, libiconv ? null, ncurses
|
||||||
|
, glibcLocales ? null
|
||||||
|
|
||||||
|
, # GHC can be built with system libffi or a bundled one.
|
||||||
|
libffi ? null
|
||||||
|
|
||||||
|
, useLLVM ? !(stdenv.targetPlatform.isx86
|
||||||
|
|| stdenv.targetPlatform.isPower
|
||||||
|
|| stdenv.targetPlatform.isSparc
|
||||||
|
|| stdenv.targetPlatform.isAarch64)
|
||||||
|
, # LLVM is conceptually a run-time-only dependency, but for
|
||||||
|
# non-x86, we need LLVM to bootstrap later stages, so it becomes a
|
||||||
|
# build-time dependency too.
|
||||||
|
buildTargetLlvmPackages, llvmPackages
|
||||||
|
|
||||||
|
, # If enabled, GHC will be built with the GPL-free but slightly slower native
|
||||||
|
# bignum backend instead of the faster but GPLed gmp backend.
|
||||||
|
enableNativeBignum ? !(lib.meta.availableOn stdenv.hostPlatform gmp
|
||||||
|
&& lib.meta.availableOn stdenv.targetPlatform gmp)
|
||||||
|
, gmp
|
||||||
|
|
||||||
|
, # If enabled, use -fPIC when compiling static libs.
|
||||||
|
enableRelocatedStaticLibs ? stdenv.targetPlatform != stdenv.hostPlatform
|
||||||
|
|
||||||
|
, enableProfiledLibs ? true
|
||||||
|
|
||||||
|
, # Whether to build dynamic libs for the standard library (on the target
|
||||||
|
# platform). Static libs are always built.
|
||||||
|
enableShared ? with stdenv.targetPlatform; !isWindows && !useiOSPrebuilt && !isStatic
|
||||||
|
|
||||||
|
, # Whether to build terminfo.
|
||||||
|
enableTerminfo ? !stdenv.targetPlatform.isWindows
|
||||||
|
|
||||||
|
, # What flavour to build. An empty string indicates no
|
||||||
|
# specific flavour and falls back to ghc default values.
|
||||||
|
ghcFlavour ? lib.optionalString (stdenv.targetPlatform != stdenv.hostPlatform)
|
||||||
|
(if useLLVM then "perf-cross" else "perf-cross-ncg")
|
||||||
|
|
||||||
|
, # Whether to build sphinx documentation.
|
||||||
|
enableDocs ? (
|
||||||
|
# Docs disabled if we are building on musl because it's a large task to keep
|
||||||
|
# all `sphinx` dependencies building in this environment.
|
||||||
|
!stdenv.buildPlatform.isMusl
|
||||||
|
)
|
||||||
|
|
||||||
|
, enableHaddockProgram ?
|
||||||
|
# Disabled for cross; see note [HADDOCK_DOCS].
|
||||||
|
(stdenv.targetPlatform == stdenv.hostPlatform)
|
||||||
|
|
||||||
|
, # Whether to disable the large address space allocator
|
||||||
|
# necessary fix for iOS: https://www.reddit.com/r/haskell/comments/4ttdz1/building_an_osxi386_to_iosarm64_cross_compiler/d5qvd67/
|
||||||
|
disableLargeAddressSpace ? stdenv.targetPlatform.isiOS
|
||||||
|
}:
|
||||||
|
|
||||||
|
assert !enableNativeBignum -> gmp != null;
|
||||||
|
|
||||||
|
# Cross cannot currently build the `haddock` program for silly reasons,
|
||||||
|
# see note [HADDOCK_DOCS].
|
||||||
|
assert (stdenv.targetPlatform != stdenv.hostPlatform) -> !enableHaddockProgram;
|
||||||
|
|
||||||
|
let
|
||||||
|
inherit (stdenv) buildPlatform hostPlatform targetPlatform;
|
||||||
|
|
||||||
|
inherit (bootPkgs) ghc;
|
||||||
|
|
||||||
|
# TODO(@Ericson2314) Make unconditional
|
||||||
|
targetPrefix = lib.optionalString
|
||||||
|
(targetPlatform != hostPlatform)
|
||||||
|
"${targetPlatform.config}-";
|
||||||
|
|
||||||
|
buildMK = ''
|
||||||
|
BuildFlavour = ${ghcFlavour}
|
||||||
|
ifneq \"\$(BuildFlavour)\" \"\"
|
||||||
|
include mk/flavours/\$(BuildFlavour).mk
|
||||||
|
endif
|
||||||
|
BUILD_SPHINX_HTML = ${if enableDocs then "YES" else "NO"}
|
||||||
|
BUILD_SPHINX_PDF = NO
|
||||||
|
'' +
|
||||||
|
# Note [HADDOCK_DOCS]:
|
||||||
|
# Unfortunately currently `HADDOCK_DOCS` controls both whether the `haddock`
|
||||||
|
# program is built (which we generally always want to have a complete GHC install)
|
||||||
|
# and whether it is run on the GHC sources to generate hyperlinked source code
|
||||||
|
# (which is impossible for cross-compilation); see:
|
||||||
|
# https://gitlab.haskell.org/ghc/ghc/-/issues/20077
|
||||||
|
# This implies that currently a cross-compiled GHC will never have a `haddock`
|
||||||
|
# program, so it can never generate haddocks for any packages.
|
||||||
|
# If this is solved in the future, we'd like to unconditionally
|
||||||
|
# build the haddock program (removing the `enableHaddockProgram` option).
|
||||||
|
''
|
||||||
|
HADDOCK_DOCS = ${if enableHaddockProgram then "YES" else "NO"}
|
||||||
|
# Build haddocks for boot packages with hyperlinking
|
||||||
|
EXTRA_HADDOCK_OPTS += --hyperlinked-source --quickjump
|
||||||
|
|
||||||
|
DYNAMIC_GHC_PROGRAMS = ${if enableShared then "YES" else "NO"}
|
||||||
|
BIGNUM_BACKEND = ${if enableNativeBignum then "native" else "gmp"}
|
||||||
|
'' + lib.optionalString (targetPlatform != hostPlatform) ''
|
||||||
|
Stage1Only = ${if targetPlatform.system == hostPlatform.system then "NO" else "YES"}
|
||||||
|
CrossCompilePrefix = ${targetPrefix}
|
||||||
|
'' + lib.optionalString (!enableProfiledLibs) ''
|
||||||
|
BUILD_PROF_LIBS = NO
|
||||||
|
'' +
|
||||||
|
# -fexternal-dynamic-refs apparently (because it's not clear from the documentation)
|
||||||
|
# makes the GHC RTS able to load static libraries, which may be needed for TemplateHaskell.
|
||||||
|
# This solution was described in https://www.tweag.io/blog/2020-09-30-bazel-static-haskell
|
||||||
|
lib.optionalString enableRelocatedStaticLibs ''
|
||||||
|
GhcLibHcOpts += -fPIC -fexternal-dynamic-refs
|
||||||
|
GhcRtsHcOpts += -fPIC -fexternal-dynamic-refs
|
||||||
|
'' + lib.optionalString targetPlatform.useAndroidPrebuilt ''
|
||||||
|
EXTRA_CC_OPTS += -std=gnu99
|
||||||
|
'';
|
||||||
|
|
||||||
|
# Splicer will pull out correct variations
|
||||||
|
libDeps = platform: lib.optional enableTerminfo ncurses
|
||||||
|
++ [libffi]
|
||||||
|
++ lib.optional (!enableNativeBignum) gmp
|
||||||
|
++ lib.optional (platform.libc != "glibc" && !targetPlatform.isWindows) libiconv;
|
||||||
|
|
||||||
|
# TODO(@sternenseemann): is buildTarget LLVM unnecessary?
|
||||||
|
# GHC doesn't seem to have {LLC,OPT}_HOST
|
||||||
|
toolsForTarget = [
|
||||||
|
pkgsBuildTarget.targetPackages.stdenv.cc
|
||||||
|
] ++ lib.optional useLLVM buildTargetLlvmPackages.llvm;
|
||||||
|
|
||||||
|
targetCC = builtins.head toolsForTarget;
|
||||||
|
|
||||||
|
# Sometimes we have to dispatch between the bintools wrapper and the unwrapped
|
||||||
|
# derivation for certain tools depending on the platform.
|
||||||
|
bintoolsFor = {
|
||||||
|
# GHC needs install_name_tool on all darwin platforms. On aarch64-darwin it is
|
||||||
|
# part of the bintools wrapper (due to codesigning requirements), but not on
|
||||||
|
# x86_64-darwin.
|
||||||
|
install_name_tool =
|
||||||
|
if stdenv.targetPlatform.isAarch64
|
||||||
|
then targetCC.bintools
|
||||||
|
else targetCC.bintools.bintools;
|
||||||
|
# Same goes for strip.
|
||||||
|
strip =
|
||||||
|
# TODO(@sternenseemann): also use wrapper if linker == "bfd" or "gold"
|
||||||
|
if stdenv.targetPlatform.isAarch64 && stdenv.targetPlatform.isDarwin
|
||||||
|
then targetCC.bintools
|
||||||
|
else targetCC.bintools.bintools;
|
||||||
|
};
|
||||||
|
|
||||||
|
# Use gold either following the default, or to avoid the BFD linker due to some bugs / perf issues.
|
||||||
|
# But we cannot avoid BFD when using musl libc due to https://sourceware.org/bugzilla/show_bug.cgi?id=23856
|
||||||
|
# see #84670 and #49071 for more background.
|
||||||
|
useLdGold = targetPlatform.linker == "gold" ||
|
||||||
|
(targetPlatform.linker == "bfd" && (targetCC.bintools.bintools.hasGold or false) && !targetPlatform.isMusl);
|
||||||
|
|
||||||
|
# Makes debugging easier to see which variant is at play in `nix-store -q --tree`.
|
||||||
|
variantSuffix = lib.concatStrings [
|
||||||
|
(lib.optionalString stdenv.hostPlatform.isMusl "-musl")
|
||||||
|
(lib.optionalString enableNativeBignum "-native-bignum")
|
||||||
|
];
|
||||||
|
|
||||||
|
in
|
||||||
|
|
||||||
|
# C compiler, bintools and LLVM are used at build time, but will also leak into
|
||||||
|
# the resulting GHC's settings file and used at runtime. This means that we are
|
||||||
|
# currently only able to build GHC if hostPlatform == buildPlatform.
|
||||||
|
assert targetCC == pkgsHostTarget.targetPackages.stdenv.cc;
|
||||||
|
assert buildTargetLlvmPackages.llvm == llvmPackages.llvm;
|
||||||
|
assert stdenv.targetPlatform.isDarwin -> buildTargetLlvmPackages.clang == llvmPackages.clang;
|
||||||
|
|
||||||
|
stdenv.mkDerivation (rec {
|
||||||
|
version = "9.4.5";
|
||||||
|
pname = "${targetPrefix}ghc${variantSuffix}";
|
||||||
|
|
||||||
|
src = fetchurl {
|
||||||
|
url = "https://downloads.haskell.org/ghc/${version}/ghc-${version}-src.tar.xz";
|
||||||
|
sha256 = "6256cf9caf6d6dc7b611dcfbb247df2d528e85aa39d22a698e870e5a590e8601";
|
||||||
|
};
|
||||||
|
|
||||||
|
enableParallelBuilding = true;
|
||||||
|
|
||||||
|
outputs = [ "out" "doc" ];
|
||||||
|
|
||||||
|
patches = [
|
||||||
|
# Don't generate code that doesn't compile when --enable-relocatable is passed to Setup.hs
|
||||||
|
# Can be removed if the Cabal library included with ghc backports the linked fix
|
||||||
|
(fetchpatch {
|
||||||
|
url = "https://github.com/haskell/cabal/commit/6c796218c92f93c95e94d5ec2d077f6956f68e98.patch";
|
||||||
|
stripLen = 1;
|
||||||
|
extraPrefix = "libraries/Cabal/";
|
||||||
|
sha256 = "sha256-yRQ6YmMiwBwiYseC5BsrEtDgFbWvst+maGgDtdD0vAY=";
|
||||||
|
})
|
||||||
|
|
||||||
|
# Fix docs build with sphinx >= 6.0
|
||||||
|
# https://gitlab.haskell.org/ghc/ghc/-/issues/22766
|
||||||
|
(fetchpatch {
|
||||||
|
name = "ghc-docs-sphinx-6.0.patch";
|
||||||
|
url = "https://gitlab.haskell.org/ghc/ghc/-/commit/10e94a556b4f90769b7fd718b9790d58ae566600.patch";
|
||||||
|
sha256 = "0kmhfamr16w8gch0lgln2912r8aryjky1hfcda3jkcwa5cdzgjdv";
|
||||||
|
})
|
||||||
|
|
||||||
|
# Fix docs build with Sphinx >= 7 https://gitlab.haskell.org/ghc/ghc/-/issues/24129
|
||||||
|
./docs-sphinx-7.patch
|
||||||
|
] ++ lib.optionals (stdenv.targetPlatform.isDarwin && stdenv.targetPlatform.isAarch64) [
|
||||||
|
# Prevent the paths module from emitting symbols that we don't use
|
||||||
|
# when building with separate outputs.
|
||||||
|
#
|
||||||
|
# These cause problems as they're not eliminated by GHC's dead code
|
||||||
|
# elimination on aarch64-darwin. (see
|
||||||
|
# https://github.com/NixOS/nixpkgs/issues/140774 for details).
|
||||||
|
./Cabal-at-least-3.6-paths-fix-cycle-aarch64-darwin.patch
|
||||||
|
];
|
||||||
|
|
||||||
|
postPatch = "patchShebangs .";
|
||||||
|
|
||||||
|
# GHC needs the locale configured during the Haddock phase.
|
||||||
|
LANG = "en_US.UTF-8";
|
||||||
|
|
||||||
|
# GHC is a bit confused on its cross terminology.
|
||||||
|
# TODO(@sternenseemann): investigate coreutils dependencies and pass absolute paths
|
||||||
|
preConfigure = ''
|
||||||
|
for env in $(env | grep '^TARGET_' | sed -E 's|\+?=.*||'); do
|
||||||
|
export "''${env#TARGET_}=''${!env}"
|
||||||
|
done
|
||||||
|
# GHC is a bit confused on its cross terminology, as these would normally be
|
||||||
|
# the *host* tools.
|
||||||
|
export CC="${targetCC}/bin/${targetCC.targetPrefix}cc"
|
||||||
|
export CXX="${targetCC}/bin/${targetCC.targetPrefix}c++"
|
||||||
|
# Use gold to work around https://sourceware.org/bugzilla/show_bug.cgi?id=16177
|
||||||
|
export LD="${targetCC.bintools}/bin/${targetCC.bintools.targetPrefix}ld${lib.optionalString useLdGold ".gold"}"
|
||||||
|
export AS="${targetCC.bintools.bintools}/bin/${targetCC.bintools.targetPrefix}as"
|
||||||
|
export AR="${targetCC.bintools.bintools}/bin/${targetCC.bintools.targetPrefix}ar"
|
||||||
|
export NM="${targetCC.bintools.bintools}/bin/${targetCC.bintools.targetPrefix}nm"
|
||||||
|
export RANLIB="${targetCC.bintools.bintools}/bin/${targetCC.bintools.targetPrefix}ranlib"
|
||||||
|
export READELF="${targetCC.bintools.bintools}/bin/${targetCC.bintools.targetPrefix}readelf"
|
||||||
|
export STRIP="${bintoolsFor.strip}/bin/${bintoolsFor.strip.targetPrefix}strip"
|
||||||
|
'' + lib.optionalString (stdenv.targetPlatform.linker == "cctools") ''
|
||||||
|
export OTOOL="${targetCC.bintools.bintools}/bin/${targetCC.bintools.targetPrefix}otool"
|
||||||
|
export INSTALL_NAME_TOOL="${bintoolsFor.install_name_tool}/bin/${bintoolsFor.install_name_tool.targetPrefix}install_name_tool"
|
||||||
|
'' + lib.optionalString useLLVM ''
|
||||||
|
export LLC="${lib.getBin buildTargetLlvmPackages.llvm}/bin/llc"
|
||||||
|
export OPT="${lib.getBin buildTargetLlvmPackages.llvm}/bin/opt"
|
||||||
|
'' + lib.optionalString (useLLVM && stdenv.targetPlatform.isDarwin) ''
|
||||||
|
# LLVM backend on Darwin needs clang: https://downloads.haskell.org/~ghc/latest/docs/html/users_guide/codegens.html#llvm-code-generator-fllvm
|
||||||
|
export CLANG="${buildTargetLlvmPackages.clang}/bin/${buildTargetLlvmPackages.clang.targetPrefix}clang"
|
||||||
|
'' + ''
|
||||||
|
|
||||||
|
echo -n "${buildMK}" > mk/build.mk
|
||||||
|
|
||||||
|
sed -i -e 's|-isysroot /Developer/SDKs/MacOSX10.5.sdk||' configure
|
||||||
|
'' + lib.optionalString (stdenv.isLinux && hostPlatform.libc == "glibc") ''
|
||||||
|
export LOCALE_ARCHIVE="${glibcLocales}/lib/locale/locale-archive"
|
||||||
|
'' + lib.optionalString (!stdenv.isDarwin) ''
|
||||||
|
export NIX_LDFLAGS+=" -rpath $out/lib/ghc-${version}"
|
||||||
|
'' + lib.optionalString stdenv.isDarwin ''
|
||||||
|
export NIX_LDFLAGS+=" -no_dtrace_dof"
|
||||||
|
|
||||||
|
# GHC tries the host xattr /usr/bin/xattr by default which fails since it expects python to be 2.7
|
||||||
|
export XATTR=${lib.getBin xattr}/bin/xattr
|
||||||
|
'' + lib.optionalString targetPlatform.useAndroidPrebuilt ''
|
||||||
|
sed -i -e '5i ,("armv7a-unknown-linux-androideabi", ("e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64", "cortex-a8", ""))' llvm-targets
|
||||||
|
'' + lib.optionalString targetPlatform.isMusl ''
|
||||||
|
echo "patching llvm-targets for musl targets..."
|
||||||
|
echo "Cloning these existing '*-linux-gnu*' targets:"
|
||||||
|
grep linux-gnu llvm-targets | sed 's/^/ /'
|
||||||
|
echo "(go go gadget sed)"
|
||||||
|
sed -i 's,\(^.*linux-\)gnu\(.*\)$,\0\n\1musl\2,' llvm-targets
|
||||||
|
echo "llvm-targets now contains these '*-linux-musl*' targets:"
|
||||||
|
grep linux-musl llvm-targets | sed 's/^/ /'
|
||||||
|
|
||||||
|
echo "And now patching to preserve '-musleabi' as done with '-gnueabi'"
|
||||||
|
# (aclocal.m4 is actual source, but patch configure as well since we don't re-gen)
|
||||||
|
for x in configure aclocal.m4; do
|
||||||
|
substituteInPlace $x \
|
||||||
|
--replace '*-android*|*-gnueabi*)' \
|
||||||
|
'*-android*|*-gnueabi*|*-musleabi*)'
|
||||||
|
done
|
||||||
|
''
|
||||||
|
# HACK: allow bootstrapping with GHC 8.10 which works fine, as we don't have
|
||||||
|
# binary 9.0 packaged. Bootstrapping with 9.2 is broken without hadrian.
|
||||||
|
+ ''
|
||||||
|
substituteInPlace configure --replace \
|
||||||
|
'MinBootGhcVersion="9.0"' \
|
||||||
|
'MinBootGhcVersion="8.10"'
|
||||||
|
'';
|
||||||
|
|
||||||
|
# TODO(@Ericson2314): Always pass "--target" and always prefix.
|
||||||
|
configurePlatforms = [ "build" "host" ]
|
||||||
|
++ lib.optional (targetPlatform != hostPlatform) "target";
|
||||||
|
|
||||||
|
# `--with` flags for libraries needed for RTS linker
|
||||||
|
configureFlags = [
|
||||||
|
"--datadir=$doc/share/doc/ghc"
|
||||||
|
"--with-curses-includes=${ncurses.dev}/include" "--with-curses-libraries=${ncurses.out}/lib"
|
||||||
|
] ++ lib.optionals (libffi != null) [
|
||||||
|
"--with-system-libffi"
|
||||||
|
"--with-ffi-includes=${targetPackages.libffi.dev}/include"
|
||||||
|
"--with-ffi-libraries=${targetPackages.libffi.out}/lib"
|
||||||
|
] ++ lib.optionals (targetPlatform == hostPlatform && !enableNativeBignum) [
|
||||||
|
"--with-gmp-includes=${targetPackages.gmp.dev}/include"
|
||||||
|
"--with-gmp-libraries=${targetPackages.gmp.out}/lib"
|
||||||
|
] ++ lib.optionals (targetPlatform == hostPlatform && hostPlatform.libc != "glibc" && !targetPlatform.isWindows) [
|
||||||
|
"--with-iconv-includes=${libiconv}/include"
|
||||||
|
"--with-iconv-libraries=${libiconv}/lib"
|
||||||
|
] ++ lib.optionals (targetPlatform != hostPlatform) [
|
||||||
|
"--enable-bootstrap-with-devel-snapshot"
|
||||||
|
] ++ lib.optionals useLdGold [
|
||||||
|
"CFLAGS=-fuse-ld=gold"
|
||||||
|
"CONF_GCC_LINKER_OPTS_STAGE1=-fuse-ld=gold"
|
||||||
|
"CONF_GCC_LINKER_OPTS_STAGE2=-fuse-ld=gold"
|
||||||
|
] ++ lib.optionals (disableLargeAddressSpace) [
|
||||||
|
"--disable-large-address-space"
|
||||||
|
];
|
||||||
|
|
||||||
|
# Make sure we never relax`$PATH` and hooks support for compatibility.
|
||||||
|
strictDeps = true;
|
||||||
|
|
||||||
|
# Don’t add -liconv to LDFLAGS automatically so that GHC will add it itself.
|
||||||
|
dontAddExtraLibs = true;
|
||||||
|
|
||||||
|
nativeBuildInputs = [
|
||||||
|
perl autoconf automake m4 python3
|
||||||
|
ghc bootPkgs.alex bootPkgs.happy bootPkgs.hscolour
|
||||||
|
] ++ lib.optionals (stdenv.isDarwin && stdenv.isAarch64) [
|
||||||
|
autoSignDarwinBinariesHook
|
||||||
|
] ++ lib.optionals enableDocs [
|
||||||
|
sphinx
|
||||||
|
];
|
||||||
|
|
||||||
|
# For building runtime libs
|
||||||
|
depsBuildTarget = toolsForTarget;
|
||||||
|
|
||||||
|
buildInputs = [ perl bash ] ++ (libDeps hostPlatform);
|
||||||
|
|
||||||
|
depsTargetTarget = map lib.getDev (libDeps targetPlatform);
|
||||||
|
depsTargetTargetPropagated = map (lib.getOutput "out") (libDeps targetPlatform);
|
||||||
|
|
||||||
|
# required, because otherwise all symbols from HSffi.o are stripped, and
|
||||||
|
# that in turn causes GHCi to abort
|
||||||
|
stripDebugFlags = [ "-S" ] ++ lib.optional (!targetPlatform.isDarwin) "--keep-file-symbols";
|
||||||
|
|
||||||
|
checkTarget = "test";
|
||||||
|
|
||||||
|
hardeningDisable =
|
||||||
|
[ "format" ]
|
||||||
|
# In nixpkgs, musl based builds currently enable `pie` hardening by default
|
||||||
|
# (see `defaultHardeningFlags` in `make-derivation.nix`).
|
||||||
|
# But GHC cannot currently produce outputs that are ready for `-pie` linking.
|
||||||
|
# Thus, disable `pie` hardening, otherwise `recompile with -fPIE` errors appear.
|
||||||
|
# See:
|
||||||
|
# * https://github.com/NixOS/nixpkgs/issues/129247
|
||||||
|
# * https://gitlab.haskell.org/ghc/ghc/-/issues/19580
|
||||||
|
++ lib.optional stdenv.targetPlatform.isMusl "pie";
|
||||||
|
|
||||||
|
# big-parallel allows us to build with more than 2 cores on
|
||||||
|
# Hydra which already warrants a significant speedup
|
||||||
|
requiredSystemFeatures = [ "big-parallel" ];
|
||||||
|
|
||||||
|
postInstall = ''
|
||||||
|
# Install the bash completion file.
|
||||||
|
install -D -m 444 utils/completion/ghc.bash $out/share/bash-completion/completions/${targetPrefix}ghc
|
||||||
|
'';
|
||||||
|
|
||||||
|
passthru = {
|
||||||
|
inherit bootPkgs targetPrefix;
|
||||||
|
|
||||||
|
inherit llvmPackages;
|
||||||
|
inherit enableShared;
|
||||||
|
|
||||||
|
# This is used by the haskell builder to query
|
||||||
|
# the presence of the haddock program.
|
||||||
|
hasHaddock = enableHaddockProgram;
|
||||||
|
|
||||||
|
# Our Cabal compiler name
|
||||||
|
haskellCompilerName = "ghc-${version}";
|
||||||
|
};
|
||||||
|
|
||||||
|
meta = {
|
||||||
|
homepage = "http://haskell.org/ghc";
|
||||||
|
description = "The Glasgow Haskell Compiler";
|
||||||
|
maintainers = with lib.maintainers; [ ];
|
||||||
|
timeout = 24 * 3600;
|
||||||
|
inherit (ghc.meta) license platforms;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // lib.optionalAttrs targetPlatform.useAndroidPrebuilt {
|
||||||
|
dontStrip = true;
|
||||||
|
dontPatchELF = true;
|
||||||
|
noAuditTmpdir = true;
|
||||||
|
})
|
|
@ -0,0 +1,15 @@
|
||||||
|
Make sure that the appropriate feature flags are set when
|
||||||
|
Rts.h is included, so that clockid_t is defined.
|
||||||
|
|
||||||
|
diff --git a/cbits/is-valid-utf8.c b/cbits/is-valid-utf8.c
|
||||||
|
index 01b3b41..c69596a 100644
|
||||||
|
--- a/libraries/bytestring/cbits/is-valid-utf8.c
|
||||||
|
+++ b/libraries/bytestring/cbits/is-valid-utf8.c
|
||||||
|
@@ -29,6 +29,7 @@ SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
#pragma GCC push_options
|
||||||
|
#pragma GCC optimize("-O2")
|
||||||
|
+#include "rts/PosixSource.h"
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include <stddef.h>
|
||||||
|
#include <stdint.h>
|
390
pkgs/by-name/ha/haskell/ghc/9.4.6.nix
Normal file
390
pkgs/by-name/ha/haskell/ghc/9.4.6.nix
Normal file
|
@ -0,0 +1,390 @@
|
||||||
|
# DO NOT port this expression to hadrian. It is not possible to build a GHC
|
||||||
|
# cross compiler with 9.4.* and hadrian.
|
||||||
|
{ lib, stdenv, pkgsBuildTarget, pkgsHostTarget, targetPackages
|
||||||
|
|
||||||
|
# build-tools
|
||||||
|
, bootPkgs
|
||||||
|
, autoconf, automake, coreutils, fetchpatch, fetchurl, perl, python3, m4, sphinx
|
||||||
|
, xattr, autoSignDarwinBinariesHook
|
||||||
|
, bash
|
||||||
|
|
||||||
|
, libiconv ? null, ncurses
|
||||||
|
, glibcLocales ? null
|
||||||
|
|
||||||
|
, # GHC can be built with system libffi or a bundled one.
|
||||||
|
libffi ? null
|
||||||
|
|
||||||
|
, useLLVM ? !(stdenv.targetPlatform.isx86
|
||||||
|
|| stdenv.targetPlatform.isPower
|
||||||
|
|| stdenv.targetPlatform.isSparc
|
||||||
|
|| stdenv.targetPlatform.isAarch64)
|
||||||
|
, # LLVM is conceptually a run-time-only dependency, but for
|
||||||
|
# non-x86, we need LLVM to bootstrap later stages, so it becomes a
|
||||||
|
# build-time dependency too.
|
||||||
|
buildTargetLlvmPackages, llvmPackages
|
||||||
|
|
||||||
|
, # If enabled, GHC will be built with the GPL-free but slightly slower native
|
||||||
|
# bignum backend instead of the faster but GPLed gmp backend.
|
||||||
|
enableNativeBignum ? !(lib.meta.availableOn stdenv.hostPlatform gmp
|
||||||
|
&& lib.meta.availableOn stdenv.targetPlatform gmp)
|
||||||
|
, gmp
|
||||||
|
|
||||||
|
, # If enabled, use -fPIC when compiling static libs.
|
||||||
|
enableRelocatedStaticLibs ? stdenv.targetPlatform != stdenv.hostPlatform
|
||||||
|
|
||||||
|
, enableProfiledLibs ? true
|
||||||
|
|
||||||
|
, # Whether to build dynamic libs for the standard library (on the target
|
||||||
|
# platform). Static libs are always built.
|
||||||
|
enableShared ? with stdenv.targetPlatform; !isWindows && !useiOSPrebuilt && !isStatic
|
||||||
|
|
||||||
|
, # Whether to build terminfo.
|
||||||
|
enableTerminfo ? !stdenv.targetPlatform.isWindows
|
||||||
|
|
||||||
|
, # What flavour to build. An empty string indicates no
|
||||||
|
# specific flavour and falls back to ghc default values.
|
||||||
|
ghcFlavour ? lib.optionalString (stdenv.targetPlatform != stdenv.hostPlatform)
|
||||||
|
(if useLLVM then "perf-cross" else "perf-cross-ncg")
|
||||||
|
|
||||||
|
, # Whether to build sphinx documentation.
|
||||||
|
enableDocs ? (
|
||||||
|
# Docs disabled if we are building on musl because it's a large task to keep
|
||||||
|
# all `sphinx` dependencies building in this environment.
|
||||||
|
!stdenv.buildPlatform.isMusl
|
||||||
|
)
|
||||||
|
|
||||||
|
, enableHaddockProgram ?
|
||||||
|
# Disabled for cross; see note [HADDOCK_DOCS].
|
||||||
|
(stdenv.targetPlatform == stdenv.hostPlatform)
|
||||||
|
|
||||||
|
, # Whether to disable the large address space allocator
|
||||||
|
# necessary fix for iOS: https://www.reddit.com/r/haskell/comments/4ttdz1/building_an_osxi386_to_iosarm64_cross_compiler/d5qvd67/
|
||||||
|
disableLargeAddressSpace ? stdenv.targetPlatform.isiOS
|
||||||
|
}:
|
||||||
|
|
||||||
|
assert !enableNativeBignum -> gmp != null;
|
||||||
|
|
||||||
|
# Cross cannot currently build the `haddock` program for silly reasons,
|
||||||
|
# see note [HADDOCK_DOCS].
|
||||||
|
assert (stdenv.targetPlatform != stdenv.hostPlatform) -> !enableHaddockProgram;
|
||||||
|
|
||||||
|
let
|
||||||
|
inherit (stdenv) buildPlatform hostPlatform targetPlatform;
|
||||||
|
|
||||||
|
inherit (bootPkgs) ghc;
|
||||||
|
|
||||||
|
# TODO(@Ericson2314) Make unconditional
|
||||||
|
targetPrefix = lib.optionalString
|
||||||
|
(targetPlatform != hostPlatform)
|
||||||
|
"${targetPlatform.config}-";
|
||||||
|
|
||||||
|
buildMK = ''
|
||||||
|
BuildFlavour = ${ghcFlavour}
|
||||||
|
ifneq \"\$(BuildFlavour)\" \"\"
|
||||||
|
include mk/flavours/\$(BuildFlavour).mk
|
||||||
|
endif
|
||||||
|
BUILD_SPHINX_HTML = ${if enableDocs then "YES" else "NO"}
|
||||||
|
BUILD_SPHINX_PDF = NO
|
||||||
|
'' +
|
||||||
|
# Note [HADDOCK_DOCS]:
|
||||||
|
# Unfortunately currently `HADDOCK_DOCS` controls both whether the `haddock`
|
||||||
|
# program is built (which we generally always want to have a complete GHC install)
|
||||||
|
# and whether it is run on the GHC sources to generate hyperlinked source code
|
||||||
|
# (which is impossible for cross-compilation); see:
|
||||||
|
# https://gitlab.haskell.org/ghc/ghc/-/issues/20077
|
||||||
|
# This implies that currently a cross-compiled GHC will never have a `haddock`
|
||||||
|
# program, so it can never generate haddocks for any packages.
|
||||||
|
# If this is solved in the future, we'd like to unconditionally
|
||||||
|
# build the haddock program (removing the `enableHaddockProgram` option).
|
||||||
|
''
|
||||||
|
HADDOCK_DOCS = ${if enableHaddockProgram then "YES" else "NO"}
|
||||||
|
# Build haddocks for boot packages with hyperlinking
|
||||||
|
EXTRA_HADDOCK_OPTS += --hyperlinked-source --quickjump
|
||||||
|
|
||||||
|
DYNAMIC_GHC_PROGRAMS = ${if enableShared then "YES" else "NO"}
|
||||||
|
BIGNUM_BACKEND = ${if enableNativeBignum then "native" else "gmp"}
|
||||||
|
'' + lib.optionalString (targetPlatform != hostPlatform) ''
|
||||||
|
Stage1Only = ${if targetPlatform.system == hostPlatform.system then "NO" else "YES"}
|
||||||
|
CrossCompilePrefix = ${targetPrefix}
|
||||||
|
'' + lib.optionalString (!enableProfiledLibs) ''
|
||||||
|
BUILD_PROF_LIBS = NO
|
||||||
|
'' +
|
||||||
|
# -fexternal-dynamic-refs apparently (because it's not clear from the documentation)
|
||||||
|
# makes the GHC RTS able to load static libraries, which may be needed for TemplateHaskell.
|
||||||
|
# This solution was described in https://www.tweag.io/blog/2020-09-30-bazel-static-haskell
|
||||||
|
lib.optionalString enableRelocatedStaticLibs ''
|
||||||
|
GhcLibHcOpts += -fPIC -fexternal-dynamic-refs
|
||||||
|
GhcRtsHcOpts += -fPIC -fexternal-dynamic-refs
|
||||||
|
'' + lib.optionalString targetPlatform.useAndroidPrebuilt ''
|
||||||
|
EXTRA_CC_OPTS += -std=gnu99
|
||||||
|
'';
|
||||||
|
|
||||||
|
# Splicer will pull out correct variations
|
||||||
|
libDeps = platform: lib.optional enableTerminfo ncurses
|
||||||
|
++ [libffi]
|
||||||
|
++ lib.optional (!enableNativeBignum) gmp
|
||||||
|
++ lib.optional (platform.libc != "glibc" && !targetPlatform.isWindows) libiconv;
|
||||||
|
|
||||||
|
# TODO(@sternenseemann): is buildTarget LLVM unnecessary?
|
||||||
|
# GHC doesn't seem to have {LLC,OPT}_HOST
|
||||||
|
toolsForTarget = [
|
||||||
|
pkgsBuildTarget.targetPackages.stdenv.cc
|
||||||
|
] ++ lib.optional useLLVM buildTargetLlvmPackages.llvm;
|
||||||
|
|
||||||
|
targetCC = builtins.head toolsForTarget;
|
||||||
|
|
||||||
|
# Sometimes we have to dispatch between the bintools wrapper and the unwrapped
|
||||||
|
# derivation for certain tools depending on the platform.
|
||||||
|
bintoolsFor = {
|
||||||
|
# GHC needs install_name_tool on all darwin platforms. On aarch64-darwin it is
|
||||||
|
# part of the bintools wrapper (due to codesigning requirements), but not on
|
||||||
|
# x86_64-darwin.
|
||||||
|
install_name_tool =
|
||||||
|
if stdenv.targetPlatform.isAarch64
|
||||||
|
then targetCC.bintools
|
||||||
|
else targetCC.bintools.bintools;
|
||||||
|
# Same goes for strip.
|
||||||
|
strip =
|
||||||
|
# TODO(@sternenseemann): also use wrapper if linker == "bfd" or "gold"
|
||||||
|
if stdenv.targetPlatform.isAarch64 && stdenv.targetPlatform.isDarwin
|
||||||
|
then targetCC.bintools
|
||||||
|
else targetCC.bintools.bintools;
|
||||||
|
};
|
||||||
|
|
||||||
|
# Use gold either following the default, or to avoid the BFD linker due to some bugs / perf issues.
|
||||||
|
# But we cannot avoid BFD when using musl libc due to https://sourceware.org/bugzilla/show_bug.cgi?id=23856
|
||||||
|
# see #84670 and #49071 for more background.
|
||||||
|
useLdGold = targetPlatform.linker == "gold" ||
|
||||||
|
(targetPlatform.linker == "bfd" && (targetCC.bintools.bintools.hasGold or false) && !targetPlatform.isMusl);
|
||||||
|
|
||||||
|
# Makes debugging easier to see which variant is at play in `nix-store -q --tree`.
|
||||||
|
variantSuffix = lib.concatStrings [
|
||||||
|
(lib.optionalString stdenv.hostPlatform.isMusl "-musl")
|
||||||
|
(lib.optionalString enableNativeBignum "-native-bignum")
|
||||||
|
];
|
||||||
|
|
||||||
|
in
|
||||||
|
|
||||||
|
# C compiler, bintools and LLVM are used at build time, but will also leak into
|
||||||
|
# the resulting GHC's settings file and used at runtime. This means that we are
|
||||||
|
# currently only able to build GHC if hostPlatform == buildPlatform.
|
||||||
|
assert targetCC == pkgsHostTarget.targetPackages.stdenv.cc;
|
||||||
|
assert buildTargetLlvmPackages.llvm == llvmPackages.llvm;
|
||||||
|
assert stdenv.targetPlatform.isDarwin -> buildTargetLlvmPackages.clang == llvmPackages.clang;
|
||||||
|
|
||||||
|
stdenv.mkDerivation (rec {
|
||||||
|
version = "9.4.6";
|
||||||
|
pname = "${targetPrefix}ghc${variantSuffix}";
|
||||||
|
|
||||||
|
src = fetchurl {
|
||||||
|
url = "https://downloads.haskell.org/ghc/${version}/ghc-${version}-src.tar.xz";
|
||||||
|
sha256 = "1b705cf52692f9d4d6707cdf8e761590f5f56ec8ea6a65e36610db392d3d24b9";
|
||||||
|
};
|
||||||
|
|
||||||
|
enableParallelBuilding = true;
|
||||||
|
|
||||||
|
outputs = [ "out" "doc" ];
|
||||||
|
|
||||||
|
patches = [
|
||||||
|
# Don't generate code that doesn't compile when --enable-relocatable is passed to Setup.hs
|
||||||
|
# Can be removed if the Cabal library included with ghc backports the linked fix
|
||||||
|
(fetchpatch {
|
||||||
|
url = "https://github.com/haskell/cabal/commit/6c796218c92f93c95e94d5ec2d077f6956f68e98.patch";
|
||||||
|
stripLen = 1;
|
||||||
|
extraPrefix = "libraries/Cabal/";
|
||||||
|
sha256 = "sha256-yRQ6YmMiwBwiYseC5BsrEtDgFbWvst+maGgDtdD0vAY=";
|
||||||
|
})
|
||||||
|
|
||||||
|
# Fix docs build with Sphinx >= 7 https://gitlab.haskell.org/ghc/ghc/-/issues/24129
|
||||||
|
./docs-sphinx-7.patch
|
||||||
|
|
||||||
|
# Work around a type not being defined when including Rts.h in bytestring's cbits
|
||||||
|
# due to missing feature macros. See https://gitlab.haskell.org/ghc/ghc/-/issues/23810.
|
||||||
|
./9.4.6-bytestring-posix-source.patch
|
||||||
|
] ++ lib.optionals (stdenv.targetPlatform.isDarwin && stdenv.targetPlatform.isAarch64) [
|
||||||
|
# Prevent the paths module from emitting symbols that we don't use
|
||||||
|
# when building with separate outputs.
|
||||||
|
#
|
||||||
|
# These cause problems as they're not eliminated by GHC's dead code
|
||||||
|
# elimination on aarch64-darwin. (see
|
||||||
|
# https://github.com/NixOS/nixpkgs/issues/140774 for details).
|
||||||
|
./Cabal-at-least-3.6-paths-fix-cycle-aarch64-darwin.patch
|
||||||
|
];
|
||||||
|
|
||||||
|
postPatch = "patchShebangs .";
|
||||||
|
|
||||||
|
# GHC needs the locale configured during the Haddock phase.
|
||||||
|
LANG = "en_US.UTF-8";
|
||||||
|
|
||||||
|
# GHC is a bit confused on its cross terminology.
|
||||||
|
# TODO(@sternenseemann): investigate coreutils dependencies and pass absolute paths
|
||||||
|
preConfigure = ''
|
||||||
|
for env in $(env | grep '^TARGET_' | sed -E 's|\+?=.*||'); do
|
||||||
|
export "''${env#TARGET_}=''${!env}"
|
||||||
|
done
|
||||||
|
# GHC is a bit confused on its cross terminology, as these would normally be
|
||||||
|
# the *host* tools.
|
||||||
|
export CC="${targetCC}/bin/${targetCC.targetPrefix}cc"
|
||||||
|
export CXX="${targetCC}/bin/${targetCC.targetPrefix}c++"
|
||||||
|
# Use gold to work around https://sourceware.org/bugzilla/show_bug.cgi?id=16177
|
||||||
|
export LD="${targetCC.bintools}/bin/${targetCC.bintools.targetPrefix}ld${lib.optionalString useLdGold ".gold"}"
|
||||||
|
export AS="${targetCC.bintools.bintools}/bin/${targetCC.bintools.targetPrefix}as"
|
||||||
|
export AR="${targetCC.bintools.bintools}/bin/${targetCC.bintools.targetPrefix}ar"
|
||||||
|
export NM="${targetCC.bintools.bintools}/bin/${targetCC.bintools.targetPrefix}nm"
|
||||||
|
export RANLIB="${targetCC.bintools.bintools}/bin/${targetCC.bintools.targetPrefix}ranlib"
|
||||||
|
export READELF="${targetCC.bintools.bintools}/bin/${targetCC.bintools.targetPrefix}readelf"
|
||||||
|
export STRIP="${bintoolsFor.strip}/bin/${bintoolsFor.strip.targetPrefix}strip"
|
||||||
|
'' + lib.optionalString (stdenv.targetPlatform.linker == "cctools") ''
|
||||||
|
export OTOOL="${targetCC.bintools.bintools}/bin/${targetCC.bintools.targetPrefix}otool"
|
||||||
|
export INSTALL_NAME_TOOL="${bintoolsFor.install_name_tool}/bin/${bintoolsFor.install_name_tool.targetPrefix}install_name_tool"
|
||||||
|
'' + lib.optionalString useLLVM ''
|
||||||
|
export LLC="${lib.getBin buildTargetLlvmPackages.llvm}/bin/llc"
|
||||||
|
export OPT="${lib.getBin buildTargetLlvmPackages.llvm}/bin/opt"
|
||||||
|
'' + lib.optionalString (useLLVM && stdenv.targetPlatform.isDarwin) ''
|
||||||
|
# LLVM backend on Darwin needs clang: https://downloads.haskell.org/~ghc/latest/docs/html/users_guide/codegens.html#llvm-code-generator-fllvm
|
||||||
|
export CLANG="${buildTargetLlvmPackages.clang}/bin/${buildTargetLlvmPackages.clang.targetPrefix}clang"
|
||||||
|
'' + ''
|
||||||
|
|
||||||
|
echo -n "${buildMK}" > mk/build.mk
|
||||||
|
|
||||||
|
sed -i -e 's|-isysroot /Developer/SDKs/MacOSX10.5.sdk||' configure
|
||||||
|
'' + lib.optionalString (stdenv.isLinux && hostPlatform.libc == "glibc") ''
|
||||||
|
export LOCALE_ARCHIVE="${glibcLocales}/lib/locale/locale-archive"
|
||||||
|
'' + lib.optionalString (!stdenv.isDarwin) ''
|
||||||
|
export NIX_LDFLAGS+=" -rpath $out/lib/ghc-${version}"
|
||||||
|
'' + lib.optionalString stdenv.isDarwin ''
|
||||||
|
export NIX_LDFLAGS+=" -no_dtrace_dof"
|
||||||
|
|
||||||
|
# GHC tries the host xattr /usr/bin/xattr by default which fails since it expects python to be 2.7
|
||||||
|
export XATTR=${lib.getBin xattr}/bin/xattr
|
||||||
|
'' + lib.optionalString targetPlatform.useAndroidPrebuilt ''
|
||||||
|
sed -i -e '5i ,("armv7a-unknown-linux-androideabi", ("e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64", "cortex-a8", ""))' llvm-targets
|
||||||
|
'' + lib.optionalString targetPlatform.isMusl ''
|
||||||
|
echo "patching llvm-targets for musl targets..."
|
||||||
|
echo "Cloning these existing '*-linux-gnu*' targets:"
|
||||||
|
grep linux-gnu llvm-targets | sed 's/^/ /'
|
||||||
|
echo "(go go gadget sed)"
|
||||||
|
sed -i 's,\(^.*linux-\)gnu\(.*\)$,\0\n\1musl\2,' llvm-targets
|
||||||
|
echo "llvm-targets now contains these '*-linux-musl*' targets:"
|
||||||
|
grep linux-musl llvm-targets | sed 's/^/ /'
|
||||||
|
|
||||||
|
echo "And now patching to preserve '-musleabi' as done with '-gnueabi'"
|
||||||
|
# (aclocal.m4 is actual source, but patch configure as well since we don't re-gen)
|
||||||
|
for x in configure aclocal.m4; do
|
||||||
|
substituteInPlace $x \
|
||||||
|
--replace '*-android*|*-gnueabi*)' \
|
||||||
|
'*-android*|*-gnueabi*|*-musleabi*)'
|
||||||
|
done
|
||||||
|
''
|
||||||
|
# HACK: allow bootstrapping with GHC 8.10 which works fine, as we don't have
|
||||||
|
# binary 9.0 packaged. Bootstrapping with 9.2 is broken without hadrian.
|
||||||
|
+ ''
|
||||||
|
substituteInPlace configure --replace \
|
||||||
|
'MinBootGhcVersion="9.0"' \
|
||||||
|
'MinBootGhcVersion="8.10"'
|
||||||
|
'';
|
||||||
|
|
||||||
|
# TODO(@Ericson2314): Always pass "--target" and always prefix.
|
||||||
|
configurePlatforms = [ "build" "host" ]
|
||||||
|
++ lib.optional (targetPlatform != hostPlatform) "target";
|
||||||
|
|
||||||
|
# `--with` flags for libraries needed for RTS linker
|
||||||
|
configureFlags = [
|
||||||
|
"--datadir=$doc/share/doc/ghc"
|
||||||
|
"--with-curses-includes=${ncurses.dev}/include" "--with-curses-libraries=${ncurses.out}/lib"
|
||||||
|
] ++ lib.optionals (libffi != null) [
|
||||||
|
"--with-system-libffi"
|
||||||
|
"--with-ffi-includes=${targetPackages.libffi.dev}/include"
|
||||||
|
"--with-ffi-libraries=${targetPackages.libffi.out}/lib"
|
||||||
|
] ++ lib.optionals (targetPlatform == hostPlatform && !enableNativeBignum) [
|
||||||
|
"--with-gmp-includes=${targetPackages.gmp.dev}/include"
|
||||||
|
"--with-gmp-libraries=${targetPackages.gmp.out}/lib"
|
||||||
|
] ++ lib.optionals (targetPlatform == hostPlatform && hostPlatform.libc != "glibc" && !targetPlatform.isWindows) [
|
||||||
|
"--with-iconv-includes=${libiconv}/include"
|
||||||
|
"--with-iconv-libraries=${libiconv}/lib"
|
||||||
|
] ++ lib.optionals (targetPlatform != hostPlatform) [
|
||||||
|
"--enable-bootstrap-with-devel-snapshot"
|
||||||
|
] ++ lib.optionals useLdGold [
|
||||||
|
"CFLAGS=-fuse-ld=gold"
|
||||||
|
"CONF_GCC_LINKER_OPTS_STAGE1=-fuse-ld=gold"
|
||||||
|
"CONF_GCC_LINKER_OPTS_STAGE2=-fuse-ld=gold"
|
||||||
|
] ++ lib.optionals (disableLargeAddressSpace) [
|
||||||
|
"--disable-large-address-space"
|
||||||
|
];
|
||||||
|
|
||||||
|
# Make sure we never relax`$PATH` and hooks support for compatibility.
|
||||||
|
strictDeps = true;
|
||||||
|
|
||||||
|
# Don’t add -liconv to LDFLAGS automatically so that GHC will add it itself.
|
||||||
|
dontAddExtraLibs = true;
|
||||||
|
|
||||||
|
nativeBuildInputs = [
|
||||||
|
perl autoconf automake m4 python3
|
||||||
|
ghc bootPkgs.alex bootPkgs.happy bootPkgs.hscolour
|
||||||
|
] ++ lib.optionals (stdenv.isDarwin && stdenv.isAarch64) [
|
||||||
|
autoSignDarwinBinariesHook
|
||||||
|
] ++ lib.optionals enableDocs [
|
||||||
|
sphinx
|
||||||
|
];
|
||||||
|
|
||||||
|
# For building runtime libs
|
||||||
|
depsBuildTarget = toolsForTarget;
|
||||||
|
|
||||||
|
buildInputs = [ perl bash ] ++ (libDeps hostPlatform);
|
||||||
|
|
||||||
|
depsTargetTarget = map lib.getDev (libDeps targetPlatform);
|
||||||
|
depsTargetTargetPropagated = map (lib.getOutput "out") (libDeps targetPlatform);
|
||||||
|
|
||||||
|
# required, because otherwise all symbols from HSffi.o are stripped, and
|
||||||
|
# that in turn causes GHCi to abort
|
||||||
|
stripDebugFlags = [ "-S" ] ++ lib.optional (!targetPlatform.isDarwin) "--keep-file-symbols";
|
||||||
|
|
||||||
|
checkTarget = "test";
|
||||||
|
|
||||||
|
hardeningDisable =
|
||||||
|
[ "format" ]
|
||||||
|
# In nixpkgs, musl based builds currently enable `pie` hardening by default
|
||||||
|
# (see `defaultHardeningFlags` in `make-derivation.nix`).
|
||||||
|
# But GHC cannot currently produce outputs that are ready for `-pie` linking.
|
||||||
|
# Thus, disable `pie` hardening, otherwise `recompile with -fPIE` errors appear.
|
||||||
|
# See:
|
||||||
|
# * https://github.com/NixOS/nixpkgs/issues/129247
|
||||||
|
# * https://gitlab.haskell.org/ghc/ghc/-/issues/19580
|
||||||
|
++ lib.optional stdenv.targetPlatform.isMusl "pie";
|
||||||
|
|
||||||
|
# big-parallel allows us to build with more than 2 cores on
|
||||||
|
# Hydra which already warrants a significant speedup
|
||||||
|
requiredSystemFeatures = [ "big-parallel" ];
|
||||||
|
|
||||||
|
postInstall = ''
|
||||||
|
# Install the bash completion file.
|
||||||
|
install -D -m 444 utils/completion/ghc.bash $out/share/bash-completion/completions/${targetPrefix}ghc
|
||||||
|
'';
|
||||||
|
|
||||||
|
passthru = {
|
||||||
|
inherit bootPkgs targetPrefix;
|
||||||
|
|
||||||
|
inherit llvmPackages;
|
||||||
|
inherit enableShared;
|
||||||
|
|
||||||
|
# This is used by the haskell builder to query
|
||||||
|
# the presence of the haddock program.
|
||||||
|
hasHaddock = enableHaddockProgram;
|
||||||
|
|
||||||
|
# Our Cabal compiler name
|
||||||
|
haskellCompilerName = "ghc-${version}";
|
||||||
|
};
|
||||||
|
|
||||||
|
meta = {
|
||||||
|
homepage = "http://haskell.org/ghc";
|
||||||
|
description = "The Glasgow Haskell Compiler";
|
||||||
|
maintainers = with lib.maintainers; [ ];
|
||||||
|
timeout = 24 * 3600;
|
||||||
|
inherit (ghc.meta) license platforms;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // lib.optionalAttrs targetPlatform.useAndroidPrebuilt {
|
||||||
|
dontStrip = true;
|
||||||
|
dontPatchELF = true;
|
||||||
|
noAuditTmpdir = true;
|
||||||
|
})
|
386
pkgs/by-name/ha/haskell/ghc/9.4.7.nix
Normal file
386
pkgs/by-name/ha/haskell/ghc/9.4.7.nix
Normal file
|
@ -0,0 +1,386 @@
|
||||||
|
# DO NOT port this expression to hadrian. It is not possible to build a GHC
|
||||||
|
# cross compiler with 9.4.* and hadrian.
|
||||||
|
{ lib, stdenv, pkgsBuildTarget, pkgsHostTarget, targetPackages
|
||||||
|
|
||||||
|
# build-tools
|
||||||
|
, bootPkgs
|
||||||
|
, autoconf, automake, coreutils, fetchpatch, fetchurl, perl, python3, m4, sphinx
|
||||||
|
, xattr, autoSignDarwinBinariesHook
|
||||||
|
, bash
|
||||||
|
|
||||||
|
, libiconv ? null, ncurses
|
||||||
|
, glibcLocales ? null
|
||||||
|
|
||||||
|
, # GHC can be built with system libffi or a bundled one.
|
||||||
|
libffi ? null
|
||||||
|
|
||||||
|
, useLLVM ? !(stdenv.targetPlatform.isx86
|
||||||
|
|| stdenv.targetPlatform.isPower
|
||||||
|
|| stdenv.targetPlatform.isSparc
|
||||||
|
|| stdenv.targetPlatform.isAarch64)
|
||||||
|
, # LLVM is conceptually a run-time-only dependency, but for
|
||||||
|
# non-x86, we need LLVM to bootstrap later stages, so it becomes a
|
||||||
|
# build-time dependency too.
|
||||||
|
buildTargetLlvmPackages, llvmPackages
|
||||||
|
|
||||||
|
, # If enabled, GHC will be built with the GPL-free but slightly slower native
|
||||||
|
# bignum backend instead of the faster but GPLed gmp backend.
|
||||||
|
enableNativeBignum ? !(lib.meta.availableOn stdenv.hostPlatform gmp
|
||||||
|
&& lib.meta.availableOn stdenv.targetPlatform gmp)
|
||||||
|
, gmp
|
||||||
|
|
||||||
|
, # If enabled, use -fPIC when compiling static libs.
|
||||||
|
enableRelocatedStaticLibs ? stdenv.targetPlatform != stdenv.hostPlatform
|
||||||
|
|
||||||
|
, enableProfiledLibs ? true
|
||||||
|
|
||||||
|
, # Whether to build dynamic libs for the standard library (on the target
|
||||||
|
# platform). Static libs are always built.
|
||||||
|
enableShared ? with stdenv.targetPlatform; !isWindows && !useiOSPrebuilt && !isStatic
|
||||||
|
|
||||||
|
, # Whether to build terminfo.
|
||||||
|
enableTerminfo ? !stdenv.targetPlatform.isWindows
|
||||||
|
|
||||||
|
, # What flavour to build. An empty string indicates no
|
||||||
|
# specific flavour and falls back to ghc default values.
|
||||||
|
ghcFlavour ? lib.optionalString (stdenv.targetPlatform != stdenv.hostPlatform)
|
||||||
|
(if useLLVM then "perf-cross" else "perf-cross-ncg")
|
||||||
|
|
||||||
|
, # Whether to build sphinx documentation.
|
||||||
|
enableDocs ? (
|
||||||
|
# Docs disabled if we are building on musl because it's a large task to keep
|
||||||
|
# all `sphinx` dependencies building in this environment.
|
||||||
|
!stdenv.buildPlatform.isMusl
|
||||||
|
)
|
||||||
|
|
||||||
|
, enableHaddockProgram ?
|
||||||
|
# Disabled for cross; see note [HADDOCK_DOCS].
|
||||||
|
(stdenv.targetPlatform == stdenv.hostPlatform)
|
||||||
|
|
||||||
|
, # Whether to disable the large address space allocator
|
||||||
|
# necessary fix for iOS: https://www.reddit.com/r/haskell/comments/4ttdz1/building_an_osxi386_to_iosarm64_cross_compiler/d5qvd67/
|
||||||
|
disableLargeAddressSpace ? stdenv.targetPlatform.isiOS
|
||||||
|
}:
|
||||||
|
|
||||||
|
assert !enableNativeBignum -> gmp != null;
|
||||||
|
|
||||||
|
# Cross cannot currently build the `haddock` program for silly reasons,
|
||||||
|
# see note [HADDOCK_DOCS].
|
||||||
|
assert (stdenv.targetPlatform != stdenv.hostPlatform) -> !enableHaddockProgram;
|
||||||
|
|
||||||
|
let
|
||||||
|
inherit (stdenv) buildPlatform hostPlatform targetPlatform;
|
||||||
|
|
||||||
|
inherit (bootPkgs) ghc;
|
||||||
|
|
||||||
|
# TODO(@Ericson2314) Make unconditional
|
||||||
|
targetPrefix = lib.optionalString
|
||||||
|
(targetPlatform != hostPlatform)
|
||||||
|
"${targetPlatform.config}-";
|
||||||
|
|
||||||
|
buildMK = ''
|
||||||
|
BuildFlavour = ${ghcFlavour}
|
||||||
|
ifneq \"\$(BuildFlavour)\" \"\"
|
||||||
|
include mk/flavours/\$(BuildFlavour).mk
|
||||||
|
endif
|
||||||
|
BUILD_SPHINX_HTML = ${if enableDocs then "YES" else "NO"}
|
||||||
|
BUILD_SPHINX_PDF = NO
|
||||||
|
'' +
|
||||||
|
# Note [HADDOCK_DOCS]:
|
||||||
|
# Unfortunately currently `HADDOCK_DOCS` controls both whether the `haddock`
|
||||||
|
# program is built (which we generally always want to have a complete GHC install)
|
||||||
|
# and whether it is run on the GHC sources to generate hyperlinked source code
|
||||||
|
# (which is impossible for cross-compilation); see:
|
||||||
|
# https://gitlab.haskell.org/ghc/ghc/-/issues/20077
|
||||||
|
# This implies that currently a cross-compiled GHC will never have a `haddock`
|
||||||
|
# program, so it can never generate haddocks for any packages.
|
||||||
|
# If this is solved in the future, we'd like to unconditionally
|
||||||
|
# build the haddock program (removing the `enableHaddockProgram` option).
|
||||||
|
''
|
||||||
|
HADDOCK_DOCS = ${if enableHaddockProgram then "YES" else "NO"}
|
||||||
|
# Build haddocks for boot packages with hyperlinking
|
||||||
|
EXTRA_HADDOCK_OPTS += --hyperlinked-source --quickjump
|
||||||
|
|
||||||
|
DYNAMIC_GHC_PROGRAMS = ${if enableShared then "YES" else "NO"}
|
||||||
|
BIGNUM_BACKEND = ${if enableNativeBignum then "native" else "gmp"}
|
||||||
|
'' + lib.optionalString (targetPlatform != hostPlatform) ''
|
||||||
|
Stage1Only = ${if targetPlatform.system == hostPlatform.system then "NO" else "YES"}
|
||||||
|
CrossCompilePrefix = ${targetPrefix}
|
||||||
|
'' + lib.optionalString (!enableProfiledLibs) ''
|
||||||
|
BUILD_PROF_LIBS = NO
|
||||||
|
'' +
|
||||||
|
# -fexternal-dynamic-refs apparently (because it's not clear from the documentation)
|
||||||
|
# makes the GHC RTS able to load static libraries, which may be needed for TemplateHaskell.
|
||||||
|
# This solution was described in https://www.tweag.io/blog/2020-09-30-bazel-static-haskell
|
||||||
|
lib.optionalString enableRelocatedStaticLibs ''
|
||||||
|
GhcLibHcOpts += -fPIC -fexternal-dynamic-refs
|
||||||
|
GhcRtsHcOpts += -fPIC -fexternal-dynamic-refs
|
||||||
|
'' + lib.optionalString targetPlatform.useAndroidPrebuilt ''
|
||||||
|
EXTRA_CC_OPTS += -std=gnu99
|
||||||
|
'';
|
||||||
|
|
||||||
|
# Splicer will pull out correct variations
|
||||||
|
libDeps = platform: lib.optional enableTerminfo ncurses
|
||||||
|
++ [libffi]
|
||||||
|
++ lib.optional (!enableNativeBignum) gmp
|
||||||
|
++ lib.optional (platform.libc != "glibc" && !targetPlatform.isWindows) libiconv;
|
||||||
|
|
||||||
|
# TODO(@sternenseemann): is buildTarget LLVM unnecessary?
|
||||||
|
# GHC doesn't seem to have {LLC,OPT}_HOST
|
||||||
|
toolsForTarget = [
|
||||||
|
pkgsBuildTarget.targetPackages.stdenv.cc
|
||||||
|
] ++ lib.optional useLLVM buildTargetLlvmPackages.llvm;
|
||||||
|
|
||||||
|
targetCC = builtins.head toolsForTarget;
|
||||||
|
|
||||||
|
# Sometimes we have to dispatch between the bintools wrapper and the unwrapped
|
||||||
|
# derivation for certain tools depending on the platform.
|
||||||
|
bintoolsFor = {
|
||||||
|
# GHC needs install_name_tool on all darwin platforms. On aarch64-darwin it is
|
||||||
|
# part of the bintools wrapper (due to codesigning requirements), but not on
|
||||||
|
# x86_64-darwin.
|
||||||
|
install_name_tool =
|
||||||
|
if stdenv.targetPlatform.isAarch64
|
||||||
|
then targetCC.bintools
|
||||||
|
else targetCC.bintools.bintools;
|
||||||
|
# Same goes for strip.
|
||||||
|
strip =
|
||||||
|
# TODO(@sternenseemann): also use wrapper if linker == "bfd" or "gold"
|
||||||
|
if stdenv.targetPlatform.isAarch64 && stdenv.targetPlatform.isDarwin
|
||||||
|
then targetCC.bintools
|
||||||
|
else targetCC.bintools.bintools;
|
||||||
|
};
|
||||||
|
|
||||||
|
# Use gold either following the default, or to avoid the BFD linker due to some bugs / perf issues.
|
||||||
|
# But we cannot avoid BFD when using musl libc due to https://sourceware.org/bugzilla/show_bug.cgi?id=23856
|
||||||
|
# see #84670 and #49071 for more background.
|
||||||
|
useLdGold = targetPlatform.linker == "gold" ||
|
||||||
|
(targetPlatform.linker == "bfd" && (targetCC.bintools.bintools.hasGold or false) && !targetPlatform.isMusl);
|
||||||
|
|
||||||
|
# Makes debugging easier to see which variant is at play in `nix-store -q --tree`.
|
||||||
|
variantSuffix = lib.concatStrings [
|
||||||
|
(lib.optionalString stdenv.hostPlatform.isMusl "-musl")
|
||||||
|
(lib.optionalString enableNativeBignum "-native-bignum")
|
||||||
|
];
|
||||||
|
|
||||||
|
in
|
||||||
|
|
||||||
|
# C compiler, bintools and LLVM are used at build time, but will also leak into
|
||||||
|
# the resulting GHC's settings file and used at runtime. This means that we are
|
||||||
|
# currently only able to build GHC if hostPlatform == buildPlatform.
|
||||||
|
assert targetCC == pkgsHostTarget.targetPackages.stdenv.cc;
|
||||||
|
assert buildTargetLlvmPackages.llvm == llvmPackages.llvm;
|
||||||
|
assert stdenv.targetPlatform.isDarwin -> buildTargetLlvmPackages.clang == llvmPackages.clang;
|
||||||
|
|
||||||
|
stdenv.mkDerivation (rec {
|
||||||
|
version = "9.4.7";
|
||||||
|
pname = "${targetPrefix}ghc${variantSuffix}";
|
||||||
|
|
||||||
|
src = fetchurl {
|
||||||
|
url = "https://downloads.haskell.org/ghc/${version}/ghc-${version}-src.tar.xz";
|
||||||
|
sha256 = "06775a52b4d13ac09edc6dabc299fd11e59d8886bbcae450af367baee2684c8f";
|
||||||
|
};
|
||||||
|
|
||||||
|
enableParallelBuilding = true;
|
||||||
|
|
||||||
|
outputs = [ "out" "doc" ];
|
||||||
|
|
||||||
|
patches = [
|
||||||
|
# Don't generate code that doesn't compile when --enable-relocatable is passed to Setup.hs
|
||||||
|
# Can be removed if the Cabal library included with ghc backports the linked fix
|
||||||
|
(fetchpatch {
|
||||||
|
url = "https://github.com/haskell/cabal/commit/6c796218c92f93c95e94d5ec2d077f6956f68e98.patch";
|
||||||
|
stripLen = 1;
|
||||||
|
extraPrefix = "libraries/Cabal/";
|
||||||
|
sha256 = "sha256-yRQ6YmMiwBwiYseC5BsrEtDgFbWvst+maGgDtdD0vAY=";
|
||||||
|
})
|
||||||
|
|
||||||
|
# Fix docs build with Sphinx >= 7 https://gitlab.haskell.org/ghc/ghc/-/issues/24129
|
||||||
|
./docs-sphinx-7.patch
|
||||||
|
] ++ lib.optionals (stdenv.targetPlatform.isDarwin && stdenv.targetPlatform.isAarch64) [
|
||||||
|
# Prevent the paths module from emitting symbols that we don't use
|
||||||
|
# when building with separate outputs.
|
||||||
|
#
|
||||||
|
# These cause problems as they're not eliminated by GHC's dead code
|
||||||
|
# elimination on aarch64-darwin. (see
|
||||||
|
# https://github.com/NixOS/nixpkgs/issues/140774 for details).
|
||||||
|
./Cabal-at-least-3.6-paths-fix-cycle-aarch64-darwin.patch
|
||||||
|
];
|
||||||
|
|
||||||
|
postPatch = "patchShebangs .";
|
||||||
|
|
||||||
|
# GHC needs the locale configured during the Haddock phase.
|
||||||
|
LANG = "en_US.UTF-8";
|
||||||
|
|
||||||
|
# GHC is a bit confused on its cross terminology.
|
||||||
|
# TODO(@sternenseemann): investigate coreutils dependencies and pass absolute paths
|
||||||
|
preConfigure = ''
|
||||||
|
for env in $(env | grep '^TARGET_' | sed -E 's|\+?=.*||'); do
|
||||||
|
export "''${env#TARGET_}=''${!env}"
|
||||||
|
done
|
||||||
|
# GHC is a bit confused on its cross terminology, as these would normally be
|
||||||
|
# the *host* tools.
|
||||||
|
export CC="${targetCC}/bin/${targetCC.targetPrefix}cc"
|
||||||
|
export CXX="${targetCC}/bin/${targetCC.targetPrefix}c++"
|
||||||
|
# Use gold to work around https://sourceware.org/bugzilla/show_bug.cgi?id=16177
|
||||||
|
export LD="${targetCC.bintools}/bin/${targetCC.bintools.targetPrefix}ld${lib.optionalString useLdGold ".gold"}"
|
||||||
|
export AS="${targetCC.bintools.bintools}/bin/${targetCC.bintools.targetPrefix}as"
|
||||||
|
export AR="${targetCC.bintools.bintools}/bin/${targetCC.bintools.targetPrefix}ar"
|
||||||
|
export NM="${targetCC.bintools.bintools}/bin/${targetCC.bintools.targetPrefix}nm"
|
||||||
|
export RANLIB="${targetCC.bintools.bintools}/bin/${targetCC.bintools.targetPrefix}ranlib"
|
||||||
|
export READELF="${targetCC.bintools.bintools}/bin/${targetCC.bintools.targetPrefix}readelf"
|
||||||
|
export STRIP="${bintoolsFor.strip}/bin/${bintoolsFor.strip.targetPrefix}strip"
|
||||||
|
'' + lib.optionalString (stdenv.targetPlatform.linker == "cctools") ''
|
||||||
|
export OTOOL="${targetCC.bintools.bintools}/bin/${targetCC.bintools.targetPrefix}otool"
|
||||||
|
export INSTALL_NAME_TOOL="${bintoolsFor.install_name_tool}/bin/${bintoolsFor.install_name_tool.targetPrefix}install_name_tool"
|
||||||
|
'' + lib.optionalString useLLVM ''
|
||||||
|
export LLC="${lib.getBin buildTargetLlvmPackages.llvm}/bin/llc"
|
||||||
|
export OPT="${lib.getBin buildTargetLlvmPackages.llvm}/bin/opt"
|
||||||
|
'' + lib.optionalString (useLLVM && stdenv.targetPlatform.isDarwin) ''
|
||||||
|
# LLVM backend on Darwin needs clang: https://downloads.haskell.org/~ghc/latest/docs/html/users_guide/codegens.html#llvm-code-generator-fllvm
|
||||||
|
export CLANG="${buildTargetLlvmPackages.clang}/bin/${buildTargetLlvmPackages.clang.targetPrefix}clang"
|
||||||
|
'' + ''
|
||||||
|
|
||||||
|
echo -n "${buildMK}" > mk/build.mk
|
||||||
|
|
||||||
|
sed -i -e 's|-isysroot /Developer/SDKs/MacOSX10.5.sdk||' configure
|
||||||
|
'' + lib.optionalString (stdenv.isLinux && hostPlatform.libc == "glibc") ''
|
||||||
|
export LOCALE_ARCHIVE="${glibcLocales}/lib/locale/locale-archive"
|
||||||
|
'' + lib.optionalString (!stdenv.isDarwin) ''
|
||||||
|
export NIX_LDFLAGS+=" -rpath $out/lib/ghc-${version}"
|
||||||
|
'' + lib.optionalString stdenv.isDarwin ''
|
||||||
|
export NIX_LDFLAGS+=" -no_dtrace_dof"
|
||||||
|
|
||||||
|
# GHC tries the host xattr /usr/bin/xattr by default which fails since it expects python to be 2.7
|
||||||
|
export XATTR=${lib.getBin xattr}/bin/xattr
|
||||||
|
'' + lib.optionalString targetPlatform.useAndroidPrebuilt ''
|
||||||
|
sed -i -e '5i ,("armv7a-unknown-linux-androideabi", ("e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64", "cortex-a8", ""))' llvm-targets
|
||||||
|
'' + lib.optionalString targetPlatform.isMusl ''
|
||||||
|
echo "patching llvm-targets for musl targets..."
|
||||||
|
echo "Cloning these existing '*-linux-gnu*' targets:"
|
||||||
|
grep linux-gnu llvm-targets | sed 's/^/ /'
|
||||||
|
echo "(go go gadget sed)"
|
||||||
|
sed -i 's,\(^.*linux-\)gnu\(.*\)$,\0\n\1musl\2,' llvm-targets
|
||||||
|
echo "llvm-targets now contains these '*-linux-musl*' targets:"
|
||||||
|
grep linux-musl llvm-targets | sed 's/^/ /'
|
||||||
|
|
||||||
|
echo "And now patching to preserve '-musleabi' as done with '-gnueabi'"
|
||||||
|
# (aclocal.m4 is actual source, but patch configure as well since we don't re-gen)
|
||||||
|
for x in configure aclocal.m4; do
|
||||||
|
substituteInPlace $x \
|
||||||
|
--replace '*-android*|*-gnueabi*)' \
|
||||||
|
'*-android*|*-gnueabi*|*-musleabi*)'
|
||||||
|
done
|
||||||
|
''
|
||||||
|
# HACK: allow bootstrapping with GHC 8.10 which works fine, as we don't have
|
||||||
|
# binary 9.0 packaged. Bootstrapping with 9.2 is broken without hadrian.
|
||||||
|
+ ''
|
||||||
|
substituteInPlace configure --replace \
|
||||||
|
'MinBootGhcVersion="9.0"' \
|
||||||
|
'MinBootGhcVersion="8.10"'
|
||||||
|
'';
|
||||||
|
|
||||||
|
# TODO(@Ericson2314): Always pass "--target" and always prefix.
|
||||||
|
configurePlatforms = [ "build" "host" ]
|
||||||
|
++ lib.optional (targetPlatform != hostPlatform) "target";
|
||||||
|
|
||||||
|
# `--with` flags for libraries needed for RTS linker
|
||||||
|
configureFlags = [
|
||||||
|
"--datadir=$doc/share/doc/ghc"
|
||||||
|
"--with-curses-includes=${ncurses.dev}/include" "--with-curses-libraries=${ncurses.out}/lib"
|
||||||
|
] ++ lib.optionals (libffi != null) [
|
||||||
|
"--with-system-libffi"
|
||||||
|
"--with-ffi-includes=${targetPackages.libffi.dev}/include"
|
||||||
|
"--with-ffi-libraries=${targetPackages.libffi.out}/lib"
|
||||||
|
] ++ lib.optionals (targetPlatform == hostPlatform && !enableNativeBignum) [
|
||||||
|
"--with-gmp-includes=${targetPackages.gmp.dev}/include"
|
||||||
|
"--with-gmp-libraries=${targetPackages.gmp.out}/lib"
|
||||||
|
] ++ lib.optionals (targetPlatform == hostPlatform && hostPlatform.libc != "glibc" && !targetPlatform.isWindows) [
|
||||||
|
"--with-iconv-includes=${libiconv}/include"
|
||||||
|
"--with-iconv-libraries=${libiconv}/lib"
|
||||||
|
] ++ lib.optionals (targetPlatform != hostPlatform) [
|
||||||
|
"--enable-bootstrap-with-devel-snapshot"
|
||||||
|
] ++ lib.optionals useLdGold [
|
||||||
|
"CFLAGS=-fuse-ld=gold"
|
||||||
|
"CONF_GCC_LINKER_OPTS_STAGE1=-fuse-ld=gold"
|
||||||
|
"CONF_GCC_LINKER_OPTS_STAGE2=-fuse-ld=gold"
|
||||||
|
] ++ lib.optionals (disableLargeAddressSpace) [
|
||||||
|
"--disable-large-address-space"
|
||||||
|
];
|
||||||
|
|
||||||
|
# Make sure we never relax`$PATH` and hooks support for compatibility.
|
||||||
|
strictDeps = true;
|
||||||
|
|
||||||
|
# Don’t add -liconv to LDFLAGS automatically so that GHC will add it itself.
|
||||||
|
dontAddExtraLibs = true;
|
||||||
|
|
||||||
|
nativeBuildInputs = [
|
||||||
|
perl autoconf automake m4 python3
|
||||||
|
ghc bootPkgs.alex bootPkgs.happy bootPkgs.hscolour
|
||||||
|
] ++ lib.optionals (stdenv.isDarwin && stdenv.isAarch64) [
|
||||||
|
autoSignDarwinBinariesHook
|
||||||
|
] ++ lib.optionals enableDocs [
|
||||||
|
sphinx
|
||||||
|
];
|
||||||
|
|
||||||
|
# For building runtime libs
|
||||||
|
depsBuildTarget = toolsForTarget;
|
||||||
|
|
||||||
|
buildInputs = [ perl bash ] ++ (libDeps hostPlatform);
|
||||||
|
|
||||||
|
depsTargetTarget = map lib.getDev (libDeps targetPlatform);
|
||||||
|
depsTargetTargetPropagated = map (lib.getOutput "out") (libDeps targetPlatform);
|
||||||
|
|
||||||
|
# required, because otherwise all symbols from HSffi.o are stripped, and
|
||||||
|
# that in turn causes GHCi to abort
|
||||||
|
stripDebugFlags = [ "-S" ] ++ lib.optional (!targetPlatform.isDarwin) "--keep-file-symbols";
|
||||||
|
|
||||||
|
checkTarget = "test";
|
||||||
|
|
||||||
|
hardeningDisable =
|
||||||
|
[ "format" ]
|
||||||
|
# In nixpkgs, musl based builds currently enable `pie` hardening by default
|
||||||
|
# (see `defaultHardeningFlags` in `make-derivation.nix`).
|
||||||
|
# But GHC cannot currently produce outputs that are ready for `-pie` linking.
|
||||||
|
# Thus, disable `pie` hardening, otherwise `recompile with -fPIE` errors appear.
|
||||||
|
# See:
|
||||||
|
# * https://github.com/NixOS/nixpkgs/issues/129247
|
||||||
|
# * https://gitlab.haskell.org/ghc/ghc/-/issues/19580
|
||||||
|
++ lib.optional stdenv.targetPlatform.isMusl "pie";
|
||||||
|
|
||||||
|
# big-parallel allows us to build with more than 2 cores on
|
||||||
|
# Hydra which already warrants a significant speedup
|
||||||
|
requiredSystemFeatures = [ "big-parallel" ];
|
||||||
|
|
||||||
|
postInstall = ''
|
||||||
|
# Install the bash completion file.
|
||||||
|
install -D -m 444 utils/completion/ghc.bash $out/share/bash-completion/completions/${targetPrefix}ghc
|
||||||
|
'';
|
||||||
|
|
||||||
|
passthru = {
|
||||||
|
inherit bootPkgs targetPrefix;
|
||||||
|
|
||||||
|
inherit llvmPackages;
|
||||||
|
inherit enableShared;
|
||||||
|
|
||||||
|
# This is used by the haskell builder to query
|
||||||
|
# the presence of the haddock program.
|
||||||
|
hasHaddock = enableHaddockProgram;
|
||||||
|
|
||||||
|
# Our Cabal compiler name
|
||||||
|
haskellCompilerName = "ghc-${version}";
|
||||||
|
};
|
||||||
|
|
||||||
|
meta = {
|
||||||
|
homepage = "http://haskell.org/ghc";
|
||||||
|
description = "The Glasgow Haskell Compiler";
|
||||||
|
maintainers = with lib.maintainers; [ ];
|
||||||
|
timeout = 24 * 3600;
|
||||||
|
inherit (ghc.meta) license platforms;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // lib.optionalAttrs targetPlatform.useAndroidPrebuilt {
|
||||||
|
dontStrip = true;
|
||||||
|
dontPatchELF = true;
|
||||||
|
noAuditTmpdir = true;
|
||||||
|
})
|
386
pkgs/by-name/ha/haskell/ghc/9.4.8.nix
Normal file
386
pkgs/by-name/ha/haskell/ghc/9.4.8.nix
Normal file
|
@ -0,0 +1,386 @@
|
||||||
|
# DO NOT port this expression to hadrian. It is not possible to build a GHC
|
||||||
|
# cross compiler with 9.4.* and hadrian.
|
||||||
|
{ lib, stdenv, pkgsBuildTarget, pkgsHostTarget, targetPackages
|
||||||
|
|
||||||
|
# build-tools
|
||||||
|
, bootPkgs
|
||||||
|
, autoconf, automake, coreutils, fetchpatch, fetchurl, perl, python3, m4, sphinx
|
||||||
|
, xattr, autoSignDarwinBinariesHook
|
||||||
|
, bash
|
||||||
|
|
||||||
|
, libiconv ? null, ncurses
|
||||||
|
, glibcLocales ? null
|
||||||
|
|
||||||
|
, # GHC can be built with system libffi or a bundled one.
|
||||||
|
libffi ? null
|
||||||
|
|
||||||
|
, useLLVM ? !(stdenv.targetPlatform.isx86
|
||||||
|
|| stdenv.targetPlatform.isPower
|
||||||
|
|| stdenv.targetPlatform.isSparc
|
||||||
|
|| stdenv.targetPlatform.isAarch64)
|
||||||
|
, # LLVM is conceptually a run-time-only dependency, but for
|
||||||
|
# non-x86, we need LLVM to bootstrap later stages, so it becomes a
|
||||||
|
# build-time dependency too.
|
||||||
|
buildTargetLlvmPackages, llvmPackages
|
||||||
|
|
||||||
|
, # If enabled, GHC will be built with the GPL-free but slightly slower native
|
||||||
|
# bignum backend instead of the faster but GPLed gmp backend.
|
||||||
|
enableNativeBignum ? !(lib.meta.availableOn stdenv.hostPlatform gmp
|
||||||
|
&& lib.meta.availableOn stdenv.targetPlatform gmp)
|
||||||
|
, gmp
|
||||||
|
|
||||||
|
, # If enabled, use -fPIC when compiling static libs.
|
||||||
|
enableRelocatedStaticLibs ? stdenv.targetPlatform != stdenv.hostPlatform
|
||||||
|
|
||||||
|
, enableProfiledLibs ? true
|
||||||
|
|
||||||
|
, # Whether to build dynamic libs for the standard library (on the target
|
||||||
|
# platform). Static libs are always built.
|
||||||
|
enableShared ? with stdenv.targetPlatform; !isWindows && !useiOSPrebuilt && !isStatic
|
||||||
|
|
||||||
|
, # Whether to build terminfo.
|
||||||
|
enableTerminfo ? !stdenv.targetPlatform.isWindows
|
||||||
|
|
||||||
|
, # What flavour to build. An empty string indicates no
|
||||||
|
# specific flavour and falls back to ghc default values.
|
||||||
|
ghcFlavour ? lib.optionalString (stdenv.targetPlatform != stdenv.hostPlatform)
|
||||||
|
(if useLLVM then "perf-cross" else "perf-cross-ncg")
|
||||||
|
|
||||||
|
, # Whether to build sphinx documentation.
|
||||||
|
enableDocs ? (
|
||||||
|
# Docs disabled if we are building on musl because it's a large task to keep
|
||||||
|
# all `sphinx` dependencies building in this environment.
|
||||||
|
!stdenv.buildPlatform.isMusl
|
||||||
|
)
|
||||||
|
|
||||||
|
, enableHaddockProgram ?
|
||||||
|
# Disabled for cross; see note [HADDOCK_DOCS].
|
||||||
|
(stdenv.targetPlatform == stdenv.hostPlatform)
|
||||||
|
|
||||||
|
, # Whether to disable the large address space allocator
|
||||||
|
# necessary fix for iOS: https://www.reddit.com/r/haskell/comments/4ttdz1/building_an_osxi386_to_iosarm64_cross_compiler/d5qvd67/
|
||||||
|
disableLargeAddressSpace ? stdenv.targetPlatform.isiOS
|
||||||
|
}:
|
||||||
|
|
||||||
|
assert !enableNativeBignum -> gmp != null;
|
||||||
|
|
||||||
|
# Cross cannot currently build the `haddock` program for silly reasons,
|
||||||
|
# see note [HADDOCK_DOCS].
|
||||||
|
assert (stdenv.targetPlatform != stdenv.hostPlatform) -> !enableHaddockProgram;
|
||||||
|
|
||||||
|
let
|
||||||
|
inherit (stdenv) buildPlatform hostPlatform targetPlatform;
|
||||||
|
|
||||||
|
inherit (bootPkgs) ghc;
|
||||||
|
|
||||||
|
# TODO(@Ericson2314) Make unconditional
|
||||||
|
targetPrefix = lib.optionalString
|
||||||
|
(targetPlatform != hostPlatform)
|
||||||
|
"${targetPlatform.config}-";
|
||||||
|
|
||||||
|
buildMK = ''
|
||||||
|
BuildFlavour = ${ghcFlavour}
|
||||||
|
ifneq \"\$(BuildFlavour)\" \"\"
|
||||||
|
include mk/flavours/\$(BuildFlavour).mk
|
||||||
|
endif
|
||||||
|
BUILD_SPHINX_HTML = ${if enableDocs then "YES" else "NO"}
|
||||||
|
BUILD_SPHINX_PDF = NO
|
||||||
|
'' +
|
||||||
|
# Note [HADDOCK_DOCS]:
|
||||||
|
# Unfortunately currently `HADDOCK_DOCS` controls both whether the `haddock`
|
||||||
|
# program is built (which we generally always want to have a complete GHC install)
|
||||||
|
# and whether it is run on the GHC sources to generate hyperlinked source code
|
||||||
|
# (which is impossible for cross-compilation); see:
|
||||||
|
# https://gitlab.haskell.org/ghc/ghc/-/issues/20077
|
||||||
|
# This implies that currently a cross-compiled GHC will never have a `haddock`
|
||||||
|
# program, so it can never generate haddocks for any packages.
|
||||||
|
# If this is solved in the future, we'd like to unconditionally
|
||||||
|
# build the haddock program (removing the `enableHaddockProgram` option).
|
||||||
|
''
|
||||||
|
HADDOCK_DOCS = ${if enableHaddockProgram then "YES" else "NO"}
|
||||||
|
# Build haddocks for boot packages with hyperlinking
|
||||||
|
EXTRA_HADDOCK_OPTS += --hyperlinked-source --quickjump
|
||||||
|
|
||||||
|
DYNAMIC_GHC_PROGRAMS = ${if enableShared then "YES" else "NO"}
|
||||||
|
BIGNUM_BACKEND = ${if enableNativeBignum then "native" else "gmp"}
|
||||||
|
'' + lib.optionalString (targetPlatform != hostPlatform) ''
|
||||||
|
Stage1Only = ${if targetPlatform.system == hostPlatform.system then "NO" else "YES"}
|
||||||
|
CrossCompilePrefix = ${targetPrefix}
|
||||||
|
'' + lib.optionalString (!enableProfiledLibs) ''
|
||||||
|
BUILD_PROF_LIBS = NO
|
||||||
|
'' +
|
||||||
|
# -fexternal-dynamic-refs apparently (because it's not clear from the documentation)
|
||||||
|
# makes the GHC RTS able to load static libraries, which may be needed for TemplateHaskell.
|
||||||
|
# This solution was described in https://www.tweag.io/blog/2020-09-30-bazel-static-haskell
|
||||||
|
lib.optionalString enableRelocatedStaticLibs ''
|
||||||
|
GhcLibHcOpts += -fPIC -fexternal-dynamic-refs
|
||||||
|
GhcRtsHcOpts += -fPIC -fexternal-dynamic-refs
|
||||||
|
'' + lib.optionalString targetPlatform.useAndroidPrebuilt ''
|
||||||
|
EXTRA_CC_OPTS += -std=gnu99
|
||||||
|
'';
|
||||||
|
|
||||||
|
# Splicer will pull out correct variations
|
||||||
|
libDeps = platform: lib.optional enableTerminfo ncurses
|
||||||
|
++ [libffi]
|
||||||
|
++ lib.optional (!enableNativeBignum) gmp
|
||||||
|
++ lib.optional (platform.libc != "glibc" && !targetPlatform.isWindows) libiconv;
|
||||||
|
|
||||||
|
# TODO(@sternenseemann): is buildTarget LLVM unnecessary?
|
||||||
|
# GHC doesn't seem to have {LLC,OPT}_HOST
|
||||||
|
toolsForTarget = [
|
||||||
|
pkgsBuildTarget.targetPackages.stdenv.cc
|
||||||
|
] ++ lib.optional useLLVM buildTargetLlvmPackages.llvm;
|
||||||
|
|
||||||
|
targetCC = builtins.head toolsForTarget;
|
||||||
|
|
||||||
|
# Sometimes we have to dispatch between the bintools wrapper and the unwrapped
|
||||||
|
# derivation for certain tools depending on the platform.
|
||||||
|
bintoolsFor = {
|
||||||
|
# GHC needs install_name_tool on all darwin platforms. On aarch64-darwin it is
|
||||||
|
# part of the bintools wrapper (due to codesigning requirements), but not on
|
||||||
|
# x86_64-darwin.
|
||||||
|
install_name_tool =
|
||||||
|
if stdenv.targetPlatform.isAarch64
|
||||||
|
then targetCC.bintools
|
||||||
|
else targetCC.bintools.bintools;
|
||||||
|
# Same goes for strip.
|
||||||
|
strip =
|
||||||
|
# TODO(@sternenseemann): also use wrapper if linker == "bfd" or "gold"
|
||||||
|
if stdenv.targetPlatform.isAarch64 && stdenv.targetPlatform.isDarwin
|
||||||
|
then targetCC.bintools
|
||||||
|
else targetCC.bintools.bintools;
|
||||||
|
};
|
||||||
|
|
||||||
|
# Use gold either following the default, or to avoid the BFD linker due to some bugs / perf issues.
|
||||||
|
# But we cannot avoid BFD when using musl libc due to https://sourceware.org/bugzilla/show_bug.cgi?id=23856
|
||||||
|
# see #84670 and #49071 for more background.
|
||||||
|
useLdGold = targetPlatform.linker == "gold" ||
|
||||||
|
(targetPlatform.linker == "bfd" && (targetCC.bintools.bintools.hasGold or false) && !targetPlatform.isMusl);
|
||||||
|
|
||||||
|
# Makes debugging easier to see which variant is at play in `nix-store -q --tree`.
|
||||||
|
variantSuffix = lib.concatStrings [
|
||||||
|
(lib.optionalString stdenv.hostPlatform.isMusl "-musl")
|
||||||
|
(lib.optionalString enableNativeBignum "-native-bignum")
|
||||||
|
];
|
||||||
|
|
||||||
|
in
|
||||||
|
|
||||||
|
# C compiler, bintools and LLVM are used at build time, but will also leak into
|
||||||
|
# the resulting GHC's settings file and used at runtime. This means that we are
|
||||||
|
# currently only able to build GHC if hostPlatform == buildPlatform.
|
||||||
|
assert targetCC == pkgsHostTarget.targetPackages.stdenv.cc;
|
||||||
|
assert buildTargetLlvmPackages.llvm == llvmPackages.llvm;
|
||||||
|
assert stdenv.targetPlatform.isDarwin -> buildTargetLlvmPackages.clang == llvmPackages.clang;
|
||||||
|
|
||||||
|
stdenv.mkDerivation (rec {
|
||||||
|
version = "9.4.8";
|
||||||
|
pname = "${targetPrefix}ghc${variantSuffix}";
|
||||||
|
|
||||||
|
src = fetchurl {
|
||||||
|
url = "https://downloads.haskell.org/ghc/${version}/ghc-${version}-src.tar.xz";
|
||||||
|
sha256 = "0bf407eb67fe3e3c24b0f4c8dea8cb63e07f63ca0f76cf2058565143507ab85e";
|
||||||
|
};
|
||||||
|
|
||||||
|
enableParallelBuilding = true;
|
||||||
|
|
||||||
|
outputs = [ "out" "doc" ];
|
||||||
|
|
||||||
|
patches = [
|
||||||
|
# Don't generate code that doesn't compile when --enable-relocatable is passed to Setup.hs
|
||||||
|
# Can be removed if the Cabal library included with ghc backports the linked fix
|
||||||
|
(fetchpatch {
|
||||||
|
url = "https://github.com/haskell/cabal/commit/6c796218c92f93c95e94d5ec2d077f6956f68e98.patch";
|
||||||
|
stripLen = 1;
|
||||||
|
extraPrefix = "libraries/Cabal/";
|
||||||
|
sha256 = "sha256-yRQ6YmMiwBwiYseC5BsrEtDgFbWvst+maGgDtdD0vAY=";
|
||||||
|
})
|
||||||
|
|
||||||
|
# Fix docs build with Sphinx >= 7 https://gitlab.haskell.org/ghc/ghc/-/issues/24129
|
||||||
|
./docs-sphinx-7.patch
|
||||||
|
] ++ lib.optionals (stdenv.targetPlatform.isDarwin && stdenv.targetPlatform.isAarch64) [
|
||||||
|
# Prevent the paths module from emitting symbols that we don't use
|
||||||
|
# when building with separate outputs.
|
||||||
|
#
|
||||||
|
# These cause problems as they're not eliminated by GHC's dead code
|
||||||
|
# elimination on aarch64-darwin. (see
|
||||||
|
# https://github.com/NixOS/nixpkgs/issues/140774 for details).
|
||||||
|
./Cabal-at-least-3.6-paths-fix-cycle-aarch64-darwin.patch
|
||||||
|
];
|
||||||
|
|
||||||
|
postPatch = "patchShebangs .";
|
||||||
|
|
||||||
|
# GHC needs the locale configured during the Haddock phase.
|
||||||
|
LANG = "en_US.UTF-8";
|
||||||
|
|
||||||
|
# GHC is a bit confused on its cross terminology.
|
||||||
|
# TODO(@sternenseemann): investigate coreutils dependencies and pass absolute paths
|
||||||
|
preConfigure = ''
|
||||||
|
for env in $(env | grep '^TARGET_' | sed -E 's|\+?=.*||'); do
|
||||||
|
export "''${env#TARGET_}=''${!env}"
|
||||||
|
done
|
||||||
|
# GHC is a bit confused on its cross terminology, as these would normally be
|
||||||
|
# the *host* tools.
|
||||||
|
export CC="${targetCC}/bin/${targetCC.targetPrefix}cc"
|
||||||
|
export CXX="${targetCC}/bin/${targetCC.targetPrefix}c++"
|
||||||
|
# Use gold to work around https://sourceware.org/bugzilla/show_bug.cgi?id=16177
|
||||||
|
export LD="${targetCC.bintools}/bin/${targetCC.bintools.targetPrefix}ld${lib.optionalString useLdGold ".gold"}"
|
||||||
|
export AS="${targetCC.bintools.bintools}/bin/${targetCC.bintools.targetPrefix}as"
|
||||||
|
export AR="${targetCC.bintools.bintools}/bin/${targetCC.bintools.targetPrefix}ar"
|
||||||
|
export NM="${targetCC.bintools.bintools}/bin/${targetCC.bintools.targetPrefix}nm"
|
||||||
|
export RANLIB="${targetCC.bintools.bintools}/bin/${targetCC.bintools.targetPrefix}ranlib"
|
||||||
|
export READELF="${targetCC.bintools.bintools}/bin/${targetCC.bintools.targetPrefix}readelf"
|
||||||
|
export STRIP="${bintoolsFor.strip}/bin/${bintoolsFor.strip.targetPrefix}strip"
|
||||||
|
'' + lib.optionalString (stdenv.targetPlatform.linker == "cctools") ''
|
||||||
|
export OTOOL="${targetCC.bintools.bintools}/bin/${targetCC.bintools.targetPrefix}otool"
|
||||||
|
export INSTALL_NAME_TOOL="${bintoolsFor.install_name_tool}/bin/${bintoolsFor.install_name_tool.targetPrefix}install_name_tool"
|
||||||
|
'' + lib.optionalString useLLVM ''
|
||||||
|
export LLC="${lib.getBin buildTargetLlvmPackages.llvm}/bin/llc"
|
||||||
|
export OPT="${lib.getBin buildTargetLlvmPackages.llvm}/bin/opt"
|
||||||
|
'' + lib.optionalString (useLLVM && stdenv.targetPlatform.isDarwin) ''
|
||||||
|
# LLVM backend on Darwin needs clang: https://downloads.haskell.org/~ghc/latest/docs/html/users_guide/codegens.html#llvm-code-generator-fllvm
|
||||||
|
export CLANG="${buildTargetLlvmPackages.clang}/bin/${buildTargetLlvmPackages.clang.targetPrefix}clang"
|
||||||
|
'' + ''
|
||||||
|
|
||||||
|
echo -n "${buildMK}" > mk/build.mk
|
||||||
|
|
||||||
|
sed -i -e 's|-isysroot /Developer/SDKs/MacOSX10.5.sdk||' configure
|
||||||
|
'' + lib.optionalString (stdenv.isLinux && hostPlatform.libc == "glibc") ''
|
||||||
|
export LOCALE_ARCHIVE="${glibcLocales}/lib/locale/locale-archive"
|
||||||
|
'' + lib.optionalString (!stdenv.isDarwin) ''
|
||||||
|
export NIX_LDFLAGS+=" -rpath $out/lib/ghc-${version}"
|
||||||
|
'' + lib.optionalString stdenv.isDarwin ''
|
||||||
|
export NIX_LDFLAGS+=" -no_dtrace_dof"
|
||||||
|
|
||||||
|
# GHC tries the host xattr /usr/bin/xattr by default which fails since it expects python to be 2.7
|
||||||
|
export XATTR=${lib.getBin xattr}/bin/xattr
|
||||||
|
'' + lib.optionalString targetPlatform.useAndroidPrebuilt ''
|
||||||
|
sed -i -e '5i ,("armv7a-unknown-linux-androideabi", ("e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64", "cortex-a8", ""))' llvm-targets
|
||||||
|
'' + lib.optionalString targetPlatform.isMusl ''
|
||||||
|
echo "patching llvm-targets for musl targets..."
|
||||||
|
echo "Cloning these existing '*-linux-gnu*' targets:"
|
||||||
|
grep linux-gnu llvm-targets | sed 's/^/ /'
|
||||||
|
echo "(go go gadget sed)"
|
||||||
|
sed -i 's,\(^.*linux-\)gnu\(.*\)$,\0\n\1musl\2,' llvm-targets
|
||||||
|
echo "llvm-targets now contains these '*-linux-musl*' targets:"
|
||||||
|
grep linux-musl llvm-targets | sed 's/^/ /'
|
||||||
|
|
||||||
|
echo "And now patching to preserve '-musleabi' as done with '-gnueabi'"
|
||||||
|
# (aclocal.m4 is actual source, but patch configure as well since we don't re-gen)
|
||||||
|
for x in configure aclocal.m4; do
|
||||||
|
substituteInPlace $x \
|
||||||
|
--replace '*-android*|*-gnueabi*)' \
|
||||||
|
'*-android*|*-gnueabi*|*-musleabi*)'
|
||||||
|
done
|
||||||
|
''
|
||||||
|
# HACK: allow bootstrapping with GHC 8.10 which works fine, as we don't have
|
||||||
|
# binary 9.0 packaged. Bootstrapping with 9.2 is broken without hadrian.
|
||||||
|
+ ''
|
||||||
|
substituteInPlace configure --replace \
|
||||||
|
'MinBootGhcVersion="9.0"' \
|
||||||
|
'MinBootGhcVersion="8.10"'
|
||||||
|
'';
|
||||||
|
|
||||||
|
# TODO(@Ericson2314): Always pass "--target" and always prefix.
|
||||||
|
configurePlatforms = [ "build" "host" ]
|
||||||
|
++ lib.optional (targetPlatform != hostPlatform) "target";
|
||||||
|
|
||||||
|
# `--with` flags for libraries needed for RTS linker
|
||||||
|
configureFlags = [
|
||||||
|
"--datadir=$doc/share/doc/ghc"
|
||||||
|
"--with-curses-includes=${ncurses.dev}/include" "--with-curses-libraries=${ncurses.out}/lib"
|
||||||
|
] ++ lib.optionals (libffi != null) [
|
||||||
|
"--with-system-libffi"
|
||||||
|
"--with-ffi-includes=${targetPackages.libffi.dev}/include"
|
||||||
|
"--with-ffi-libraries=${targetPackages.libffi.out}/lib"
|
||||||
|
] ++ lib.optionals (targetPlatform == hostPlatform && !enableNativeBignum) [
|
||||||
|
"--with-gmp-includes=${targetPackages.gmp.dev}/include"
|
||||||
|
"--with-gmp-libraries=${targetPackages.gmp.out}/lib"
|
||||||
|
] ++ lib.optionals (targetPlatform == hostPlatform && hostPlatform.libc != "glibc" && !targetPlatform.isWindows) [
|
||||||
|
"--with-iconv-includes=${libiconv}/include"
|
||||||
|
"--with-iconv-libraries=${libiconv}/lib"
|
||||||
|
] ++ lib.optionals (targetPlatform != hostPlatform) [
|
||||||
|
"--enable-bootstrap-with-devel-snapshot"
|
||||||
|
] ++ lib.optionals useLdGold [
|
||||||
|
"CFLAGS=-fuse-ld=gold"
|
||||||
|
"CONF_GCC_LINKER_OPTS_STAGE1=-fuse-ld=gold"
|
||||||
|
"CONF_GCC_LINKER_OPTS_STAGE2=-fuse-ld=gold"
|
||||||
|
] ++ lib.optionals (disableLargeAddressSpace) [
|
||||||
|
"--disable-large-address-space"
|
||||||
|
];
|
||||||
|
|
||||||
|
# Make sure we never relax`$PATH` and hooks support for compatibility.
|
||||||
|
strictDeps = true;
|
||||||
|
|
||||||
|
# Don’t add -liconv to LDFLAGS automatically so that GHC will add it itself.
|
||||||
|
dontAddExtraLibs = true;
|
||||||
|
|
||||||
|
nativeBuildInputs = [
|
||||||
|
perl autoconf automake m4 python3
|
||||||
|
ghc bootPkgs.alex bootPkgs.happy bootPkgs.hscolour
|
||||||
|
] ++ lib.optionals (stdenv.isDarwin && stdenv.isAarch64) [
|
||||||
|
autoSignDarwinBinariesHook
|
||||||
|
] ++ lib.optionals enableDocs [
|
||||||
|
sphinx
|
||||||
|
];
|
||||||
|
|
||||||
|
# For building runtime libs
|
||||||
|
depsBuildTarget = toolsForTarget;
|
||||||
|
|
||||||
|
buildInputs = [ perl bash ] ++ (libDeps hostPlatform);
|
||||||
|
|
||||||
|
depsTargetTarget = map lib.getDev (libDeps targetPlatform);
|
||||||
|
depsTargetTargetPropagated = map (lib.getOutput "out") (libDeps targetPlatform);
|
||||||
|
|
||||||
|
# required, because otherwise all symbols from HSffi.o are stripped, and
|
||||||
|
# that in turn causes GHCi to abort
|
||||||
|
stripDebugFlags = [ "-S" ] ++ lib.optional (!targetPlatform.isDarwin) "--keep-file-symbols";
|
||||||
|
|
||||||
|
checkTarget = "test";
|
||||||
|
|
||||||
|
hardeningDisable =
|
||||||
|
[ "format" ]
|
||||||
|
# In nixpkgs, musl based builds currently enable `pie` hardening by default
|
||||||
|
# (see `defaultHardeningFlags` in `make-derivation.nix`).
|
||||||
|
# But GHC cannot currently produce outputs that are ready for `-pie` linking.
|
||||||
|
# Thus, disable `pie` hardening, otherwise `recompile with -fPIE` errors appear.
|
||||||
|
# See:
|
||||||
|
# * https://github.com/NixOS/nixpkgs/issues/129247
|
||||||
|
# * https://gitlab.haskell.org/ghc/ghc/-/issues/19580
|
||||||
|
++ lib.optional stdenv.targetPlatform.isMusl "pie";
|
||||||
|
|
||||||
|
# big-parallel allows us to build with more than 2 cores on
|
||||||
|
# Hydra which already warrants a significant speedup
|
||||||
|
requiredSystemFeatures = [ "big-parallel" ];
|
||||||
|
|
||||||
|
postInstall = ''
|
||||||
|
# Install the bash completion file.
|
||||||
|
install -D -m 444 utils/completion/ghc.bash $out/share/bash-completion/completions/${targetPrefix}ghc
|
||||||
|
'';
|
||||||
|
|
||||||
|
passthru = {
|
||||||
|
inherit bootPkgs targetPrefix;
|
||||||
|
|
||||||
|
inherit llvmPackages;
|
||||||
|
inherit enableShared;
|
||||||
|
|
||||||
|
# This is used by the haskell builder to query
|
||||||
|
# the presence of the haddock program.
|
||||||
|
hasHaddock = enableHaddockProgram;
|
||||||
|
|
||||||
|
# Our Cabal compiler name
|
||||||
|
haskellCompilerName = "ghc-${version}";
|
||||||
|
};
|
||||||
|
|
||||||
|
meta = {
|
||||||
|
homepage = "http://haskell.org/ghc";
|
||||||
|
description = "The Glasgow Haskell Compiler";
|
||||||
|
maintainers = with lib.maintainers; [ ];
|
||||||
|
timeout = 24 * 3600;
|
||||||
|
inherit (ghc.meta) license platforms;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // lib.optionalAttrs targetPlatform.useAndroidPrebuilt {
|
||||||
|
dontStrip = true;
|
||||||
|
dontPatchELF = true;
|
||||||
|
noAuditTmpdir = true;
|
||||||
|
})
|
410
pkgs/by-name/ha/haskell/ghc/9.6.3-binary.nix
Normal file
410
pkgs/by-name/ha/haskell/ghc/9.6.3-binary.nix
Normal file
|
@ -0,0 +1,410 @@
|
||||||
|
{ lib, stdenv
|
||||||
|
, fetchurl, perl, gcc
|
||||||
|
, ncurses5
|
||||||
|
, ncurses6, gmp, libiconv, numactl, libffi
|
||||||
|
, llvmPackages
|
||||||
|
, coreutils
|
||||||
|
, targetPackages
|
||||||
|
|
||||||
|
# minimal = true; will remove files that aren't strictly necessary for
|
||||||
|
# regular builds and GHC bootstrapping.
|
||||||
|
# This is "useful" for staying within hydra's output limits for at least the
|
||||||
|
# aarch64-linux architecture.
|
||||||
|
, minimal ? false
|
||||||
|
}:
|
||||||
|
|
||||||
|
# Prebuilt only does native
|
||||||
|
assert stdenv.targetPlatform == stdenv.hostPlatform;
|
||||||
|
|
||||||
|
let
|
||||||
|
downloadsUrl = "https://downloads.haskell.org/ghc";
|
||||||
|
|
||||||
|
# Copy sha256 from https://downloads.haskell.org/~ghc/9.6.3/SHA256SUMS
|
||||||
|
version = "9.6.3";
|
||||||
|
|
||||||
|
# Information about available bindists that we use in the build.
|
||||||
|
#
|
||||||
|
# # Bindist library checking
|
||||||
|
#
|
||||||
|
# The field `archSpecificLibraries` also provides a way for us get notified
|
||||||
|
# early when the upstream bindist changes its dependencies (e.g. because a
|
||||||
|
# newer Debian version is used that uses a new `ncurses` version).
|
||||||
|
#
|
||||||
|
# Usage:
|
||||||
|
#
|
||||||
|
# * You can find the `fileToCheckFor` of libraries by running `readelf -d`
|
||||||
|
# on the compiler binary (`exePathForLibraryCheck`).
|
||||||
|
# * To skip library checking for an architecture,
|
||||||
|
# set `exePathForLibraryCheck = null`.
|
||||||
|
# * To skip file checking for a specific arch specfic library,
|
||||||
|
# set `fileToCheckFor = null`.
|
||||||
|
ghcBinDists = {
|
||||||
|
# Binary distributions for the default libc (e.g. glibc, or libSystem on Darwin)
|
||||||
|
# nixpkgs uses for the respective system.
|
||||||
|
defaultLibc = {
|
||||||
|
i686-linux = {
|
||||||
|
variantSuffix = "";
|
||||||
|
src = {
|
||||||
|
url = "${downloadsUrl}/${version}/ghc-${version}-i386-deb9-linux.tar.xz";
|
||||||
|
sha256 = "58be26f8b8f6b5bd8baf5c32abb03e2c4621646b2142fab10e5c7de5af5c50f8";
|
||||||
|
};
|
||||||
|
exePathForLibraryCheck = "bin/ghc";
|
||||||
|
archSpecificLibraries = [
|
||||||
|
{ nixPackage = gmp; fileToCheckFor = null; }
|
||||||
|
# The i686-linux bindist provided by GHC HQ is currently built on Debian 9,
|
||||||
|
# which link it against `libtinfo.so.5` (ncurses 5).
|
||||||
|
# Other bindists are linked `libtinfo.so.6` (ncurses 6).
|
||||||
|
{ nixPackage = ncurses5; fileToCheckFor = "libtinfo.so.5"; }
|
||||||
|
];
|
||||||
|
};
|
||||||
|
x86_64-linux = {
|
||||||
|
variantSuffix = "";
|
||||||
|
src = {
|
||||||
|
url = "${downloadsUrl}/${version}/ghc-${version}-x86_64-deb11-linux.tar.xz";
|
||||||
|
sha256 = "c4c0124857265926f1cf22a09d950d7ba989ff94053a4ddf3dcdab5359f4cab7";
|
||||||
|
};
|
||||||
|
exePathForLibraryCheck = "bin/ghc";
|
||||||
|
archSpecificLibraries = [
|
||||||
|
{ nixPackage = gmp; fileToCheckFor = null; }
|
||||||
|
{ nixPackage = ncurses6; fileToCheckFor = "libtinfo.so.6"; }
|
||||||
|
];
|
||||||
|
};
|
||||||
|
aarch64-linux = {
|
||||||
|
variantSuffix = "";
|
||||||
|
src = {
|
||||||
|
url = "${downloadsUrl}/${version}/ghc-${version}-aarch64-deb10-linux.tar.xz";
|
||||||
|
sha256 = "03c389859319f09452081310fc13af7525063ea8930830ef76be2a14b312271e";
|
||||||
|
};
|
||||||
|
exePathForLibraryCheck = "bin/ghc";
|
||||||
|
archSpecificLibraries = [
|
||||||
|
{ nixPackage = gmp; fileToCheckFor = null; }
|
||||||
|
{ nixPackage = ncurses6; fileToCheckFor = "libtinfo.so.6"; }
|
||||||
|
{ nixPackage = numactl; fileToCheckFor = null; }
|
||||||
|
];
|
||||||
|
};
|
||||||
|
x86_64-darwin = {
|
||||||
|
variantSuffix = "";
|
||||||
|
src = {
|
||||||
|
url = "${downloadsUrl}/${version}/ghc-${version}-x86_64-apple-darwin.tar.xz";
|
||||||
|
sha256 = "dde46118ab8388fb1066312c097123e93b1dcf6ae366e3370f88ea456382c9db";
|
||||||
|
};
|
||||||
|
exePathForLibraryCheck = null; # we don't have a library check for darwin yet
|
||||||
|
archSpecificLibraries = [
|
||||||
|
{ nixPackage = gmp; fileToCheckFor = null; }
|
||||||
|
{ nixPackage = ncurses6; fileToCheckFor = null; }
|
||||||
|
{ nixPackage = libiconv; fileToCheckFor = null; }
|
||||||
|
];
|
||||||
|
};
|
||||||
|
aarch64-darwin = {
|
||||||
|
variantSuffix = "";
|
||||||
|
src = {
|
||||||
|
url = "${downloadsUrl}/${version}/ghc-${version}-aarch64-apple-darwin.tar.xz";
|
||||||
|
sha256 = "e1cdf458926b2eaf52d2a8287d99a965040ff9051171f5c3b7467049cf0eb213";
|
||||||
|
};
|
||||||
|
exePathForLibraryCheck = null; # we don't have a library check for darwin yet
|
||||||
|
archSpecificLibraries = [
|
||||||
|
{ nixPackage = gmp; fileToCheckFor = null; }
|
||||||
|
{ nixPackage = ncurses6; fileToCheckFor = null; }
|
||||||
|
{ nixPackage = libiconv; fileToCheckFor = null; }
|
||||||
|
];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
# Binary distributions for the musl libc for the respective system.
|
||||||
|
musl = {
|
||||||
|
x86_64-linux = {
|
||||||
|
variantSuffix = "-musl";
|
||||||
|
src = {
|
||||||
|
url = "${downloadsUrl}/${version}/ghc-${version}-x86_64-alpine3_12-linux.tar.xz";
|
||||||
|
sha256 = "8f457af0aa40127049c11134c8793f64351a446e87da1f8ec256e1279b5ab61f";
|
||||||
|
};
|
||||||
|
exePathForLibraryCheck = "bin/ghc";
|
||||||
|
archSpecificLibraries = [
|
||||||
|
{ nixPackage = gmp; fileToCheckFor = null; }
|
||||||
|
{ nixPackage = ncurses6; fileToCheckFor = "libncursesw.so.6"; }
|
||||||
|
];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
distSetName = if stdenv.hostPlatform.isMusl then "musl" else "defaultLibc";
|
||||||
|
|
||||||
|
binDistUsed = ghcBinDists.${distSetName}.${stdenv.hostPlatform.system}
|
||||||
|
or (throw "cannot bootstrap GHC on this platform ('${stdenv.hostPlatform.system}' with libc '${distSetName}')");
|
||||||
|
|
||||||
|
gmpUsed = (builtins.head (
|
||||||
|
builtins.filter (
|
||||||
|
drv: lib.hasPrefix "gmp" (drv.nixPackage.name or "")
|
||||||
|
) binDistUsed.archSpecificLibraries
|
||||||
|
)).nixPackage;
|
||||||
|
|
||||||
|
# GHC has other native backends (like PowerPC), but here only the ones
|
||||||
|
# we ship bindists for matter.
|
||||||
|
useLLVM = !(stdenv.targetPlatform.isx86
|
||||||
|
|| (stdenv.targetPlatform.isAarch64 && stdenv.targetPlatform.isDarwin));
|
||||||
|
|
||||||
|
libPath =
|
||||||
|
lib.makeLibraryPath (
|
||||||
|
# Add arch-specific libraries.
|
||||||
|
map ({ nixPackage, ... }: nixPackage) binDistUsed.archSpecificLibraries
|
||||||
|
);
|
||||||
|
|
||||||
|
libEnvVar = lib.optionalString stdenv.hostPlatform.isDarwin "DY"
|
||||||
|
+ "LD_LIBRARY_PATH";
|
||||||
|
|
||||||
|
runtimeDeps = [
|
||||||
|
targetPackages.stdenv.cc
|
||||||
|
targetPackages.stdenv.cc.bintools
|
||||||
|
coreutils # for cat
|
||||||
|
]
|
||||||
|
++ lib.optionals useLLVM [
|
||||||
|
(lib.getBin llvmPackages.llvm)
|
||||||
|
]
|
||||||
|
# On darwin, we need unwrapped bintools as well (for otool)
|
||||||
|
++ lib.optionals (stdenv.targetPlatform.linker == "cctools") [
|
||||||
|
targetPackages.stdenv.cc.bintools.bintools
|
||||||
|
];
|
||||||
|
|
||||||
|
in
|
||||||
|
|
||||||
|
stdenv.mkDerivation rec {
|
||||||
|
inherit version;
|
||||||
|
pname = "ghc-binary${binDistUsed.variantSuffix}";
|
||||||
|
|
||||||
|
src = fetchurl binDistUsed.src;
|
||||||
|
|
||||||
|
nativeBuildInputs = [ perl ];
|
||||||
|
|
||||||
|
# Set LD_LIBRARY_PATH or equivalent so that the programs running as part
|
||||||
|
# of the bindist installer can find the libraries they expect.
|
||||||
|
# Cannot patchelf beforehand due to relative RPATHs that anticipate
|
||||||
|
# the final install location.
|
||||||
|
${libEnvVar} = libPath;
|
||||||
|
|
||||||
|
postUnpack =
|
||||||
|
# Verify our assumptions of which `libtinfo.so` (ncurses) version is used,
|
||||||
|
# so that we know when ghc bindists upgrade that and we need to update the
|
||||||
|
# version used in `libPath`.
|
||||||
|
lib.optionalString
|
||||||
|
(binDistUsed.exePathForLibraryCheck != null)
|
||||||
|
# Note the `*` glob because some GHCs have a suffix when unpacked, e.g.
|
||||||
|
# the musl bindist has dir `ghc-VERSION-x86_64-unknown-linux/`.
|
||||||
|
# As a result, don't shell-quote this glob when splicing the string.
|
||||||
|
(let buildExeGlob = ''ghc-${version}*/"${binDistUsed.exePathForLibraryCheck}"''; in
|
||||||
|
lib.concatStringsSep "\n" [
|
||||||
|
(''
|
||||||
|
shopt -u nullglob
|
||||||
|
echo "Checking that ghc binary exists in bindist at ${buildExeGlob}"
|
||||||
|
if ! test -e ${buildExeGlob}; then
|
||||||
|
echo >&2 "GHC binary ${binDistUsed.exePathForLibraryCheck} could not be found in the bindist build directory (at ${buildExeGlob}) for arch ${stdenv.hostPlatform.system}, please check that ghcBinDists correctly reflect the bindist dependencies!"; exit 1;
|
||||||
|
fi
|
||||||
|
'')
|
||||||
|
(lib.concatMapStringsSep
|
||||||
|
"\n"
|
||||||
|
({ fileToCheckFor, nixPackage }:
|
||||||
|
lib.optionalString (fileToCheckFor != null) ''
|
||||||
|
echo "Checking bindist for ${fileToCheckFor} to ensure that is still used"
|
||||||
|
if ! readelf -d ${buildExeGlob} | grep "${fileToCheckFor}"; then
|
||||||
|
echo >&2 "File ${fileToCheckFor} could not be found in ${binDistUsed.exePathForLibraryCheck} for arch ${stdenv.hostPlatform.system}, please check that ghcBinDists correctly reflect the bindist dependencies!"; exit 1;
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "Checking that the nix package ${nixPackage} contains ${fileToCheckFor}"
|
||||||
|
if ! test -e "${lib.getLib nixPackage}/lib/${fileToCheckFor}"; then
|
||||||
|
echo >&2 "Nix package ${nixPackage} did not contain ${fileToCheckFor} for arch ${stdenv.hostPlatform.system}, please check that ghcBinDists correctly reflect the bindist dependencies!"; exit 1;
|
||||||
|
fi
|
||||||
|
''
|
||||||
|
)
|
||||||
|
binDistUsed.archSpecificLibraries
|
||||||
|
)
|
||||||
|
])
|
||||||
|
# GHC has dtrace probes, which causes ld to try to open /usr/lib/libdtrace.dylib
|
||||||
|
# during linking
|
||||||
|
+ lib.optionalString stdenv.isDarwin ''
|
||||||
|
export NIX_LDFLAGS+=" -no_dtrace_dof"
|
||||||
|
# not enough room in the object files for the full path to libiconv :(
|
||||||
|
for exe in $(find . -type f -executable); do
|
||||||
|
isMachO $exe || continue
|
||||||
|
ln -fs ${libiconv}/lib/libiconv.dylib $(dirname $exe)/libiconv.dylib
|
||||||
|
install_name_tool -change /usr/lib/libiconv.2.dylib @executable_path/libiconv.dylib -change /usr/local/lib/gcc/6/libgcc_s.1.dylib ${gcc.cc.lib}/lib/libgcc_s.1.dylib $exe
|
||||||
|
done
|
||||||
|
''
|
||||||
|
|
||||||
|
# We have to patch the GMP paths for the ghc-bignum package, for hadrian by
|
||||||
|
# modifying the package-db directly
|
||||||
|
+ ''
|
||||||
|
find . -name 'ghc-bignum*.conf' \
|
||||||
|
-exec sed -e '/^[a-z-]*library-dirs/a \ ${lib.getLib gmpUsed}/lib' -i {} \;
|
||||||
|
''
|
||||||
|
# Similar for iconv and libffi on darwin
|
||||||
|
+ lib.optionalString stdenv.isDarwin ''
|
||||||
|
find . -name 'base*.conf' \
|
||||||
|
-exec sed -e '/^[a-z-]*library-dirs/a \ ${lib.getLib libiconv}/lib' -i {} \;
|
||||||
|
|
||||||
|
# To link RTS in the end we also need libffi now
|
||||||
|
find . -name 'rts*.conf' \
|
||||||
|
-exec sed -e '/^[a-z-]*library-dirs/a \ ${lib.getLib libffi}/lib' \
|
||||||
|
-e 's@/Library/Developer/.*/usr/include/ffi@${lib.getDev libffi}/include@' \
|
||||||
|
-i {} \;
|
||||||
|
'' +
|
||||||
|
# aarch64 does HAVE_NUMA so -lnuma requires it in library-dirs in rts/package.conf.in
|
||||||
|
# FFI_LIB_DIR is a good indication of places it must be needed.
|
||||||
|
lib.optionalString (stdenv.hostPlatform.isLinux && stdenv.hostPlatform.isAarch64) ''
|
||||||
|
find . -name package.conf.in \
|
||||||
|
-exec sed -i "s@FFI_LIB_DIR@FFI_LIB_DIR ${numactl.out}/lib@g" {} \;
|
||||||
|
'' +
|
||||||
|
# Rename needed libraries and binaries, fix interpreter
|
||||||
|
lib.optionalString stdenv.isLinux ''
|
||||||
|
find . -type f -executable -exec patchelf \
|
||||||
|
--interpreter ${stdenv.cc.bintools.dynamicLinker} {} \;
|
||||||
|
'';
|
||||||
|
|
||||||
|
# fix for `configure: error: Your linker is affected by binutils #16177`
|
||||||
|
preConfigure = lib.optionalString
|
||||||
|
stdenv.targetPlatform.isAarch32
|
||||||
|
"LD=ld.gold";
|
||||||
|
|
||||||
|
# GHC has a patched config.sub and bindists' platforms should always work
|
||||||
|
dontUpdateAutotoolsGnuConfigScripts = true;
|
||||||
|
|
||||||
|
configurePlatforms = [ ];
|
||||||
|
configureFlags =
|
||||||
|
lib.optional stdenv.isDarwin "--with-gcc=${./gcc-clang-wrapper.sh}"
|
||||||
|
# From: https://github.com/NixOS/nixpkgs/pull/43369/commits
|
||||||
|
++ lib.optional stdenv.hostPlatform.isMusl "--disable-ld-override";
|
||||||
|
|
||||||
|
# No building is necessary, but calling make without flags ironically
|
||||||
|
# calls install-strip ...
|
||||||
|
dontBuild = true;
|
||||||
|
|
||||||
|
# Patch scripts to include runtime dependencies in $PATH.
|
||||||
|
postInstall = ''
|
||||||
|
for i in "$out/bin/"*; do
|
||||||
|
test ! -h "$i" || continue
|
||||||
|
isScript "$i" || continue
|
||||||
|
sed -i -e '2i export PATH="${lib.makeBinPath runtimeDeps}:$PATH"' "$i"
|
||||||
|
done
|
||||||
|
'';
|
||||||
|
|
||||||
|
# Apparently necessary for the ghc Alpine (musl) bindist:
|
||||||
|
# When we strip, and then run the
|
||||||
|
# patchelf --set-rpath "${libPath}:$(patchelf --print-rpath $p)" $p
|
||||||
|
# below, running ghc (e.g. during `installCheckPhase)` gives some apparently
|
||||||
|
# corrupted rpath or whatever makes the loader work on nonsensical strings:
|
||||||
|
# running install tests
|
||||||
|
# Error relocating /nix/store/...-ghc-8.10.2-binary/lib/ghc-8.10.5/bin/ghc: : symbol not found
|
||||||
|
# Error relocating /nix/store/...-ghc-8.10.2-binary/lib/ghc-8.10.5/bin/ghc: ir6zf6c9f86pfx8sr30n2vjy-ghc-8.10.2-binary/lib/ghc-8.10.5/bin/../lib/x86_64-linux-ghc-8.10.5/libHSexceptions-0.10.4-ghc8.10.5.so: symbol not found
|
||||||
|
# Error relocating /nix/store/...-ghc-8.10.2-binary/lib/ghc-8.10.5/bin/ghc: y/lib/ghc-8.10.5/bin/../lib/x86_64-linux-ghc-8.10.5/libHStemplate-haskell-2.16.0.0-ghc8.10.5.so: symbol not found
|
||||||
|
# Error relocating /nix/store/...-ghc-8.10.2-binary/lib/ghc-8.10.5/bin/ghc: 8.10.5/libHStemplate-haskell-2.16.0.0-ghc8.10.5.so: symbol not found
|
||||||
|
# Error relocating /nix/store/...-ghc-8.10.2-binary/lib/ghc-8.10.5/bin/ghc: <20>: symbol not found
|
||||||
|
# Error relocating /nix/store/...-ghc-8.10.2-binary/lib/ghc-8.10.5/bin/ghc: <20>?: symbol not found
|
||||||
|
# Error relocating /nix/store/...-ghc-8.10.2-binary/lib/ghc-8.10.5/bin/ghc: 64-linux-ghc-8.10.5/libHSexceptions-0.10.4-ghc8.10.5.so: symbol not found
|
||||||
|
# This is extremely bogus and should be investigated.
|
||||||
|
dontStrip = if stdenv.hostPlatform.isMusl then true else false; # `if` for explicitness
|
||||||
|
|
||||||
|
# On Linux, use patchelf to modify the executables so that they can
|
||||||
|
# find editline/gmp.
|
||||||
|
postFixup = lib.optionalString (stdenv.isLinux && !(binDistUsed.isStatic or false))
|
||||||
|
(if stdenv.hostPlatform.isAarch64 then
|
||||||
|
# Keep rpath as small as possible on aarch64 for patchelf#244. All Elfs
|
||||||
|
# are 2 directories deep from $out/lib, so pooling symlinks there makes
|
||||||
|
# a short rpath.
|
||||||
|
''
|
||||||
|
(cd $out/lib; ln -s ${ncurses6.out}/lib/libtinfo.so.6)
|
||||||
|
(cd $out/lib; ln -s ${lib.getLib gmpUsed}/lib/libgmp.so.10)
|
||||||
|
(cd $out/lib; ln -s ${numactl.out}/lib/libnuma.so.1)
|
||||||
|
for p in $(find "$out/lib" -type f -name "*\.so*"); do
|
||||||
|
(cd $out/lib; ln -s $p)
|
||||||
|
done
|
||||||
|
|
||||||
|
for p in $(find "$out/lib" -type f -executable); do
|
||||||
|
if isELF "$p"; then
|
||||||
|
echo "Patchelfing $p"
|
||||||
|
patchelf --set-rpath "\$ORIGIN:\$ORIGIN/../.." $p
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
''
|
||||||
|
else
|
||||||
|
''
|
||||||
|
for p in $(find "$out" -type f -executable); do
|
||||||
|
if isELF "$p"; then
|
||||||
|
echo "Patchelfing $p"
|
||||||
|
patchelf --set-rpath "${libPath}:$(patchelf --print-rpath $p)" $p
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
'') + lib.optionalString stdenv.isDarwin ''
|
||||||
|
# not enough room in the object files for the full path to libiconv :(
|
||||||
|
for exe in $(find "$out" -type f -executable); do
|
||||||
|
isMachO $exe || continue
|
||||||
|
ln -fs ${libiconv}/lib/libiconv.dylib $(dirname $exe)/libiconv.dylib
|
||||||
|
install_name_tool -change /usr/lib/libiconv.2.dylib @executable_path/libiconv.dylib -change /usr/local/lib/gcc/6/libgcc_s.1.dylib ${gcc.cc.lib}/lib/libgcc_s.1.dylib $exe
|
||||||
|
done
|
||||||
|
|
||||||
|
for file in $(find "$out" -name setup-config); do
|
||||||
|
substituteInPlace $file --replace /usr/bin/ranlib "$(type -P ranlib)"
|
||||||
|
done
|
||||||
|
''
|
||||||
|
# Recache package db which needs to happen for Hadrian bindists
|
||||||
|
# where we modify the package db before installing
|
||||||
|
+ ''
|
||||||
|
package_db=("$out"/lib/ghc-*/lib/package.conf.d)
|
||||||
|
"$out/bin/ghc-pkg" --package-db="$package_db" recache
|
||||||
|
'';
|
||||||
|
|
||||||
|
# In nixpkgs, musl based builds currently enable `pie` hardening by default
|
||||||
|
# (see `defaultHardeningFlags` in `make-derivation.nix`).
|
||||||
|
# But GHC cannot currently produce outputs that are ready for `-pie` linking.
|
||||||
|
# Thus, disable `pie` hardening, otherwise `recompile with -fPIE` errors appear.
|
||||||
|
# See:
|
||||||
|
# * https://github.com/NixOS/nixpkgs/issues/129247
|
||||||
|
# * https://gitlab.haskell.org/ghc/ghc/-/issues/19580
|
||||||
|
hardeningDisable = lib.optional stdenv.targetPlatform.isMusl "pie";
|
||||||
|
|
||||||
|
doInstallCheck = true;
|
||||||
|
installCheckPhase = ''
|
||||||
|
# Sanity check, can ghc create executables?
|
||||||
|
cd $TMP
|
||||||
|
mkdir test-ghc; cd test-ghc
|
||||||
|
cat > main.hs << EOF
|
||||||
|
{-# LANGUAGE TemplateHaskell #-}
|
||||||
|
module Main where
|
||||||
|
main = putStrLn \$([|"yes"|])
|
||||||
|
EOF
|
||||||
|
env -i $out/bin/ghc --make main.hs || exit 1
|
||||||
|
echo compilation ok
|
||||||
|
[ $(./main) == "yes" ]
|
||||||
|
'';
|
||||||
|
|
||||||
|
passthru = {
|
||||||
|
targetPrefix = "";
|
||||||
|
enableShared = true;
|
||||||
|
|
||||||
|
inherit llvmPackages;
|
||||||
|
|
||||||
|
# Our Cabal compiler name
|
||||||
|
haskellCompilerName = "ghc-${version}";
|
||||||
|
|
||||||
|
# Normal GHC derivations expose the hadrian derivation used to build them
|
||||||
|
# here. In the case of bindists we just make sure that the attribute exists,
|
||||||
|
# as it is used for checking if a GHC derivation has been built with hadrian.
|
||||||
|
hadrian = null;
|
||||||
|
};
|
||||||
|
|
||||||
|
meta = rec {
|
||||||
|
homepage = "http://haskell.org/ghc";
|
||||||
|
description = "The Glasgow Haskell Compiler";
|
||||||
|
license = lib.licenses.bsd3;
|
||||||
|
# HACK: since we can't encode the libc / abi in platforms, we need
|
||||||
|
# to make the platform list dependent on the evaluation platform
|
||||||
|
# in order to avoid eval errors with musl which supports less
|
||||||
|
# platforms than the default libcs (i. e. glibc / libSystem).
|
||||||
|
# This is done for the benefit of Hydra, so `packagePlatforms`
|
||||||
|
# won't return any platforms that would cause an evaluation
|
||||||
|
# failure for `pkgsMusl.haskell.compiler.ghc922Binary`, as
|
||||||
|
# long as the evaluator runs on a platform that supports
|
||||||
|
# `pkgsMusl`.
|
||||||
|
platforms = builtins.attrNames ghcBinDists.${distSetName};
|
||||||
|
maintainers = [ ];
|
||||||
|
# packages involving hsc2hs (clock) produce libraries our
|
||||||
|
# ld can't link against
|
||||||
|
broken = stdenv.hostPlatform.isDarwin;
|
||||||
|
};
|
||||||
|
}
|
4
pkgs/by-name/ha/haskell/ghc/9.6.3.nix
Normal file
4
pkgs/by-name/ha/haskell/ghc/9.6.3.nix
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
import ./common-hadrian.nix rec {
|
||||||
|
version = "9.6.3";
|
||||||
|
sha256 = "1xbpxchmvm9gswrwwz1rsvx9kjaxhc2q3fx9l6wa0l5599xydkfz";
|
||||||
|
}
|
4
pkgs/by-name/ha/haskell/ghc/9.6.4.nix
Normal file
4
pkgs/by-name/ha/haskell/ghc/9.6.4.nix
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
import ./common-hadrian.nix {
|
||||||
|
version = "9.6.4";
|
||||||
|
sha256 = "10bf25b8b07174fdd9868b5c0c56c17c0ef1edcb6247b4b864be933651bfd4c0";
|
||||||
|
}
|
4
pkgs/by-name/ha/haskell/ghc/9.6.5.nix
Normal file
4
pkgs/by-name/ha/haskell/ghc/9.6.5.nix
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
import ./common-hadrian.nix {
|
||||||
|
version = "9.6.5";
|
||||||
|
sha256 = "87b389924f98c1a26c205122757338c8dab33ad1fcf670faa22622742432b93c";
|
||||||
|
}
|
4
pkgs/by-name/ha/haskell/ghc/9.8.1.nix
Normal file
4
pkgs/by-name/ha/haskell/ghc/9.8.1.nix
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
import ./common-hadrian.nix rec {
|
||||||
|
version = "9.8.1";
|
||||||
|
sha256 = "b2f8ed6b7f733797a92436f4ff6e088a520913149c9a9be90465b40ad1f20751";
|
||||||
|
}
|
4
pkgs/by-name/ha/haskell/ghc/9.8.2.nix
Normal file
4
pkgs/by-name/ha/haskell/ghc/9.8.2.nix
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
import ./common-hadrian.nix rec {
|
||||||
|
version = "9.8.2";
|
||||||
|
sha256 = "4vt6fddGEjfSLoNlqD7dnhp30uFdBF85RTloRah3gck=";
|
||||||
|
}
|
|
@ -0,0 +1,99 @@
|
||||||
|
diff --git a/Cabal/Distribution/Simple/Build/PathsModule.hs b/Cabal/Distribution/Simple/Build/PathsModule.hs
|
||||||
|
index 5e660e8d6..1ae603c94 100644
|
||||||
|
--- a/libraries/Cabal/Cabal/Distribution/Simple/Build/PathsModule.hs
|
||||||
|
+++ b/libraries/Cabal/Cabal/Distribution/Simple/Build/PathsModule.hs
|
||||||
|
@@ -37,6 +37,9 @@ import System.FilePath ( pathSeparator )
|
||||||
|
-- * Building Paths_<pkg>.hs
|
||||||
|
-- ------------------------------------------------------------
|
||||||
|
|
||||||
|
+splitPath :: FilePath -> [ String ]
|
||||||
|
+splitPath = unintersperse pathSeparator
|
||||||
|
+
|
||||||
|
generatePathsModule :: PackageDescription -> LocalBuildInfo -> ComponentLocalBuildInfo -> String
|
||||||
|
generatePathsModule pkg_descr lbi clbi =
|
||||||
|
let pragmas =
|
||||||
|
@@ -78,12 +81,44 @@ generatePathsModule pkg_descr lbi clbi =
|
||||||
|
"import System.Environment (getExecutablePath)\n"
|
||||||
|
| otherwise = ""
|
||||||
|
|
||||||
|
+ dirs = [ (flat_libdir, "LibDir")
|
||||||
|
+ , (flat_dynlibdir, "DynLibDir")
|
||||||
|
+ , (flat_datadir, "DataDir")
|
||||||
|
+ , (flat_libexecdir, "LibexecDir")
|
||||||
|
+ , (flat_sysconfdir, "SysconfDir") ];
|
||||||
|
+
|
||||||
|
+ shouldEmitPath p
|
||||||
|
+ | (splitPath flat_prefix) `isPrefixOf` (splitPath flat_bindir) = True
|
||||||
|
+ | (splitPath flat_prefix) `isPrefixOf` (splitPath p) = False
|
||||||
|
+ | otherwise = True
|
||||||
|
+
|
||||||
|
+ shouldEmitDataDir = shouldEmitPath flat_datadir
|
||||||
|
+
|
||||||
|
+ nixEmitPathFn (path, name) = let
|
||||||
|
+ varName = toLower <$> name
|
||||||
|
+ fnName = "get"++name
|
||||||
|
+ in if shouldEmitPath path then
|
||||||
|
+ varName ++ " :: FilePath\n"++
|
||||||
|
+ varName ++ " = " ++ show path ++
|
||||||
|
+ "\n" ++ fnName ++ " :: IO FilePath" ++
|
||||||
|
+ "\n" ++ fnName ++ " = " ++ mkGetEnvOr varName ("return " ++ varName)++"\n"
|
||||||
|
+ else ""
|
||||||
|
+
|
||||||
|
+ absBody = intercalate "\n" $ nixEmitPathFn <$> dirs
|
||||||
|
+
|
||||||
|
+ warnPragma = case filter (not . shouldEmitPath . fst) dirs of
|
||||||
|
+ [] -> ""
|
||||||
|
+ omittedDirs -> "{-# WARNING \"The functions: "++omittedFns++" Have been omitted by the Nix build system.\" #-}"
|
||||||
|
+ where omittedFns = intercalate ", " $ map snd omittedDirs
|
||||||
|
+
|
||||||
|
+ importList = intercalate ", " $ ("get" ++) . snd <$> filter (shouldEmitPath . fst) dirs
|
||||||
|
+
|
||||||
|
header =
|
||||||
|
pragmas++
|
||||||
|
- "module " ++ prettyShow paths_modulename ++ " (\n"++
|
||||||
|
- " version,\n"++
|
||||||
|
- " getBinDir, getLibDir, getDynLibDir, getDataDir, getLibexecDir,\n"++
|
||||||
|
- " getDataFileName, getSysconfDir\n"++
|
||||||
|
+ "module " ++ prettyShow paths_modulename ++ " " ++ warnPragma ++ " (\n"++
|
||||||
|
+ " version, getBinDir,\n"++
|
||||||
|
+ (if shouldEmitDataDir then " getDataFileName, \n" else "\n")++
|
||||||
|
+ " " ++ importList ++"\n"++
|
||||||
|
" ) where\n"++
|
||||||
|
"\n"++
|
||||||
|
foreign_imports++
|
||||||
|
@@ -136,26 +171,18 @@ generatePathsModule pkg_descr lbi clbi =
|
||||||
|
"\n"++
|
||||||
|
filename_stuff
|
||||||
|
| absolute =
|
||||||
|
- "\nbindir, libdir, dynlibdir, datadir, libexecdir, sysconfdir :: FilePath\n"++
|
||||||
|
+ "\nbindir :: FilePath\n"++
|
||||||
|
"\nbindir = " ++ show flat_bindir ++
|
||||||
|
- "\nlibdir = " ++ show flat_libdir ++
|
||||||
|
- "\ndynlibdir = " ++ show flat_dynlibdir ++
|
||||||
|
- "\ndatadir = " ++ show flat_datadir ++
|
||||||
|
- "\nlibexecdir = " ++ show flat_libexecdir ++
|
||||||
|
- "\nsysconfdir = " ++ show flat_sysconfdir ++
|
||||||
|
"\n"++
|
||||||
|
- "\ngetBinDir, getLibDir, getDynLibDir, getDataDir, getLibexecDir, getSysconfDir :: IO FilePath\n"++
|
||||||
|
+ "\ngetBinDir :: IO FilePath\n"++
|
||||||
|
"getBinDir = "++mkGetEnvOr "bindir" "return bindir"++"\n"++
|
||||||
|
- "getLibDir = "++mkGetEnvOr "libdir" "return libdir"++"\n"++
|
||||||
|
- "getDynLibDir = "++mkGetEnvOr "dynlibdir" "return dynlibdir"++"\n"++
|
||||||
|
- "getDataDir = "++mkGetEnvOr "datadir" "return datadir"++"\n"++
|
||||||
|
- "getLibexecDir = "++mkGetEnvOr "libexecdir" "return libexecdir"++"\n"++
|
||||||
|
- "getSysconfDir = "++mkGetEnvOr "sysconfdir" "return sysconfdir"++"\n"++
|
||||||
|
- "\n"++
|
||||||
|
- "getDataFileName :: FilePath -> IO FilePath\n"++
|
||||||
|
- "getDataFileName name = do\n"++
|
||||||
|
- " dir <- getDataDir\n"++
|
||||||
|
- " return (dir ++ "++path_sep++" ++ name)\n"
|
||||||
|
+ absBody ++ "\n"++
|
||||||
|
+ (if shouldEmitDataDir then
|
||||||
|
+ "getDataFileName :: FilePath -> IO FilePath\n"++
|
||||||
|
+ "getDataFileName name = do\n"++
|
||||||
|
+ " dir <- getDataDir\n"++
|
||||||
|
+ " return (dir ++ "++path_sep++" ++ name)\n"
|
||||||
|
+ else "\n")
|
||||||
|
| otherwise =
|
||||||
|
"\nprefix, bindirrel :: FilePath" ++
|
||||||
|
"\nprefix = " ++ show flat_prefix ++
|
|
@ -0,0 +1,602 @@
|
||||||
|
This patch is based on https://github.com/sternenseemann/cabal/compare/982646d67b95b32813b89ab5d2d2f4d4dc03fb2b..7c49047f253e1f128e2df356400ec5da6f11066b
|
||||||
|
and has been postprocessed with `filterdiff --strip=1 --addoldprefix=a/libraries/Cabal/ --addnewprefix=b/libraries/Cabal/`.
|
||||||
|
Note that the base for the diff is not the Cabal 3.6.3.0 release tag, but
|
||||||
|
982646d67b95b32813b89ab5d2d2f4d4dc03fb2b which is obtained by applying
|
||||||
|
https://github.com/haskell/cabal/commit/6c796218c92f93c95e94d5ec2d077f6956f68e98
|
||||||
|
on top of said release tag. That patch is applied to all our GHCs in the 9.2 series.
|
||||||
|
|
||||||
|
Reasoning and explanation of the patch can be found in the comment in the diff for PathsModule.hs below.
|
||||||
|
|
||||||
|
diffCabal/src/Distribution/Simple/Build/PathsModule.hs b/Cabal/src/Distribution/Simple/Build/PathsModule.hs
|
||||||
|
index b2be7e1a8..9b63e9850 100644
|
||||||
|
--- a/libraries/Cabal/Cabal/src/Distribution/Simple/Build/PathsModule.hs
|
||||||
|
+++ b/libraries/Cabal/Cabal/src/Distribution/Simple/Build/PathsModule.hs
|
||||||
|
@@ -46,6 +46,7 @@ generatePathsModule pkg_descr lbi clbi = Z.render Z.Z
|
||||||
|
, Z.zIsWindows = isWindows
|
||||||
|
, Z.zIsI386 = buildArch == I386
|
||||||
|
, Z.zIsX8664 = buildArch == X86_64
|
||||||
|
+ , Z.zOr = (||)
|
||||||
|
, Z.zNot = not
|
||||||
|
, Z.zManglePkgName = showPkgName
|
||||||
|
|
||||||
|
@@ -56,8 +57,112 @@ generatePathsModule pkg_descr lbi clbi = Z.render Z.Z
|
||||||
|
, Z.zDatadir = zDatadir
|
||||||
|
, Z.zLibexecdir = zLibexecdir
|
||||||
|
, Z.zSysconfdir = zSysconfdir
|
||||||
|
+
|
||||||
|
+ -- Sadly we can't be cleverer about this – we can't have literals in the template
|
||||||
|
+ , Z.zShouldEmitDataDir = shouldEmit "DataDir"
|
||||||
|
+ , Z.zShouldEmitLibDir = shouldEmit "LibDir"
|
||||||
|
+ , Z.zShouldEmitDynLibDir = shouldEmit "DynLibDir"
|
||||||
|
+ , Z.zShouldEmitLibexecDir = shouldEmit "LibexecDir"
|
||||||
|
+ , Z.zShouldEmitSysconfDir = shouldEmit "SysconfDir"
|
||||||
|
+
|
||||||
|
+ , Z.zWarning = zWarning
|
||||||
|
+ , Z.zShouldEmitWarning = zShouldEmitWarning
|
||||||
|
}
|
||||||
|
where
|
||||||
|
+ -- GHC's NCG backend for aarch64-darwin does not support link-time dead code
|
||||||
|
+ -- elimination to the extent that NCG does for other targets. Consequently,
|
||||||
|
+ -- we struggle with unnecessarily retained store path references due to the
|
||||||
|
+ -- use of `Paths_*` modules – even if `getLibDir` is not used, it'll end up
|
||||||
|
+ -- in the final library or executables we build.
|
||||||
|
+ --
|
||||||
|
+ -- When using a different output for the executables and library, this
|
||||||
|
+ -- becomes more sinister: The library will contain a reference to the bin
|
||||||
|
+ -- output and itself due to `getLibDir` and `getBinDir`, but the executables
|
||||||
|
+ -- will do so, too. Either due to linking dynamically or because the library
|
||||||
|
+ -- is linked statically into the executable and retains those references.
|
||||||
|
+ -- Since Nix disallows cyclical references between two outputs, it becomes
|
||||||
|
+ -- impossible to use the `Paths_*` module and a separate `bin` output for
|
||||||
|
+ -- aarch64-darwin.
|
||||||
|
+ --
|
||||||
|
+ -- The solution we have resorted to for now, is to trim the `Paths_*` module
|
||||||
|
+ -- dynamically depending on what references *could* be used without causing
|
||||||
|
+ -- a cyclical reference. That has the effect that any code that would not
|
||||||
|
+ -- cause a cyclical reference with dead code elimination will compile and
|
||||||
|
+ -- work for aarch64-darwin. If the code would use a `get*Dir` function that
|
||||||
|
+ -- has been omitted, this would indicate that the code would have caused a
|
||||||
|
+ -- cyclical reference anyways.
|
||||||
|
+ --
|
||||||
|
+ -- The logic for this makes some pretty big assumptions about installation
|
||||||
|
+ -- prefixes that probably only hold fully in nixpkgs with
|
||||||
|
+ -- `haskellPackages.mkDerivation`. Simple uses outside nixpkgs that have
|
||||||
|
+ -- everything below the same prefix should continue to work as expected,
|
||||||
|
+ -- though.
|
||||||
|
+ --
|
||||||
|
+ -- We assume the following:
|
||||||
|
+ --
|
||||||
|
+ -- - flat_prefix is `$out`.
|
||||||
|
+ -- - flat_libdir etc. are always below `$out`.
|
||||||
|
+ --
|
||||||
|
+ -- Since in the normal case due to static linking `$bin` and `$out` will
|
||||||
|
+ -- have the same references in libraries/executables, we need to either
|
||||||
|
+ -- prevent usage of `getBinDir` or `getLibDir` to break the cycle in case
|
||||||
|
+ -- `flat_bindir` is not below `$out`. We have decided to always allow usage
|
||||||
|
+ -- of `getBinDir`, so `getLibDir` gets dropped if a separate `bin` output is
|
||||||
|
+ -- used. This has the simple reason that `$out` which contains `flat_libdir`
|
||||||
|
+ -- tends to be quite big – we would like to have a `bin` output that doesn't
|
||||||
|
+ -- require keeping that around.
|
||||||
|
+ pathEmittable :: FilePath -> Bool
|
||||||
|
+ pathEmittable p
|
||||||
|
+ -- If the executable installation target is below `$out` the reference
|
||||||
|
+ -- cycle is within a single output (since libs are installed to `$out`)
|
||||||
|
+ -- and thus unproblematic. We can use any and all `get*Dir` functions.
|
||||||
|
+ | flat_prefix `isPrefixOf` flat_bindir = True
|
||||||
|
+ -- Otherwise, we need to disallow all `get*Dir` functions that would cause
|
||||||
|
+ -- a reference to `$out` which contains the libraries that would in turn
|
||||||
|
+ -- reference `$bin`. This always include `flat_libdir` and friends, but
|
||||||
|
+ -- can also include `flat_datadir` if no separate output for data files is
|
||||||
|
+ -- used.
|
||||||
|
+ | otherwise = not (flat_prefix `isPrefixOf` p)
|
||||||
|
+
|
||||||
|
+ -- This list maps the "name" of the directory to whether we want to include
|
||||||
|
+ -- it in the `Paths_*` module or not. `shouldEmit` performs a lookup in this.
|
||||||
|
+ dirs :: [(String, Bool)]
|
||||||
|
+ dirs =
|
||||||
|
+ map
|
||||||
|
+ (\(name, path) -> (name, pathEmittable path))
|
||||||
|
+ [ ("LibDir", flat_libdir)
|
||||||
|
+ , ("DynLibDir", flat_dynlibdir)
|
||||||
|
+ , ("DataDir", flat_datadir)
|
||||||
|
+ , ("LibexecDir", flat_libexecdir)
|
||||||
|
+ , ("SysconfDir", flat_sysconfdir)
|
||||||
|
+ ]
|
||||||
|
+
|
||||||
|
+ shouldEmit :: String -> Bool
|
||||||
|
+ shouldEmit name =
|
||||||
|
+ case lookup name dirs of
|
||||||
|
+ Just b -> b
|
||||||
|
+ Nothing -> error "panic! BUG in Cabal Paths_ patch for aarch64-darwin, report this at https://github.com/nixos/nixpkgs/issues"
|
||||||
|
+
|
||||||
|
+ -- This is a comma separated list of all functions that have been omitted.
|
||||||
|
+ -- This is included in a GHC warning which will be attached to the `Paths_*`
|
||||||
|
+ -- module in case we are dropping any `get*Dir` functions that would
|
||||||
|
+ -- normally exist.
|
||||||
|
+ --
|
||||||
|
+ -- TODO: getDataFileName is not accounted for at the moment.
|
||||||
|
+ omittedFunctions :: String
|
||||||
|
+ omittedFunctions =
|
||||||
|
+ intercalate ", "
|
||||||
|
+ $ map (("get" ++) . fst)
|
||||||
|
+ $ filter (not . snd) dirs
|
||||||
|
+
|
||||||
|
+ zWarning :: String
|
||||||
|
+ zWarning =
|
||||||
|
+ show $
|
||||||
|
+ "The following functions have been omitted by a nixpkgs-specific patch to Cabal: "
|
||||||
|
+ ++ omittedFunctions
|
||||||
|
+ zShouldEmitWarning :: Bool
|
||||||
|
+ zShouldEmitWarning = any (not . snd) dirs
|
||||||
|
+
|
||||||
|
supports_cpp = supports_language_pragma
|
||||||
|
supports_rebindable_syntax = ghc_newer_than (mkVersion [7,0,1])
|
||||||
|
supports_language_pragma = ghc_newer_than (mkVersion [6,6,1])
|
||||||
|
diffCabal/src/Distribution/Simple/Build/PathsModule/Z.hs b/Cabal/src/Distribution/Simple/Build/PathsModule/Z.hs
|
||||||
|
index 6488ea061..a6cdc8e31 100644
|
||||||
|
--- a/libraries/Cabal/Cabal/src/Distribution/Simple/Build/PathsModule/Z.hs
|
||||||
|
+++ b/libraries/Cabal/Cabal/src/Distribution/Simple/Build/PathsModule/Z.hs
|
||||||
|
@@ -18,6 +18,14 @@ data Z
|
||||||
|
zDatadir :: FilePath,
|
||||||
|
zLibexecdir :: FilePath,
|
||||||
|
zSysconfdir :: FilePath,
|
||||||
|
+ zShouldEmitLibDir :: Bool,
|
||||||
|
+ zShouldEmitDynLibDir :: Bool,
|
||||||
|
+ zShouldEmitLibexecDir :: Bool,
|
||||||
|
+ zShouldEmitDataDir :: Bool,
|
||||||
|
+ zShouldEmitSysconfDir :: Bool,
|
||||||
|
+ zShouldEmitWarning :: Bool,
|
||||||
|
+ zWarning :: String,
|
||||||
|
+ zOr :: (Bool -> Bool -> Bool),
|
||||||
|
zNot :: (Bool -> Bool),
|
||||||
|
zManglePkgName :: (PackageName -> String)}
|
||||||
|
deriving Generic
|
||||||
|
@@ -45,10 +53,51 @@ render z_root = execWriter $ do
|
||||||
|
tell "{-# OPTIONS_GHC -w #-}\n"
|
||||||
|
tell "module Paths_"
|
||||||
|
tell (zManglePkgName z_root (zPackageName z_root))
|
||||||
|
- tell " (\n"
|
||||||
|
+ tell "\n"
|
||||||
|
+ tell " "
|
||||||
|
+ if (zShouldEmitWarning z_root)
|
||||||
|
+ then do
|
||||||
|
+ tell "{-# WARNING "
|
||||||
|
+ tell (zWarning z_root)
|
||||||
|
+ tell " #-}"
|
||||||
|
+ return ()
|
||||||
|
+ else do
|
||||||
|
+ return ()
|
||||||
|
+ tell "\n"
|
||||||
|
+ tell " (\n"
|
||||||
|
tell " version,\n"
|
||||||
|
- tell " getBinDir, getLibDir, getDynLibDir, getDataDir, getLibexecDir,\n"
|
||||||
|
- tell " getDataFileName, getSysconfDir\n"
|
||||||
|
+ tell " getBinDir,\n"
|
||||||
|
+ if (zOr z_root (zNot z_root (zAbsolute z_root)) (zShouldEmitLibDir z_root))
|
||||||
|
+ then do
|
||||||
|
+ tell " getLibDir,\n"
|
||||||
|
+ return ()
|
||||||
|
+ else do
|
||||||
|
+ return ()
|
||||||
|
+ if (zOr z_root (zNot z_root (zAbsolute z_root)) (zShouldEmitDynLibDir z_root))
|
||||||
|
+ then do
|
||||||
|
+ tell " getDynLibDir,\n"
|
||||||
|
+ return ()
|
||||||
|
+ else do
|
||||||
|
+ return ()
|
||||||
|
+ if (zOr z_root (zNot z_root (zAbsolute z_root)) (zShouldEmitLibexecDir z_root))
|
||||||
|
+ then do
|
||||||
|
+ tell " getLibexecDir,\n"
|
||||||
|
+ return ()
|
||||||
|
+ else do
|
||||||
|
+ return ()
|
||||||
|
+ if (zOr z_root (zNot z_root (zAbsolute z_root)) (zShouldEmitDataDir z_root))
|
||||||
|
+ then do
|
||||||
|
+ tell " getDataFileName,\n"
|
||||||
|
+ tell " getDataDir,\n"
|
||||||
|
+ return ()
|
||||||
|
+ else do
|
||||||
|
+ return ()
|
||||||
|
+ if (zOr z_root (zNot z_root (zAbsolute z_root)) (zShouldEmitSysconfDir z_root))
|
||||||
|
+ then do
|
||||||
|
+ tell " getSysconfDir\n"
|
||||||
|
+ return ()
|
||||||
|
+ else do
|
||||||
|
+ return ()
|
||||||
|
tell " ) where\n"
|
||||||
|
tell "\n"
|
||||||
|
if (zNot z_root (zAbsolute z_root))
|
||||||
|
@@ -97,12 +146,15 @@ render z_root = execWriter $ do
|
||||||
|
tell (zVersionDigits z_root)
|
||||||
|
tell " []\n"
|
||||||
|
tell "\n"
|
||||||
|
- tell "getDataFileName :: FilePath -> IO FilePath\n"
|
||||||
|
- tell "getDataFileName name = do\n"
|
||||||
|
- tell " dir <- getDataDir\n"
|
||||||
|
- tell " return (dir `joinFileName` name)\n"
|
||||||
|
- tell "\n"
|
||||||
|
- tell "getBinDir, getLibDir, getDynLibDir, getDataDir, getLibexecDir, getSysconfDir :: IO FilePath\n"
|
||||||
|
+ if (zOr z_root (zNot z_root (zAbsolute z_root)) (zShouldEmitDataDir z_root))
|
||||||
|
+ then do
|
||||||
|
+ tell "getDataFileName :: FilePath -> IO FilePath\n"
|
||||||
|
+ tell "getDataFileName name = do\n"
|
||||||
|
+ tell " dir <- getDataDir\n"
|
||||||
|
+ tell " return (dir `joinFileName` name)\n"
|
||||||
|
+ return ()
|
||||||
|
+ else do
|
||||||
|
+ return ()
|
||||||
|
tell "\n"
|
||||||
|
let
|
||||||
|
z_var0_function_defs = do
|
||||||
|
@@ -130,6 +182,7 @@ render z_root = execWriter $ do
|
||||||
|
tell "\n"
|
||||||
|
if (zRelocatable z_root)
|
||||||
|
then do
|
||||||
|
+ tell "\n"
|
||||||
|
tell "\n"
|
||||||
|
tell "getPrefixDirReloc :: FilePath -> IO FilePath\n"
|
||||||
|
tell "getPrefixDirReloc dirRel = do\n"
|
||||||
|
@@ -139,31 +192,37 @@ render z_root = execWriter $ do
|
||||||
|
tell (zBindir z_root)
|
||||||
|
tell ") `joinFileName` dirRel)\n"
|
||||||
|
tell "\n"
|
||||||
|
+ tell "getBinDir :: IO FilePath\n"
|
||||||
|
tell "getBinDir = catchIO (getEnv \""
|
||||||
|
tell (zManglePkgName z_root (zPackageName z_root))
|
||||||
|
tell "_bindir\") (\\_ -> getPrefixDirReloc $ "
|
||||||
|
tell (zBindir z_root)
|
||||||
|
tell ")\n"
|
||||||
|
+ tell "getLibDir :: IO FilePath\n"
|
||||||
|
tell "getLibDir = catchIO (getEnv \""
|
||||||
|
tell (zManglePkgName z_root (zPackageName z_root))
|
||||||
|
tell "_libdir\") (\\_ -> getPrefixDirReloc $ "
|
||||||
|
tell (zLibdir z_root)
|
||||||
|
tell ")\n"
|
||||||
|
+ tell "getDynLibDir :: IO FilePath\n"
|
||||||
|
tell "getDynLibDir = catchIO (getEnv \""
|
||||||
|
tell (zManglePkgName z_root (zPackageName z_root))
|
||||||
|
tell "_dynlibdir\") (\\_ -> getPrefixDirReloc $ "
|
||||||
|
tell (zDynlibdir z_root)
|
||||||
|
tell ")\n"
|
||||||
|
+ tell "getDataDir :: IO FilePath\n"
|
||||||
|
tell "getDataDir = catchIO (getEnv \""
|
||||||
|
tell (zManglePkgName z_root (zPackageName z_root))
|
||||||
|
tell "_datadir\") (\\_ -> getPrefixDirReloc $ "
|
||||||
|
tell (zDatadir z_root)
|
||||||
|
tell ")\n"
|
||||||
|
+ tell "getLibexecDir :: IO FilePath\n"
|
||||||
|
tell "getLibexecDir = catchIO (getEnv \""
|
||||||
|
tell (zManglePkgName z_root (zPackageName z_root))
|
||||||
|
tell "_libexecdir\") (\\_ -> getPrefixDirReloc $ "
|
||||||
|
tell (zLibexecdir z_root)
|
||||||
|
tell ")\n"
|
||||||
|
+ tell "getSysconfDir :: IO FilePath\n"
|
||||||
|
tell "getSysconfDir = catchIO (getEnv \""
|
||||||
|
tell (zManglePkgName z_root (zPackageName z_root))
|
||||||
|
tell "_sysconfdir\") (\\_ -> getPrefixDirReloc $ "
|
||||||
|
@@ -177,72 +236,119 @@ render z_root = execWriter $ do
|
||||||
|
if (zAbsolute z_root)
|
||||||
|
then do
|
||||||
|
tell "\n"
|
||||||
|
- tell "bindir, libdir, dynlibdir, datadir, libexecdir, sysconfdir :: FilePath\n"
|
||||||
|
+ tell "bindir :: FilePath\n"
|
||||||
|
tell "bindir = "
|
||||||
|
tell (zBindir z_root)
|
||||||
|
tell "\n"
|
||||||
|
- tell "libdir = "
|
||||||
|
- tell (zLibdir z_root)
|
||||||
|
- tell "\n"
|
||||||
|
- tell "dynlibdir = "
|
||||||
|
- tell (zDynlibdir z_root)
|
||||||
|
+ tell "getBinDir :: IO FilePath\n"
|
||||||
|
+ tell "getBinDir = catchIO (getEnv \""
|
||||||
|
+ tell (zManglePkgName z_root (zPackageName z_root))
|
||||||
|
+ tell "_bindir\") (\\_ -> return bindir)\n"
|
||||||
|
tell "\n"
|
||||||
|
- tell "datadir = "
|
||||||
|
- tell (zDatadir z_root)
|
||||||
|
+ if (zShouldEmitLibDir z_root)
|
||||||
|
+ then do
|
||||||
|
+ tell "libdir :: FilePath\n"
|
||||||
|
+ tell "libdir = "
|
||||||
|
+ tell (zLibdir z_root)
|
||||||
|
+ tell "\n"
|
||||||
|
+ tell "getLibDir :: IO FilePath\n"
|
||||||
|
+ tell "getLibDir = catchIO (getEnv \""
|
||||||
|
+ tell (zManglePkgName z_root (zPackageName z_root))
|
||||||
|
+ tell "_libdir\") (\\_ -> return libdir)\n"
|
||||||
|
+ return ()
|
||||||
|
+ else do
|
||||||
|
+ return ()
|
||||||
|
tell "\n"
|
||||||
|
- tell "libexecdir = "
|
||||||
|
- tell (zLibexecdir z_root)
|
||||||
|
+ if (zShouldEmitDynLibDir z_root)
|
||||||
|
+ then do
|
||||||
|
+ tell "dynlibdir :: FilePath\n"
|
||||||
|
+ tell "dynlibdir = "
|
||||||
|
+ tell (zDynlibdir z_root)
|
||||||
|
+ tell "\n"
|
||||||
|
+ tell "getDynLibDir :: IO FilePath\n"
|
||||||
|
+ tell "getDynLibDir = catchIO (getEnv \""
|
||||||
|
+ tell (zManglePkgName z_root (zPackageName z_root))
|
||||||
|
+ tell "_dynlibdir\") (\\_ -> return dynlibdir)\n"
|
||||||
|
+ return ()
|
||||||
|
+ else do
|
||||||
|
+ return ()
|
||||||
|
tell "\n"
|
||||||
|
- tell "sysconfdir = "
|
||||||
|
- tell (zSysconfdir z_root)
|
||||||
|
+ if (zShouldEmitDataDir z_root)
|
||||||
|
+ then do
|
||||||
|
+ tell "datadir :: FilePath\n"
|
||||||
|
+ tell "datadir = "
|
||||||
|
+ tell (zDatadir z_root)
|
||||||
|
+ tell "\n"
|
||||||
|
+ tell "getDataDir :: IO FilePath\n"
|
||||||
|
+ tell "getDataDir = catchIO (getEnv \""
|
||||||
|
+ tell (zManglePkgName z_root (zPackageName z_root))
|
||||||
|
+ tell "_datadir\") (\\_ -> return datadir)\n"
|
||||||
|
+ return ()
|
||||||
|
+ else do
|
||||||
|
+ return ()
|
||||||
|
tell "\n"
|
||||||
|
+ if (zShouldEmitLibexecDir z_root)
|
||||||
|
+ then do
|
||||||
|
+ tell "libexecdir :: FilePath\n"
|
||||||
|
+ tell "libexecdir = "
|
||||||
|
+ tell (zLibexecdir z_root)
|
||||||
|
+ tell "\n"
|
||||||
|
+ tell "getLibexecDir :: IO FilePath\n"
|
||||||
|
+ tell "getLibexecDir = catchIO (getEnv \""
|
||||||
|
+ tell (zManglePkgName z_root (zPackageName z_root))
|
||||||
|
+ tell "_libexecdir\") (\\_ -> return libexecdir)\n"
|
||||||
|
+ return ()
|
||||||
|
+ else do
|
||||||
|
+ return ()
|
||||||
|
tell "\n"
|
||||||
|
- tell "getBinDir = catchIO (getEnv \""
|
||||||
|
- tell (zManglePkgName z_root (zPackageName z_root))
|
||||||
|
- tell "_bindir\") (\\_ -> return bindir)\n"
|
||||||
|
- tell "getLibDir = catchIO (getEnv \""
|
||||||
|
- tell (zManglePkgName z_root (zPackageName z_root))
|
||||||
|
- tell "_libdir\") (\\_ -> return libdir)\n"
|
||||||
|
- tell "getDynLibDir = catchIO (getEnv \""
|
||||||
|
- tell (zManglePkgName z_root (zPackageName z_root))
|
||||||
|
- tell "_dynlibdir\") (\\_ -> return dynlibdir)\n"
|
||||||
|
- tell "getDataDir = catchIO (getEnv \""
|
||||||
|
- tell (zManglePkgName z_root (zPackageName z_root))
|
||||||
|
- tell "_datadir\") (\\_ -> return datadir)\n"
|
||||||
|
- tell "getLibexecDir = catchIO (getEnv \""
|
||||||
|
- tell (zManglePkgName z_root (zPackageName z_root))
|
||||||
|
- tell "_libexecdir\") (\\_ -> return libexecdir)\n"
|
||||||
|
- tell "getSysconfDir = catchIO (getEnv \""
|
||||||
|
- tell (zManglePkgName z_root (zPackageName z_root))
|
||||||
|
- tell "_sysconfdir\") (\\_ -> return sysconfdir)\n"
|
||||||
|
+ if (zShouldEmitSysconfDir z_root)
|
||||||
|
+ then do
|
||||||
|
+ tell "sysconfdir :: FilePath\n"
|
||||||
|
+ tell "sysconfdir = "
|
||||||
|
+ tell (zSysconfdir z_root)
|
||||||
|
+ tell "\n"
|
||||||
|
+ tell "getSysconfDir :: IO FilePath\n"
|
||||||
|
+ tell "getSysconfDir = catchIO (getEnv \""
|
||||||
|
+ tell (zManglePkgName z_root (zPackageName z_root))
|
||||||
|
+ tell "_sysconfdir\") (\\_ -> return sysconfdir)\n"
|
||||||
|
+ return ()
|
||||||
|
+ else do
|
||||||
|
+ return ()
|
||||||
|
tell "\n"
|
||||||
|
return ()
|
||||||
|
else do
|
||||||
|
if (zIsWindows z_root)
|
||||||
|
then do
|
||||||
|
+ tell "\n"
|
||||||
|
tell "\n"
|
||||||
|
tell "prefix :: FilePath\n"
|
||||||
|
tell "prefix = "
|
||||||
|
tell (zPrefix z_root)
|
||||||
|
tell "\n"
|
||||||
|
tell "\n"
|
||||||
|
+ tell "getBinDir :: IO FilePath\n"
|
||||||
|
tell "getBinDir = getPrefixDirRel $ "
|
||||||
|
tell (zBindir z_root)
|
||||||
|
tell "\n"
|
||||||
|
+ tell "getLibDir :: IO FilePath\n"
|
||||||
|
tell "getLibDir = "
|
||||||
|
tell (zLibdir z_root)
|
||||||
|
tell "\n"
|
||||||
|
+ tell "getDynLibDir :: IO FilePath\n"
|
||||||
|
tell "getDynLibDir = "
|
||||||
|
tell (zDynlibdir z_root)
|
||||||
|
tell "\n"
|
||||||
|
+ tell "getDataDir :: IO FilePath\n"
|
||||||
|
tell "getDataDir = catchIO (getEnv \""
|
||||||
|
tell (zManglePkgName z_root (zPackageName z_root))
|
||||||
|
tell "_datadir\") (\\_ -> "
|
||||||
|
tell (zDatadir z_root)
|
||||||
|
tell ")\n"
|
||||||
|
+ tell "getLibexecDir :: IO FilePath\n"
|
||||||
|
tell "getLibexecDir = "
|
||||||
|
tell (zLibexecdir z_root)
|
||||||
|
tell "\n"
|
||||||
|
+ tell "getSysconfDir :: IO FilePath\n"
|
||||||
|
tell "getSysconfDir = "
|
||||||
|
tell (zSysconfdir z_root)
|
||||||
|
tell "\n"
|
||||||
|
diffcabal-dev-scripts/src/GenPathsModule.hs b/cabal-dev-scripts/src/GenPathsModule.hs
|
||||||
|
index e4b930635..9b978f284 100644
|
||||||
|
--- a/libraries/Cabal/cabal-dev-scripts/src/GenPathsModule.hs
|
||||||
|
+++ b/libraries/Cabal/cabal-dev-scripts/src/GenPathsModule.hs
|
||||||
|
@@ -41,6 +41,16 @@ $(capture "decls" [d|
|
||||||
|
, zLibexecdir :: FilePath
|
||||||
|
, zSysconfdir :: FilePath
|
||||||
|
|
||||||
|
+ , zShouldEmitLibDir :: Bool
|
||||||
|
+ , zShouldEmitDynLibDir :: Bool
|
||||||
|
+ , zShouldEmitLibexecDir :: Bool
|
||||||
|
+ , zShouldEmitDataDir :: Bool
|
||||||
|
+ , zShouldEmitSysconfDir :: Bool
|
||||||
|
+
|
||||||
|
+ , zShouldEmitWarning :: Bool
|
||||||
|
+ , zWarning :: String
|
||||||
|
+
|
||||||
|
+ , zOr :: Bool -> Bool -> Bool
|
||||||
|
, zNot :: Bool -> Bool
|
||||||
|
, zManglePkgName :: PackageName -> String
|
||||||
|
}
|
||||||
|
difftemplates/Paths_pkg.template.hs b/templates/Paths_pkg.template.hs
|
||||||
|
index 6bc6b7875..aa90a9382 100644
|
||||||
|
--- a/libraries/Cabal/templates/Paths_pkg.template.hs
|
||||||
|
+++ b/libraries/Cabal/templates/Paths_pkg.template.hs
|
||||||
|
@@ -9,10 +9,31 @@
|
||||||
|
{% endif %}
|
||||||
|
{-# OPTIONS_GHC -fno-warn-missing-import-lists #-}
|
||||||
|
{-# OPTIONS_GHC -w #-}
|
||||||
|
-module Paths_{{ manglePkgName packageName }} (
|
||||||
|
+module Paths_{{ manglePkgName packageName }}
|
||||||
|
+ {% if shouldEmitWarning %}{-# WARNING {{ warning }} #-}{% endif %}
|
||||||
|
+ (
|
||||||
|
version,
|
||||||
|
- getBinDir, getLibDir, getDynLibDir, getDataDir, getLibexecDir,
|
||||||
|
- getDataFileName, getSysconfDir
|
||||||
|
+ getBinDir,
|
||||||
|
+{# We only care about the absolute case for our emit logic, since only in this
|
||||||
|
+ case references are incurred. We are not going to hit isWindows and relocatable
|
||||||
|
+ has no absolute references to begin with.
|
||||||
|
+#}
|
||||||
|
+{% if or (not absolute) shouldEmitLibDir %}
|
||||||
|
+ getLibDir,
|
||||||
|
+{% endif %}
|
||||||
|
+{% if or (not absolute) shouldEmitDynLibDir %}
|
||||||
|
+ getDynLibDir,
|
||||||
|
+{% endif %}
|
||||||
|
+{% if or (not absolute) shouldEmitLibexecDir %}
|
||||||
|
+ getLibexecDir,
|
||||||
|
+{% endif %}
|
||||||
|
+{% if or (not absolute) shouldEmitDataDir %}
|
||||||
|
+ getDataFileName,
|
||||||
|
+ getDataDir,
|
||||||
|
+{% endif %}
|
||||||
|
+{% if or (not absolute) shouldEmitSysconfDir %}
|
||||||
|
+ getSysconfDir
|
||||||
|
+{% endif %}
|
||||||
|
) where
|
||||||
|
|
||||||
|
{% if not absolute %}
|
||||||
|
@@ -51,12 +72,12 @@ catchIO = Exception.catch
|
||||||
|
version :: Version
|
||||||
|
version = Version {{ versionDigits }} []
|
||||||
|
|
||||||
|
+{% if or (not absolute) shouldEmitDataDir %}
|
||||||
|
getDataFileName :: FilePath -> IO FilePath
|
||||||
|
getDataFileName name = do
|
||||||
|
dir <- getDataDir
|
||||||
|
return (dir `joinFileName` name)
|
||||||
|
-
|
||||||
|
-getBinDir, getLibDir, getDynLibDir, getDataDir, getLibexecDir, getSysconfDir :: IO FilePath
|
||||||
|
+{% endif %}
|
||||||
|
|
||||||
|
{% defblock function_defs %}
|
||||||
|
minusFileName :: FilePath -> String -> FilePath
|
||||||
|
@@ -85,48 +106,93 @@ splitFileName p = (reverse (path2++drive), reverse fname)
|
||||||
|
|
||||||
|
{% if relocatable %}
|
||||||
|
|
||||||
|
+{# Relocatable can not incur any absolute references, so we can ignore it.
|
||||||
|
+ Additionally, --enable-relocatable is virtually useless in Nix builds
|
||||||
|
+#}
|
||||||
|
+
|
||||||
|
getPrefixDirReloc :: FilePath -> IO FilePath
|
||||||
|
getPrefixDirReloc dirRel = do
|
||||||
|
exePath <- getExecutablePath
|
||||||
|
let (dir,_) = splitFileName exePath
|
||||||
|
return ((dir `minusFileName` {{ bindir }}) `joinFileName` dirRel)
|
||||||
|
|
||||||
|
+getBinDir :: IO FilePath
|
||||||
|
getBinDir = catchIO (getEnv "{{ manglePkgName packageName }}_bindir") (\_ -> getPrefixDirReloc $ {{ bindir }})
|
||||||
|
+getLibDir :: IO FilePath
|
||||||
|
getLibDir = catchIO (getEnv "{{ manglePkgName packageName }}_libdir") (\_ -> getPrefixDirReloc $ {{ libdir }})
|
||||||
|
+getDynLibDir :: IO FilePath
|
||||||
|
getDynLibDir = catchIO (getEnv "{{ manglePkgName packageName }}_dynlibdir") (\_ -> getPrefixDirReloc $ {{ dynlibdir }})
|
||||||
|
+getDataDir :: IO FilePath
|
||||||
|
getDataDir = catchIO (getEnv "{{ manglePkgName packageName }}_datadir") (\_ -> getPrefixDirReloc $ {{ datadir }})
|
||||||
|
+getLibexecDir :: IO FilePath
|
||||||
|
getLibexecDir = catchIO (getEnv "{{ manglePkgName packageName }}_libexecdir") (\_ -> getPrefixDirReloc $ {{ libexecdir }})
|
||||||
|
+getSysconfDir :: IO FilePath
|
||||||
|
getSysconfDir = catchIO (getEnv "{{ manglePkgName packageName }}_sysconfdir") (\_ -> getPrefixDirReloc $ {{ sysconfdir }})
|
||||||
|
|
||||||
|
{% useblock function_defs %}
|
||||||
|
|
||||||
|
{% elif absolute %}
|
||||||
|
|
||||||
|
-bindir, libdir, dynlibdir, datadir, libexecdir, sysconfdir :: FilePath
|
||||||
|
+bindir :: FilePath
|
||||||
|
bindir = {{ bindir }}
|
||||||
|
-libdir = {{ libdir }}
|
||||||
|
-dynlibdir = {{ dynlibdir }}
|
||||||
|
-datadir = {{ datadir }}
|
||||||
|
-libexecdir = {{ libexecdir }}
|
||||||
|
-sysconfdir = {{ sysconfdir }}
|
||||||
|
-
|
||||||
|
+getBinDir :: IO FilePath
|
||||||
|
getBinDir = catchIO (getEnv "{{ manglePkgName packageName }}_bindir") (\_ -> return bindir)
|
||||||
|
+
|
||||||
|
+{% if shouldEmitLibDir %}
|
||||||
|
+libdir :: FilePath
|
||||||
|
+libdir = {{ libdir }}
|
||||||
|
+getLibDir :: IO FilePath
|
||||||
|
getLibDir = catchIO (getEnv "{{ manglePkgName packageName }}_libdir") (\_ -> return libdir)
|
||||||
|
+{% endif %}
|
||||||
|
+
|
||||||
|
+{% if shouldEmitDynLibDir %}
|
||||||
|
+dynlibdir :: FilePath
|
||||||
|
+dynlibdir = {{ dynlibdir }}
|
||||||
|
+getDynLibDir :: IO FilePath
|
||||||
|
getDynLibDir = catchIO (getEnv "{{ manglePkgName packageName }}_dynlibdir") (\_ -> return dynlibdir)
|
||||||
|
+{% endif %}
|
||||||
|
+
|
||||||
|
+{% if shouldEmitDataDir %}
|
||||||
|
+datadir :: FilePath
|
||||||
|
+datadir = {{ datadir }}
|
||||||
|
+getDataDir :: IO FilePath
|
||||||
|
getDataDir = catchIO (getEnv "{{ manglePkgName packageName }}_datadir") (\_ -> return datadir)
|
||||||
|
+{% endif %}
|
||||||
|
+
|
||||||
|
+{% if shouldEmitLibexecDir %}
|
||||||
|
+libexecdir :: FilePath
|
||||||
|
+libexecdir = {{ libexecdir }}
|
||||||
|
+getLibexecDir :: IO FilePath
|
||||||
|
getLibexecDir = catchIO (getEnv "{{ manglePkgName packageName }}_libexecdir") (\_ -> return libexecdir)
|
||||||
|
+{% endif %}
|
||||||
|
+
|
||||||
|
+{% if shouldEmitSysconfDir %}
|
||||||
|
+sysconfdir :: FilePath
|
||||||
|
+sysconfdir = {{ sysconfdir }}
|
||||||
|
+getSysconfDir :: IO FilePath
|
||||||
|
getSysconfDir = catchIO (getEnv "{{ manglePkgName packageName }}_sysconfdir") (\_ -> return sysconfdir)
|
||||||
|
+{% endif %}
|
||||||
|
|
||||||
|
{% elif isWindows %}
|
||||||
|
|
||||||
|
+{# We are only trying to fix the problem for aarch64-darwin with this patch,
|
||||||
|
+ so let's ignore Windows which we can reach via pkgsCross, for example.
|
||||||
|
+#}
|
||||||
|
+
|
||||||
|
prefix :: FilePath
|
||||||
|
prefix = {{ prefix }}
|
||||||
|
|
||||||
|
+getBinDir :: IO FilePath
|
||||||
|
getBinDir = getPrefixDirRel $ {{ bindir }}
|
||||||
|
+getLibDir :: IO FilePath
|
||||||
|
getLibDir = {{ libdir }}
|
||||||
|
+getDynLibDir :: IO FilePath
|
||||||
|
getDynLibDir = {{ dynlibdir }}
|
||||||
|
+getDataDir :: IO FilePath
|
||||||
|
getDataDir = catchIO (getEnv "{{ manglePkgName packageName }}_datadir") (\_ -> {{ datadir }})
|
||||||
|
+getLibexecDir :: IO FilePath
|
||||||
|
getLibexecDir = {{ libexecdir }}
|
||||||
|
+getSysconfDir :: IO FilePath
|
||||||
|
getSysconfDir = {{ sysconfdir }}
|
||||||
|
|
||||||
|
getPrefixDirRel :: FilePath -> IO FilePath
|
544
pkgs/by-name/ha/haskell/ghc/common-hadrian.nix
Normal file
544
pkgs/by-name/ha/haskell/ghc/common-hadrian.nix
Normal file
|
@ -0,0 +1,544 @@
|
||||||
|
{ version
|
||||||
|
, rev ? null
|
||||||
|
, sha256
|
||||||
|
, url ?
|
||||||
|
if rev != null
|
||||||
|
then "https://gitlab.haskell.org/ghc/ghc.git"
|
||||||
|
else "https://downloads.haskell.org/ghc/${version}/ghc-${version}-src.tar.xz"
|
||||||
|
, postFetch ? null
|
||||||
|
}:
|
||||||
|
|
||||||
|
{ lib
|
||||||
|
, stdenv
|
||||||
|
, pkgsBuildTarget
|
||||||
|
, pkgsHostTarget
|
||||||
|
, targetPackages
|
||||||
|
|
||||||
|
# build-tools
|
||||||
|
, bootPkgs
|
||||||
|
, autoconf
|
||||||
|
, automake
|
||||||
|
, coreutils
|
||||||
|
, fetchpatch
|
||||||
|
, fetchurl
|
||||||
|
, fetchgit
|
||||||
|
, perl
|
||||||
|
, python3
|
||||||
|
, m4
|
||||||
|
, sphinx
|
||||||
|
, xattr
|
||||||
|
, autoSignDarwinBinariesHook
|
||||||
|
, bash
|
||||||
|
|
||||||
|
, libiconv ? null, ncurses
|
||||||
|
, glibcLocales ? null
|
||||||
|
|
||||||
|
, # GHC can be built with system libffi or a bundled one.
|
||||||
|
libffi ? null
|
||||||
|
|
||||||
|
, useLLVM ? !(stdenv.targetPlatform.isx86
|
||||||
|
|| stdenv.targetPlatform.isPower
|
||||||
|
|| stdenv.targetPlatform.isSparc
|
||||||
|
|| stdenv.targetPlatform.isAarch64
|
||||||
|
|| stdenv.targetPlatform.isGhcjs)
|
||||||
|
, # LLVM is conceptually a run-time-only dependency, but for
|
||||||
|
# non-x86, we need LLVM to bootstrap later stages, so it becomes a
|
||||||
|
# build-time dependency too.
|
||||||
|
buildTargetLlvmPackages
|
||||||
|
, llvmPackages
|
||||||
|
|
||||||
|
, # If enabled, GHC will be built with the GPL-free but slightly slower native
|
||||||
|
# bignum backend instead of the faster but GPLed gmp backend.
|
||||||
|
enableNativeBignum ? !(lib.meta.availableOn stdenv.hostPlatform gmp
|
||||||
|
&& lib.meta.availableOn stdenv.targetPlatform gmp)
|
||||||
|
|| stdenv.targetPlatform.isGhcjs
|
||||||
|
, gmp
|
||||||
|
|
||||||
|
, # If enabled, use -fPIC when compiling static libs.
|
||||||
|
enableRelocatedStaticLibs ? stdenv.targetPlatform != stdenv.hostPlatform
|
||||||
|
|
||||||
|
, enableProfiledLibs ? true
|
||||||
|
|
||||||
|
, # Whether to build dynamic libs for the standard library (on the target
|
||||||
|
# platform). Static libs are always built.
|
||||||
|
enableShared ? with stdenv.targetPlatform; !isWindows && !useiOSPrebuilt && !isStatic && !isGhcjs
|
||||||
|
|
||||||
|
, # Whether to build terminfo.
|
||||||
|
enableTerminfo ? !(stdenv.targetPlatform.isWindows
|
||||||
|
|| stdenv.targetPlatform.isGhcjs)
|
||||||
|
|
||||||
|
, # Libdw.c only supports x86_64, i686 and s390x as of 2022-08-04
|
||||||
|
enableDwarf ? (stdenv.targetPlatform.isx86 ||
|
||||||
|
(stdenv.targetPlatform.isS390 && stdenv.targetPlatform.is64bit)) &&
|
||||||
|
lib.meta.availableOn stdenv.hostPlatform elfutils &&
|
||||||
|
lib.meta.availableOn stdenv.targetPlatform elfutils &&
|
||||||
|
# HACK: elfutils is marked as broken on static platforms
|
||||||
|
# which availableOn can't tell.
|
||||||
|
!stdenv.targetPlatform.isStatic &&
|
||||||
|
!stdenv.hostPlatform.isStatic
|
||||||
|
, elfutils
|
||||||
|
|
||||||
|
, # What flavour to build. Flavour string may contain a flavour and flavour
|
||||||
|
# transformers as accepted by hadrian.
|
||||||
|
ghcFlavour ?
|
||||||
|
let
|
||||||
|
# TODO(@sternenseemann): does using the static flavour make sense?
|
||||||
|
baseFlavour = "release";
|
||||||
|
# Note: in case hadrian's flavour transformers cease being expressive
|
||||||
|
# enough for us, we'll need to resort to defining a "nixpkgs" flavour
|
||||||
|
# in hadrianUserSettings and using that instead.
|
||||||
|
transformers =
|
||||||
|
lib.optionals useLLVM [ "llvm" ]
|
||||||
|
++ lib.optionals (!enableShared) [
|
||||||
|
"no_dynamic_libs"
|
||||||
|
"no_dynamic_ghc"
|
||||||
|
]
|
||||||
|
++ lib.optionals (!enableProfiledLibs) [ "no_profiled_libs" ]
|
||||||
|
# While split sections are now enabled by default in ghc 8.8 for windows,
|
||||||
|
# they seem to lead to `too many sections` errors when building base for
|
||||||
|
# profiling.
|
||||||
|
++ lib.optionals (!stdenv.targetPlatform.isWindows) [ "split_sections" ]
|
||||||
|
;
|
||||||
|
in
|
||||||
|
baseFlavour + lib.concatMapStrings (t: "+${t}") transformers
|
||||||
|
|
||||||
|
, # Contents of the UserSettings.hs file to use when compiling hadrian.
|
||||||
|
hadrianUserSettings ? ''
|
||||||
|
module UserSettings (
|
||||||
|
userFlavours, userPackages, userDefaultFlavour,
|
||||||
|
verboseCommand, buildProgressColour, successColour, finalStage
|
||||||
|
) where
|
||||||
|
|
||||||
|
import Flavour.Type
|
||||||
|
import Expression
|
||||||
|
import {-# SOURCE #-} Settings.Default
|
||||||
|
|
||||||
|
-- no way to set this via the command line
|
||||||
|
finalStage :: Stage
|
||||||
|
finalStage = ${
|
||||||
|
# Always build the stage 2 compiler if possible. Note we can currently
|
||||||
|
# assume hostPlatform == buildPlatform.
|
||||||
|
# TODO(@sternenseemann): improve this condition when we can cross-compile GHC
|
||||||
|
if stdenv.hostPlatform.canExecute stdenv.targetPlatform
|
||||||
|
then "Stage2" # native compiler or “native” cross e.g. pkgsStatic
|
||||||
|
else "Stage1" # cross compiler
|
||||||
|
}
|
||||||
|
|
||||||
|
userDefaultFlavour :: String
|
||||||
|
userDefaultFlavour = "release"
|
||||||
|
|
||||||
|
userFlavours :: [Flavour]
|
||||||
|
userFlavours = []
|
||||||
|
|
||||||
|
-- Disable Colours
|
||||||
|
buildProgressColour :: BuildProgressColour
|
||||||
|
buildProgressColour = mkBuildProgressColour (Dull Reset)
|
||||||
|
successColour :: SuccessColour
|
||||||
|
successColour = mkSuccessColour (Dull Reset)
|
||||||
|
|
||||||
|
-- taken from src/UserSettings.hs unchanged, need to be there
|
||||||
|
userPackages :: [Package]
|
||||||
|
userPackages = []
|
||||||
|
verboseCommand :: Predicate
|
||||||
|
verboseCommand = do
|
||||||
|
verbosity <- expr getVerbosity
|
||||||
|
return $ verbosity >= Verbose
|
||||||
|
''
|
||||||
|
|
||||||
|
, ghcSrc ? (if rev != null then fetchgit else fetchurl) ({
|
||||||
|
inherit url sha256;
|
||||||
|
} // lib.optionalAttrs (rev != null) {
|
||||||
|
inherit rev;
|
||||||
|
} // lib.optionalAttrs (postFetch != null) {
|
||||||
|
inherit postFetch;
|
||||||
|
})
|
||||||
|
|
||||||
|
# GHC's build system hadrian built from the GHC-to-build's source tree
|
||||||
|
# using our bootstrap GHC.
|
||||||
|
, hadrian ? import ../hadrian/make-hadrian.nix { inherit bootPkgs lib; } {
|
||||||
|
ghcSrc = ghcSrc;
|
||||||
|
ghcVersion = version;
|
||||||
|
userSettings = hadrianUserSettings;
|
||||||
|
# Disable haddock generating pretty source listings to stay under 3GB on aarch64-linux
|
||||||
|
enableHyperlinkedSource =
|
||||||
|
# TODO(@sternenseemann): Disabling currently doesn't work with GHC >= 9.8
|
||||||
|
lib.versionAtLeast version "9.8" ||
|
||||||
|
!(stdenv.hostPlatform.isAarch64 && stdenv.hostPlatform.isLinux);
|
||||||
|
}
|
||||||
|
|
||||||
|
, # Whether to build sphinx documentation.
|
||||||
|
# TODO(@sternenseemann): Hadrian ignores the --docs flag if finalStage = Stage1
|
||||||
|
enableDocs ? (
|
||||||
|
# Docs disabled if we are building on musl because it's a large task to keep
|
||||||
|
# all `sphinx` dependencies building in this environment.
|
||||||
|
!stdenv.buildPlatform.isMusl
|
||||||
|
)
|
||||||
|
|
||||||
|
, # Whether to disable the large address space allocator
|
||||||
|
# necessary fix for iOS: https://www.reddit.com/r/haskell/comments/4ttdz1/building_an_osxi386_to_iosarm64_cross_compiler/d5qvd67/
|
||||||
|
disableLargeAddressSpace ? stdenv.targetPlatform.isiOS
|
||||||
|
}:
|
||||||
|
|
||||||
|
assert !enableNativeBignum -> gmp != null;
|
||||||
|
|
||||||
|
let
|
||||||
|
inherit (stdenv) buildPlatform hostPlatform targetPlatform;
|
||||||
|
|
||||||
|
inherit (bootPkgs) ghc;
|
||||||
|
|
||||||
|
# TODO(@Ericson2314) Make unconditional
|
||||||
|
targetPrefix = lib.optionalString
|
||||||
|
(targetPlatform != hostPlatform)
|
||||||
|
"${targetPlatform.config}-";
|
||||||
|
|
||||||
|
hadrianSettings =
|
||||||
|
# -fexternal-dynamic-refs apparently (because it's not clear from the
|
||||||
|
# documentation) makes the GHC RTS able to load static libraries, which may
|
||||||
|
# be needed for TemplateHaskell. This solution was described in
|
||||||
|
# https://www.tweag.io/blog/2020-09-30-bazel-static-haskell
|
||||||
|
lib.optionals enableRelocatedStaticLibs [
|
||||||
|
"*.*.ghc.*.opts += -fPIC -fexternal-dynamic-refs"
|
||||||
|
]
|
||||||
|
++ lib.optionals targetPlatform.useAndroidPrebuilt [
|
||||||
|
"*.*.ghc.c.opts += -optc-std=gnu99"
|
||||||
|
];
|
||||||
|
|
||||||
|
# Splicer will pull out correct variations
|
||||||
|
libDeps = platform: lib.optional enableTerminfo ncurses
|
||||||
|
++ lib.optionals (!targetPlatform.isGhcjs) [libffi]
|
||||||
|
# Bindist configure script fails w/o elfutils in linker search path
|
||||||
|
# https://gitlab.haskell.org/ghc/ghc/-/issues/22081
|
||||||
|
++ lib.optional enableDwarf elfutils
|
||||||
|
++ lib.optional (!enableNativeBignum) gmp
|
||||||
|
++ lib.optional (platform.libc != "glibc" && !targetPlatform.isWindows && !targetPlatform.isGhcjs) libiconv;
|
||||||
|
|
||||||
|
# TODO(@sternenseemann): is buildTarget LLVM unnecessary?
|
||||||
|
# GHC doesn't seem to have {LLC,OPT}_HOST
|
||||||
|
toolsForTarget = [
|
||||||
|
(if targetPlatform.isGhcjs
|
||||||
|
then pkgsBuildTarget.emscripten
|
||||||
|
else pkgsBuildTarget.targetPackages.stdenv.cc)
|
||||||
|
] ++ lib.optional useLLVM buildTargetLlvmPackages.llvm;
|
||||||
|
|
||||||
|
targetCC = builtins.head toolsForTarget;
|
||||||
|
|
||||||
|
# Sometimes we have to dispatch between the bintools wrapper and the unwrapped
|
||||||
|
# derivation for certain tools depending on the platform.
|
||||||
|
bintoolsFor = {
|
||||||
|
# GHC needs install_name_tool on all darwin platforms. On aarch64-darwin it is
|
||||||
|
# part of the bintools wrapper (due to codesigning requirements), but not on
|
||||||
|
# x86_64-darwin.
|
||||||
|
install_name_tool =
|
||||||
|
if stdenv.targetPlatform.isAarch64
|
||||||
|
then targetCC.bintools
|
||||||
|
else targetCC.bintools.bintools;
|
||||||
|
# Same goes for strip.
|
||||||
|
strip =
|
||||||
|
# TODO(@sternenseemann): also use wrapper if linker == "bfd" or "gold"
|
||||||
|
if stdenv.targetPlatform.isAarch64 && stdenv.targetPlatform.isDarwin
|
||||||
|
then targetCC.bintools
|
||||||
|
else targetCC.bintools.bintools;
|
||||||
|
};
|
||||||
|
|
||||||
|
# Use gold either following the default, or to avoid the BFD linker due to some bugs / perf issues.
|
||||||
|
# But we cannot avoid BFD when using musl libc due to https://sourceware.org/bugzilla/show_bug.cgi?id=23856
|
||||||
|
# see #84670 and #49071 for more background.
|
||||||
|
useLdGold = targetPlatform.linker == "gold" ||
|
||||||
|
(targetPlatform.linker == "bfd" && (targetCC.bintools.bintools.hasGold or false) && !targetPlatform.isMusl);
|
||||||
|
|
||||||
|
# Makes debugging easier to see which variant is at play in `nix-store -q --tree`.
|
||||||
|
variantSuffix = lib.concatStrings [
|
||||||
|
(lib.optionalString stdenv.hostPlatform.isMusl "-musl")
|
||||||
|
(lib.optionalString enableNativeBignum "-native-bignum")
|
||||||
|
];
|
||||||
|
|
||||||
|
in
|
||||||
|
|
||||||
|
# C compiler, bintools and LLVM are used at build time, but will also leak into
|
||||||
|
# the resulting GHC's settings file and used at runtime. This means that we are
|
||||||
|
# currently only able to build GHC if hostPlatform == buildPlatform.
|
||||||
|
assert !targetPlatform.isGhcjs -> targetCC == pkgsHostTarget.targetPackages.stdenv.cc;
|
||||||
|
assert buildTargetLlvmPackages.llvm == llvmPackages.llvm;
|
||||||
|
assert stdenv.targetPlatform.isDarwin -> buildTargetLlvmPackages.clang == llvmPackages.clang;
|
||||||
|
|
||||||
|
stdenv.mkDerivation ({
|
||||||
|
pname = "${targetPrefix}ghc${variantSuffix}";
|
||||||
|
inherit version;
|
||||||
|
|
||||||
|
src = ghcSrc;
|
||||||
|
|
||||||
|
enableParallelBuilding = true;
|
||||||
|
|
||||||
|
patches = [
|
||||||
|
# Fix docs build with Sphinx >= 7 https://gitlab.haskell.org/ghc/ghc/-/issues/24129
|
||||||
|
(if lib.versionAtLeast version "9.8"
|
||||||
|
then ./docs-sphinx-7-ghc98.patch
|
||||||
|
else ./docs-sphinx-7.patch )
|
||||||
|
] ++ lib.optionals (stdenv.targetPlatform.isDarwin && stdenv.targetPlatform.isAarch64) [
|
||||||
|
# Prevent the paths module from emitting symbols that we don't use
|
||||||
|
# when building with separate outputs.
|
||||||
|
#
|
||||||
|
# These cause problems as they're not eliminated by GHC's dead code
|
||||||
|
# elimination on aarch64-darwin. (see
|
||||||
|
# https://github.com/NixOS/nixpkgs/issues/140774 for details).
|
||||||
|
./Cabal-at-least-3.6-paths-fix-cycle-aarch64-darwin.patch
|
||||||
|
];
|
||||||
|
|
||||||
|
postPatch = ''
|
||||||
|
patchShebangs --build .
|
||||||
|
'';
|
||||||
|
|
||||||
|
# GHC needs the locale configured during the Haddock phase.
|
||||||
|
LANG = "en_US.UTF-8";
|
||||||
|
|
||||||
|
# GHC is a bit confused on its cross terminology.
|
||||||
|
# TODO(@sternenseemann): investigate coreutils dependencies and pass absolute paths
|
||||||
|
preConfigure = ''
|
||||||
|
for env in $(env | grep '^TARGET_' | sed -E 's|\+?=.*||'); do
|
||||||
|
export "''${env#TARGET_}=''${!env}"
|
||||||
|
done
|
||||||
|
# GHC is a bit confused on its cross terminology, as these would normally be
|
||||||
|
# the *host* tools.
|
||||||
|
export CC="${targetCC}/bin/${targetCC.targetPrefix}cc"
|
||||||
|
export CXX="${targetCC}/bin/${targetCC.targetPrefix}c++"
|
||||||
|
# Use gold to work around https://sourceware.org/bugzilla/show_bug.cgi?id=16177
|
||||||
|
export LD="${targetCC.bintools}/bin/${targetCC.bintools.targetPrefix}ld${lib.optionalString useLdGold ".gold"}"
|
||||||
|
export AS="${targetCC.bintools.bintools}/bin/${targetCC.bintools.targetPrefix}as"
|
||||||
|
export AR="${targetCC.bintools.bintools}/bin/${targetCC.bintools.targetPrefix}ar"
|
||||||
|
export NM="${targetCC.bintools.bintools}/bin/${targetCC.bintools.targetPrefix}nm"
|
||||||
|
export RANLIB="${targetCC.bintools.bintools}/bin/${targetCC.bintools.targetPrefix}ranlib"
|
||||||
|
export READELF="${targetCC.bintools.bintools}/bin/${targetCC.bintools.targetPrefix}readelf"
|
||||||
|
export STRIP="${bintoolsFor.strip}/bin/${bintoolsFor.strip.targetPrefix}strip"
|
||||||
|
'' + lib.optionalString (stdenv.targetPlatform.linker == "cctools") ''
|
||||||
|
export OTOOL="${targetCC.bintools.bintools}/bin/${targetCC.bintools.targetPrefix}otool"
|
||||||
|
export INSTALL_NAME_TOOL="${bintoolsFor.install_name_tool}/bin/${bintoolsFor.install_name_tool.targetPrefix}install_name_tool"
|
||||||
|
'' + lib.optionalString useLLVM ''
|
||||||
|
export LLC="${lib.getBin buildTargetLlvmPackages.llvm}/bin/llc"
|
||||||
|
export OPT="${lib.getBin buildTargetLlvmPackages.llvm}/bin/opt"
|
||||||
|
'' + lib.optionalString (useLLVM && stdenv.targetPlatform.isDarwin) ''
|
||||||
|
# LLVM backend on Darwin needs clang: https://downloads.haskell.org/~ghc/latest/docs/html/users_guide/codegens.html#llvm-code-generator-fllvm
|
||||||
|
export CLANG="${buildTargetLlvmPackages.clang}/bin/${buildTargetLlvmPackages.clang.targetPrefix}clang"
|
||||||
|
'' +
|
||||||
|
lib.optionalString (stdenv.isLinux && hostPlatform.libc == "glibc") ''
|
||||||
|
export LOCALE_ARCHIVE="${glibcLocales}/lib/locale/locale-archive"
|
||||||
|
'' + lib.optionalString (!stdenv.isDarwin) ''
|
||||||
|
export NIX_LDFLAGS+=" -rpath $out/lib/ghc-${version}"
|
||||||
|
'' + lib.optionalString stdenv.isDarwin ''
|
||||||
|
export NIX_LDFLAGS+=" -no_dtrace_dof"
|
||||||
|
|
||||||
|
# GHC tries the host xattr /usr/bin/xattr by default which fails since it expects python to be 2.7
|
||||||
|
export XATTR=${lib.getBin xattr}/bin/xattr
|
||||||
|
''
|
||||||
|
# If we are not using release tarballs, some files need to be generated using
|
||||||
|
# the boot script.
|
||||||
|
+ lib.optionalString (rev != null) ''
|
||||||
|
echo ${version} > VERSION
|
||||||
|
echo ${rev} > GIT_COMMIT_ID
|
||||||
|
./boot
|
||||||
|
''
|
||||||
|
+ lib.optionalString targetPlatform.useAndroidPrebuilt ''
|
||||||
|
sed -i -e '5i ,("armv7a-unknown-linux-androideabi", ("e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64", "cortex-a8", ""))' llvm-targets
|
||||||
|
'' + lib.optionalString targetPlatform.isMusl ''
|
||||||
|
echo "patching llvm-targets for musl targets..."
|
||||||
|
echo "Cloning these existing '*-linux-gnu*' targets:"
|
||||||
|
grep linux-gnu llvm-targets | sed 's/^/ /'
|
||||||
|
echo "(go go gadget sed)"
|
||||||
|
sed -i 's,\(^.*linux-\)gnu\(.*\)$,\0\n\1musl\2,' llvm-targets
|
||||||
|
echo "llvm-targets now contains these '*-linux-musl*' targets:"
|
||||||
|
grep linux-musl llvm-targets | sed 's/^/ /'
|
||||||
|
|
||||||
|
echo "And now patching to preserve '-musleabi' as done with '-gnueabi'"
|
||||||
|
# (aclocal.m4 is actual source, but patch configure as well since we don't re-gen)
|
||||||
|
for x in configure aclocal.m4; do
|
||||||
|
substituteInPlace $x \
|
||||||
|
--replace '*-android*|*-gnueabi*)' \
|
||||||
|
'*-android*|*-gnueabi*|*-musleabi*)'
|
||||||
|
done
|
||||||
|
''
|
||||||
|
# Need to make writable EM_CACHE for emscripten. The path in EM_CACHE must be absolute.
|
||||||
|
# https://gitlab.haskell.org/ghc/ghc/-/wikis/javascript-backend#configure-fails-with-sub-word-sized-atomic-operations-not-available
|
||||||
|
+ lib.optionalString targetPlatform.isGhcjs ''
|
||||||
|
export EM_CACHE="$(realpath $(mktemp -d emcache.XXXXXXXXXX))"
|
||||||
|
cp -Lr ${targetCC /* == emscripten */}/share/emscripten/cache/* "$EM_CACHE/"
|
||||||
|
chmod u+rwX -R "$EM_CACHE"
|
||||||
|
''
|
||||||
|
# Create bash array hadrianFlagsArray for use in buildPhase. Do it in
|
||||||
|
# preConfigure, so overrideAttrs can be used to modify it effectively.
|
||||||
|
# hadrianSettings are passed via the command line so they are more visible
|
||||||
|
# in the build log.
|
||||||
|
+ ''
|
||||||
|
hadrianFlagsArray=(
|
||||||
|
"-j$NIX_BUILD_CORES"
|
||||||
|
${lib.escapeShellArgs hadrianSettings}
|
||||||
|
)
|
||||||
|
'';
|
||||||
|
|
||||||
|
${if targetPlatform.isGhcjs then "configureScript" else null} = "emconfigure ./configure";
|
||||||
|
# GHC currently ships an edited config.sub so ghcjs is accepted which we can not rollback
|
||||||
|
${if targetPlatform.isGhcjs then "dontUpdateAutotoolsGnuConfigScripts" else null} = true;
|
||||||
|
|
||||||
|
# TODO(@Ericson2314): Always pass "--target" and always prefix.
|
||||||
|
configurePlatforms = [ "build" "host" ]
|
||||||
|
++ lib.optional (targetPlatform != hostPlatform) "target";
|
||||||
|
|
||||||
|
# `--with` flags for libraries needed for RTS linker
|
||||||
|
configureFlags = [
|
||||||
|
"--datadir=$doc/share/doc/ghc"
|
||||||
|
"--with-curses-includes=${ncurses.dev}/include" "--with-curses-libraries=${ncurses.out}/lib"
|
||||||
|
] ++ lib.optionals (libffi != null && !targetPlatform.isGhcjs) [
|
||||||
|
"--with-system-libffi"
|
||||||
|
"--with-ffi-includes=${targetPackages.libffi.dev}/include"
|
||||||
|
"--with-ffi-libraries=${targetPackages.libffi.out}/lib"
|
||||||
|
] ++ lib.optionals (targetPlatform == hostPlatform && !enableNativeBignum) [
|
||||||
|
"--with-gmp-includes=${targetPackages.gmp.dev}/include"
|
||||||
|
"--with-gmp-libraries=${targetPackages.gmp.out}/lib"
|
||||||
|
] ++ lib.optionals (targetPlatform == hostPlatform && hostPlatform.libc != "glibc" && !targetPlatform.isWindows) [
|
||||||
|
"--with-iconv-includes=${libiconv}/include"
|
||||||
|
"--with-iconv-libraries=${libiconv}/lib"
|
||||||
|
] ++ lib.optionals (targetPlatform != hostPlatform) [
|
||||||
|
"--enable-bootstrap-with-devel-snapshot"
|
||||||
|
] ++ lib.optionals useLdGold [
|
||||||
|
"CFLAGS=-fuse-ld=gold"
|
||||||
|
"CONF_GCC_LINKER_OPTS_STAGE1=-fuse-ld=gold"
|
||||||
|
"CONF_GCC_LINKER_OPTS_STAGE2=-fuse-ld=gold"
|
||||||
|
] ++ lib.optionals (disableLargeAddressSpace) [
|
||||||
|
"--disable-large-address-space"
|
||||||
|
] ++ lib.optionals enableDwarf [
|
||||||
|
"--enable-dwarf-unwind"
|
||||||
|
"--with-libdw-includes=${lib.getDev elfutils}/include"
|
||||||
|
"--with-libdw-libraries=${lib.getLib elfutils}/lib"
|
||||||
|
] ++ lib.optionals targetPlatform.isDarwin [
|
||||||
|
# Darwin uses llvm-ar. GHC will try to use `-L` with `ar` when it is `llvm-ar`
|
||||||
|
# but it doesn’t currently work because Cabal never uses `-L` on Darwin. See:
|
||||||
|
# https://gitlab.haskell.org/ghc/ghc/-/issues/23188
|
||||||
|
# https://github.com/haskell/cabal/issues/8882
|
||||||
|
"fp_cv_prog_ar_supports_dash_l=no"
|
||||||
|
];
|
||||||
|
|
||||||
|
# Make sure we never relax`$PATH` and hooks support for compatibility.
|
||||||
|
strictDeps = true;
|
||||||
|
|
||||||
|
# Don’t add -liconv to LDFLAGS automatically so that GHC will add it itself.
|
||||||
|
dontAddExtraLibs = true;
|
||||||
|
|
||||||
|
nativeBuildInputs = [
|
||||||
|
perl ghc hadrian bootPkgs.alex bootPkgs.happy bootPkgs.hscolour
|
||||||
|
# autoconf and friends are necessary for hadrian to create the bindist
|
||||||
|
autoconf automake m4
|
||||||
|
# Python is used in a few scripts invoked by hadrian to generate e.g. rts headers.
|
||||||
|
python3
|
||||||
|
] ++ lib.optionals (stdenv.isDarwin && stdenv.isAarch64) [
|
||||||
|
autoSignDarwinBinariesHook
|
||||||
|
] ++ lib.optionals enableDocs [
|
||||||
|
sphinx
|
||||||
|
];
|
||||||
|
|
||||||
|
# For building runtime libs
|
||||||
|
depsBuildTarget = toolsForTarget;
|
||||||
|
|
||||||
|
buildInputs = [ perl bash ] ++ (libDeps hostPlatform);
|
||||||
|
|
||||||
|
depsTargetTarget = map lib.getDev (libDeps targetPlatform);
|
||||||
|
depsTargetTargetPropagated = map (lib.getOutput "out") (libDeps targetPlatform);
|
||||||
|
|
||||||
|
hadrianFlags = [
|
||||||
|
"--flavour=${ghcFlavour}"
|
||||||
|
"--bignum=${if enableNativeBignum then "native" else "gmp"}"
|
||||||
|
"--docs=${if enableDocs then "no-sphinx-pdfs" else "no-sphinx"}"
|
||||||
|
];
|
||||||
|
|
||||||
|
buildPhase = ''
|
||||||
|
runHook preBuild
|
||||||
|
|
||||||
|
# hadrianFlagsArray is created in preConfigure
|
||||||
|
echo "hadrianFlags: $hadrianFlags ''${hadrianFlagsArray[@]}"
|
||||||
|
|
||||||
|
# We need to go via the bindist for installing
|
||||||
|
hadrian $hadrianFlags "''${hadrianFlagsArray[@]}" binary-dist-dir
|
||||||
|
|
||||||
|
runHook postBuild
|
||||||
|
'';
|
||||||
|
|
||||||
|
# required, because otherwise all symbols from HSffi.o are stripped, and
|
||||||
|
# that in turn causes GHCi to abort
|
||||||
|
stripDebugFlags = [ "-S" ] ++ lib.optional (!targetPlatform.isDarwin) "--keep-file-symbols";
|
||||||
|
|
||||||
|
checkTarget = "test";
|
||||||
|
|
||||||
|
hardeningDisable =
|
||||||
|
[ "format" ]
|
||||||
|
# In nixpkgs, musl based builds currently enable `pie` hardening by default
|
||||||
|
# (see `defaultHardeningFlags` in `make-derivation.nix`).
|
||||||
|
# But GHC cannot currently produce outputs that are ready for `-pie` linking.
|
||||||
|
# Thus, disable `pie` hardening, otherwise `recompile with -fPIE` errors appear.
|
||||||
|
# See:
|
||||||
|
# * https://github.com/NixOS/nixpkgs/issues/129247
|
||||||
|
# * https://gitlab.haskell.org/ghc/ghc/-/issues/19580
|
||||||
|
++ lib.optional stdenv.targetPlatform.isMusl "pie";
|
||||||
|
|
||||||
|
# big-parallel allows us to build with more than 2 cores on
|
||||||
|
# Hydra which already warrants a significant speedup
|
||||||
|
requiredSystemFeatures = [ "big-parallel" ];
|
||||||
|
|
||||||
|
outputs = [ "out" "doc" ];
|
||||||
|
|
||||||
|
# We need to configure the bindist *again* before installing
|
||||||
|
# https://gitlab.haskell.org/ghc/ghc/-/issues/22058
|
||||||
|
# TODO(@sternenseemann): it would be nice if the bindist could be an intermediate
|
||||||
|
# derivation, but since it is > 2GB even on x86_64-linux, not a good idea?
|
||||||
|
preInstall = ''
|
||||||
|
pushd _build/bindist/*
|
||||||
|
|
||||||
|
''
|
||||||
|
# the bindist configure script uses different env variables than the GHC configure script
|
||||||
|
# see https://github.com/NixOS/nixpkgs/issues/267250 and https://gitlab.haskell.org/ghc/ghc/-/issues/24211
|
||||||
|
+ lib.optionalString (stdenv.targetPlatform.linker == "cctools") ''
|
||||||
|
export InstallNameToolCmd=$INSTALL_NAME_TOOL
|
||||||
|
export OtoolCmd=$OTOOL
|
||||||
|
''
|
||||||
|
+ ''
|
||||||
|
$configureScript $configureFlags "''${configureFlagsArray[@]}"
|
||||||
|
'';
|
||||||
|
|
||||||
|
postInstall = ''
|
||||||
|
# leave bindist directory
|
||||||
|
popd
|
||||||
|
|
||||||
|
# Install the bash completion file.
|
||||||
|
install -Dm 644 utils/completion/ghc.bash $out/share/bash-completion/completions/${targetPrefix}ghc
|
||||||
|
'';
|
||||||
|
|
||||||
|
passthru = {
|
||||||
|
inherit bootPkgs targetPrefix;
|
||||||
|
|
||||||
|
inherit llvmPackages;
|
||||||
|
inherit enableShared;
|
||||||
|
|
||||||
|
# Our Cabal compiler name
|
||||||
|
haskellCompilerName = "ghc-${version}";
|
||||||
|
|
||||||
|
# Expose hadrian used for bootstrapping, for debugging purposes
|
||||||
|
inherit hadrian;
|
||||||
|
|
||||||
|
# TODO(@sternenseemann): there's no stage0:exe:haddock target by default,
|
||||||
|
# so haddock isn't available for GHC cross-compilers. Can we fix that?
|
||||||
|
hasHaddock = stdenv.hostPlatform == stdenv.targetPlatform;
|
||||||
|
};
|
||||||
|
|
||||||
|
meta = {
|
||||||
|
homepage = "http://haskell.org/ghc";
|
||||||
|
description = "The Glasgow Haskell Compiler";
|
||||||
|
maintainers = with lib.maintainers; [ ];
|
||||||
|
timeout = 24 * 3600;
|
||||||
|
inherit (ghc.meta) license platforms;
|
||||||
|
# https://github.com/NixOS/nixpkgs/issues/208959
|
||||||
|
broken =
|
||||||
|
(lib.versionAtLeast version "9.6" && lib.versionOlder version "9.8")
|
||||||
|
&& stdenv.targetPlatform.isStatic;
|
||||||
|
};
|
||||||
|
|
||||||
|
dontStrip = targetPlatform.useAndroidPrebuilt || targetPlatform.isWasm;
|
||||||
|
} // lib.optionalAttrs targetPlatform.useAndroidPrebuilt {
|
||||||
|
dontPatchELF = true;
|
||||||
|
noAuditTmpdir = true;
|
||||||
|
})
|
8
pkgs/by-name/ha/haskell/ghc/docs-sphinx-7-ghc98.patch
Normal file
8
pkgs/by-name/ha/haskell/ghc/docs-sphinx-7-ghc98.patch
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
Fix build of docs after sphinx update.
|
||||||
|
https://github.com/sphinx-doc/sphinx/pull/11381
|
||||||
|
https://gitlab.haskell.org/ghc/ghc/-/issues/24129
|
||||||
|
--- a/docs/users_guide/rtd-theme/layout.html
|
||||||
|
+++ b/docs/users_guide/rtd-theme/layout.html
|
||||||
|
@@ -28 +28 @@
|
||||||
|
- <link rel="stylesheet" href="{{ pathto('_static/' + style, 1) }}" type="text/css" />
|
||||||
|
+ <link rel="stylesheet" href="{{ pathto('_static/' + styles[-1], 1) }}" type="text/css" />
|
8
pkgs/by-name/ha/haskell/ghc/docs-sphinx-7.patch
Normal file
8
pkgs/by-name/ha/haskell/ghc/docs-sphinx-7.patch
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
Fix build of docs after sphinx update.
|
||||||
|
https://github.com/sphinx-doc/sphinx/pull/11381
|
||||||
|
https://gitlab.haskell.org/ghc/ghc/-/issues/24129
|
||||||
|
--- a/docs/users_guide/rtd-theme/layout.html
|
||||||
|
+++ b/docs/users_guide/rtd-theme/layout.html
|
||||||
|
@@ -67 +67 @@
|
||||||
|
- <link rel="stylesheet" href="{{ pathto('_static/' + style, 1) }}" type="text/css" />
|
||||||
|
+ <link rel="stylesheet" href="{{ pathto('_static/' + styles[-1], 1) }}" type="text/css" />
|
46
pkgs/by-name/ha/haskell/ghc/gcc-clang-wrapper.sh
Executable file
46
pkgs/by-name/ha/haskell/ghc/gcc-clang-wrapper.sh
Executable file
|
@ -0,0 +1,46 @@
|
||||||
|
#!@shell@
|
||||||
|
|
||||||
|
inPreprocessorMode () {
|
||||||
|
hasE=0
|
||||||
|
hasU=0
|
||||||
|
hasT=0
|
||||||
|
for arg in "$@"
|
||||||
|
do
|
||||||
|
if [ 'x-E' = "x$arg" ]; then hasE=1; fi
|
||||||
|
if [ 'x-undef' = "x$arg" ]; then hasU=1; fi
|
||||||
|
if [ 'x-traditional' = "x$arg" ]; then hasT=1; fi
|
||||||
|
done
|
||||||
|
[ "$hasE$hasU$hasT" = '111' ]
|
||||||
|
}
|
||||||
|
|
||||||
|
extraClangArgs="-Wno-invalid-pp-token -Wno-unicode -Wno-trigraphs"
|
||||||
|
|
||||||
|
adjustPreprocessorLanguage () {
|
||||||
|
newArgs=''
|
||||||
|
while [ $# -gt 0 ]
|
||||||
|
do
|
||||||
|
newArgs="$newArgs $1"
|
||||||
|
if [ "$1" = '-x' ]
|
||||||
|
then
|
||||||
|
shift
|
||||||
|
if [ $# -gt 0 ]
|
||||||
|
then
|
||||||
|
if [ "$1" = 'c' ]
|
||||||
|
then
|
||||||
|
newArgs="$newArgs assembler-with-cpp"
|
||||||
|
else
|
||||||
|
newArgs="$newArgs $1"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
shift
|
||||||
|
done
|
||||||
|
echo $newArgs
|
||||||
|
}
|
||||||
|
|
||||||
|
if inPreprocessorMode "$@"
|
||||||
|
then
|
||||||
|
exec clang $extraClangArgs `adjustPreprocessorLanguage "$@"`
|
||||||
|
else
|
||||||
|
exec clang $extraClangArgs "${@/-nodefaultlibs/}"
|
||||||
|
fi
|
11
pkgs/by-name/ha/haskell/ghc/head.nix
Normal file
11
pkgs/by-name/ha/haskell/ghc/head.nix
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
import ./common-hadrian.nix {
|
||||||
|
version = "9.11.20240410";
|
||||||
|
rev = "1b1a92bd25c3f7249cf922c5dbf4415d2de44a36";
|
||||||
|
sha256 = "sha256-2HdhxhVrKn8c/ZOGYoYThqXpod2OPiGXgH+mAV69Ip0=";
|
||||||
|
# The STM benchmark contains chanbench.hs and ChanBench.hs causing a hash
|
||||||
|
# mismatch on case insensitive filesystems. See also
|
||||||
|
# https://gitlab.haskell.org/ghc/packages/stm/-/issues/2
|
||||||
|
postFetch = ''
|
||||||
|
rm -rf "$out/libraries/stm/bench"
|
||||||
|
'';
|
||||||
|
}
|
25
pkgs/by-name/ha/haskell/ghc/respect-ar-path.patch
Normal file
25
pkgs/by-name/ha/haskell/ghc/respect-ar-path.patch
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
diff -urd a/aclocal.m4 b/aclocal.m4
|
||||||
|
--- a/aclocal.m4
|
||||||
|
+++ b/aclocal.m4
|
||||||
|
@@ -1199,7 +1199,8 @@
|
||||||
|
# thinks that target == host so it never checks the unqualified
|
||||||
|
# tools for Windows. See #14274.
|
||||||
|
AC_DEFUN([FP_PROG_AR],
|
||||||
|
-[if test -z "$fp_prog_ar"; then
|
||||||
|
+[AC_SUBST(fp_prog_ar,$AR)
|
||||||
|
+if test -z "$fp_prog_ar"; then
|
||||||
|
if test "$HostOS" = "mingw32"
|
||||||
|
then
|
||||||
|
AC_PATH_PROG([fp_prog_ar], [ar])
|
||||||
|
diff -urd a/configure b/configure
|
||||||
|
--- a/configure
|
||||||
|
+++ b/configure
|
||||||
|
@@ -10744,6 +10744,8 @@
|
||||||
|
test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
|
||||||
|
|
||||||
|
|
||||||
|
+fp_prog_ar=$AR
|
||||||
|
+
|
||||||
|
if test -z "$fp_prog_ar"; then
|
||||||
|
if test "$HostOS" = "mingw32"
|
||||||
|
then
|
|
@ -0,0 +1,12 @@
|
||||||
|
diff --git a/hadrian/src/Settings/Builders/Haddock.hs b/hadrian/src/Settings/Builders/Haddock.hs
|
||||||
|
index 902b2f85e2..429a441c3b 100644
|
||||||
|
--- a/src/Settings/Builders/Haddock.hs
|
||||||
|
+++ b/src/Settings/Builders/Haddock.hs
|
||||||
|
@@ -57,7 +57,6 @@ haddockBuilderArgs = mconcat
|
||||||
|
, arg $ "--odir=" ++ takeDirectory output
|
||||||
|
, arg $ "--dump-interface=" ++ output
|
||||||
|
, arg "--html"
|
||||||
|
- , arg "--hyperlinked-source"
|
||||||
|
, arg "--hoogle"
|
||||||
|
, arg "--quickjump"
|
||||||
|
, arg $ "--title=" ++ pkgName pkg ++ "-" ++ version
|
16
pkgs/by-name/ha/haskell/hadrian/ghc-platform.nix
Normal file
16
pkgs/by-name/ha/haskell/hadrian/ghc-platform.nix
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
{ mkDerivation, base, lib
|
||||||
|
# GHC source tree to build ghc-toolchain from
|
||||||
|
, ghcSrc
|
||||||
|
, ghcVersion
|
||||||
|
}:
|
||||||
|
mkDerivation {
|
||||||
|
pname = "ghc-platform";
|
||||||
|
version = ghcVersion;
|
||||||
|
src = ghcSrc;
|
||||||
|
postUnpack = ''
|
||||||
|
sourceRoot="$sourceRoot/libraries/ghc-platform"
|
||||||
|
'';
|
||||||
|
libraryHaskellDepends = [ base ];
|
||||||
|
description = "Platform information used by GHC and friends";
|
||||||
|
license = lib.licenses.bsd3;
|
||||||
|
}
|
19
pkgs/by-name/ha/haskell/hadrian/ghc-toolchain.nix
Normal file
19
pkgs/by-name/ha/haskell/hadrian/ghc-toolchain.nix
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
{ mkDerivation, base, directory, filepath, ghc-platform, lib
|
||||||
|
, process, text, transformers
|
||||||
|
# GHC source tree to build ghc-toolchain from
|
||||||
|
, ghcVersion
|
||||||
|
, ghcSrc
|
||||||
|
}:
|
||||||
|
mkDerivation {
|
||||||
|
pname = "ghc-toolchain";
|
||||||
|
version = ghcVersion;
|
||||||
|
src = ghcSrc;
|
||||||
|
postUnpack = ''
|
||||||
|
sourceRoot="$sourceRoot/utils/ghc-toolchain"
|
||||||
|
'';
|
||||||
|
libraryHaskellDepends = [
|
||||||
|
base directory filepath ghc-platform process text transformers
|
||||||
|
];
|
||||||
|
description = "Utility for managing GHC target toolchains";
|
||||||
|
license = lib.licenses.bsd3;
|
||||||
|
}
|
|
@ -0,0 +1,13 @@
|
||||||
|
diff --git a/hadrian.cabal b/hadrian.cabal
|
||||||
|
index 70fded11aa..3893537f05 100644
|
||||||
|
--- a/hadrian.cabal
|
||||||
|
+++ b/hadrian.cabal
|
||||||
|
@@ -150,7 +150,7 @@ executable hadrian
|
||||||
|
, TypeOperators
|
||||||
|
other-extensions: MultiParamTypeClasses
|
||||||
|
, TypeFamilies
|
||||||
|
- build-depends: Cabal >= 3.2 && < 3.9
|
||||||
|
+ build-depends: Cabal >= 3.2 && < 3.11
|
||||||
|
, base >= 4.11 && < 5
|
||||||
|
, bytestring >= 0.10 && < 0.13
|
||||||
|
, containers >= 0.5 && < 0.7
|
59
pkgs/by-name/ha/haskell/hadrian/hadrian.nix
Normal file
59
pkgs/by-name/ha/haskell/hadrian/hadrian.nix
Normal file
|
@ -0,0 +1,59 @@
|
||||||
|
# See also ./make-hadria.nix
|
||||||
|
{ mkDerivation, base, bytestring, Cabal, containers, directory
|
||||||
|
, extra, filepath, lib, mtl, parsec, shake, text, transformers
|
||||||
|
, unordered-containers, cryptohash-sha256, base16-bytestring
|
||||||
|
, writeText
|
||||||
|
# Dependencies that are not on Hackage and only used in certain Hadrian versions
|
||||||
|
, ghc-platform ? null
|
||||||
|
, ghc-toolchain ? null
|
||||||
|
# GHC source tree to build hadrian from
|
||||||
|
, ghcSrc
|
||||||
|
, ghcVersion
|
||||||
|
# Customization
|
||||||
|
, userSettings ? null
|
||||||
|
, enableHyperlinkedSource
|
||||||
|
}:
|
||||||
|
|
||||||
|
mkDerivation {
|
||||||
|
pname = "hadrian";
|
||||||
|
version = ghcVersion;
|
||||||
|
src = ghcSrc;
|
||||||
|
postUnpack = ''
|
||||||
|
sourceRoot="$sourceRoot/hadrian"
|
||||||
|
'';
|
||||||
|
patches = lib.optionals (!enableHyperlinkedSource) [
|
||||||
|
./disable-hyperlinked-source.patch
|
||||||
|
] ++ lib.optionals (lib.elem ghcVersion [ "9.8.1" "9.8.2" ]) [
|
||||||
|
# Incorrect bounds on Cabal
|
||||||
|
# https://gitlab.haskell.org/ghc/ghc/-/issues/24100
|
||||||
|
./hadrian-9.8.1-allow-Cabal-3.10.patch
|
||||||
|
];
|
||||||
|
# Overwrite UserSettings.hs with a provided custom one
|
||||||
|
postPatch = lib.optionalString (userSettings != null) ''
|
||||||
|
install -m644 "${writeText "UserSettings.hs" userSettings}" src/UserSettings.hs
|
||||||
|
'';
|
||||||
|
configureFlags = [
|
||||||
|
# avoid QuickCheck dep which needs shared libs / TH
|
||||||
|
"-f-selftest"
|
||||||
|
# Building hadrian with -O1 takes quite some time with little benefit.
|
||||||
|
# Additionally we need to recompile it on every change of UserSettings.hs.
|
||||||
|
# See https://gitlab.haskell.org/ghc/ghc/-/merge_requests/1190
|
||||||
|
"-O0"
|
||||||
|
];
|
||||||
|
isLibrary = false;
|
||||||
|
isExecutable = true;
|
||||||
|
executableHaskellDepends = [
|
||||||
|
base bytestring Cabal containers directory extra filepath mtl
|
||||||
|
parsec shake text transformers unordered-containers
|
||||||
|
] ++ lib.optionals (lib.versionAtLeast ghcVersion "9.7") [
|
||||||
|
cryptohash-sha256 base16-bytestring
|
||||||
|
] ++ lib.optionals (lib.versionAtLeast ghcVersion "9.9") [
|
||||||
|
ghc-platform ghc-toolchain
|
||||||
|
];
|
||||||
|
passthru = {
|
||||||
|
# Expose »private« dependencies if any
|
||||||
|
inherit ghc-platform ghc-toolchain;
|
||||||
|
};
|
||||||
|
description = "GHC build system";
|
||||||
|
license = lib.licenses.bsd3;
|
||||||
|
}
|
59
pkgs/by-name/ha/haskell/hadrian/make-hadrian.nix
Normal file
59
pkgs/by-name/ha/haskell/hadrian/make-hadrian.nix
Normal file
|
@ -0,0 +1,59 @@
|
||||||
|
# Hadrian is the build system used to (exclusively) build GHC. It can
|
||||||
|
# (theoretically) be used starting with GHC 9.4 and is required since 9.6. It is
|
||||||
|
# developed in the GHC source tree and specific to the GHC version it is released
|
||||||
|
# with, i.e. Hadrian always needs to be built from the same GHC source tree as
|
||||||
|
# the GHC we want to build.
|
||||||
|
#
|
||||||
|
# This fact makes it impossible to integrate Hadrian into our Haskell package
|
||||||
|
# sets which are also used to bootstrap GHC, since a package set can bootstrap
|
||||||
|
# multiple GHC versions (usually two major versions). A bootstrap set would need
|
||||||
|
# knowledge of the GHC it would eventually bootstrap which would make the logic
|
||||||
|
# unnecessarily complicated.
|
||||||
|
#
|
||||||
|
# Luckily Hadrian is, while annoying to bootstrap, relatively simple. Specifically
|
||||||
|
# all it requires to build is (relative to the GHC we are trying to build) a
|
||||||
|
# build->build GHC and build->build Haskell packages. We can get all of this
|
||||||
|
# from bootPkgs which is already passed to the GHC expression.
|
||||||
|
#
|
||||||
|
# The solution is the following: The GHC expression passes its source tree and
|
||||||
|
# version along with some parameters to this function (./make-hadrian.nix)
|
||||||
|
# which acts as a common expression builder for all Hadrian version as well as
|
||||||
|
# related packages that are managed in the GHC source tree. Its main job is to
|
||||||
|
# expose all possible compile time customization in a common interface and
|
||||||
|
# take care of all differences between Hadrian versions.
|
||||||
|
{ bootPkgs
|
||||||
|
, lib
|
||||||
|
}:
|
||||||
|
|
||||||
|
{ # GHC source tree and version to build hadrian & friends from.
|
||||||
|
# These are passed on to the actual package expressions.
|
||||||
|
ghcSrc
|
||||||
|
, ghcVersion
|
||||||
|
# Contents of a non-default UserSettings.hs to use when building hadrian, if any.
|
||||||
|
# Should be a string or null.
|
||||||
|
, userSettings ? null
|
||||||
|
# Whether to pass --hyperlinked-source to haddock or not. This is a custom
|
||||||
|
# workaround as we wait for this to be configurable via userSettings or similar.
|
||||||
|
# https://gitlab.haskell.org/ghc/ghc/-/issues/23625
|
||||||
|
, enableHyperlinkedSource ? false
|
||||||
|
}:
|
||||||
|
|
||||||
|
let
|
||||||
|
callPackage' = f: args: bootPkgs.callPackage f ({
|
||||||
|
inherit ghcSrc ghcVersion;
|
||||||
|
} // args);
|
||||||
|
|
||||||
|
ghc-platform = callPackage' ./ghc-platform.nix { };
|
||||||
|
ghc-toolchain = callPackage' ./ghc-toolchain.nix {
|
||||||
|
inherit ghc-platform;
|
||||||
|
};
|
||||||
|
in
|
||||||
|
|
||||||
|
callPackage' ./hadrian.nix ({
|
||||||
|
inherit userSettings enableHyperlinkedSource;
|
||||||
|
} // lib.optionalAttrs (lib.versionAtLeast ghcVersion "9.9") {
|
||||||
|
# Starting with GHC 9.9 development, additional in tree packages are required
|
||||||
|
# to build hadrian. (Hackage-released conditional dependencies are handled
|
||||||
|
# in ./hadrian.nix without requiring intervention here.)
|
||||||
|
inherit ghc-platform ghc-toolchain;
|
||||||
|
})
|
355
pkgs/by-name/ha/haskell/haskell-modules/HACKING.md
Normal file
355
pkgs/by-name/ha/haskell/haskell-modules/HACKING.md
Normal file
|
@ -0,0 +1,355 @@
|
||||||
|
|
||||||
|
# Maintainer Workflow
|
||||||
|
|
||||||
|
The goal of the [@NixOS/haskell](https://github.com/orgs/NixOS/teams/haskell)
|
||||||
|
team is to keep the Haskell packages in Nixpkgs up-to-date, while making sure
|
||||||
|
there are no Haskell-related evaluation errors or build errors that get into
|
||||||
|
the Nixpkgs `master` branch.
|
||||||
|
|
||||||
|
We do this by periodically merging an updated set of Haskell packages on the
|
||||||
|
`haskell-updates` branch into the `master` branch. Each member of the team
|
||||||
|
takes a two week period where they are in charge of merging the
|
||||||
|
`haskell-updates` branch into `master`. This is the documentation for this
|
||||||
|
workflow.
|
||||||
|
|
||||||
|
The workflow generally proceeds in three main steps:
|
||||||
|
|
||||||
|
1. create the initial `haskell-updates` PR, and update Stackage and Hackage snapshots
|
||||||
|
1. wait for contributors to fix newly broken Haskell packages
|
||||||
|
1. merge `haskell-updates` into `master`
|
||||||
|
|
||||||
|
Each of these steps is described in a separate section.
|
||||||
|
|
||||||
|
There is a script that automates the workflow for merging the currently open
|
||||||
|
`haskell-updates` PR into `master` and opening the next PR. It is described
|
||||||
|
at the end of this document.
|
||||||
|
|
||||||
|
## Initial `haskell-updates` PR
|
||||||
|
|
||||||
|
In this section we create the PR for merging `haskell-updates` into `master`.
|
||||||
|
|
||||||
|
1. Make sure the `haskell-updates` branch is up-to-date with `master`.
|
||||||
|
|
||||||
|
1. Update the Stackage Nightly resolver used by Nixpkgs and create a commit:
|
||||||
|
|
||||||
|
```console
|
||||||
|
$ ./maintainers/scripts/haskell/update-stackage.sh --do-commit
|
||||||
|
```
|
||||||
|
|
||||||
|
1. Update the Hackage package set used by Nixpkgs and create a commit:
|
||||||
|
|
||||||
|
```console
|
||||||
|
$ ./maintainers/scripts/haskell/update-hackage.sh --do-commit
|
||||||
|
```
|
||||||
|
|
||||||
|
1. Regenerate the Haskell package set used in Nixpkgs and create a commit:
|
||||||
|
|
||||||
|
```console
|
||||||
|
$ ./maintainers/scripts/haskell/regenerate-hackage-packages.sh --do-commit
|
||||||
|
```
|
||||||
|
|
||||||
|
1. Push these commits to the `haskell-updates` branch of the NixOS/nixpkgs repository.
|
||||||
|
|
||||||
|
1. Open a PR on Nixpkgs for merging `haskell-updates` into `master`. The recommended
|
||||||
|
PR title and body text are described in the `merge-and-open-pr.sh` section.
|
||||||
|
|
||||||
|
## Notify Maintainers and Fix Broken Packages
|
||||||
|
|
||||||
|
After you've done the previous steps, Hydra will start building the new and
|
||||||
|
updated Haskell packages. You can see the progress Hydra is making at
|
||||||
|
https://hydra.nixos.org/jobset/nixpkgs/haskell-updates. This Hydra jobset is
|
||||||
|
defined in the file [release-haskell.nix](../../top-level/release-haskell.nix).
|
||||||
|
|
||||||
|
### Notify Maintainers
|
||||||
|
|
||||||
|
When Hydra finishes building all the updated packages for the `haskell-updates`
|
||||||
|
jobset, you should generate a build report to notify maintainers of their
|
||||||
|
newly broken packages. You can do that with the following commands:
|
||||||
|
|
||||||
|
```console
|
||||||
|
$ ./maintainers/scripts/haskell/hydra-report.hs get-report
|
||||||
|
$ ./maintainers/scripts/haskell/hydra-report.hs ping-maintainers
|
||||||
|
```
|
||||||
|
|
||||||
|
The `hydra-report.hs ping-maintainers` command generates a Markdown document
|
||||||
|
that you can paste in a GitHub comment on the PR opened above. This
|
||||||
|
comment describes which Haskell packages are now failing to build. It also
|
||||||
|
pings the maintainers so that they know to fix up their packages.
|
||||||
|
|
||||||
|
It may be helpful to pipe `hydra-report.hs ping-maintainers` into `xclip`
|
||||||
|
(XOrg) or `wl-copy` (Wayland) in order to post on GitHub.
|
||||||
|
|
||||||
|
This build report can be fetched and re-generated for new Hydra evaluations.
|
||||||
|
It may help contributors to try to keep the GitHub comment updated with the
|
||||||
|
most recent build report.
|
||||||
|
|
||||||
|
Maintainers should be given at least 7 days to fix up their packages when they
|
||||||
|
break. If maintainers don't fix up their packages within 7 days, then they
|
||||||
|
may be marked broken before merging `haskell-updates` into `master`.
|
||||||
|
|
||||||
|
### Fix Broken Packages
|
||||||
|
|
||||||
|
After getting the build report, you can see which packages and Hydra jobs are
|
||||||
|
failing to build. The most important jobs are the
|
||||||
|
[`maintained`](https://hydra.nixos.org/job/nixpkgs/haskell-updates/maintained) and
|
||||||
|
[`mergeable`](https://hydra.nixos.org/job/nixpkgs/haskell-updates/mergeable)
|
||||||
|
jobs. These are both defined in
|
||||||
|
[`release-haskell.nix`](../../top-level/release-haskell.nix).
|
||||||
|
|
||||||
|
`mergeable` is a set of the most important Haskell packages, including things
|
||||||
|
like Pandoc and XMonad. These packages are widely used. We would like to
|
||||||
|
always keep these building.
|
||||||
|
|
||||||
|
`maintained` is a set of Haskell packages that have maintainers in Nixpkgs.
|
||||||
|
We should be proactive in working with maintainers to keep their packages
|
||||||
|
building.
|
||||||
|
|
||||||
|
Steps to fix Haskell packages that are failing to build is out of scope for
|
||||||
|
this document, but it usually requires fixing up dependencies that are now
|
||||||
|
out-of-bounds.
|
||||||
|
|
||||||
|
### Mark Broken Packages
|
||||||
|
|
||||||
|
Packages that do not get fixed can be marked broken with the following
|
||||||
|
commands. First check which packages are broken:
|
||||||
|
|
||||||
|
```console
|
||||||
|
$ ./maintainers/scripts/haskell/hydra-report.hs get-report
|
||||||
|
$ ./maintainers/scripts/haskell/hydra-report.hs mark-broken-list
|
||||||
|
```
|
||||||
|
|
||||||
|
This shows a list of packages that reported a build failure on `x86_64-linux` on Hydra.
|
||||||
|
|
||||||
|
Next, run the following command:
|
||||||
|
|
||||||
|
```console
|
||||||
|
$ ./maintainers/scripts/haskell/mark-broken.sh --do-commit
|
||||||
|
```
|
||||||
|
|
||||||
|
This first opens up an editor with the broken package list. Some of these
|
||||||
|
packages may have a maintainer in Nixpkgs. If these maintainers have not been
|
||||||
|
given 7 days to fix up their package, then make sure to remove those packages
|
||||||
|
from the list before continuing. After saving and exiting the editor, the
|
||||||
|
following will happen:
|
||||||
|
|
||||||
|
- Packages from the list will be added to
|
||||||
|
[`configuration-hackage2nix/broken.yaml`](configuration-hackage2nix/broken.yaml).
|
||||||
|
This is a list of Haskell packages that are known to be broken.
|
||||||
|
|
||||||
|
- [`hackage-packages.nix`](hackage-packages.nix) will be regenerated. This
|
||||||
|
will mark all Haskell packages in `configuration-hackage2nix/broken.yaml`
|
||||||
|
as `broken`.
|
||||||
|
|
||||||
|
- The
|
||||||
|
[`configuration-hackage2nix/transitive-broken.yaml`](configuration-hackage2nix/transitive-broken.yaml)
|
||||||
|
file will be updated. This is a list of Haskell packages that
|
||||||
|
depend on a package in `configuration-hackage2nix/broken.yaml` or
|
||||||
|
`configuration-hackage2nix/transitive-broken.yaml`
|
||||||
|
|
||||||
|
- `hackage-packages.nix` will be regenerated again. This will set
|
||||||
|
`hydraPlatforms = none` for all the packages in
|
||||||
|
`configuration-hackage2nix/transitive-broken.yaml`. This makes
|
||||||
|
sure that Hydra does not try to build any of these packages.
|
||||||
|
|
||||||
|
- All updated files will be committed.
|
||||||
|
|
||||||
|
## Merge `haskell-updates` into `master`
|
||||||
|
|
||||||
|
Now it is time to merge the `haskell-updates` PR you opened above.
|
||||||
|
|
||||||
|
Before doing this, make sure of the following:
|
||||||
|
|
||||||
|
- All Haskell packages that fail to build are correctly marked broken or
|
||||||
|
transitively broken.
|
||||||
|
|
||||||
|
- The `maintained` and `mergeable` jobs are passing on Hydra.
|
||||||
|
|
||||||
|
- The maintainers for any maintained Haskell packages that are newly broken
|
||||||
|
have been pinged on GitHub and given at least a week to fix their packages.
|
||||||
|
This is especially important for widely-used packages like `cachix`.
|
||||||
|
|
||||||
|
- Make sure you first merge the `master` branch into `haskell-updates`. Wait
|
||||||
|
for Hydra to evaluate the new `haskell-updates` jobset. Make sure you only
|
||||||
|
merge `haskell-updates` into `master` when there are no evaluation errors.
|
||||||
|
|
||||||
|
- Due to Hydra having only a small number of Darwin build machines, the
|
||||||
|
`haskell-updates` jobset on Hydra often has many queued Darwin jobs.
|
||||||
|
In order to not have these queued Darwin jobs prevent the `haskell-updates`
|
||||||
|
branch from being merged to `master` in a timely manner, we have special
|
||||||
|
rules for Darwin jobs.
|
||||||
|
|
||||||
|
- It is alright to merge the `haskell-updates` branch to `master` if
|
||||||
|
there are remaining queued Darwin jobs on Hydra.
|
||||||
|
|
||||||
|
- We would like to keep GHC and the `mergeable` job building on Darwin.
|
||||||
|
Do not merge the `haskell-updates` branch to `master` if GHC is failing
|
||||||
|
to build, or the `mergeable` job has failing Darwin constituent jobs.
|
||||||
|
|
||||||
|
If GHC and the `mergeable` job are not failing, but merely queued,
|
||||||
|
it is alright to merge the `haskell-updates` branch to `master`.
|
||||||
|
|
||||||
|
- We do not need to keep the `maintained` job building on Darwin.
|
||||||
|
If `maintained` packages are failing on Darwin, it is helpful to
|
||||||
|
mark them as broken on that platform.
|
||||||
|
|
||||||
|
When you've double-checked these points, go ahead and merge the `haskell-updates` PR.
|
||||||
|
After merging, **make sure not to delete the `haskell-updates` branch**, since it
|
||||||
|
causes all currently open Haskell-related pull-requests to be automatically closed on GitHub.
|
||||||
|
|
||||||
|
## Script for Merging `haskell-updates` and Opening a New PR
|
||||||
|
|
||||||
|
There is a script that automates merging the current `haskell-updates` PR and
|
||||||
|
opening the next one. When you want to merge the currently open
|
||||||
|
`haskell-updates` PR, you can run the script with the following steps:
|
||||||
|
|
||||||
|
1. Make sure you have previously authenticated with the `gh` command. The
|
||||||
|
script uses the `gh` command to merge the current PR and open a new one.
|
||||||
|
You should only need to do this once.
|
||||||
|
|
||||||
|
This command can be used to authenticate:
|
||||||
|
|
||||||
|
```console
|
||||||
|
$ gh auth login
|
||||||
|
```
|
||||||
|
|
||||||
|
This command can be used to confirm that you have already authenticated:
|
||||||
|
|
||||||
|
```console
|
||||||
|
$ gh auth status
|
||||||
|
```
|
||||||
|
|
||||||
|
1. Make sure you have setup your `~/.cabal/config` file for authentication
|
||||||
|
for uploading the NixOS package versions to Hackage. See the following
|
||||||
|
section for details on how to do this.
|
||||||
|
|
||||||
|
1. Make sure you have correctly marked packages broken. One of the previous
|
||||||
|
sections explains how to do this.
|
||||||
|
|
||||||
|
In short:
|
||||||
|
|
||||||
|
```console
|
||||||
|
$ ./maintainers/scripts/haskell/hydra-report.hs get-report
|
||||||
|
$ ./maintainers/scripts/haskell/hydra-report.hs mark-broken-list
|
||||||
|
$ ./maintainers/scripts/haskell/mark-broken.sh --do-commit
|
||||||
|
```
|
||||||
|
|
||||||
|
1. Merge `master` into `haskell-updates` and make sure to push to the
|
||||||
|
`haskell-updates` branch. (This can be skipped if `master` has recently
|
||||||
|
been merged into `haskell-updates`.)
|
||||||
|
|
||||||
|
1. Go to https://hydra.nixos.org/jobset/nixpkgs/haskell-updates and force an
|
||||||
|
evaluation of the `haskell-updates` jobset. See one of the following
|
||||||
|
sections for how to do this. Make sure there are no evaluation errors. If
|
||||||
|
there are remaining evaluation errors, fix them before continuing with this
|
||||||
|
merge.
|
||||||
|
|
||||||
|
1. Run the script to merge `haskell-updates`:
|
||||||
|
|
||||||
|
```console
|
||||||
|
$ ./maintainers/scripts/haskell/merge-and-open-pr.sh PR_NUM_OF_CURRENT_HASKELL_UPDATES_PR
|
||||||
|
```
|
||||||
|
|
||||||
|
Find the PR number easily [here](https://github.com/nixos/nixpkgs/pulls?q=is%3Apr+is%3Aopen+head%3Ahaskell-updates)
|
||||||
|
|
||||||
|
This does the following things:
|
||||||
|
|
||||||
|
1. Fetches `origin`, makes sure you currently have the `haskell-updates`
|
||||||
|
branch checked out, and makes sure your currently checked-out
|
||||||
|
`haskell-updates` branch is on the same commit as
|
||||||
|
`origin/haskell-updates`.
|
||||||
|
|
||||||
|
1. Merges the currently open `haskell-updates` PR.
|
||||||
|
|
||||||
|
1. Updates the version of Haskell packages in NixOS on Hackage.
|
||||||
|
|
||||||
|
1. Updates Stackage and Hackage snapshots. Regenerates the Haskell package set.
|
||||||
|
|
||||||
|
1. Pushes the commits updating Stackage and Hackage and opens a new
|
||||||
|
`haskell-updates` PR on Nixpkgs. If you'd like to do this by hand,
|
||||||
|
look in the script for the recommended PR title and body text.
|
||||||
|
|
||||||
|
## Update Hackage Version Information
|
||||||
|
|
||||||
|
After merging into `master` you can update what Hackage displays as the current
|
||||||
|
version in NixOS for every individual package. To do this you run
|
||||||
|
`maintainers/scripts/haskell/upload-nixos-package-list-to-hackage.sh`. See the
|
||||||
|
script for how to provide credentials. Once you have configured credentials,
|
||||||
|
running this takes only a few seconds.
|
||||||
|
|
||||||
|
## Additional Info
|
||||||
|
|
||||||
|
Here are some additional tips that didn't fit in above.
|
||||||
|
|
||||||
|
- Hydra tries to evaluate the `haskell-updates` branch (in the
|
||||||
|
[`nixpkgs:haskell-updates`](https://hydra.nixos.org/jobset/nixpkgs/haskell-updates)
|
||||||
|
jobset) every 4 hours. It is possible to force a new Hydra evaluation without
|
||||||
|
waiting 4 hours by the following steps:
|
||||||
|
|
||||||
|
1. Log into Hydra with your GitHub or Google account.
|
||||||
|
1. Go to the [nixpkgs:haskell-updates](https://hydra.nixos.org/jobset/nixpkgs/haskell-updates) jobset.
|
||||||
|
1. Click the `Actions` button.
|
||||||
|
1. Select `Evaluate this jobset`.
|
||||||
|
1. If you refresh the page, there should be a new `Evaluation running since:` line.
|
||||||
|
1. Evaluations take about 10 minutes to finish.
|
||||||
|
|
||||||
|
- It is sometimes helpful to update the version of
|
||||||
|
[`cabal2nix` / `hackage2nix`](https://github.com/NixOS/cabal2nix) that our
|
||||||
|
maintainer scripts use. This can be done with the
|
||||||
|
[`maintainers/scripts/haskell/update-cabal2nix-unstable.sh`](../../../maintainers/scripts/haskell/update-cabal2nix-unstable.sh)
|
||||||
|
script.
|
||||||
|
|
||||||
|
You might want to do this if a user contributes a fix to `cabal2nix` that
|
||||||
|
will immediately fix a Haskell package in Nixpkgs. First, merge in
|
||||||
|
the PR to `cabal2nix`, then run `update-cabal2nix-upstable.sh`. Finally, run
|
||||||
|
[`regenerate-hackage-packages.sh`](../../../maintainers/scripts/haskell/regenerate-hackage-packages.sh)
|
||||||
|
to regenerate the Hackage package set with the updated version of `hackage2nix`.
|
||||||
|
|
||||||
|
- Make sure never to update the Hackage package hashes in
|
||||||
|
[`pkgs/data/misc/hackage/`](../../../pkgs/data/misc/hackage/), or the
|
||||||
|
pinned Stackage Nightly versions on the release branches (like
|
||||||
|
`release-21.05`).
|
||||||
|
|
||||||
|
This means that the
|
||||||
|
[`update-hackage.sh`](../../../maintainers/scripts/haskell/update-hackage.sh)
|
||||||
|
and
|
||||||
|
[`update-stackage.sh`](../../../maintainers/scripts/haskell/update-stackage.sh)
|
||||||
|
scripts should never be used on the release branches.
|
||||||
|
|
||||||
|
However, changing other files in `./.` and regenerating the package set is encouraged.
|
||||||
|
This can be done with
|
||||||
|
[`regenerate-hackage-packages.sh`](../../../maintainers/scripts/haskell/regenerate-hackage-packages.sh)
|
||||||
|
as described above.
|
||||||
|
|
||||||
|
- The Haskell team members generally hang out in the Matrix room
|
||||||
|
[#haskell:nixos.org](https://matrix.to/#/#haskell:nixos.org).
|
||||||
|
|
||||||
|
- This is a checklist for things that need to happen when a new
|
||||||
|
member is added to the Nixpkgs Haskell team.
|
||||||
|
|
||||||
|
1. Add the person to the
|
||||||
|
[@NixOS/haskell](https://github.com/orgs/NixOS/teams/haskell)
|
||||||
|
team. You may need to ask someone in the NixOS organization
|
||||||
|
to do this, like [@domenkozar](https://github.com/domenkozar).
|
||||||
|
This gives the new member access to the GitHub repos like
|
||||||
|
[cabal2nix](https://github.com/NixOS/cabal2nix).
|
||||||
|
|
||||||
|
1. Add the person as a maintainer for the following packages
|
||||||
|
on Hackage:
|
||||||
|
- https://hackage.haskell.org/package/cabal2nix
|
||||||
|
- https://hackage.haskell.org/package/distribution-nixpkgs
|
||||||
|
- https://hackage.haskell.org/package/hackage-db
|
||||||
|
- https://hackage.haskell.org/package/jailbreak-cabal
|
||||||
|
- https://hackage.haskell.org/package/language-nix
|
||||||
|
|
||||||
|
1. Add the person to the `haskell` team in
|
||||||
|
[`maintainers/team-list.nix`](../../../maintainers/team-list.nix).
|
||||||
|
This team is responsible for some important packages in
|
||||||
|
[release-haskell.nix](../../top-level/release-haskell.nix).
|
||||||
|
|
||||||
|
1. Update the
|
||||||
|
[Nextcloud Calendar](https://cloud.maralorn.de/apps/calendar/p/H6migHmKX7xHoTFa)
|
||||||
|
and work the new member into the `haskell-updates` rotation.
|
||||||
|
|
||||||
|
1. Optionally, have the new member add themselves to the Haskell
|
||||||
|
section in [`CODEOWNERS`](../../../.github/CODEOWNERS). This
|
||||||
|
will cause them to get pinged on most Haskell-related PRs.
|
|
@ -0,0 +1,41 @@
|
||||||
|
# This file defines cabal2nix-unstable, used by maintainers/scripts/haskell/regenerate-hackage-packages.sh.
|
||||||
|
{ mkDerivation, aeson, ansi-wl-pprint, base, bytestring, Cabal
|
||||||
|
, containers, deepseq, directory, distribution-nixpkgs, fetchzip
|
||||||
|
, filepath, hackage-db, hopenssl, hpack, language-nix, lens, lib
|
||||||
|
, monad-par, monad-par-extras, mtl, optparse-applicative, pretty
|
||||||
|
, process, split, tasty, tasty-golden, text, time, transformers
|
||||||
|
, yaml
|
||||||
|
}:
|
||||||
|
mkDerivation {
|
||||||
|
pname = "cabal2nix";
|
||||||
|
version = "unstable-2024-04-21";
|
||||||
|
src = fetchzip {
|
||||||
|
url = "https://github.com/NixOS/cabal2nix/archive/f8e6bf749a158a5ed866c57deee907b5f16c38e5.tar.gz";
|
||||||
|
sha256 = "0c73mvza65iy46fv8c8cadsy7klk4jzmimm1mfdavvm8i2cr5476";
|
||||||
|
};
|
||||||
|
postUnpack = "sourceRoot+=/cabal2nix; echo source root reset to $sourceRoot";
|
||||||
|
isLibrary = true;
|
||||||
|
isExecutable = true;
|
||||||
|
libraryHaskellDepends = [
|
||||||
|
aeson ansi-wl-pprint base bytestring Cabal containers deepseq
|
||||||
|
directory distribution-nixpkgs filepath hackage-db hopenssl hpack
|
||||||
|
language-nix lens optparse-applicative pretty process split text
|
||||||
|
time transformers yaml
|
||||||
|
];
|
||||||
|
executableHaskellDepends = [
|
||||||
|
aeson base bytestring Cabal containers directory
|
||||||
|
distribution-nixpkgs filepath hopenssl language-nix lens monad-par
|
||||||
|
monad-par-extras mtl optparse-applicative pretty
|
||||||
|
];
|
||||||
|
testHaskellDepends = [
|
||||||
|
base Cabal containers directory filepath language-nix lens pretty
|
||||||
|
process tasty tasty-golden
|
||||||
|
];
|
||||||
|
preCheck = ''
|
||||||
|
export PATH="$PWD/dist/build/cabal2nix:$PATH"
|
||||||
|
export HOME="$TMPDIR/home"
|
||||||
|
'';
|
||||||
|
homepage = "https://github.com/nixos/cabal2nix#readme";
|
||||||
|
description = "Convert Cabal files into Nix build instructions";
|
||||||
|
license = lib.licenses.bsd3;
|
||||||
|
}
|
117
pkgs/by-name/ha/haskell/haskell-modules/configuration-arm.nix
Normal file
117
pkgs/by-name/ha/haskell/haskell-modules/configuration-arm.nix
Normal file
|
@ -0,0 +1,117 @@
|
||||||
|
# ARM-SPECIFIC OVERRIDES FOR THE HASKELL PACKAGE SET IN NIXPKGS
|
||||||
|
#
|
||||||
|
# This extension is applied to all haskell package sets in nixpkgs if
|
||||||
|
# `stdenv.hostPlatform.isAarch` to apply arm specific workarounds or
|
||||||
|
# fixes.
|
||||||
|
#
|
||||||
|
# The file is split into three parts:
|
||||||
|
#
|
||||||
|
# * Overrides that are applied for all arm platforms
|
||||||
|
# * Overrides for aarch32 platforms
|
||||||
|
# * Overrides for aarch64 platforms
|
||||||
|
#
|
||||||
|
# This may be extended in the future to also include compiler-
|
||||||
|
# specific sections as compiler and linker related bugs may
|
||||||
|
# get fixed subsequently.
|
||||||
|
#
|
||||||
|
# When adding new overrides, try to research which section they
|
||||||
|
# belong into. Most likely we'll be favouring aarch64 overrides
|
||||||
|
# in practice since that is the only platform we can test on
|
||||||
|
# Hydra. Also take care to group overrides by the issue they
|
||||||
|
# solve, so refactors and updates to this file are less tedious.
|
||||||
|
{ pkgs, haskellLib }:
|
||||||
|
|
||||||
|
let
|
||||||
|
inherit (pkgs) lib;
|
||||||
|
in
|
||||||
|
|
||||||
|
with haskellLib;
|
||||||
|
|
||||||
|
self: super: {
|
||||||
|
# COMMON ARM OVERRIDES
|
||||||
|
|
||||||
|
# moved here from configuration-common.nix, no reason given.
|
||||||
|
servant-docs = dontCheck super.servant-docs;
|
||||||
|
swagger2 = dontHaddock (dontCheck super.swagger2);
|
||||||
|
|
||||||
|
# Similar to https://ghc.haskell.org/trac/ghc/ticket/13062
|
||||||
|
happy = dontCheck super.happy;
|
||||||
|
happy_1_19_12 = doDistribute (dontCheck super.happy_1_19_12);
|
||||||
|
|
||||||
|
# add arm specific library
|
||||||
|
wiringPi = overrideCabal ({librarySystemDepends ? [], ...}: {
|
||||||
|
librarySystemDepends = librarySystemDepends ++ [pkgs.wiringpi];
|
||||||
|
}) super.wiringPi;
|
||||||
|
|
||||||
|
} // lib.optionalAttrs pkgs.stdenv.hostPlatform.isAarch64 {
|
||||||
|
# AARCH64-SPECIFIC OVERRIDES
|
||||||
|
|
||||||
|
# Corrupted store path https://github.com/NixOS/nixpkgs/pull/272097#issuecomment-1848414265
|
||||||
|
cachix = triggerRebuild 1 super.cachix;
|
||||||
|
|
||||||
|
# Doctests fail on aarch64 due to a GHCi linking bug
|
||||||
|
# https://gitlab.haskell.org/ghc/ghc/-/issues/15275#note_295437
|
||||||
|
# TODO: figure out if needed on aarch32 as well
|
||||||
|
BNFC = dontCheck super.BNFC;
|
||||||
|
C-structs = dontCheck super.C-structs;
|
||||||
|
Chart-tests = dontCheck super.Chart-tests;
|
||||||
|
Jikka = dontCheck super.Jikka;
|
||||||
|
accelerate = dontCheck super.accelerate;
|
||||||
|
ad = dontCheck super.ad;
|
||||||
|
autoapply = dontCheck super.autoapply;
|
||||||
|
construct = dontCheck super.construct;
|
||||||
|
exact-real = dontCheck super.exact-real;
|
||||||
|
flight-kml = dontCheck super.flight-kml;
|
||||||
|
focuslist = dontCheck super.focuslist;
|
||||||
|
grammatical-parsers = dontCheck super.grammatical-parsers;
|
||||||
|
greskell = dontCheck super.greskell;
|
||||||
|
groupBy = dontCheck super.groupBy;
|
||||||
|
haskell-time-range = dontCheck super.haskell-time-range;
|
||||||
|
headroom = dontCheck super.headroom;
|
||||||
|
hgeometry = dontCheck super.hgeometry;
|
||||||
|
hhp = dontCheck super.hhp;
|
||||||
|
hsakamai = dontCheck super.hsakamai;
|
||||||
|
hsemail-ns = dontCheck super.hsemail-ns;
|
||||||
|
html-validator-cli = dontCheck super.html-validator-cli;
|
||||||
|
hw-fingertree-strict = dontCheck super.hw-fingertree-strict;
|
||||||
|
hw-packed-vector = dontCheck super.hw-packed-vector;
|
||||||
|
hw-prim = dontCheck super.hw-prim;
|
||||||
|
hw-xml = dontCheck super.hw-xml;
|
||||||
|
language-nix = dontCheck super.language-nix;
|
||||||
|
lens-regex = dontCheck super.lens-regex;
|
||||||
|
meep = dontCheck super.meep;
|
||||||
|
openapi3 = dontCheck super.openapi3;
|
||||||
|
orbits = dontCheck super.orbits;
|
||||||
|
ranged-list = dontCheck super.ranged-list;
|
||||||
|
rank2classes = dontCheck super.rank2classes;
|
||||||
|
schedule = dontCheck super.schedule;
|
||||||
|
static = dontCheck super.static;
|
||||||
|
strict-writer = dontCheck super.strict-writer;
|
||||||
|
termonad = dontCheck super.termonad;
|
||||||
|
trifecta = dontCheck super.trifecta;
|
||||||
|
twiml = dontCheck super.twiml;
|
||||||
|
twitter-conduit = dontCheck super.twitter-conduit;
|
||||||
|
validationt = dontCheck super.validationt;
|
||||||
|
vgrep = dontCheck super.vgrep;
|
||||||
|
vinyl = dontCheck super.vinyl;
|
||||||
|
vulkan-utils = dontCheck super.vulkan-utils;
|
||||||
|
xml-html-qq = dontCheck super.xml-html-qq;
|
||||||
|
yaml-combinators = dontCheck super.yaml-combinators;
|
||||||
|
yesod-paginator = dontCheck super.yesod-paginator;
|
||||||
|
|
||||||
|
# https://github.com/ekmett/half/issues/35
|
||||||
|
half = dontCheck super.half;
|
||||||
|
|
||||||
|
# We disable profiling on aarch64, so tests naturally fail
|
||||||
|
ghc-prof = dontCheck super.ghc-prof;
|
||||||
|
|
||||||
|
# Similar RTS issue in test suite:
|
||||||
|
# rts/linker/elf_reloc_aarch64.c:98: encodeAddendAarch64: Assertion `isInt64(21+12, addend)' failed.
|
||||||
|
# These still fail sporadically on ghc 9.2
|
||||||
|
} // lib.optionalAttrs pkgs.stdenv.hostPlatform.isAarch32 {
|
||||||
|
# AARCH32-SPECIFIC OVERRIDES
|
||||||
|
|
||||||
|
# KAT/ECB/D2 test segfaults on armv7l
|
||||||
|
# https://github.com/haskell-crypto/cryptonite/issues/367
|
||||||
|
cryptonite = dontCheck super.cryptonite;
|
||||||
|
}
|
3050
pkgs/by-name/ha/haskell/haskell-modules/configuration-common.nix
Normal file
3050
pkgs/by-name/ha/haskell/haskell-modules/configuration-common.nix
Normal file
File diff suppressed because it is too large
Load diff
357
pkgs/by-name/ha/haskell/haskell-modules/configuration-darwin.nix
Normal file
357
pkgs/by-name/ha/haskell/haskell-modules/configuration-darwin.nix
Normal file
|
@ -0,0 +1,357 @@
|
||||||
|
# DARWIN-SPECIFIC OVERRIDES FOR THE HASKELL PACKAGE SET IN NIXPKGS
|
||||||
|
|
||||||
|
{ pkgs, haskellLib }:
|
||||||
|
|
||||||
|
let
|
||||||
|
inherit (pkgs) lib darwin;
|
||||||
|
in
|
||||||
|
|
||||||
|
with haskellLib;
|
||||||
|
|
||||||
|
self: super: ({
|
||||||
|
|
||||||
|
# the tests for shell-conduit on Darwin illegitimatey assume non-GNU echo
|
||||||
|
# see: https://github.com/psibi/shell-conduit/issues/12
|
||||||
|
shell-conduit = dontCheck super.shell-conduit;
|
||||||
|
|
||||||
|
conduit-extra = super.conduit-extra.overrideAttrs (drv: {
|
||||||
|
__darwinAllowLocalNetworking = true;
|
||||||
|
});
|
||||||
|
|
||||||
|
streaming-commons = super.streaming-commons.overrideAttrs (_: {
|
||||||
|
__darwinAllowLocalNetworking = true;
|
||||||
|
});
|
||||||
|
|
||||||
|
halive = addBuildDepend darwin.apple_sdk.frameworks.AppKit super.halive;
|
||||||
|
|
||||||
|
# Hakyll's tests are broken on Darwin (3 failures); and they require util-linux
|
||||||
|
hakyll = overrideCabal {
|
||||||
|
testToolDepends = [];
|
||||||
|
doCheck = false;
|
||||||
|
} super.hakyll;
|
||||||
|
|
||||||
|
barbly = addBuildDepend darwin.apple_sdk.frameworks.AppKit super.barbly;
|
||||||
|
|
||||||
|
double-conversion = addExtraLibrary pkgs.libcxx super.double-conversion;
|
||||||
|
|
||||||
|
streamly = addBuildDepend darwin.apple_sdk.frameworks.Cocoa super.streamly;
|
||||||
|
|
||||||
|
apecs-physics = addPkgconfigDepends [
|
||||||
|
darwin.apple_sdk.frameworks.ApplicationServices
|
||||||
|
] super.apecs-physics;
|
||||||
|
|
||||||
|
# Framework deps are hidden behind a flag
|
||||||
|
hmidi = addExtraLibraries [
|
||||||
|
darwin.apple_sdk.frameworks.CoreFoundation
|
||||||
|
darwin.apple_sdk.frameworks.CoreAudio
|
||||||
|
darwin.apple_sdk.frameworks.CoreMIDI
|
||||||
|
] super.hmidi;
|
||||||
|
|
||||||
|
# "erf table" test fails on Darwin
|
||||||
|
# https://github.com/bos/math-functions/issues/63
|
||||||
|
math-functions = dontCheck super.math-functions;
|
||||||
|
|
||||||
|
# darwin doesn't have sub-second resolution
|
||||||
|
# https://github.com/hspec/mockery/issues/11
|
||||||
|
mockery = overrideCabal (drv: {
|
||||||
|
preCheck = ''
|
||||||
|
export TRAVIS=true
|
||||||
|
'' + (drv.preCheck or "");
|
||||||
|
}) super.mockery;
|
||||||
|
|
||||||
|
# https://github.com/ndmitchell/shake/issues/206
|
||||||
|
shake = dontCheck super.shake;
|
||||||
|
|
||||||
|
filecache = dontCheck super.filecache;
|
||||||
|
|
||||||
|
# gtk/gtk3 needs to be told on Darwin to use the Quartz
|
||||||
|
# rather than X11 backend (see eg https://github.com/gtk2hs/gtk2hs/issues/249).
|
||||||
|
gtk3 = appendConfigureFlag "-f have-quartz-gtk" super.gtk3;
|
||||||
|
gtk = appendConfigureFlag "-f have-quartz-gtk" super.gtk;
|
||||||
|
|
||||||
|
OpenAL = addExtraLibrary darwin.apple_sdk.frameworks.OpenAL super.OpenAL;
|
||||||
|
|
||||||
|
al = overrideCabal (drv: {
|
||||||
|
libraryFrameworkDepends = [
|
||||||
|
darwin.apple_sdk.frameworks.OpenAL
|
||||||
|
] ++ (drv.libraryFrameworkDepends or []);
|
||||||
|
}) super.al;
|
||||||
|
|
||||||
|
proteaaudio = addExtraLibrary darwin.apple_sdk.frameworks.AudioToolbox super.proteaaudio;
|
||||||
|
|
||||||
|
# the system-fileio tests use canonicalizePath, which fails in the sandbox
|
||||||
|
system-fileio = dontCheck super.system-fileio;
|
||||||
|
|
||||||
|
git-annex = overrideCabal (drv: {
|
||||||
|
# We can't use testFlags since git-annex side steps the Cabal test mechanism
|
||||||
|
preCheck = drv.preCheck or "" + ''
|
||||||
|
checkFlagsArray+=(
|
||||||
|
# The addurl test cases require security(1) to be in PATH which we can't
|
||||||
|
# provide from nixpkgs to my (@sternenseemann) knowledge.
|
||||||
|
"-p" "!/addurl/"
|
||||||
|
)
|
||||||
|
'';
|
||||||
|
}) super.git-annex;
|
||||||
|
|
||||||
|
# Prevents needing to add `security_tool` as a run-time dependency for
|
||||||
|
# everything using x509-system to give access to the `security` executable.
|
||||||
|
#
|
||||||
|
# darwin.security_tool is broken in Mojave (#45042)
|
||||||
|
#
|
||||||
|
# We will use the system provided security for now.
|
||||||
|
# Beware this WILL break in sandboxes!
|
||||||
|
#
|
||||||
|
# TODO(matthewbauer): If someone really needs this to work in sandboxes,
|
||||||
|
# I think we can add a propagatedImpureHost dep here, but I’m hoping to
|
||||||
|
# get a proper fix available soonish.
|
||||||
|
x509-system = overrideCabal (drv:
|
||||||
|
lib.optionalAttrs (!pkgs.stdenv.cc.nativeLibc) {
|
||||||
|
postPatch = ''
|
||||||
|
substituteInPlace System/X509/MacOS.hs --replace security /usr/bin/security
|
||||||
|
'' + (drv.postPatch or "");
|
||||||
|
}) super.x509-system;
|
||||||
|
|
||||||
|
# https://github.com/haskell-foundation/foundation/pull/412
|
||||||
|
foundation = dontCheck super.foundation;
|
||||||
|
|
||||||
|
llvm-hs = overrideCabal (oldAttrs: {
|
||||||
|
# One test fails on darwin.
|
||||||
|
doCheck = false;
|
||||||
|
# llvm-hs's Setup.hs file tries to add the lib/ directory from LLVM8 to
|
||||||
|
# the DYLD_LIBRARY_PATH environment variable. This messes up clang
|
||||||
|
# when called from GHC, probably because clang is version 7, but we are
|
||||||
|
# using LLVM8.
|
||||||
|
preCompileBuildDriver = ''
|
||||||
|
substituteInPlace Setup.hs --replace "addToLdLibraryPath libDir" "pure ()"
|
||||||
|
'' + (oldAttrs.preCompileBuildDriver or "");
|
||||||
|
}) super.llvm-hs;
|
||||||
|
|
||||||
|
yesod-bin = addBuildDepend darwin.apple_sdk.frameworks.Cocoa super.yesod-bin;
|
||||||
|
|
||||||
|
yesod-core = super.yesod-core.overrideAttrs (drv: {
|
||||||
|
# Allow access to local networking when the Darwin sandbox is enabled, so yesod-core can
|
||||||
|
# run tests that access localhost.
|
||||||
|
__darwinAllowLocalNetworking = true;
|
||||||
|
});
|
||||||
|
|
||||||
|
hidapi =
|
||||||
|
addExtraLibraries [
|
||||||
|
darwin.apple_sdk.frameworks.AppKit
|
||||||
|
darwin.apple_sdk.frameworks.IOKit
|
||||||
|
darwin.apple_sdk.frameworks.CoreFoundation
|
||||||
|
]
|
||||||
|
(super.hidapi.override { systemd = null; });
|
||||||
|
|
||||||
|
hmatrix = addBuildDepend darwin.apple_sdk.frameworks.Accelerate super.hmatrix;
|
||||||
|
|
||||||
|
blas-hs = overrideCabal (drv: {
|
||||||
|
libraryFrameworkDepends = [
|
||||||
|
darwin.apple_sdk.frameworks.Accelerate
|
||||||
|
] ++ (drv.libraryFrameworkDepends or []);
|
||||||
|
}) super.blas-hs;
|
||||||
|
|
||||||
|
# Ensure the necessary frameworks are propagatedBuildInputs on darwin
|
||||||
|
OpenGLRaw = overrideCabal (drv: {
|
||||||
|
librarySystemDepends = [];
|
||||||
|
libraryHaskellDepends = drv.libraryHaskellDepends ++ [
|
||||||
|
darwin.apple_sdk.frameworks.OpenGL
|
||||||
|
];
|
||||||
|
preConfigure = ''
|
||||||
|
frameworkPaths=($(for i in $nativeBuildInputs; do if [ -d "$i"/Library/Frameworks ]; then echo "-F$i/Library/Frameworks"; fi done))
|
||||||
|
frameworkPaths=$(IFS=, ; echo "''${frameworkPaths[@]}")
|
||||||
|
configureFlags+=$(if [ -n "$frameworkPaths" ]; then echo -n "--ghc-options=-optl=$frameworkPaths"; fi)
|
||||||
|
'' + (drv.preConfigure or "");
|
||||||
|
}) super.OpenGLRaw;
|
||||||
|
GLURaw = overrideCabal (drv: {
|
||||||
|
librarySystemDepends = [];
|
||||||
|
libraryHaskellDepends = drv.libraryHaskellDepends ++ [
|
||||||
|
darwin.apple_sdk.frameworks.OpenGL
|
||||||
|
];
|
||||||
|
}) super.GLURaw;
|
||||||
|
bindings-GLFW = overrideCabal (drv: {
|
||||||
|
librarySystemDepends = [];
|
||||||
|
libraryHaskellDepends = drv.libraryHaskellDepends ++ [
|
||||||
|
darwin.apple_sdk.frameworks.AGL
|
||||||
|
darwin.apple_sdk.frameworks.Cocoa
|
||||||
|
darwin.apple_sdk.frameworks.OpenGL
|
||||||
|
darwin.apple_sdk.frameworks.IOKit
|
||||||
|
darwin.apple_sdk.frameworks.Kernel
|
||||||
|
darwin.apple_sdk.frameworks.CoreVideo
|
||||||
|
darwin.CF
|
||||||
|
];
|
||||||
|
}) super.bindings-GLFW;
|
||||||
|
OpenCL = overrideCabal (drv: {
|
||||||
|
librarySystemDepends = [];
|
||||||
|
libraryHaskellDepends = drv.libraryHaskellDepends ++ [
|
||||||
|
darwin.apple_sdk.frameworks.OpenCL
|
||||||
|
];
|
||||||
|
}) super.OpenCL;
|
||||||
|
|
||||||
|
# cabal2nix likes to generate dependencies on hinotify when hfsevents is
|
||||||
|
# really required on darwin: https://github.com/NixOS/cabal2nix/issues/146.
|
||||||
|
hinotify = self.hfsevents;
|
||||||
|
|
||||||
|
# FSEvents API is very buggy and tests are unreliable. See
|
||||||
|
# http://openradar.appspot.com/10207999 and similar issues.
|
||||||
|
fsnotify = addBuildDepend darwin.apple_sdk.frameworks.Cocoa
|
||||||
|
(dontCheck super.fsnotify);
|
||||||
|
|
||||||
|
FractalArt = overrideCabal (drv: {
|
||||||
|
librarySystemDepends = [
|
||||||
|
darwin.libobjc
|
||||||
|
darwin.apple_sdk.frameworks.AppKit
|
||||||
|
] ++ (drv.librarySystemDepends or []);
|
||||||
|
}) super.FractalArt;
|
||||||
|
|
||||||
|
arbtt = overrideCabal (drv: {
|
||||||
|
librarySystemDepends = [
|
||||||
|
darwin.apple_sdk.frameworks.Foundation
|
||||||
|
darwin.apple_sdk.frameworks.Carbon
|
||||||
|
darwin.apple_sdk.frameworks.IOKit
|
||||||
|
] ++ (drv.librarySystemDepends or []);
|
||||||
|
}) super.arbtt;
|
||||||
|
|
||||||
|
HTF = overrideCabal (drv: {
|
||||||
|
# GNU find is not prefixed in stdenv
|
||||||
|
postPatch = ''
|
||||||
|
substituteInPlace scripts/local-htfpp --replace "find=gfind" "find=find"
|
||||||
|
'' + (drv.postPatch or "");
|
||||||
|
}) super.HTF;
|
||||||
|
|
||||||
|
# conditional dependency via a cabal flag
|
||||||
|
cas-store = overrideCabal (drv: {
|
||||||
|
libraryHaskellDepends = [
|
||||||
|
self.kqueue
|
||||||
|
] ++ (drv.libraryHaskellDepends or []);
|
||||||
|
}) super.cas-store;
|
||||||
|
|
||||||
|
# We are lacking pure pgrep at the moment for tests to work
|
||||||
|
tmp-postgres = dontCheck super.tmp-postgres;
|
||||||
|
|
||||||
|
# On darwin librt doesn't exist and will fail to link against,
|
||||||
|
# however linking against it is also not necessary there
|
||||||
|
GLHUI = overrideCabal (drv: {
|
||||||
|
postPatch = ''
|
||||||
|
substituteInPlace GLHUI.cabal --replace " rt" ""
|
||||||
|
'' + (drv.postPatch or "");
|
||||||
|
}) super.GLHUI;
|
||||||
|
|
||||||
|
SDL-image = overrideCabal (drv: {
|
||||||
|
# Prevent darwin-specific configuration code path being taken
|
||||||
|
# which doesn't work with nixpkgs' SDL libraries
|
||||||
|
postPatch = ''
|
||||||
|
substituteInPlace configure --replace xDarwin noDarwinSpecialCasing
|
||||||
|
'' + (drv.postPatch or "");
|
||||||
|
patches = [
|
||||||
|
# Work around SDL_main.h redefining main to SDL_main
|
||||||
|
./patches/SDL-image-darwin-hsc.patch
|
||||||
|
];
|
||||||
|
}) super.SDL-image;
|
||||||
|
|
||||||
|
# Prevent darwin-specific configuration code path being taken which
|
||||||
|
# doesn't work with nixpkgs' SDL libraries
|
||||||
|
SDL-mixer = overrideCabal (drv: {
|
||||||
|
postPatch = ''
|
||||||
|
substituteInPlace configure --replace xDarwin noDarwinSpecialCasing
|
||||||
|
'' + (drv.postPatch or "");
|
||||||
|
}) super.SDL-mixer;
|
||||||
|
|
||||||
|
# Work around SDL_main.h redefining main to SDL_main
|
||||||
|
SDL-ttf = appendPatch ./patches/SDL-ttf-darwin-hsc.patch super.SDL-ttf;
|
||||||
|
|
||||||
|
# Disable a bunch of test suites that fail because of darwin's case insensitive
|
||||||
|
# file system: When a test suite has a test suite file that has the same name
|
||||||
|
# as a module in scope, but in different case (e. g. hedgehog.hs and Hedgehog
|
||||||
|
# in scope), GHC will complain that the file name and module name differ (in
|
||||||
|
# the example hedgehog.hs would be Main).
|
||||||
|
# These failures can easily be fixed by upstream by renaming files, so we
|
||||||
|
# should create issues for them.
|
||||||
|
# https://github.com/typeclasses/aws-cloudfront-signed-cookies/issues/2
|
||||||
|
aws-cloudfront-signed-cookies = dontCheck super.aws-cloudfront-signed-cookies;
|
||||||
|
|
||||||
|
# https://github.com/acid-state/acid-state/issues/133
|
||||||
|
acid-state = dontCheck super.acid-state;
|
||||||
|
|
||||||
|
# Otherwise impure gcc is used, which is Apple's weird wrapper
|
||||||
|
c2hsc = addTestToolDepends [ pkgs.gcc ] super.c2hsc;
|
||||||
|
|
||||||
|
http-client-tls = overrideCabal (drv: {
|
||||||
|
postPatch = ''
|
||||||
|
# This comment has been inserted, so the derivation hash changes, forcing
|
||||||
|
# a rebuild of this derivation which has succeeded to build on Hydra before,
|
||||||
|
# but apparently been corrupted, causing reverse dependencies to fail.
|
||||||
|
#
|
||||||
|
# This workaround can be removed upon the next darwin stdenv rebuild,
|
||||||
|
# presumably https://github.com/NixOS/nixpkgs/pull/152850 or the next
|
||||||
|
# full haskellPackages rebuild.
|
||||||
|
'' + drv.postPatch or "";
|
||||||
|
}) super.http-client-tls;
|
||||||
|
|
||||||
|
http2 = super.http2.overrideAttrs (drv: {
|
||||||
|
# Allow access to local networking when the Darwin sandbox is enabled, so http2 can run tests
|
||||||
|
# that access localhost.
|
||||||
|
__darwinAllowLocalNetworking = true;
|
||||||
|
});
|
||||||
|
|
||||||
|
foldl = overrideCabal (drv: {
|
||||||
|
postPatch = ''
|
||||||
|
# This comment has been inserted, so the derivation hash changes, forcing
|
||||||
|
# a rebuild of this derivation which has succeeded to build on Hydra before,
|
||||||
|
# but apparently been corrupted, causing reverse dependencies to fail.
|
||||||
|
#
|
||||||
|
# This workaround can be removed upon the next darwin stdenv rebuild,
|
||||||
|
# presumably https://github.com/NixOS/nixpkgs/pull/152850 or the next
|
||||||
|
# full haskellPackages rebuild.
|
||||||
|
'' + drv.postPatch or "";
|
||||||
|
}) super.foldl;
|
||||||
|
|
||||||
|
# https://hydra.nixos.org/build/230964714/nixlog/1
|
||||||
|
inline-c-cpp = appendPatch (pkgs.fetchpatch {
|
||||||
|
url = "https://github.com/fpco/inline-c/commit/e8dc553b13bb847409fdced649a6a863323cff8a.patch";
|
||||||
|
name = "revert-use-system-cxx-std-lib.patch";
|
||||||
|
sha256 = "sha256-ql1/+8bvmWexyCdFR0VS4M4cY2lD0Px/9dHYLqlKyNA=";
|
||||||
|
revert = true;
|
||||||
|
stripLen = 1;
|
||||||
|
}) super.inline-c-cpp;
|
||||||
|
|
||||||
|
# Tests fail on macOS https://github.com/mrkkrp/zip/issues/112
|
||||||
|
zip = dontCheck super.zip;
|
||||||
|
} // lib.optionalAttrs pkgs.stdenv.isAarch64 { # aarch64-darwin
|
||||||
|
|
||||||
|
# https://github.com/fpco/unliftio/issues/87
|
||||||
|
unliftio = dontCheck super.unliftio;
|
||||||
|
# This is the same issue as above; the rio tests call functions in unliftio
|
||||||
|
# that have issues as tracked in the GitHub issue above. Once the unliftio
|
||||||
|
# tests are fixed, we can remove this as well.
|
||||||
|
#
|
||||||
|
# We skip just the problematic tests by replacing 'it' with 'xit'.
|
||||||
|
rio = overrideCabal (drv: {
|
||||||
|
preConfigure = ''
|
||||||
|
sed -i 's/\bit /xit /g' test/RIO/FileSpec.hs
|
||||||
|
'';
|
||||||
|
}) super.rio;
|
||||||
|
|
||||||
|
# https://github.com/haskell-crypto/cryptonite/issues/360
|
||||||
|
cryptonite = appendPatch ./patches/cryptonite-remove-argon2.patch super.cryptonite;
|
||||||
|
|
||||||
|
# Build segfaults unless `fixity-th` is disabled.
|
||||||
|
# https://github.com/tweag/ormolu/issues/927
|
||||||
|
ormolu = overrideCabal (drv: {
|
||||||
|
libraryHaskellDepends = drv.libraryHaskellDepends ++ [ self.file-embed ];
|
||||||
|
}) (disableCabalFlag "fixity-th" super.ormolu);
|
||||||
|
fourmolu = overrideCabal (drv: {
|
||||||
|
libraryHaskellDepends = drv.libraryHaskellDepends ++ [ self.file-embed ];
|
||||||
|
}) (disableCabalFlag "fixity-th" super.fourmolu);
|
||||||
|
|
||||||
|
# https://github.com/NixOS/nixpkgs/issues/149692
|
||||||
|
Agda = disableCabalFlag "optimise-heavily" super.Agda;
|
||||||
|
|
||||||
|
} // lib.optionalAttrs pkgs.stdenv.isx86_64 { # x86_64-darwin
|
||||||
|
|
||||||
|
# tests appear to be failing to link or something:
|
||||||
|
# https://hydra.nixos.org/build/174540882/nixlog/9
|
||||||
|
regex-rure = dontCheck super.regex-rure;
|
||||||
|
# same
|
||||||
|
# https://hydra.nixos.org/build/174540882/nixlog/9
|
||||||
|
jacinda = dontCheck super.jacinda;
|
||||||
|
})
|
|
@ -0,0 +1,191 @@
|
||||||
|
{ pkgs, haskellLib }:
|
||||||
|
|
||||||
|
with haskellLib;
|
||||||
|
|
||||||
|
let
|
||||||
|
inherit (pkgs.stdenv.hostPlatform) isDarwin;
|
||||||
|
inherit (pkgs) lib;
|
||||||
|
in
|
||||||
|
|
||||||
|
self: super: {
|
||||||
|
|
||||||
|
# ghcjs does not use `llvmPackages` and exposes `null` attribute.
|
||||||
|
llvmPackages =
|
||||||
|
if self.ghc.llvmPackages != null
|
||||||
|
then pkgs.lib.dontRecurseIntoAttrs self.ghc.llvmPackages
|
||||||
|
else null;
|
||||||
|
|
||||||
|
# Disable GHC 8.10.x core libraries.
|
||||||
|
array = null;
|
||||||
|
base = null;
|
||||||
|
binary = null;
|
||||||
|
bytestring = null;
|
||||||
|
Cabal = null;
|
||||||
|
containers = null;
|
||||||
|
deepseq = null;
|
||||||
|
directory = null;
|
||||||
|
exceptions = null;
|
||||||
|
filepath = null;
|
||||||
|
ghc-boot = null;
|
||||||
|
ghc-boot-th = null;
|
||||||
|
ghc-compact = null;
|
||||||
|
ghc-heap = null;
|
||||||
|
ghc-prim = null;
|
||||||
|
ghci = null;
|
||||||
|
haskeline = null;
|
||||||
|
hpc = null;
|
||||||
|
integer-gmp = null;
|
||||||
|
libiserv = null;
|
||||||
|
mtl = null;
|
||||||
|
parsec = null;
|
||||||
|
pretty = null;
|
||||||
|
process = null;
|
||||||
|
rts = null;
|
||||||
|
stm = null;
|
||||||
|
template-haskell = null;
|
||||||
|
# GHC only builds terminfo if it is a native compiler
|
||||||
|
terminfo = if pkgs.stdenv.hostPlatform == pkgs.stdenv.buildPlatform then null else doDistribute self.terminfo_0_4_1_6;
|
||||||
|
text = null;
|
||||||
|
time = null;
|
||||||
|
transformers = null;
|
||||||
|
unix = null;
|
||||||
|
# GHC only bundles the xhtml library if haddock is enabled, check if this is
|
||||||
|
# still the case when updating: https://gitlab.haskell.org/ghc/ghc/-/blob/0198841877f6f04269d6050892b98b5c3807ce4c/ghc.mk#L463
|
||||||
|
xhtml = if self.ghc.hasHaddock or true then null else doDistribute self.xhtml_3000_3_0_0;
|
||||||
|
|
||||||
|
# Need the Cabal-syntax-3.6.0.0 fake package for Cabal < 3.8 to allow callPackage and the constraint solver to work
|
||||||
|
Cabal-syntax = self.Cabal-syntax_3_6_0_0;
|
||||||
|
# These core package only exist for GHC >= 9.4. The best we can do is feign
|
||||||
|
# their existence to callPackages, but their is no shim for lower GHC versions.
|
||||||
|
system-cxx-std-lib = null;
|
||||||
|
|
||||||
|
# For GHC < 9.4, some packages need data-array-byte as an extra dependency
|
||||||
|
# For GHC < 9.2, os-string is not required.
|
||||||
|
primitive = addBuildDepends [ self.data-array-byte ] super.primitive;
|
||||||
|
hashable = addBuildDepends [
|
||||||
|
self.data-array-byte
|
||||||
|
self.base-orphans
|
||||||
|
] (super.hashable.override {
|
||||||
|
os-string = null;
|
||||||
|
});
|
||||||
|
|
||||||
|
# Too strict lower bounds on base
|
||||||
|
primitive-addr = doJailbreak super.primitive-addr;
|
||||||
|
|
||||||
|
# Pick right versions for GHC-specific packages
|
||||||
|
ghc-api-compat = doDistribute (unmarkBroken self.ghc-api-compat_8_10_7);
|
||||||
|
|
||||||
|
# Needs to use ghc-lib due to incompatible GHC
|
||||||
|
ghc-tags = doDistribute (addBuildDepend self.ghc-lib self.ghc-tags_1_5);
|
||||||
|
|
||||||
|
# Jailbreak to fix the build.
|
||||||
|
base-noprelude = doJailbreak super.base-noprelude;
|
||||||
|
unliftio-core = doJailbreak super.unliftio-core;
|
||||||
|
|
||||||
|
# Jailbreaking because monoidal-containers hasn’t bumped it's base dependency for 8.10.
|
||||||
|
monoidal-containers = doJailbreak super.monoidal-containers;
|
||||||
|
|
||||||
|
# Jailbreak to fix the build.
|
||||||
|
brick = doJailbreak super.brick;
|
||||||
|
exact-pi = doJailbreak super.exact-pi;
|
||||||
|
serialise = doJailbreak super.serialise;
|
||||||
|
setlocale = doJailbreak super.setlocale;
|
||||||
|
shellmet = doJailbreak super.shellmet;
|
||||||
|
shower = doJailbreak super.shower;
|
||||||
|
|
||||||
|
# hnix 0.9.0 does not provide an executable for ghc < 8.10, so define completions here for now.
|
||||||
|
hnix = self.generateOptparseApplicativeCompletions [ "hnix" ]
|
||||||
|
(overrideCabal (drv: {
|
||||||
|
# executable is allowed for ghc >= 8.10 and needs repline
|
||||||
|
executableHaskellDepends = drv.executableToolDepends or [] ++ [ self.repline ];
|
||||||
|
}) super.hnix);
|
||||||
|
|
||||||
|
haskell-language-server = throw "haskell-language-server dropped support for ghc 8.10 in version 2.3.0.0 please use a newer ghc version or an older nixpkgs version";
|
||||||
|
|
||||||
|
ghc-lib-parser = doDistribute self.ghc-lib-parser_9_2_8_20230729;
|
||||||
|
ghc-lib-parser-ex = doDistribute self.ghc-lib-parser-ex_9_2_1_1;
|
||||||
|
ghc-lib = doDistribute self.ghc-lib_9_2_8_20230729;
|
||||||
|
|
||||||
|
path-io = doJailbreak super.path-io;
|
||||||
|
|
||||||
|
hlint = self.hlint_3_4_1;
|
||||||
|
|
||||||
|
mime-string = disableOptimization super.mime-string;
|
||||||
|
|
||||||
|
# weeder 2.3.* no longer supports GHC 8.10
|
||||||
|
weeder = doDistribute (doJailbreak self.weeder_2_2_0);
|
||||||
|
# Unnecessarily strict upper bound on lens
|
||||||
|
weeder_2_2_0 = doJailbreak (super.weeder_2_2_0.override {
|
||||||
|
# weeder < 2.6 only supports algebraic-graphs < 0.7
|
||||||
|
# We no longer have matching test deps for algebraic-graphs 0.6.1 in the set
|
||||||
|
algebraic-graphs = dontCheck self.algebraic-graphs_0_6_1;
|
||||||
|
});
|
||||||
|
|
||||||
|
# Overly-strict bounds introducted by a revision in version 0.3.2.
|
||||||
|
text-metrics = doJailbreak super.text-metrics;
|
||||||
|
|
||||||
|
# Doesn't build with 9.0, see https://github.com/yi-editor/yi/issues/1125
|
||||||
|
yi-core = doDistribute (markUnbroken super.yi-core);
|
||||||
|
|
||||||
|
# Temporarily disabled blaze-textual for GHC >= 9.0 causing hackage2nix ignoring it
|
||||||
|
# https://github.com/paul-rouse/mysql-simple/blob/872604f87044ff6d1a240d9819a16c2bdf4ed8f5/Database/MySQL/Internal/Blaze.hs#L4-L10
|
||||||
|
mysql-simple = addBuildDepends [
|
||||||
|
self.blaze-textual
|
||||||
|
] super.mysql-simple;
|
||||||
|
|
||||||
|
taffybar = markUnbroken (doDistribute super.taffybar);
|
||||||
|
|
||||||
|
# https://github.com/fpco/inline-c/issues/127 (recommend to upgrade to Nixpkgs GHC >=9.0)
|
||||||
|
inline-c-cpp = (if isDarwin then dontCheck else x: x) super.inline-c-cpp;
|
||||||
|
|
||||||
|
# Depends on OneTuple for GHC < 9.0
|
||||||
|
universe-base = addBuildDepends [ self.OneTuple ] super.universe-base;
|
||||||
|
|
||||||
|
# Not possible to build in the main GHC 9.0 package set
|
||||||
|
# https://github.com/awakesecurity/spectacle/issues/49
|
||||||
|
spectacle = doDistribute (markUnbroken super.spectacle);
|
||||||
|
|
||||||
|
# doctest-parallel dependency requires newer Cabal
|
||||||
|
regex-tdfa = dontCheck super.regex-tdfa;
|
||||||
|
|
||||||
|
# Unnecessarily strict lower bound on base
|
||||||
|
# https://github.com/mrkkrp/megaparsec/pull/485#issuecomment-1250051823
|
||||||
|
megaparsec = doJailbreak super.megaparsec;
|
||||||
|
|
||||||
|
retrie = dontCheck self.retrie_1_1_0_0;
|
||||||
|
|
||||||
|
# Later versions only support GHC >= 9.2
|
||||||
|
ghc-exactprint = self.ghc-exactprint_0_6_4;
|
||||||
|
|
||||||
|
apply-refact = self.apply-refact_0_9_3_0;
|
||||||
|
|
||||||
|
# Needs OneTuple for ghc < 9.2
|
||||||
|
binary-orphans = addBuildDepends [ self.OneTuple ] super.binary-orphans;
|
||||||
|
|
||||||
|
# Requires GHC < 9.4
|
||||||
|
ghc-source-gen = doDistribute (unmarkBroken super.ghc-source-gen);
|
||||||
|
|
||||||
|
# No instance for (Show B.Builder) arising from a use of ‘print’
|
||||||
|
http-types = dontCheck super.http-types;
|
||||||
|
|
||||||
|
# Packages which need compat library for GHC < 9.6
|
||||||
|
inherit
|
||||||
|
(lib.mapAttrs
|
||||||
|
(_: addBuildDepends [ self.foldable1-classes-compat ])
|
||||||
|
super)
|
||||||
|
indexed-traversable
|
||||||
|
these
|
||||||
|
;
|
||||||
|
base-compat-batteries = addBuildDepends [
|
||||||
|
self.foldable1-classes-compat
|
||||||
|
self.OneTuple
|
||||||
|
] super.base-compat-batteries;
|
||||||
|
|
||||||
|
# OneTuple needs hashable (instead of ghc-prim) and foldable1-classes-compat for GHC < 9
|
||||||
|
OneTuple = addBuildDepends [
|
||||||
|
self.foldable1-classes-compat
|
||||||
|
self.base-orphans
|
||||||
|
] (super.OneTuple.override {
|
||||||
|
ghc-prim = self.hashable;
|
||||||
|
});
|
||||||
|
}
|
|
@ -0,0 +1,112 @@
|
||||||
|
{ pkgs, haskellLib }:
|
||||||
|
|
||||||
|
with haskellLib;
|
||||||
|
|
||||||
|
let
|
||||||
|
inherit (pkgs.stdenv.hostPlatform) isDarwin;
|
||||||
|
in
|
||||||
|
|
||||||
|
self: super: {
|
||||||
|
|
||||||
|
# Should be llvmPackages_6 which has been removed from nixpkgs
|
||||||
|
llvmPackages = null;
|
||||||
|
|
||||||
|
# Disable GHC 8.6.x core libraries.
|
||||||
|
array = null;
|
||||||
|
base = null;
|
||||||
|
binary = null;
|
||||||
|
bytestring = null;
|
||||||
|
Cabal = null;
|
||||||
|
containers = null;
|
||||||
|
deepseq = null;
|
||||||
|
directory = null;
|
||||||
|
filepath = null;
|
||||||
|
ghc-boot = null;
|
||||||
|
ghc-boot-th = null;
|
||||||
|
ghc-compact = null;
|
||||||
|
ghc-heap = null;
|
||||||
|
ghc-prim = null;
|
||||||
|
ghci = null;
|
||||||
|
haskeline = null;
|
||||||
|
hpc = null;
|
||||||
|
integer-gmp = null;
|
||||||
|
libiserv = null;
|
||||||
|
mtl = null;
|
||||||
|
parsec = null;
|
||||||
|
pretty = null;
|
||||||
|
process = null;
|
||||||
|
rts = null;
|
||||||
|
stm = null;
|
||||||
|
template-haskell = null;
|
||||||
|
# GHC only builds terminfo if it is a native compiler
|
||||||
|
terminfo = if pkgs.stdenv.hostPlatform == pkgs.stdenv.buildPlatform then null else doDistribute self.terminfo_0_4_1_6;
|
||||||
|
text = null;
|
||||||
|
time = null;
|
||||||
|
transformers = null;
|
||||||
|
unix = null;
|
||||||
|
# GHC only bundles the xhtml library if haddock is enabled, check if this is
|
||||||
|
# still the case when updating: https://gitlab.haskell.org/ghc/ghc/-/blob/0198841877f6f04269d6050892b98b5c3807ce4c/ghc.mk#L463
|
||||||
|
xhtml = if self.ghc.hasHaddock or true then null else doDistribute self.xhtml_3000_3_0_0;
|
||||||
|
|
||||||
|
# Need the Cabal-syntax-3.6.0.0 fake package for Cabal < 3.8 to allow callPackage and the constraint solver to work
|
||||||
|
Cabal-syntax = self.Cabal-syntax_3_6_0_0;
|
||||||
|
# These core package only exist for GHC >= 9.4. The best we can do is feign
|
||||||
|
# their existence to callPackages, but their is no shim for lower GHC versions.
|
||||||
|
system-cxx-std-lib = null;
|
||||||
|
|
||||||
|
# Needs Cabal 3.0.x.
|
||||||
|
jailbreak-cabal = super.jailbreak-cabal.overrideScope (cself: _: { Cabal = cself.Cabal_3_2_1_0; });
|
||||||
|
|
||||||
|
# https://github.com/tibbe/unordered-containers/issues/214
|
||||||
|
unordered-containers = dontCheck super.unordered-containers;
|
||||||
|
|
||||||
|
# Test suite does not compile.
|
||||||
|
data-clist = doJailbreak super.data-clist; # won't cope with QuickCheck 2.12.x
|
||||||
|
dates = doJailbreak super.dates; # base >=4.9 && <4.12
|
||||||
|
Diff = dontCheck super.Diff;
|
||||||
|
equivalence = dontCheck super.equivalence; # test suite doesn't compile https://github.com/pa-ba/equivalence/issues/5
|
||||||
|
HaTeX = doJailbreak super.HaTeX; # containers >=0.4 && <0.6 is too tight; https://github.com/Daniel-Diaz/HaTeX/issues/126
|
||||||
|
hpc-coveralls = doJailbreak super.hpc-coveralls; # https://github.com/guillaume-nargeot/hpc-coveralls/issues/82
|
||||||
|
http-api-data = doJailbreak super.http-api-data;
|
||||||
|
persistent-sqlite = dontCheck super.persistent-sqlite;
|
||||||
|
system-fileio = dontCheck super.system-fileio; # avoid dependency on broken "patience"
|
||||||
|
unicode-transforms = dontCheck super.unicode-transforms;
|
||||||
|
wl-pprint-extras = doJailbreak super.wl-pprint-extras; # containers >=0.4 && <0.6 is too tight; https://github.com/ekmett/wl-pprint-extras/issues/17
|
||||||
|
RSA = dontCheck super.RSA; # https://github.com/GaloisInc/RSA/issues/14
|
||||||
|
github = dontCheck super.github; # hspec upper bound exceeded; https://github.com/phadej/github/pull/341
|
||||||
|
binary-orphans = dontCheck super.binary-orphans; # tasty upper bound exceeded; https://github.com/phadej/binary-orphans/commit/8ce857226595dd520236ff4c51fa1a45d8387b33
|
||||||
|
rebase = doJailbreak super.rebase; # time ==1.9.* is too low
|
||||||
|
|
||||||
|
# https://github.com/jgm/skylighting/issues/55
|
||||||
|
skylighting-core = dontCheck super.skylighting-core;
|
||||||
|
|
||||||
|
# cabal2nix needs the latest version of Cabal, and the one
|
||||||
|
# hackage-db uses must match, so take the latest
|
||||||
|
cabal2nix = super.cabal2nix.overrideScope (self: super: { Cabal = self.Cabal_3_2_1_0; });
|
||||||
|
|
||||||
|
# cabal2spec needs a recent version of Cabal
|
||||||
|
cabal2spec = super.cabal2spec.overrideScope (self: super: { Cabal = self.Cabal_3_2_1_0; });
|
||||||
|
|
||||||
|
# https://github.com/pikajude/stylish-cabal/issues/12
|
||||||
|
stylish-cabal = doDistribute (markUnbroken (super.stylish-cabal.override { haddock-library = self.haddock-library_1_7_0; }));
|
||||||
|
haddock-library_1_7_0 = dontCheck super.haddock-library_1_7_0;
|
||||||
|
|
||||||
|
# ghc versions prior to 8.8.x needs additional dependency to compile successfully.
|
||||||
|
ghc-lib-parser-ex = addBuildDepend self.ghc-lib-parser super.ghc-lib-parser-ex;
|
||||||
|
|
||||||
|
# This became a core library in ghc 8.10., so we don’t have an "exception" attribute anymore.
|
||||||
|
exceptions = self.exceptions_0_10_7;
|
||||||
|
|
||||||
|
# vector 0.12.2 indroduced doctest checks that don’t work on older compilers
|
||||||
|
vector = dontCheck super.vector;
|
||||||
|
|
||||||
|
mmorph = super.mmorph_1_1_3;
|
||||||
|
|
||||||
|
# https://github.com/haskellari/time-compat/issues/23
|
||||||
|
time-compat = dontCheck super.time-compat;
|
||||||
|
|
||||||
|
mime-string = disableOptimization super.mime-string;
|
||||||
|
|
||||||
|
# https://github.com/fpco/inline-c/issues/127 (recommend to upgrade to Nixpkgs GHC >=9.0)
|
||||||
|
inline-c-cpp = (if isDarwin then dontCheck else x: x) super.inline-c-cpp;
|
||||||
|
}
|
|
@ -0,0 +1,162 @@
|
||||||
|
{ pkgs, haskellLib }:
|
||||||
|
|
||||||
|
with haskellLib;
|
||||||
|
|
||||||
|
let
|
||||||
|
inherit (pkgs.stdenv.hostPlatform) isDarwin;
|
||||||
|
inherit (pkgs) lib;
|
||||||
|
in
|
||||||
|
|
||||||
|
self: super: {
|
||||||
|
|
||||||
|
llvmPackages = pkgs.lib.dontRecurseIntoAttrs self.ghc.llvmPackages;
|
||||||
|
|
||||||
|
# Disable GHC 9.0.x core libraries.
|
||||||
|
array = null;
|
||||||
|
base = null;
|
||||||
|
binary = null;
|
||||||
|
bytestring = null;
|
||||||
|
Cabal = null;
|
||||||
|
containers = null;
|
||||||
|
deepseq = null;
|
||||||
|
directory = null;
|
||||||
|
exceptions = null;
|
||||||
|
filepath = null;
|
||||||
|
ghc-bignum = null;
|
||||||
|
ghc-boot = null;
|
||||||
|
ghc-boot-th = null;
|
||||||
|
ghc-compact = null;
|
||||||
|
ghc-heap = null;
|
||||||
|
ghc-prim = null;
|
||||||
|
ghci = null;
|
||||||
|
haskeline = null;
|
||||||
|
hpc = null;
|
||||||
|
integer-gmp = null;
|
||||||
|
libiserv = null;
|
||||||
|
mtl = null;
|
||||||
|
parsec = null;
|
||||||
|
pretty = null;
|
||||||
|
process = null;
|
||||||
|
rts = null;
|
||||||
|
stm = null;
|
||||||
|
template-haskell = null;
|
||||||
|
# GHC only builds terminfo if it is a native compiler
|
||||||
|
terminfo = if pkgs.stdenv.hostPlatform == pkgs.stdenv.buildPlatform then null else doDistribute self.terminfo_0_4_1_6;
|
||||||
|
text = null;
|
||||||
|
time = null;
|
||||||
|
transformers = null;
|
||||||
|
unix = null;
|
||||||
|
# GHC only bundles the xhtml library if haddock is enabled, check if this is
|
||||||
|
# still the case when updating: https://gitlab.haskell.org/ghc/ghc/-/blob/0198841877f6f04269d6050892b98b5c3807ce4c/ghc.mk#L463
|
||||||
|
xhtml = if self.ghc.hasHaddock or true then null else doDistribute self.xhtml_3000_3_0_0;
|
||||||
|
|
||||||
|
# Need the Cabal-syntax-3.6.0.0 fake package for Cabal < 3.8 to allow callPackage and the constraint solver to work
|
||||||
|
Cabal-syntax = self.Cabal-syntax_3_6_0_0;
|
||||||
|
# These core package only exist for GHC >= 9.4. The best we can do is feign
|
||||||
|
# their existence to callPackages, but their is no shim for lower GHC versions.
|
||||||
|
system-cxx-std-lib = null;
|
||||||
|
|
||||||
|
# Jailbreaks & Version Updates
|
||||||
|
|
||||||
|
# For GHC < 9.4, some packages need data-array-byte as an extra dependency
|
||||||
|
primitive = addBuildDepends [ self.data-array-byte ] super.primitive;
|
||||||
|
# For GHC < 9.2, os-string is not required.
|
||||||
|
hashable = addBuildDepends [
|
||||||
|
self.data-array-byte
|
||||||
|
self.base-orphans
|
||||||
|
] (super.hashable.override {
|
||||||
|
os-string = null;
|
||||||
|
});
|
||||||
|
|
||||||
|
# Too strict lower bounds on base
|
||||||
|
primitive-addr = doJailbreak super.primitive-addr;
|
||||||
|
|
||||||
|
hashable-time = doJailbreak super.hashable-time;
|
||||||
|
tuple = addBuildDepend self.base-orphans super.tuple;
|
||||||
|
vector-th-unbox = doJailbreak super.vector-th-unbox;
|
||||||
|
|
||||||
|
ormolu = self.ormolu_0_5_2_0.override {
|
||||||
|
Cabal-syntax = self.Cabal-syntax_3_8_1_0;
|
||||||
|
};
|
||||||
|
|
||||||
|
stylish-haskell = doJailbreak super.stylish-haskell_0_14_4_0;
|
||||||
|
|
||||||
|
doctest = dontCheck super.doctest;
|
||||||
|
|
||||||
|
haskell-language-server = throw "haskell-language-server has dropped support for ghc 9.0 in version 2.4.0.0, please use a newer ghc version or an older nixpkgs version";
|
||||||
|
|
||||||
|
# Needs to use ghc-lib due to incompatible GHC
|
||||||
|
ghc-tags = doDistribute (addBuildDepend self.ghc-lib self.ghc-tags_1_6);
|
||||||
|
|
||||||
|
# Test suite sometimes segfaults with GHC 9.0.1 and 9.0.2
|
||||||
|
# https://github.com/ekmett/reflection/issues/51
|
||||||
|
# https://gitlab.haskell.org/ghc/ghc/-/issues/21141
|
||||||
|
reflection = dontCheck super.reflection;
|
||||||
|
|
||||||
|
# Disable tests pending resolution of
|
||||||
|
# https://github.com/Soostone/retry/issues/71
|
||||||
|
retry = dontCheck super.retry;
|
||||||
|
|
||||||
|
ghc-api-compat = unmarkBroken super.ghc-api-compat;
|
||||||
|
|
||||||
|
# 2021-09-18: cabal2nix does not detect the need for ghc-api-compat.
|
||||||
|
hiedb = overrideCabal (old: {
|
||||||
|
libraryHaskellDepends = old.libraryHaskellDepends ++ [self.ghc-api-compat];
|
||||||
|
}) super.hiedb;
|
||||||
|
|
||||||
|
# https://github.com/lspitzner/butcher/issues/7
|
||||||
|
butcher = doJailbreak super.butcher;
|
||||||
|
|
||||||
|
# We use a GHC patch to support the fix for https://github.com/fpco/inline-c/issues/127
|
||||||
|
# which means that the upstream cabal file isn't allowed to add the flag.
|
||||||
|
inline-c-cpp =
|
||||||
|
(if isDarwin then appendConfigureFlags ["--ghc-option=-fcompact-unwind"] else x: x)
|
||||||
|
super.inline-c-cpp;
|
||||||
|
|
||||||
|
# 2022-05-31: weeder 2.4.* requires GHC 9.2
|
||||||
|
weeder = doDistribute self.weeder_2_3_1;
|
||||||
|
# Unnecessarily strict upper bound on lens
|
||||||
|
weeder_2_3_1 = doJailbreak (super.weeder_2_3_1.override {
|
||||||
|
# weeder < 2.6 only supports algebraic-graphs < 0.7
|
||||||
|
# We no longer have matching test deps for algebraic-graphs 0.6.1 in the set
|
||||||
|
algebraic-graphs = dontCheck self.algebraic-graphs_0_6_1;
|
||||||
|
});
|
||||||
|
|
||||||
|
# Restrictive upper bound on base and containers
|
||||||
|
sv2v = doJailbreak super.sv2v;
|
||||||
|
|
||||||
|
# Later versions only support GHC >= 9.2
|
||||||
|
ghc-exactprint = self.ghc-exactprint_0_6_4;
|
||||||
|
|
||||||
|
retrie = dontCheck self.retrie_1_1_0_0;
|
||||||
|
|
||||||
|
apply-refact = self.apply-refact_0_9_3_0;
|
||||||
|
|
||||||
|
# Needs OneTuple for ghc < 9.2
|
||||||
|
binary-orphans = addBuildDepends [ self.OneTuple ] super.binary-orphans;
|
||||||
|
|
||||||
|
# Requires GHC < 9.4
|
||||||
|
ghc-source-gen = doDistribute (unmarkBroken super.ghc-source-gen);
|
||||||
|
|
||||||
|
hspec-megaparsec = super.hspec-megaparsec_2_2_0;
|
||||||
|
|
||||||
|
# No instance for (Show B.Builder) arising from a use of ‘print’
|
||||||
|
http-types = dontCheck super.http-types;
|
||||||
|
|
||||||
|
# Packages which need compat library for GHC < 9.6
|
||||||
|
inherit
|
||||||
|
(lib.mapAttrs
|
||||||
|
(_: addBuildDepends [ self.foldable1-classes-compat ])
|
||||||
|
super)
|
||||||
|
indexed-traversable
|
||||||
|
these
|
||||||
|
;
|
||||||
|
base-compat-batteries = addBuildDepends [
|
||||||
|
self.foldable1-classes-compat
|
||||||
|
self.OneTuple
|
||||||
|
] super.base-compat-batteries;
|
||||||
|
OneTuple = addBuildDepends [
|
||||||
|
self.foldable1-classes-compat
|
||||||
|
self.base-orphans
|
||||||
|
] super.OneTuple;
|
||||||
|
}
|
|
@ -0,0 +1,52 @@
|
||||||
|
{ pkgs, haskellLib }:
|
||||||
|
|
||||||
|
let
|
||||||
|
inherit (pkgs) lib;
|
||||||
|
in
|
||||||
|
|
||||||
|
self: super: {
|
||||||
|
llvmPackages = lib.dontRecurseIntoAttrs self.ghc.llvmPackages;
|
||||||
|
|
||||||
|
# Disable GHC core libraries
|
||||||
|
array = null;
|
||||||
|
base = null;
|
||||||
|
binary = null;
|
||||||
|
bytestring = null;
|
||||||
|
Cabal = null;
|
||||||
|
Cabal-syntax = null;
|
||||||
|
containers = null;
|
||||||
|
deepseq = null;
|
||||||
|
directory = null;
|
||||||
|
exceptions = null;
|
||||||
|
filepath = null;
|
||||||
|
ghc-bignum = null;
|
||||||
|
ghc-boot = null;
|
||||||
|
ghc-boot-th = null;
|
||||||
|
ghc-compact = null;
|
||||||
|
ghc-experimental = null;
|
||||||
|
ghc-heap = null;
|
||||||
|
ghc-internal = null;
|
||||||
|
ghc-platform = null;
|
||||||
|
ghc-prim = null;
|
||||||
|
ghc-toolchain = null;
|
||||||
|
ghci = null;
|
||||||
|
haskeline = null;
|
||||||
|
hpc = null;
|
||||||
|
integer-gmp = null;
|
||||||
|
mtl = null;
|
||||||
|
parsec = null;
|
||||||
|
pretty = null;
|
||||||
|
process = null;
|
||||||
|
rts = null;
|
||||||
|
semaphore-compat = null;
|
||||||
|
stm = null;
|
||||||
|
system-cxx-std-lib = null;
|
||||||
|
template-haskell = null;
|
||||||
|
# GHC only builds terminfo if it is a native compiler
|
||||||
|
terminfo = if pkgs.stdenv.hostPlatform == pkgs.stdenv.buildPlatform then null else haskellLib.doDistribute self.terminfo_0_4_1_6;
|
||||||
|
text = null;
|
||||||
|
time = null;
|
||||||
|
transformers = null;
|
||||||
|
unix = null;
|
||||||
|
xhtml = null;
|
||||||
|
}
|
|
@ -0,0 +1,53 @@
|
||||||
|
{ pkgs, haskellLib }:
|
||||||
|
|
||||||
|
let
|
||||||
|
inherit (pkgs) lib;
|
||||||
|
in
|
||||||
|
|
||||||
|
self: super: {
|
||||||
|
llvmPackages = lib.dontRecurseIntoAttrs self.ghc.llvmPackages;
|
||||||
|
|
||||||
|
# Disable GHC core libraries
|
||||||
|
array = null;
|
||||||
|
base = null;
|
||||||
|
binary = null;
|
||||||
|
bytestring = null;
|
||||||
|
Cabal = null;
|
||||||
|
Cabal-syntax = null;
|
||||||
|
containers = null;
|
||||||
|
deepseq = null;
|
||||||
|
directory = null;
|
||||||
|
exceptions = null;
|
||||||
|
filepath = null;
|
||||||
|
ghc-bignum = null;
|
||||||
|
ghc-boot = null;
|
||||||
|
ghc-boot-th = null;
|
||||||
|
ghc-compact = null;
|
||||||
|
ghc-experimental = null;
|
||||||
|
ghc-heap = null;
|
||||||
|
ghc-internal = null;
|
||||||
|
ghc-platform = null;
|
||||||
|
ghc-prim = null;
|
||||||
|
ghc-toolchain = null;
|
||||||
|
ghci = null;
|
||||||
|
haskeline = null;
|
||||||
|
hpc = null;
|
||||||
|
integer-gmp = null;
|
||||||
|
mtl = null;
|
||||||
|
os-string = null;
|
||||||
|
parsec = null;
|
||||||
|
pretty = null;
|
||||||
|
process = null;
|
||||||
|
rts = null;
|
||||||
|
semaphore-compat = null;
|
||||||
|
stm = null;
|
||||||
|
system-cxx-std-lib = null;
|
||||||
|
template-haskell = null;
|
||||||
|
# GHC only builds terminfo if it is a native compiler
|
||||||
|
terminfo = if pkgs.stdenv.hostPlatform == pkgs.stdenv.buildPlatform then null else haskellLib.doDistribute self.terminfo_0_4_1_6;
|
||||||
|
text = null;
|
||||||
|
time = null;
|
||||||
|
transformers = null;
|
||||||
|
unix = null;
|
||||||
|
xhtml = null;
|
||||||
|
}
|
|
@ -0,0 +1,151 @@
|
||||||
|
{ pkgs, haskellLib }:
|
||||||
|
|
||||||
|
with haskellLib;
|
||||||
|
|
||||||
|
let
|
||||||
|
inherit (pkgs.stdenv.hostPlatform) isDarwin;
|
||||||
|
inherit (pkgs) lib;
|
||||||
|
in
|
||||||
|
|
||||||
|
self: super: {
|
||||||
|
|
||||||
|
llvmPackages = pkgs.lib.dontRecurseIntoAttrs self.ghc.llvmPackages;
|
||||||
|
|
||||||
|
# Disable GHC 9.2.x core libraries.
|
||||||
|
array = null;
|
||||||
|
base = null;
|
||||||
|
binary = null;
|
||||||
|
bytestring = null;
|
||||||
|
Cabal = null;
|
||||||
|
containers = null;
|
||||||
|
deepseq = null;
|
||||||
|
directory = null;
|
||||||
|
exceptions = null;
|
||||||
|
filepath = null;
|
||||||
|
ghc-bignum = null;
|
||||||
|
ghc-boot = null;
|
||||||
|
ghc-boot-th = null;
|
||||||
|
ghc-compact = null;
|
||||||
|
ghc-heap = null;
|
||||||
|
ghc-prim = null;
|
||||||
|
ghci = null;
|
||||||
|
haskeline = null;
|
||||||
|
hpc = null;
|
||||||
|
integer-gmp = null;
|
||||||
|
libiserv = null;
|
||||||
|
mtl = null;
|
||||||
|
parsec = null;
|
||||||
|
pretty = null;
|
||||||
|
process = null;
|
||||||
|
rts = null;
|
||||||
|
stm = null;
|
||||||
|
template-haskell = null;
|
||||||
|
# GHC only builds terminfo if it is a native compiler
|
||||||
|
terminfo = if pkgs.stdenv.hostPlatform == pkgs.stdenv.buildPlatform then null else doDistribute self.terminfo_0_4_1_6;
|
||||||
|
text = null;
|
||||||
|
time = null;
|
||||||
|
transformers = null;
|
||||||
|
unix = null;
|
||||||
|
# GHC only bundles the xhtml library if haddock is enabled, check if this is
|
||||||
|
# still the case when updating: https://gitlab.haskell.org/ghc/ghc/-/blob/0198841877f6f04269d6050892b98b5c3807ce4c/ghc.mk#L463
|
||||||
|
xhtml = if self.ghc.hasHaddock or true then null else doDistribute self.xhtml_3000_3_0_0;
|
||||||
|
|
||||||
|
# Need the Cabal-syntax-3.6.0.0 fake package for Cabal < 3.8 to allow callPackage and the constraint solver to work
|
||||||
|
Cabal-syntax = self.Cabal-syntax_3_6_0_0;
|
||||||
|
# These core package only exist for GHC >= 9.4. The best we can do is feign
|
||||||
|
# their existence to callPackages, but their is no shim for lower GHC versions.
|
||||||
|
system-cxx-std-lib = null;
|
||||||
|
|
||||||
|
# weeder >= 2.5 requires GHC 9.4
|
||||||
|
weeder = doDistribute self.weeder_2_4_1;
|
||||||
|
# Allow dhall 1.42.*
|
||||||
|
weeder_2_4_1 = doJailbreak (super.weeder_2_4_1.override {
|
||||||
|
# weeder < 2.6 only supports algebraic-graphs < 0.7
|
||||||
|
# We no longer have matching test deps for algebraic-graphs 0.6.1 in the set
|
||||||
|
algebraic-graphs = dontCheck self.algebraic-graphs_0_6_1;
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
haskell-language-server = lib.pipe super.haskell-language-server [
|
||||||
|
(disableCabalFlag "fourmolu")
|
||||||
|
(disableCabalFlag "ormolu")
|
||||||
|
(disableCabalFlag "stylishHaskell")
|
||||||
|
(overrideCabal (drv: {
|
||||||
|
# Disabling the build flags isn't enough: `Setup configure` still configures
|
||||||
|
# every component for building and complains about missing dependencies.
|
||||||
|
# Thus we have to mark the undesired components as non-buildable.
|
||||||
|
postPatch = drv.postPatch or "" + ''
|
||||||
|
for lib in hls-ormolu-plugin hls-fourmolu-plugin; do
|
||||||
|
sed -i "/^library $lib/a\ buildable: False" haskell-language-server.cabal
|
||||||
|
done
|
||||||
|
'';
|
||||||
|
}))
|
||||||
|
(d: d.override {
|
||||||
|
ormolu = null;
|
||||||
|
fourmolu = null;
|
||||||
|
})
|
||||||
|
];
|
||||||
|
|
||||||
|
# For GHC < 9.4, some packages need data-array-byte as an extra dependency
|
||||||
|
hashable = addBuildDepends [ self.data-array-byte ] super.hashable;
|
||||||
|
primitive = addBuildDepends [ self.data-array-byte ] super.primitive;
|
||||||
|
primitive-unlifted = super.primitive-unlifted_0_1_3_1;
|
||||||
|
# Too strict lower bound on base
|
||||||
|
primitive-addr = doJailbreak super.primitive-addr;
|
||||||
|
|
||||||
|
# Jailbreaks & Version Updates
|
||||||
|
hashable-time = doJailbreak super.hashable-time;
|
||||||
|
|
||||||
|
# Depends on utf8-light which isn't maintained / doesn't support base >= 4.16
|
||||||
|
# https://github.com/haskell-infra/hackage-trustees/issues/347
|
||||||
|
# https://mail.haskell.org/pipermail/haskell-cafe/2022-October/135613.html
|
||||||
|
language-javascript_0_7_0_0 = dontCheck super.language-javascript_0_7_0_0;
|
||||||
|
|
||||||
|
# Tests depend on `parseTime` which is no longer available
|
||||||
|
hourglass = dontCheck super.hourglass;
|
||||||
|
|
||||||
|
# Needs to match ghc version
|
||||||
|
ghc-tags = doDistribute self.ghc-tags_1_5;
|
||||||
|
|
||||||
|
# For "ghc-lib" flag see https://github.com/haskell/haskell-language-server/issues/3185#issuecomment-1250264515
|
||||||
|
hlint = enableCabalFlag "ghc-lib" super.hlint;
|
||||||
|
|
||||||
|
# 0.2.2.3 requires Cabal >= 3.8
|
||||||
|
shake-cabal = doDistribute self.shake-cabal_0_2_2_2;
|
||||||
|
|
||||||
|
# https://github.com/sjakobi/bsb-http-chunked/issues/38
|
||||||
|
bsb-http-chunked = dontCheck super.bsb-http-chunked;
|
||||||
|
|
||||||
|
# https://github.com/NixOS/cabal2nix/issues/554
|
||||||
|
# https://github.com/clash-lang/clash-compiler/blob/f0f6275e19b8c672f042026c478484c5fd45191d/README.md#ghc-compatibility
|
||||||
|
clash-prelude = dontDistribute (markBroken super.clash-prelude);
|
||||||
|
|
||||||
|
# Too strict upper bound on bytestring, relevant for GHC 9.2.6 specifically
|
||||||
|
# https://github.com/protolude/protolude/issues/127#issuecomment-1428807874
|
||||||
|
protolude = doJailbreak super.protolude;
|
||||||
|
|
||||||
|
# https://github.com/fpco/inline-c/pull/131
|
||||||
|
inline-c-cpp =
|
||||||
|
(if isDarwin then appendConfigureFlags ["--ghc-option=-fcompact-unwind"] else x: x)
|
||||||
|
super.inline-c-cpp;
|
||||||
|
|
||||||
|
# A given major version of ghc-exactprint only supports one version of GHC.
|
||||||
|
ghc-exactprint = super.ghc-exactprint_1_5_0;
|
||||||
|
|
||||||
|
# Requires GHC < 9.4
|
||||||
|
ghc-source-gen = doDistribute (unmarkBroken super.ghc-source-gen);
|
||||||
|
|
||||||
|
# Packages which need compat library for GHC < 9.6
|
||||||
|
inherit
|
||||||
|
(lib.mapAttrs
|
||||||
|
(_: addBuildDepends [ self.foldable1-classes-compat ])
|
||||||
|
super)
|
||||||
|
indexed-traversable
|
||||||
|
OneTuple
|
||||||
|
these
|
||||||
|
;
|
||||||
|
base-compat-batteries = addBuildDepends [
|
||||||
|
self.foldable1-classes-compat
|
||||||
|
self.OneTuple
|
||||||
|
] super.base-compat-batteries;
|
||||||
|
}
|
|
@ -0,0 +1,143 @@
|
||||||
|
{ pkgs, haskellLib }:
|
||||||
|
|
||||||
|
let
|
||||||
|
inherit (pkgs) fetchpatch lib;
|
||||||
|
checkAgainAfter = pkg: ver: msg: act:
|
||||||
|
if builtins.compareVersions pkg.version ver <= 0 then act
|
||||||
|
else
|
||||||
|
builtins.throw "Check if '${msg}' was resolved in ${pkg.pname} ${pkg.version} and update or remove this";
|
||||||
|
in
|
||||||
|
|
||||||
|
with haskellLib;
|
||||||
|
self: super: let
|
||||||
|
jailbreakForCurrentVersion = p: v: checkAgainAfter p v "bad bounds" (doJailbreak p);
|
||||||
|
in {
|
||||||
|
llvmPackages = lib.dontRecurseIntoAttrs self.ghc.llvmPackages;
|
||||||
|
|
||||||
|
# Disable GHC core libraries.
|
||||||
|
array = null;
|
||||||
|
base = null;
|
||||||
|
binary = null;
|
||||||
|
bytestring = null;
|
||||||
|
Cabal = null;
|
||||||
|
Cabal-syntax = null;
|
||||||
|
containers = null;
|
||||||
|
deepseq = null;
|
||||||
|
directory = null;
|
||||||
|
exceptions = null;
|
||||||
|
filepath = null;
|
||||||
|
ghc-bignum = null;
|
||||||
|
ghc-boot = null;
|
||||||
|
ghc-boot-th = null;
|
||||||
|
ghc-compact = null;
|
||||||
|
ghc-heap = null;
|
||||||
|
ghc-prim = null;
|
||||||
|
ghci = null;
|
||||||
|
haskeline = null;
|
||||||
|
hpc = null;
|
||||||
|
integer-gmp = null;
|
||||||
|
libiserv = null;
|
||||||
|
mtl = null;
|
||||||
|
parsec = null;
|
||||||
|
pretty = null;
|
||||||
|
process = null;
|
||||||
|
rts = null;
|
||||||
|
stm = null;
|
||||||
|
system-cxx-std-lib = null;
|
||||||
|
template-haskell = null;
|
||||||
|
# GHC only builds terminfo if it is a native compiler
|
||||||
|
terminfo = if pkgs.stdenv.hostPlatform == pkgs.stdenv.buildPlatform then null else doDistribute self.terminfo_0_4_1_6;
|
||||||
|
text = null;
|
||||||
|
time = null;
|
||||||
|
transformers = null;
|
||||||
|
unix = null;
|
||||||
|
# GHC only bundles the xhtml library if haddock is enabled, check if this is
|
||||||
|
# still the case when updating: https://gitlab.haskell.org/ghc/ghc/-/blob/0198841877f6f04269d6050892b98b5c3807ce4c/ghc.mk#L463
|
||||||
|
xhtml = if self.ghc.hasHaddock or true then null else doDistribute self.xhtml_3000_3_0_0;
|
||||||
|
|
||||||
|
# Jailbreaks & Version Updates
|
||||||
|
|
||||||
|
hashable-time = doJailbreak super.hashable-time;
|
||||||
|
libmpd = doJailbreak super.libmpd;
|
||||||
|
|
||||||
|
# generically needs base-orphans for 9.4 only
|
||||||
|
base-orphans = dontCheck (doDistribute super.base-orphans);
|
||||||
|
generically = addBuildDepends [
|
||||||
|
self.base-orphans
|
||||||
|
] super.generically;
|
||||||
|
|
||||||
|
# the dontHaddock is due to a GHC panic. might be this bug, not sure.
|
||||||
|
# https://gitlab.haskell.org/ghc/ghc/-/issues/21619
|
||||||
|
hedgehog = dontHaddock super.hedgehog;
|
||||||
|
|
||||||
|
hpack = overrideCabal (drv: {
|
||||||
|
# Cabal 3.6 seems to preserve comments when reading, which makes this test fail
|
||||||
|
# 2021-10-10: 9.2.1 is not yet supported (also no issue)
|
||||||
|
testFlags = [
|
||||||
|
"--skip=/Hpack/renderCabalFile/is inverse to readCabalFile/"
|
||||||
|
] ++ drv.testFlags or [];
|
||||||
|
}) (doJailbreak super.hpack);
|
||||||
|
|
||||||
|
# Tests depend on `parseTime` which is no longer available
|
||||||
|
hourglass = dontCheck super.hourglass;
|
||||||
|
|
||||||
|
# https://github.com/sjakobi/bsb-http-chunked/issues/38
|
||||||
|
bsb-http-chunked = dontCheck super.bsb-http-chunked;
|
||||||
|
|
||||||
|
# 2022-08-01: Tests are broken on ghc 9.2.4: https://github.com/wz1000/HieDb/issues/46
|
||||||
|
hiedb = dontCheck super.hiedb;
|
||||||
|
|
||||||
|
# 2022-10-06: https://gitlab.haskell.org/ghc/ghc/-/issues/22260
|
||||||
|
ghc-check = dontHaddock super.ghc-check;
|
||||||
|
|
||||||
|
ghc-tags = self.ghc-tags_1_6;
|
||||||
|
|
||||||
|
# A given major version of ghc-exactprint only supports one version of GHC.
|
||||||
|
ghc-exactprint = super.ghc-exactprint_1_6_1_3;
|
||||||
|
|
||||||
|
# Too strict upper bound on template-haskell
|
||||||
|
# https://github.com/mokus0/th-extras/issues/18
|
||||||
|
th-extras = doJailbreak super.th-extras;
|
||||||
|
|
||||||
|
# https://github.com/kowainik/relude/issues/436
|
||||||
|
relude = dontCheck super.relude;
|
||||||
|
|
||||||
|
inherit
|
||||||
|
(
|
||||||
|
let
|
||||||
|
hls_overlay = lself: lsuper: {
|
||||||
|
Cabal-syntax = lself.Cabal-syntax_3_10_3_0;
|
||||||
|
};
|
||||||
|
in
|
||||||
|
lib.mapAttrs (_: pkg: doDistribute (pkg.overrideScope hls_overlay)) {
|
||||||
|
haskell-language-server = allowInconsistentDependencies super.haskell-language-server;
|
||||||
|
fourmolu = super.fourmolu;
|
||||||
|
ormolu = super.ormolu;
|
||||||
|
hlint = super.hlint;
|
||||||
|
stylish-haskell = super.stylish-haskell;
|
||||||
|
}
|
||||||
|
)
|
||||||
|
haskell-language-server
|
||||||
|
fourmolu
|
||||||
|
ormolu
|
||||||
|
hlint
|
||||||
|
stylish-haskell
|
||||||
|
;
|
||||||
|
|
||||||
|
# Packages which need compat library for GHC < 9.6
|
||||||
|
inherit
|
||||||
|
(lib.mapAttrs
|
||||||
|
(_: addBuildDepends [ self.foldable1-classes-compat ])
|
||||||
|
super)
|
||||||
|
indexed-traversable
|
||||||
|
OneTuple
|
||||||
|
these
|
||||||
|
;
|
||||||
|
base-compat-batteries = addBuildDepends [
|
||||||
|
self.foldable1-classes-compat
|
||||||
|
self.OneTuple
|
||||||
|
] super.base-compat-batteries;
|
||||||
|
|
||||||
|
# Too strict lower bound on base
|
||||||
|
primitive-addr = doJailbreak super.primitive-addr;
|
||||||
|
}
|
|
@ -0,0 +1,194 @@
|
||||||
|
{ pkgs, haskellLib }:
|
||||||
|
|
||||||
|
with haskellLib;
|
||||||
|
|
||||||
|
let
|
||||||
|
inherit (pkgs) lib;
|
||||||
|
|
||||||
|
jailbreakWhileRevision = rev:
|
||||||
|
overrideCabal (old: {
|
||||||
|
jailbreak = assert old.revision or "0" == toString rev; true;
|
||||||
|
});
|
||||||
|
checkAgainAfter = pkg: ver: msg: act:
|
||||||
|
if builtins.compareVersions pkg.version ver <= 0 then act
|
||||||
|
else
|
||||||
|
builtins.throw "Check if '${msg}' was resolved in ${pkg.pname} ${pkg.version} and update or remove this";
|
||||||
|
jailbreakForCurrentVersion = p: v: checkAgainAfter p v "bad bounds" (doJailbreak p);
|
||||||
|
|
||||||
|
# Workaround for a ghc-9.6 issue: https://gitlab.haskell.org/ghc/ghc/-/issues/23392
|
||||||
|
disableParallelBuilding = overrideCabal (drv: { enableParallelBuilding = false; });
|
||||||
|
in
|
||||||
|
|
||||||
|
self: super: {
|
||||||
|
llvmPackages = lib.dontRecurseIntoAttrs self.ghc.llvmPackages;
|
||||||
|
|
||||||
|
# Disable GHC core libraries
|
||||||
|
array = null;
|
||||||
|
base = null;
|
||||||
|
binary = null;
|
||||||
|
bytestring = null;
|
||||||
|
Cabal = null;
|
||||||
|
Cabal-syntax = null;
|
||||||
|
containers = null;
|
||||||
|
deepseq = null;
|
||||||
|
directory = null;
|
||||||
|
exceptions = null;
|
||||||
|
filepath = null;
|
||||||
|
ghc-bignum = null;
|
||||||
|
ghc-boot = null;
|
||||||
|
ghc-boot-th = null;
|
||||||
|
ghc-compact = null;
|
||||||
|
ghc-heap = null;
|
||||||
|
ghc-prim = null;
|
||||||
|
ghci = null;
|
||||||
|
haskeline = null;
|
||||||
|
hpc = null;
|
||||||
|
integer-gmp = null;
|
||||||
|
libiserv = null;
|
||||||
|
mtl = null;
|
||||||
|
parsec = null;
|
||||||
|
pretty = null;
|
||||||
|
process = null;
|
||||||
|
rts = null;
|
||||||
|
stm = null;
|
||||||
|
system-cxx-std-lib = null;
|
||||||
|
template-haskell = null;
|
||||||
|
# terminfo is not built if GHC is a cross compiler
|
||||||
|
terminfo = if pkgs.stdenv.hostPlatform == pkgs.stdenv.buildPlatform then null else doDistribute self.terminfo_0_4_1_6;
|
||||||
|
text = null;
|
||||||
|
time = null;
|
||||||
|
transformers = null;
|
||||||
|
unix = null;
|
||||||
|
xhtml = null;
|
||||||
|
|
||||||
|
#
|
||||||
|
# Version deviations from Stackage LTS
|
||||||
|
#
|
||||||
|
|
||||||
|
# Too strict upper bound on template-haskell
|
||||||
|
# https://github.com/mokus0/th-extras/pull/21
|
||||||
|
th-extras = doJailbreak super.th-extras;
|
||||||
|
|
||||||
|
#
|
||||||
|
# Too strict bounds without upstream fix
|
||||||
|
#
|
||||||
|
|
||||||
|
# Forbids transformers >= 0.6
|
||||||
|
quickcheck-classes-base = doJailbreak super.quickcheck-classes-base;
|
||||||
|
# https://github.com/Gabriella439/Haskell-Break-Library/pull/3
|
||||||
|
break = doJailbreak super.break;
|
||||||
|
# Forbids mtl >= 2.3
|
||||||
|
ChasingBottoms = doJailbreak super.ChasingBottoms;
|
||||||
|
# Forbids base >= 4.18
|
||||||
|
cabal-install-solver = doJailbreak super.cabal-install-solver;
|
||||||
|
cabal-install = doJailbreak super.cabal-install;
|
||||||
|
|
||||||
|
# Forbids base >= 4.18, fix proposed: https://github.com/sjakobi/newtype-generics/pull/25
|
||||||
|
newtype-generics = jailbreakForCurrentVersion super.newtype-generics "0.6.2";
|
||||||
|
|
||||||
|
#
|
||||||
|
# Too strict bounds, waiting on Hackage release in nixpkgs
|
||||||
|
#
|
||||||
|
|
||||||
|
#
|
||||||
|
# Compilation failure workarounds
|
||||||
|
#
|
||||||
|
|
||||||
|
# Add support for time 1.10
|
||||||
|
# https://github.com/vincenthz/hs-hourglass/pull/56
|
||||||
|
hourglass = appendPatches [
|
||||||
|
(pkgs.fetchpatch {
|
||||||
|
name = "hourglass-pr-56.patch";
|
||||||
|
url =
|
||||||
|
"https://github.com/vincenthz/hs-hourglass/commit/cfc2a4b01f9993b1b51432f0a95fa6730d9a558a.patch";
|
||||||
|
sha256 = "sha256-gntZf7RkaR4qzrhjrXSC69jE44SknPDBmfs4z9rVa5Q=";
|
||||||
|
})
|
||||||
|
] (super.hourglass);
|
||||||
|
|
||||||
|
# Jailbreaks for servant <0.20
|
||||||
|
servant-lucid = doJailbreak super.servant-lucid;
|
||||||
|
|
||||||
|
lifted-base = dontCheck super.lifted-base;
|
||||||
|
hw-prim = dontCheck (doJailbreak super.hw-prim);
|
||||||
|
stm-containers = dontCheck super.stm-containers;
|
||||||
|
regex-tdfa = dontCheck super.regex-tdfa;
|
||||||
|
hiedb = dontCheck super.hiedb;
|
||||||
|
retrie = dontCheck super.retrie;
|
||||||
|
# https://github.com/kowainik/relude/issues/436
|
||||||
|
relude = dontCheck (doJailbreak super.relude);
|
||||||
|
|
||||||
|
inherit (pkgs.lib.mapAttrs (_: doJailbreak ) super)
|
||||||
|
ghc-trace-events
|
||||||
|
gi-cairo-connector # mtl <2.3
|
||||||
|
ghc-prof # base <4.18
|
||||||
|
env-guard # doctest <0.21
|
||||||
|
package-version # doctest <0.21, tasty-hedgehog <1.4
|
||||||
|
;
|
||||||
|
|
||||||
|
# Avoid triggering an issue in ghc-9.6.2
|
||||||
|
gi-gtk = disableParallelBuilding super.gi-gtk;
|
||||||
|
|
||||||
|
# Pending text-2.0 support https://github.com/gtk2hs/gtk2hs/issues/327
|
||||||
|
gtk = doJailbreak super.gtk;
|
||||||
|
|
||||||
|
# 2023-12-23: It needs this to build under ghc-9.6.3.
|
||||||
|
# A factor of 100 is insufficent, 200 seems seems to work.
|
||||||
|
hip = appendConfigureFlag "--ghc-options=-fsimpl-tick-factor=200" super.hip;
|
||||||
|
|
||||||
|
# Doctest comments have bogus imports.
|
||||||
|
bsb-http-chunked = dontCheck super.bsb-http-chunked;
|
||||||
|
|
||||||
|
# This can be removed once https://github.com/typeclasses/ascii-predicates/pull/1
|
||||||
|
# is merged and in a release that's being tracked.
|
||||||
|
ascii-predicates = appendPatch
|
||||||
|
(pkgs.fetchpatch
|
||||||
|
{ url = "https://github.com/typeclasses/ascii-predicates/commit/2e6d9ed45987a8566f3a77eedf7836055c076d1a.patch";
|
||||||
|
name = "ascii-predicates-pull-1.patch";
|
||||||
|
relative = "ascii-predicates";
|
||||||
|
sha256 = "sha256-4JguQFZNRQpjZThLrAo13jNeypvLfqFp6o7c1bnkmZo=";
|
||||||
|
})
|
||||||
|
super.ascii-predicates;
|
||||||
|
|
||||||
|
# This can be removed once https://github.com/typeclasses/ascii-numbers/pull/1
|
||||||
|
# is merged and in a release that's being tracked.
|
||||||
|
ascii-numbers = appendPatch
|
||||||
|
(pkgs.fetchpatch
|
||||||
|
{ url = "https://github.com/typeclasses/ascii-numbers/commit/e9474ad91bc997891f1a46afd5d0bdf9b9f7d768.patch";
|
||||||
|
name = "ascii-numbers-pull-1.patch";
|
||||||
|
relative = "ascii-numbers";
|
||||||
|
sha256 = "sha256-buw1UeW57CFefEfqdDUraSyQ+H/NvCZOv6WF2ORiYQg=";
|
||||||
|
})
|
||||||
|
super.ascii-numbers;
|
||||||
|
|
||||||
|
# Fix ghc-9.6.x build errors.
|
||||||
|
libmpd = appendPatch
|
||||||
|
# https://github.com/vimus/libmpd-haskell/pull/138
|
||||||
|
(pkgs.fetchpatch { url = "https://github.com/vimus/libmpd-haskell/compare/95d3b3bab5858d6d1f0e079d0ab7c2d182336acb...5737096a339edc265a663f51ad9d29baee262694.patch";
|
||||||
|
name = "vimus-libmpd-haskell-pull-138.patch";
|
||||||
|
sha256 = "sha256-CvvylXyRmoCoRJP2MzRwL0SBbrEzDGqAjXS+4LsLutQ=";
|
||||||
|
})
|
||||||
|
super.libmpd;
|
||||||
|
|
||||||
|
# Apply patch from PR with mtl-2.3 fix.
|
||||||
|
ConfigFile = overrideCabal (drv: {
|
||||||
|
editedCabalFile = null;
|
||||||
|
buildDepends = drv.buildDepends or [] ++ [ self.HUnit ];
|
||||||
|
patches = [(pkgs.fetchpatch {
|
||||||
|
# https://github.com/jgoerzen/configfile/pull/12
|
||||||
|
name = "ConfigFile-pr-12.patch";
|
||||||
|
url = "https://github.com/jgoerzen/configfile/compare/d0a2e654be0b73eadbf2a50661d00574ad7b6f87...83ee30b43f74d2b6781269072cf5ed0f0e00012f.patch";
|
||||||
|
sha256 = "sha256-b7u9GiIAd2xpOrM0MfILHNb6Nt7070lNRIadn2l3DfQ=";
|
||||||
|
})];
|
||||||
|
}) super.ConfigFile;
|
||||||
|
}
|
||||||
|
# super.ghc is required to break infinite recursion as Nix is strict in the attrNames
|
||||||
|
// lib.optionalAttrs (pkgs.stdenv.hostPlatform.isAarch64 && lib.versionOlder super.ghc.version "9.6.4") {
|
||||||
|
# The NCG backend for aarch64 generates invalid jumps in some situations,
|
||||||
|
# the workaround on 9.6 is to revert to the LLVM backend (which is used
|
||||||
|
# for these sorts of situations even on 9.2 and 9.4).
|
||||||
|
# https://gitlab.haskell.org/ghc/ghc/-/issues/23746#note_525318
|
||||||
|
inherit (lib.mapAttrs (_: self.forceLlvmCodegenBackend) super)
|
||||||
|
tls
|
||||||
|
mmark
|
||||||
|
;
|
||||||
|
}
|
|
@ -0,0 +1,134 @@
|
||||||
|
{ pkgs, haskellLib }:
|
||||||
|
|
||||||
|
with haskellLib;
|
||||||
|
|
||||||
|
let
|
||||||
|
inherit (pkgs.stdenv.hostPlatform) isDarwin;
|
||||||
|
in
|
||||||
|
|
||||||
|
self: super: {
|
||||||
|
|
||||||
|
llvmPackages = pkgs.lib.dontRecurseIntoAttrs self.ghc.llvmPackages;
|
||||||
|
|
||||||
|
# Disable GHC core libraries.
|
||||||
|
array = null;
|
||||||
|
base = null;
|
||||||
|
binary = null;
|
||||||
|
bytestring = null;
|
||||||
|
Cabal = null;
|
||||||
|
Cabal-syntax = null;
|
||||||
|
containers = null;
|
||||||
|
deepseq = null;
|
||||||
|
directory = null;
|
||||||
|
exceptions = null;
|
||||||
|
filepath = null;
|
||||||
|
ghc-bignum = null;
|
||||||
|
ghc-boot = null;
|
||||||
|
ghc-boot-th = null;
|
||||||
|
ghc-compact = null;
|
||||||
|
ghc-heap = null;
|
||||||
|
ghc-prim = null;
|
||||||
|
ghci = null;
|
||||||
|
haskeline = null;
|
||||||
|
hpc = null;
|
||||||
|
integer-gmp = null;
|
||||||
|
libiserv = null;
|
||||||
|
mtl = null;
|
||||||
|
parsec = null;
|
||||||
|
pretty = null;
|
||||||
|
process = null;
|
||||||
|
rts = null;
|
||||||
|
stm = null;
|
||||||
|
system-cxx-std-lib = null;
|
||||||
|
template-haskell = null;
|
||||||
|
# GHC only builds terminfo if it is a native compiler
|
||||||
|
terminfo = if pkgs.stdenv.hostPlatform == pkgs.stdenv.buildPlatform then null else doDistribute self.terminfo_0_4_1_6;
|
||||||
|
text = null;
|
||||||
|
time = null;
|
||||||
|
transformers = null;
|
||||||
|
unix = null;
|
||||||
|
xhtml = null;
|
||||||
|
|
||||||
|
#
|
||||||
|
# Version upgrades
|
||||||
|
#
|
||||||
|
th-abstraction = doDistribute self.th-abstraction_0_7_0_0;
|
||||||
|
ghc-lib-parser = doDistribute self.ghc-lib-parser_9_8_2_20240223;
|
||||||
|
ghc-lib-parser-ex = doDistribute self.ghc-lib-parser-ex_9_8_0_2;
|
||||||
|
ghc-lib = doDistribute self.ghc-lib_9_8_2_20240223;
|
||||||
|
megaparsec = doDistribute self.megaparsec_9_6_1;
|
||||||
|
# TODO: remove when aeson updates or launches a revision
|
||||||
|
# see https://github.com/haskell/aeson/issues/1089 and https://github.com/haskell/aeson/pulls/1088
|
||||||
|
aeson = doJailbreak (doDistribute self.aeson_2_2_1_0);
|
||||||
|
attoparsec-aeson = doDistribute self.attoparsec-aeson_2_2_0_1;
|
||||||
|
xmonad = doDistribute self.xmonad_0_18_0;
|
||||||
|
apply-refact = self.apply-refact_0_14_0_0;
|
||||||
|
ormolu = self.ormolu_0_7_4_0;
|
||||||
|
fourmolu = self.fourmolu_0_15_0_0;
|
||||||
|
stylish-haskell = self.stylish-haskell_0_14_6_0;
|
||||||
|
hlint = self.hlint_3_8;
|
||||||
|
ghc-syntax-highlighter = self.ghc-syntax-highlighter_0_0_11_0;
|
||||||
|
|
||||||
|
# A given major version of ghc-exactprint only supports one version of GHC.
|
||||||
|
ghc-exactprint = self.ghc-exactprint_1_8_0_0;
|
||||||
|
ghc-exactprint_1_8_0_0 = addBuildDepends [
|
||||||
|
self.Diff
|
||||||
|
self.HUnit
|
||||||
|
self.data-default
|
||||||
|
self.extra
|
||||||
|
self.free
|
||||||
|
self.ghc-paths
|
||||||
|
self.ordered-containers
|
||||||
|
self.silently
|
||||||
|
self.syb
|
||||||
|
] super.ghc-exactprint_1_8_0_0;
|
||||||
|
|
||||||
|
#
|
||||||
|
# Jailbreaks
|
||||||
|
#
|
||||||
|
blaze-svg = doJailbreak super.blaze-svg; # base <4.19
|
||||||
|
commutative-semigroups = doJailbreak super.commutative-semigroups; # base < 4.19
|
||||||
|
diagrams-lib = doJailbreak super.diagrams-lib; # base <4.19, text <2.1
|
||||||
|
diagrams-postscript = doJailbreak super.diagrams-postscript; # base <4.19, bytestring <0.12
|
||||||
|
diagrams-svg = doJailbreak super.diagrams-svg; # base <4.19, text <2.1
|
||||||
|
ghc-trace-events = doJailbreak super.ghc-trace-events; # text < 2.1, bytestring < 0.12, base < 4.19
|
||||||
|
primitive-unlifted = doJailbreak super.primitive-unlifted; # bytestring < 0.12
|
||||||
|
statestack = doJailbreak super.statestack; # base < 4.19
|
||||||
|
newtype-generics = doJailbreak super.newtype-generics; # base < 4.19
|
||||||
|
hw-prim = doJailbreak super.hw-prim; # doctest < 0.22, ghc-prim < 0.11, hedgehog < 1.4
|
||||||
|
svg-builder = doJailbreak super.svg-builder; # base <4.19, bytestring <0.12, text <2.1
|
||||||
|
# Too strict bound on base, believe it or not.
|
||||||
|
# https://github.com/judah/terminfo/pull/55#issuecomment-1876894232
|
||||||
|
terminfo_0_4_1_6 = doJailbreak super.terminfo_0_4_1_6;
|
||||||
|
HaskellNet-SSL = doJailbreak super.HaskellNet-SSL; # bytestring >=0.9 && <0.12
|
||||||
|
raven-haskell = doJailbreak super.raven-haskell; # aeson <2.2
|
||||||
|
stripe-concepts = doJailbreak super.stripe-concepts; # text >=1.2.5 && <1.3 || >=2.0 && <2.1
|
||||||
|
stripe-signature = doJailbreak super.stripe-signature; # text >=1.2.5 && <1.3 || >=2.0 && <2.1
|
||||||
|
string-random = doJailbreak super.string-random; # text >=1.2.2.1 && <2.1
|
||||||
|
inflections = doJailbreak super.inflections; # text >=0.2 && <2.1
|
||||||
|
|
||||||
|
#
|
||||||
|
# Test suite issues
|
||||||
|
#
|
||||||
|
unordered-containers = dontCheck super.unordered-containers; # ChasingBottoms doesn't support base 4.20
|
||||||
|
lifted-base = dontCheck super.lifted-base; # doesn't compile with transformers == 0.6.*
|
||||||
|
hourglass = dontCheck super.hourglass; # umaintained, test suite doesn't compile anymore
|
||||||
|
bsb-http-chunked = dontCheck super.bsb-http-chunked; # umaintained, test suite doesn't compile anymore
|
||||||
|
pcre-heavy = dontCheck super.pcre-heavy; # GHC warnings cause the tests to fail
|
||||||
|
|
||||||
|
#
|
||||||
|
# Other build fixes
|
||||||
|
#
|
||||||
|
|
||||||
|
# 2023-12-23: It needs this to build under ghc-9.6.3.
|
||||||
|
# A factor of 100 is insufficent, 200 seems seems to work.
|
||||||
|
hip = appendConfigureFlag "--ghc-options=-fsimpl-tick-factor=200" super.hip;
|
||||||
|
|
||||||
|
# Fix build with text-2.x.
|
||||||
|
libmpd = appendPatch (pkgs.fetchpatch
|
||||||
|
{ url = "https://github.com/vimus/libmpd-haskell/pull/138.patch";
|
||||||
|
sha256 = "Q4fA2J/Tq+WernBo+UIMdj604ILOMlIYkG4Pr046DfM=";
|
||||||
|
})
|
||||||
|
super.libmpd;
|
||||||
|
|
||||||
|
}
|
133
pkgs/by-name/ha/haskell/haskell-modules/configuration-ghcjs.nix
Normal file
133
pkgs/by-name/ha/haskell/haskell-modules/configuration-ghcjs.nix
Normal file
|
@ -0,0 +1,133 @@
|
||||||
|
# GHCJS package fixes
|
||||||
|
#
|
||||||
|
# Please insert new packages *alphabetically*
|
||||||
|
# in the OTHER PACKAGES section.
|
||||||
|
{ pkgs, haskellLib }:
|
||||||
|
|
||||||
|
let
|
||||||
|
removeLibraryHaskellDepends = pnames: depends:
|
||||||
|
builtins.filter (e: !(builtins.elem (e.pname or "") pnames)) depends;
|
||||||
|
in
|
||||||
|
|
||||||
|
with haskellLib;
|
||||||
|
|
||||||
|
self: super:
|
||||||
|
|
||||||
|
## GENERAL SETUP BASE PACKAGES
|
||||||
|
{
|
||||||
|
inherit (self.ghc.bootPkgs)
|
||||||
|
jailbreak-cabal alex happy gtk2hs-buildtools rehoo hoogle;
|
||||||
|
|
||||||
|
# Test suite fails; https://github.com/ghcjs/ghcjs-base/issues/133
|
||||||
|
ghcjs-base = dontCheck (self.callPackage ../compilers/ghcjs/ghcjs-base.nix {
|
||||||
|
fetchFromGitHub = pkgs.buildPackages.fetchFromGitHub;
|
||||||
|
aeson = self.aeson_1_5_6_0;
|
||||||
|
});
|
||||||
|
|
||||||
|
# GHCJS does not ship with the same core packages as GHC.
|
||||||
|
# https://github.com/ghcjs/ghcjs/issues/676
|
||||||
|
stm = doJailbreak self.stm_2_5_3_0;
|
||||||
|
exceptions = dontCheck self.exceptions_0_10_7;
|
||||||
|
|
||||||
|
## OTHER PACKAGES
|
||||||
|
|
||||||
|
# Runtime exception in tests, missing C API h$realloc
|
||||||
|
base-compat-batteries = dontCheck super.base-compat-batteries;
|
||||||
|
|
||||||
|
# nodejs crashes during test
|
||||||
|
ChasingBottoms = dontCheck super.ChasingBottoms;
|
||||||
|
|
||||||
|
# runs forever
|
||||||
|
text-short = dontCheck super.text-short;
|
||||||
|
|
||||||
|
# doctest doesn't work on ghcjs, but sometimes dontCheck doesn't seem to get rid of the dependency
|
||||||
|
doctest = pkgs.lib.warn "ignoring dependency on doctest" null;
|
||||||
|
|
||||||
|
ghcjs-dom = overrideCabal (drv: {
|
||||||
|
libraryHaskellDepends = with self; [
|
||||||
|
ghcjs-base ghcjs-dom-jsffi text transformers
|
||||||
|
];
|
||||||
|
configureFlags = [ "-fjsffi" "-f-webkit" ];
|
||||||
|
}) super.ghcjs-dom;
|
||||||
|
|
||||||
|
ghcjs-dom-jsffi = overrideCabal (drv: {
|
||||||
|
libraryHaskellDepends = (drv.libraryHaskellDepends or []) ++ [ self.ghcjs-base self.text ];
|
||||||
|
broken = false;
|
||||||
|
}) super.ghcjs-dom-jsffi;
|
||||||
|
|
||||||
|
# https://github.com/Deewiant/glob/issues/39
|
||||||
|
Glob = dontCheck super.Glob;
|
||||||
|
|
||||||
|
# Test fails to compile during the hsc2hs stage
|
||||||
|
hashable = dontCheck super.hashable;
|
||||||
|
|
||||||
|
# uses doctest
|
||||||
|
http-types = dontCheck super.http-types;
|
||||||
|
|
||||||
|
jsaddle = overrideCabal (drv: {
|
||||||
|
libraryHaskellDepends = (drv.libraryHaskellDepends or []) ++ [ self.ghcjs-base ];
|
||||||
|
}) super.jsaddle;
|
||||||
|
|
||||||
|
# Tests hang, possibly some issue with tasty and race(async) usage in the nonTerminating tests
|
||||||
|
logict = dontCheck super.logict;
|
||||||
|
|
||||||
|
patch = dontCheck super.patch;
|
||||||
|
|
||||||
|
# TODO: tests hang
|
||||||
|
pcre-light = dontCheck super.pcre-light;
|
||||||
|
|
||||||
|
# Terminal test not supported on ghcjs
|
||||||
|
QuickCheck = dontCheck super.QuickCheck;
|
||||||
|
|
||||||
|
reflex = overrideCabal (drv: {
|
||||||
|
libraryHaskellDepends = (drv.libraryHaskellDepends or []) ++ [ self.ghcjs-base ];
|
||||||
|
}) super.reflex;
|
||||||
|
|
||||||
|
reflex-dom = overrideCabal (drv: {
|
||||||
|
libraryHaskellDepends = removeLibraryHaskellDepends ["jsaddle-webkit2gtk"] (drv.libraryHaskellDepends or []);
|
||||||
|
}) super.reflex-dom;
|
||||||
|
|
||||||
|
# https://github.com/dreixel/syb/issues/21
|
||||||
|
syb = dontCheck super.syb;
|
||||||
|
|
||||||
|
# nodejs crashes during test
|
||||||
|
scientific = dontCheck super.scientific;
|
||||||
|
|
||||||
|
# Tests use TH which gives error
|
||||||
|
tasty-quickcheck = dontCheck super.tasty-quickcheck;
|
||||||
|
|
||||||
|
temporary = dontCheck super.temporary;
|
||||||
|
|
||||||
|
# 2 tests fail, related to time precision
|
||||||
|
time-compat = dontCheck super.time-compat;
|
||||||
|
|
||||||
|
# TODO: The tests have a TH error, which has been fixed in ghc
|
||||||
|
# https://gitlab.haskell.org/ghc/ghc/-/issues/15481 but somehow the issue is
|
||||||
|
# still present here https://github.com/glguy/th-abstraction/issues/53
|
||||||
|
th-abstraction = dontCheck super.th-abstraction;
|
||||||
|
|
||||||
|
# Need hedgehog for tests, which fails to compile due to dep on concurrent-output
|
||||||
|
zenc = dontCheck super.zenc;
|
||||||
|
|
||||||
|
hspec = self.hspec_2_7_10;
|
||||||
|
hspec-core = self.hspec-core_2_7_10;
|
||||||
|
hspec-meta = self.hspec-meta_2_7_8;
|
||||||
|
hspec-discover = self.hspec-discover_2_7_10;
|
||||||
|
|
||||||
|
# ReferenceError: h$primop_ShrinkSmallMutableArrayOp_Char is not defined
|
||||||
|
unordered-containers = dontCheck super.unordered-containers;
|
||||||
|
|
||||||
|
# Without this revert, test suites using tasty fail with:
|
||||||
|
# ReferenceError: h$getMonotonicNSec is not defined
|
||||||
|
# https://github.com/UnkindPartition/tasty/pull/345#issuecomment-1538216407
|
||||||
|
tasty = appendPatch (pkgs.fetchpatch {
|
||||||
|
name = "tasty-ghcjs.patch";
|
||||||
|
url = "https://github.com/UnkindPartition/tasty/commit/e692065642fd09b82acccea610ad8f49edd207df.patch";
|
||||||
|
revert = true;
|
||||||
|
relative = "core";
|
||||||
|
hash = "sha256-ryABU2ywkVOEPC/jWv8humT3HaRpCwMYEk+Ux3hhi/M=";
|
||||||
|
}) super.tasty;
|
||||||
|
|
||||||
|
# Tests take unacceptably long.
|
||||||
|
vector = dontCheck super.vector;
|
||||||
|
}
|
File diff suppressed because it is too large
Load diff
|
@ -0,0 +1,869 @@
|
||||||
|
# pkgs/development/haskell-modules/configuration-hackage2nix/main.yaml
|
||||||
|
|
||||||
|
# This is a list of packages with versions from the latest Stackage LTS release.
|
||||||
|
#
|
||||||
|
# The packages and versions in this list cause the `hackage2nix` tool to
|
||||||
|
# generate the package at the given version.
|
||||||
|
#
|
||||||
|
# For instance, with a line like the following:
|
||||||
|
#
|
||||||
|
# - aeson ==1.4.6.0
|
||||||
|
#
|
||||||
|
# `hackage2nix` will generate the `aeson` package at version 1.4.6.0 in the
|
||||||
|
# ./hackage-packages.nix file.
|
||||||
|
#
|
||||||
|
# Since the packages in the LTS package set are sometimes older than the latest
|
||||||
|
# on Hackage, `hackage2nix` is smart enough to also generate the latest version
|
||||||
|
# of a given package.
|
||||||
|
#
|
||||||
|
# In the above example with aeson, if there was version 1.5.0.0 of aeson
|
||||||
|
# available on Hackage, `hackage2nix` would generate two packages, `aeson`
|
||||||
|
# at version 1.4.6.0 and `aeson_1_5_0_0` at version 1.5.0.0.
|
||||||
|
#
|
||||||
|
# WARNING: We import a list of default-package-overrides from stackage which is
|
||||||
|
# tracked in stackage.yaml. Adding conflicting overrides with stackage here will
|
||||||
|
# not work.
|
||||||
|
default-package-overrides:
|
||||||
|
# gi-gdkx11-4.x requires gtk-4.x, but stackage still restricts gi-gtk to 3.*
|
||||||
|
- gi-gdkx11 < 4
|
||||||
|
# 2021-11-09: ghc-bignum is bundled starting with 9.0.1; only 1.0 builds with GHCs prior to 9.2.1
|
||||||
|
- ghc-bignum == 1.0
|
||||||
|
|
||||||
|
extra-packages:
|
||||||
|
- Cabal-syntax == 3.6.* # Dummy package that ensures packages depending on Cabal-syntax can work for Cabal < 3.8
|
||||||
|
- Cabal == 3.2.* # Used for packages needing newer Cabal on ghc 8.6 and 8.8
|
||||||
|
- Cabal == 3.6.* # used for packages needing newer Cabal on ghc 8.10 and 9.0
|
||||||
|
- Cabal-syntax == 3.8.* # version required for ormolu and fourmolu on ghc 9.2 and 9.0
|
||||||
|
- Cabal-syntax == 3.10.* # newest version required for cabal-install and other packages
|
||||||
|
- directory == 1.3.7.* # required to build cabal-install 3.10.* with GHC 9.2
|
||||||
|
- Diff < 0.4 # required by liquidhaskell-0.8.10.2: https://github.com/ucsd-progsys/liquidhaskell/issues/1729
|
||||||
|
- aeson < 2 # required by pantry-0.5.2
|
||||||
|
- apply-refact == 0.9.* # 2022-12-12: needed for GHC < 9.2
|
||||||
|
- apply-refact == 0.11.* # 2023-02-02: needed for hls-hlint-plugin on GHC 9.2
|
||||||
|
- attoparsec == 0.13.* # 2022-02-23: Needed to compile elm for now
|
||||||
|
- base16-bytestring < 1 # required for cabal-install etc.
|
||||||
|
- basement < 0.0.15 # 2022-08-30: last version to support GHC < 8.10
|
||||||
|
- bower-json == 1.0.0.1 # 2022-05-21: Needed for spago 0.20.9
|
||||||
|
- brick == 0.70.* # 2022-08-13: needed by taskell
|
||||||
|
- brittany == 0.13.1.2 # 2022-09-20: needed for hls on ghc 8.8
|
||||||
|
- crackNum < 3.0 # 2021-05-21: 3.0 removed the lib which sbv 7.13 uses
|
||||||
|
- dependent-map == 0.2.4.0 # required by Hasura 1.3.1, 2020-08-20
|
||||||
|
- dependent-sum == 0.4 # required by Hasura 1.3.1, 2020-08-20
|
||||||
|
- doctest == 0.18.* # 2021-11-19: closest to stackage version for GHC 9.*
|
||||||
|
- foundation < 0.0.29 # 2022-08-30: last version to support GHC < 8.10
|
||||||
|
- ghc-api-compat == 8.10.7 # 2022-02-17: preserve for GHC 8.10.7
|
||||||
|
- ghc-api-compat == 8.6 # 2021-09-07: preserve for GHC 8.8.4
|
||||||
|
- ghc-exactprint == 0.6.* # 2022-12-12: needed for GHC < 9.2
|
||||||
|
- ghc-exactprint == 1.5.* # 2023-03-30: needed for GHC == 9.2
|
||||||
|
- ghc-exactprint == 1.6.* # 2023-03-30: needed for GHC == 9.4
|
||||||
|
- ghc-lib == 9.2.* # 2022-02-17: preserve for GHC 9.2
|
||||||
|
- ghc-lib-parser == 9.2.* # 2022-02-17: preserve for GHC 9.2
|
||||||
|
- ghc-lib-parser-ex == 9.2.* # 2022-07-13: preserve for GHC 9.2
|
||||||
|
- ghc-syntax-highlighter == 0.0.10.* # 2023-11-20:
|
||||||
|
- gi-soup == 2.4.28 # 2023-04-05: the last version to support libsoup-2.4 (and thus be compatible with our other gi- packages)
|
||||||
|
- haddock == 2.23.* # required on GHC < 8.10.x
|
||||||
|
- haddock-api == 2.23.* # required on GHC < 8.10.x
|
||||||
|
- haddock-library ==1.7.* # required by stylish-cabal-0.5.0.0
|
||||||
|
- happy == 1.19.12 # for ghcjs
|
||||||
|
- hinotify == 0.3.9 # for xmonad-0.26: https://github.com/kolmodin/hinotify/issues/29
|
||||||
|
- ansi-wl-pprint >= 0.6 && < 0.7 # 2024-03-23: required for ghcjs
|
||||||
|
- hlint == 3.2.8 # 2022-09-21: needed for hls on ghc 8.8
|
||||||
|
- hlint == 3.4.1 # 2022-09-21: needed for hls with ghc-lib-parser 9.2
|
||||||
|
- hnix-store-core < 0.7 # 2023-12-11: required by hnix-store-remote 0.6
|
||||||
|
- hspec < 2.8 # 2022-04-07: Needed for tasty-hspec 1.1.6
|
||||||
|
- hspec-core < 2.8 # 2022-04-07: Needed for tasty-hspec 1.1.6
|
||||||
|
- hspec-discover < 2.8 # 2022-04-07: Needed for tasty-hspec 1.1.6
|
||||||
|
- hspec-megaparsec == 2.2.0 # 2023-11-18: Latest version compatible with ghc 9.0, needed for HLS
|
||||||
|
- hspec-meta < 2.8 # 2022-12-07: Needed for elmPackages.elm / hspec-discover
|
||||||
|
- hspec-golden == 0.1.* # 2022-04-07: Needed for elm-format
|
||||||
|
- http2 < 3.3 # 2023-08-24: Needed for twain <https://github.com/alexmingoia/twain/issues/5>
|
||||||
|
- immortal == 0.2.2.1 # required by Hasura 1.3.1, 2020-08-20
|
||||||
|
- language-docker == 11.0.0 # required by hadolint 2.12.0, 2022-11-16
|
||||||
|
- language-javascript == 0.7.0.0 # required by purescript
|
||||||
|
- lens-aeson < 1.2 # 2022-12-17: For aeson < 2.0 compat
|
||||||
|
- lsp == 2.1.0.0 # 2024-02-28: need for dhall-lsp-server unstable
|
||||||
|
- lsp-types == 2.0.2.0 # 2024-02-28: need for dhall-lsp-server unstable
|
||||||
|
- mmorph == 1.1.3 # Newest working version of mmorph on ghc 8.6.5. needed for hls
|
||||||
|
- network == 2.6.3.1 # required by pkgs/games/hedgewars/default.nix, 2020-11-15
|
||||||
|
- optparse-applicative < 0.16 # needed for niv-0.2.19
|
||||||
|
- fourmolu == 0.11.* # 2023-10-22: for hls on ghc 9.0
|
||||||
|
- fourmolu == 0.14.0.0 # 2023-11-13: for ghc-lib-parser 9.6 compat
|
||||||
|
- ormolu == 0.5.2.0 # 2023-08-08: for hls on ghc 9.0 and 9.2
|
||||||
|
- ormolu == 0.7.2.0 # 2023-11-13: for ghc-lib-parser 9.6 compat
|
||||||
|
- primitive-unlifted == 0.1.3.1 # 2024-03-16: Needed for hls on ghc 9.2
|
||||||
|
- path == 0.9.0 # 2021-12-03: path version building with stackage genvalidity and GHC 9.0.2
|
||||||
|
- resolv < 0.2 # required to build cabal-install-3.10.1.0 with Stackage LTS 21
|
||||||
|
- sbv == 7.13 # required for pkgs.petrinizer
|
||||||
|
- stylish-haskell == 0.14.4.0 # 2022-09-19: needed for hls on ghc 9.2
|
||||||
|
- tasty-hspec == 1.1.6 # 2022-04-07: Needed for elm-format
|
||||||
|
- text == 2.0.2 # 2023-09-14: Needed for elm (which is currently on ghc-8.10)
|
||||||
|
- th-abstraction < 0.6 # 2023-09-11: needed for aeson-2.2.0.0
|
||||||
|
- vty == 5.35.1 # 2022-07-08: needed for glirc-2.39.0.1
|
||||||
|
- warp < 3.3.31 # 2024-03-20: for twain, which requires http2 3.0.3
|
||||||
|
- weeder == 2.2.* # 2022-02-21: preserve for GHC 8.10.7
|
||||||
|
- weeder == 2.3.* # 2022-05-31: preserve for GHC 9.0.2
|
||||||
|
- weeder == 2.4.* # 2023-02-02: preserve for GHC 9.2.*
|
||||||
|
- retrie < 1.2.0.0 # 2022-12-30: required for hls on ghc < 9.2
|
||||||
|
- ghc-tags == 1.5.* # 2023-02-18: preserve for ghc-lib == 9.2.*
|
||||||
|
- ghc-tags == 1.6.* # 2023-02-18: preserve for ghc-lib == 9.4.*
|
||||||
|
- shake-cabal < 0.2.2.3 # 2023-07-01: last version to support Cabal 3.6.*
|
||||||
|
- algebraic-graphs < 0.7 # 2023-08-14: Needed for building weeder < 2.6.0
|
||||||
|
- fuzzyset == 0.2.4 # 2023-12-20: Needed for building postgrest > 10
|
||||||
|
- ShellCheck == 0.9.0 # 2024-03-21: pinned by haskell-ci
|
||||||
|
|
||||||
|
package-maintainers:
|
||||||
|
abbradar:
|
||||||
|
- Agda
|
||||||
|
Anton-Latukha:
|
||||||
|
- hnix
|
||||||
|
- hnix-store-core
|
||||||
|
- hnix-store-remote
|
||||||
|
arturcygan:
|
||||||
|
- hevm
|
||||||
|
athas:
|
||||||
|
- futhark
|
||||||
|
berberman:
|
||||||
|
- nvfetcher
|
||||||
|
- arch-web
|
||||||
|
- uusi
|
||||||
|
bdesham:
|
||||||
|
- pinboard-notes-backup
|
||||||
|
cdepillabout:
|
||||||
|
- password
|
||||||
|
- password-instances
|
||||||
|
- pretty-simple
|
||||||
|
- stack
|
||||||
|
- termonad
|
||||||
|
centromere:
|
||||||
|
- nfc
|
||||||
|
dalpd:
|
||||||
|
- dhall-lsp-server
|
||||||
|
- espial
|
||||||
|
- ghc-vis
|
||||||
|
- patat
|
||||||
|
- svgcairo
|
||||||
|
danielrolls:
|
||||||
|
- byte-count-reader
|
||||||
|
- shellify
|
||||||
|
- specup
|
||||||
|
domenkozar:
|
||||||
|
- cachix
|
||||||
|
- cachix-api
|
||||||
|
dschrempf:
|
||||||
|
- circular
|
||||||
|
- covariance
|
||||||
|
- dirichlet
|
||||||
|
- elynx
|
||||||
|
- elynx-markov
|
||||||
|
- elynx-nexus
|
||||||
|
- elynx-seq
|
||||||
|
- elynx-tools
|
||||||
|
- elynx-tree
|
||||||
|
- glasso
|
||||||
|
- mcmc
|
||||||
|
- pava
|
||||||
|
- slynx
|
||||||
|
- tlynx
|
||||||
|
- xmonad
|
||||||
|
- xmonad-contrib
|
||||||
|
expipiplus1:
|
||||||
|
- VulkanMemoryAllocator
|
||||||
|
- autoapply
|
||||||
|
- exact-real
|
||||||
|
- language-c
|
||||||
|
- orbits
|
||||||
|
- update-nix-fetchgit
|
||||||
|
- vector-sized
|
||||||
|
- vulkan
|
||||||
|
- vulkan-utils
|
||||||
|
erictapen:
|
||||||
|
- hakyll
|
||||||
|
evenbrenden:
|
||||||
|
- unleash-client-haskell
|
||||||
|
- unleash-client-haskell-core
|
||||||
|
Gabriella439:
|
||||||
|
- annah
|
||||||
|
- bench
|
||||||
|
- break
|
||||||
|
- dhall-bash
|
||||||
|
- dhall-docs
|
||||||
|
- dhall-json
|
||||||
|
- dhall-lsp-server
|
||||||
|
- dhall-nix
|
||||||
|
- dhall-nixpkgs
|
||||||
|
- dhall-openapi
|
||||||
|
- dhall-text
|
||||||
|
- dhall-yaml
|
||||||
|
- dhall
|
||||||
|
- dirstream
|
||||||
|
- errors
|
||||||
|
- foldl
|
||||||
|
- index-core
|
||||||
|
- lens-tutorial
|
||||||
|
- list-transformer
|
||||||
|
- managed
|
||||||
|
- mmorph
|
||||||
|
- morte
|
||||||
|
- mvc-updates
|
||||||
|
- mvc
|
||||||
|
- nix-derivation
|
||||||
|
- nix-diff
|
||||||
|
- optional-args
|
||||||
|
- optparse-generic
|
||||||
|
- pipes-bytestring
|
||||||
|
- pipes-concurrency
|
||||||
|
- pipes-csv
|
||||||
|
- pipes-extras
|
||||||
|
- pipes-group
|
||||||
|
- pipes-http
|
||||||
|
- pipes-parse
|
||||||
|
- pipes-safe
|
||||||
|
- pipes
|
||||||
|
- server-generic
|
||||||
|
- total
|
||||||
|
- turtle
|
||||||
|
- typed-spreadsheet
|
||||||
|
gebner:
|
||||||
|
- wstunnel
|
||||||
|
gridaphobe:
|
||||||
|
- located-base
|
||||||
|
iblech:
|
||||||
|
- Agda
|
||||||
|
ivanbrennan:
|
||||||
|
- xmonad
|
||||||
|
- xmonad-contrib
|
||||||
|
jb55:
|
||||||
|
# - bson-lens
|
||||||
|
- cased
|
||||||
|
- elm-export-persistent
|
||||||
|
# - pipes-mongodb
|
||||||
|
- streaming-wai
|
||||||
|
kiwi:
|
||||||
|
- config-schema
|
||||||
|
- config-value
|
||||||
|
- glirc
|
||||||
|
- irc-core
|
||||||
|
- matterhorn
|
||||||
|
- mattermost-api
|
||||||
|
- mattermost-api-qc
|
||||||
|
- Unique
|
||||||
|
libjared:
|
||||||
|
- sensei
|
||||||
|
maralorn:
|
||||||
|
- bluefin
|
||||||
|
- cabal-fmt
|
||||||
|
- eventlog2html
|
||||||
|
- falsify
|
||||||
|
- generic-optics
|
||||||
|
- ghc-debug-brick
|
||||||
|
- ghc-debug-stub
|
||||||
|
- ghcid
|
||||||
|
- graphql-client
|
||||||
|
- haskell-language-server
|
||||||
|
- hledger
|
||||||
|
- hledger-ui
|
||||||
|
- hledger-web
|
||||||
|
- hlint
|
||||||
|
- hspec-discover
|
||||||
|
- jsaddle-warp
|
||||||
|
- matrix-client
|
||||||
|
- optics
|
||||||
|
- pandoc
|
||||||
|
- pandoc-cli
|
||||||
|
- pandoc-crossref
|
||||||
|
- postgresql-simple
|
||||||
|
- purebred-email
|
||||||
|
- reflex-dom
|
||||||
|
- replace-megaparsec
|
||||||
|
- req
|
||||||
|
- say
|
||||||
|
- shake-bench
|
||||||
|
- shh
|
||||||
|
- shh-extras
|
||||||
|
- snap
|
||||||
|
- stm-containers
|
||||||
|
- streamly
|
||||||
|
- streamly-bytestring
|
||||||
|
- string-interpolate
|
||||||
|
- taskwarrior
|
||||||
|
- tasty
|
||||||
|
- threadscope
|
||||||
|
- tz
|
||||||
|
- weeder
|
||||||
|
- witch
|
||||||
|
ncfavier:
|
||||||
|
- irc-client
|
||||||
|
- lambdabot
|
||||||
|
- shake
|
||||||
|
nomeata:
|
||||||
|
- cabal-plan-bounds
|
||||||
|
- candid
|
||||||
|
- leb128-cereal
|
||||||
|
- lhs2tex
|
||||||
|
- rec-def
|
||||||
|
- tasty-expected-failure
|
||||||
|
peti:
|
||||||
|
- cabal2spec
|
||||||
|
- funcmp
|
||||||
|
- git-annex
|
||||||
|
- hledger-interest
|
||||||
|
- hopenssl
|
||||||
|
- hsdns
|
||||||
|
- hsemail
|
||||||
|
- hsyslog
|
||||||
|
- logging-facade-syslog
|
||||||
|
- nix-paths
|
||||||
|
- structured-haskell-mode
|
||||||
|
- titlecase
|
||||||
|
- xmonad
|
||||||
|
- xmonad-contrib
|
||||||
|
poscat:
|
||||||
|
- hinit
|
||||||
|
psibi:
|
||||||
|
- path-pieces
|
||||||
|
- persistent
|
||||||
|
- persistent-sqlite
|
||||||
|
- persistent-template
|
||||||
|
- shakespeare
|
||||||
|
raehik:
|
||||||
|
- strongweak
|
||||||
|
- generic-data-functions
|
||||||
|
- binrep
|
||||||
|
- bytepatch
|
||||||
|
- heystone
|
||||||
|
- refined
|
||||||
|
- refined1
|
||||||
|
- flatparse
|
||||||
|
roberth:
|
||||||
|
- arion-compose
|
||||||
|
- cabal-pkg-config-version-hook
|
||||||
|
- hercules-ci-agent
|
||||||
|
- hercules-ci-api
|
||||||
|
- hercules-ci-api-agent
|
||||||
|
- hercules-ci-api-core
|
||||||
|
- hercules-ci-cli
|
||||||
|
- hercules-ci-cnix-expr
|
||||||
|
- hercules-ci-cnix-store
|
||||||
|
- inline-c
|
||||||
|
- inline-c-cpp
|
||||||
|
roosemberth:
|
||||||
|
- git-annex
|
||||||
|
rvl:
|
||||||
|
- taffybar
|
||||||
|
- arbtt
|
||||||
|
- lentil
|
||||||
|
sheepforce:
|
||||||
|
- mpi-hs
|
||||||
|
- mpi-hs-store
|
||||||
|
- mpi-hs-cereal
|
||||||
|
- mpi-hs-binary
|
||||||
|
- cpython
|
||||||
|
- massiv
|
||||||
|
- massiv-io
|
||||||
|
- massiv-test
|
||||||
|
shlok:
|
||||||
|
- streamly-archive
|
||||||
|
- streamly-lmdb
|
||||||
|
slotThe:
|
||||||
|
- X11
|
||||||
|
- X11-xft
|
||||||
|
- html-parse-util
|
||||||
|
- kmonad
|
||||||
|
- optparse-applicative-cmdline-util
|
||||||
|
- xmonad
|
||||||
|
- xmonad-contrib
|
||||||
|
- xmonad-extras
|
||||||
|
sorki:
|
||||||
|
- cayenne-lpp
|
||||||
|
- blockfrost-client
|
||||||
|
- data-lens-light
|
||||||
|
- data-stm32
|
||||||
|
- gcodehs
|
||||||
|
- hnix
|
||||||
|
- hnix-store-core
|
||||||
|
- hnix-store-remote
|
||||||
|
- implicit
|
||||||
|
- nix-derivation
|
||||||
|
- nix-diff
|
||||||
|
- nix-narinfo
|
||||||
|
- ttn
|
||||||
|
- ttn-client
|
||||||
|
- update-nix-fetchgit
|
||||||
|
- zre
|
||||||
|
srid:
|
||||||
|
- ema
|
||||||
|
- emanote
|
||||||
|
sternenseemann:
|
||||||
|
# also maintain upstream package
|
||||||
|
- cabal2nix
|
||||||
|
- distribution-nixpkgs
|
||||||
|
- hackage-db
|
||||||
|
- language-nix
|
||||||
|
- jailbreak-cabal
|
||||||
|
- spacecookie
|
||||||
|
- gopher-proxy
|
||||||
|
# other packages I can help out for
|
||||||
|
- cabal-install
|
||||||
|
- hledger
|
||||||
|
- pandoc
|
||||||
|
- systemd
|
||||||
|
- fast-logger
|
||||||
|
- flat
|
||||||
|
- Euterpea2
|
||||||
|
- utc
|
||||||
|
- socket
|
||||||
|
- gitit
|
||||||
|
- yarn-lock
|
||||||
|
- yarn2nix
|
||||||
|
- large-hashable
|
||||||
|
- haskell-ci
|
||||||
|
- diagrams
|
||||||
|
- rel8
|
||||||
|
- regex-rure
|
||||||
|
- jacinda
|
||||||
|
- citeproc
|
||||||
|
# owothia
|
||||||
|
- irc-client
|
||||||
|
- chatter
|
||||||
|
- envy
|
||||||
|
t4ccer:
|
||||||
|
- aeson-better-errors
|
||||||
|
- cheapskate
|
||||||
|
- containers-unicode-symbols
|
||||||
|
- numerals-base
|
||||||
|
- pattern-arrows
|
||||||
|
tbidne:
|
||||||
|
- rest-rewrite
|
||||||
|
terlar:
|
||||||
|
- nix-diff
|
||||||
|
turion:
|
||||||
|
- Agda
|
||||||
|
- cabal-gild
|
||||||
|
- dunai
|
||||||
|
- essence-of-live-coding
|
||||||
|
- essence-of-live-coding-gloss
|
||||||
|
- essence-of-live-coding-pulse
|
||||||
|
- essence-of-live-coding-quickcheck
|
||||||
|
- essence-of-live-coding-warp
|
||||||
|
- finite-typelits
|
||||||
|
- has-transformers
|
||||||
|
- monad-bayes
|
||||||
|
- monad-schedule
|
||||||
|
- pulse-simple
|
||||||
|
- rhine
|
||||||
|
- rhine-gloss
|
||||||
|
- simple-affine-space
|
||||||
|
- time-domain
|
||||||
|
thielema:
|
||||||
|
- accelerate-arithmetic
|
||||||
|
- accelerate-fftw
|
||||||
|
- accelerate-fourier
|
||||||
|
- accelerate-utility
|
||||||
|
- align-audio
|
||||||
|
- alsa-core
|
||||||
|
- alsa-pcm
|
||||||
|
- alsa-seq
|
||||||
|
- apportionment
|
||||||
|
- audacity
|
||||||
|
- battleship-combinatorics
|
||||||
|
- bibtex
|
||||||
|
- board-games
|
||||||
|
- buffer-pipe
|
||||||
|
- cabal-flatpak
|
||||||
|
- calendar-recycling
|
||||||
|
- checksum
|
||||||
|
- check-pvp
|
||||||
|
- coinor-clp
|
||||||
|
- combinatorial
|
||||||
|
- comfort-graph
|
||||||
|
- comfort-array
|
||||||
|
- comfort-array-shape
|
||||||
|
- comfort-fftw
|
||||||
|
- comfort-glpk
|
||||||
|
- concurrent-split
|
||||||
|
- cutter
|
||||||
|
- data-accessor
|
||||||
|
- data-accessor-mtl
|
||||||
|
- data-accessor-template
|
||||||
|
- data-accessor-transformers
|
||||||
|
- data-ref
|
||||||
|
- doctest-exitcode-stdio
|
||||||
|
- doctest-extract
|
||||||
|
- doctest-lib
|
||||||
|
- dsp
|
||||||
|
- enumset
|
||||||
|
- equal-files
|
||||||
|
- event-list
|
||||||
|
- explicit-exception
|
||||||
|
- fixed-length
|
||||||
|
- fftw-ffi
|
||||||
|
- gnuplot
|
||||||
|
- group-by-date
|
||||||
|
- guarded-allocation
|
||||||
|
- iff
|
||||||
|
- interpolation
|
||||||
|
- jack
|
||||||
|
- latex
|
||||||
|
- lazyio
|
||||||
|
- linear-programming
|
||||||
|
- llvm-ffi
|
||||||
|
- markov-chain
|
||||||
|
- midi
|
||||||
|
- midi-alsa
|
||||||
|
- midi-music-box
|
||||||
|
- mbox-utility
|
||||||
|
- med-module
|
||||||
|
- monoid-transformer
|
||||||
|
- non-empty
|
||||||
|
- non-negative
|
||||||
|
- numeric-prelude
|
||||||
|
- numeric-quest
|
||||||
|
- pathtype
|
||||||
|
- pooled-io
|
||||||
|
- probability
|
||||||
|
- quickcheck-transformer
|
||||||
|
- reactive-midyim
|
||||||
|
- reactive-balsa
|
||||||
|
- reactive-jack
|
||||||
|
- sample-frame
|
||||||
|
- sample-frame-np
|
||||||
|
- set-cover
|
||||||
|
- shell-utility
|
||||||
|
- sound-collage
|
||||||
|
- sox
|
||||||
|
- soxlib
|
||||||
|
- split-record
|
||||||
|
- spreadsheet
|
||||||
|
- stm-split
|
||||||
|
- storable-record
|
||||||
|
- storable-tuple
|
||||||
|
- storablevector
|
||||||
|
- synthesizer-core
|
||||||
|
- synthesizer-dimensional
|
||||||
|
- synthesizer-alsa
|
||||||
|
- synthesizer-midi
|
||||||
|
- tagchup
|
||||||
|
- tfp
|
||||||
|
- unicode
|
||||||
|
- unique-logic
|
||||||
|
- unique-logic-tf
|
||||||
|
- unsafe
|
||||||
|
- utility-ht
|
||||||
|
- wuerfelschlange
|
||||||
|
- xml-basic
|
||||||
|
- youtube
|
||||||
|
- prelude-compat
|
||||||
|
- fft
|
||||||
|
- carray
|
||||||
|
- lapack-ffi-tools
|
||||||
|
- netlib-ffi
|
||||||
|
- blas-ffi
|
||||||
|
- lapack-ffi
|
||||||
|
- netlib-carray
|
||||||
|
- blas-carray
|
||||||
|
- lapack-carray
|
||||||
|
- netlib-comfort-array
|
||||||
|
- blas-comfort-array
|
||||||
|
- lapack-comfort-array
|
||||||
|
- comfort-blas
|
||||||
|
- lapack
|
||||||
|
- lapack-hmatrix
|
||||||
|
- hmm-lapack
|
||||||
|
- magico
|
||||||
|
- resistor-cube
|
||||||
|
- linear-circuit
|
||||||
|
utdemir:
|
||||||
|
- nix-tree
|
||||||
|
zowoq:
|
||||||
|
- ShellCheck
|
||||||
|
|
||||||
|
unsupported-platforms:
|
||||||
|
Allure: [ platforms.darwin ]
|
||||||
|
bdcs-api: [ platforms.darwin ]
|
||||||
|
bindings-directfb: [ platforms.darwin ]
|
||||||
|
bindings-sane: [ platforms.darwin ]
|
||||||
|
bustle: [ platforms.darwin ] # uses glibc-specific ptsname_r
|
||||||
|
bytelog: [ platforms.darwin ] # due to posix-api
|
||||||
|
camfort: [ aarch64-linux ]
|
||||||
|
chalkboard: [ platforms.darwin ] # depends on Codec-Image-DevIL
|
||||||
|
chalkboard-viewer: [ platforms.darwin ] # depends on chalkboard
|
||||||
|
charsetdetect: [ aarch64-linux ] # not supported by vendored lib / not configured properly https://github.com/batterseapower/libcharsetdetect/issues/3
|
||||||
|
Codec-Image-DevIL: [ platforms.darwin ] # depends on mesa
|
||||||
|
coinor-clp: [ aarch64-linux ] # aarch64-linux is not supported by required system dependency clp
|
||||||
|
cut-the-crap: [ platforms.darwin ]
|
||||||
|
essence-of-live-coding-PortMidi: [ platforms.darwin ]
|
||||||
|
Euterpea: [ platforms.darwin ]
|
||||||
|
follow-file: [ platforms.darwin ]
|
||||||
|
freenect: [ platforms.darwin ]
|
||||||
|
FTGL: [ platforms.darwin ]
|
||||||
|
fuzzytime: [ platforms.darwin ] # https://github.com/kamwitsta/fuzzytime/issues/2
|
||||||
|
ghcjs-dom-hello: [ platforms.darwin ]
|
||||||
|
ghc-gc-hook: [ platforms.darwin ] # requires C11 threads which Apple doesn't support
|
||||||
|
gi-adwaita: [ platforms.darwin ]
|
||||||
|
gi-dbusmenugtk3: [ platforms.darwin ]
|
||||||
|
gi-dbusmenu: [ platforms.darwin ]
|
||||||
|
gi-ggit: [ platforms.darwin ]
|
||||||
|
gi-gtk-layer-shell: [ platforms.darwin ] # depends on gtk-layer-shell which is not supported on darwin
|
||||||
|
gi-ibus: [ platforms.darwin ]
|
||||||
|
gi-javascriptcore: [ platforms.darwin ] # webkitgtk marked broken on darwin
|
||||||
|
gi-ostree: [ platforms.darwin ]
|
||||||
|
gi-vte: [ platforms.darwin ]
|
||||||
|
gi-webkit2webextension: [ platforms.darwin ] # webkitgtk marked broken on darwin
|
||||||
|
gi-webkit2: [ platforms.darwin ] # webkitgtk marked broken on darwin
|
||||||
|
gi-wnck: [ platforms.darwin ]
|
||||||
|
gl: [ platforms.darwin ] # depends on mesa
|
||||||
|
GLHUI: [ platforms.darwin ] # depends on mesa
|
||||||
|
gnome-keyring: [ platforms.darwin ]
|
||||||
|
grid-proto: [ platforms.darwin ]
|
||||||
|
gtk-sni-tray: [ platforms.darwin ]
|
||||||
|
h-raylib: [ platforms.darwin ] # depends on mesa
|
||||||
|
haskell-snake: [ platforms.darwin ]
|
||||||
|
hcwiid: [ platforms.darwin ]
|
||||||
|
HDRUtils: [ platforms.darwin ]
|
||||||
|
hinotify-bytestring: [ platforms.darwin ]
|
||||||
|
honk: [ platforms.darwin ]
|
||||||
|
HSoM: [ platforms.darwin ]
|
||||||
|
intricacy: [ platforms.darwin ] # depends on mesa
|
||||||
|
iwlib: [ platforms.darwin ]
|
||||||
|
Jazzkell: [ platforms.darwin ] # depends on Euterpea
|
||||||
|
jsaddle-hello: [ platforms.darwin ] # depends on jsaddle-webkit2gtk
|
||||||
|
jsaddle-webkit2gtk: [ platforms.darwin ]
|
||||||
|
Kulitta: [ platforms.darwin ] # depends on Euterpea
|
||||||
|
LambdaHack: [ platforms.darwin ]
|
||||||
|
large-hashable: [ aarch64-linux ] # https://github.com/factisresearch/large-hashable/issues/17
|
||||||
|
libmodbus: [ platforms.darwin ]
|
||||||
|
libsystemd-journal: [ platforms.darwin ]
|
||||||
|
libtelnet: [ platforms.darwin ]
|
||||||
|
libvirt-hs: [ platforms.darwin ] # spidermonkey is not supported on darwin
|
||||||
|
libzfs: [ platforms.darwin ]
|
||||||
|
linearEqSolver: [ aarch64-linux ]
|
||||||
|
lio-fs: [ platforms.darwin ]
|
||||||
|
logging-facade-journald: [ platforms.darwin ]
|
||||||
|
longshot: [ aarch64-linux ]
|
||||||
|
mpi-hs: [ aarch64-linux, platforms.darwin ]
|
||||||
|
mpi-hs-binary: [ aarch64-linux, platforms.darwin ]
|
||||||
|
mpi-hs-cereal: [ aarch64-linux, platforms.darwin ]
|
||||||
|
mpi-hs-store: [ aarch64-linux, platforms.darwin ]
|
||||||
|
mplayer-spot: [ aarch64-linux, platforms.darwin ]
|
||||||
|
monomer: [ platforms.darwin ] # depends on mesa
|
||||||
|
monomer-hagrid: [ platforms.darwin ] # depends on mesa
|
||||||
|
mptcp-pm: [ platforms.darwin ]
|
||||||
|
mueval: [ aarch64-linux ] # https://hydra.nixos.org/build/257076117/nixlog/2 https://gitlab.haskell.org/ghc/ghc/-/issues/24432
|
||||||
|
nanovg: [ platforms.darwin ] # depends on mesa
|
||||||
|
netlink: [ platforms.darwin ]
|
||||||
|
notifications-tray-icon: [ platforms.darwin ] # depends on gi-dbusmenu
|
||||||
|
oculus: [ platforms.darwin ]
|
||||||
|
ostree-pin: [ platforms.darwin ] # depends on gi-ostree
|
||||||
|
pam: [ platforms.darwin ]
|
||||||
|
parport: [ platforms.darwin ]
|
||||||
|
persist-state: [ aarch64-linux, armv7l-linux ] # https://github.com/minad/persist-state/blob/6fd68c0b8b93dec78218f6d5a1f4fa06ced4e896/src/Data/PersistState.hs#L122-L128
|
||||||
|
piyo: [ platforms.darwin ]
|
||||||
|
PortMidi-simple: [ platforms.darwin ]
|
||||||
|
PortMidi: [ platforms.darwin ]
|
||||||
|
portmidi-utility: [ platforms.darwin ]
|
||||||
|
posix-api: [ platforms.darwin ]
|
||||||
|
Raincat: [ platforms.darwin ]
|
||||||
|
reactive-balsa: [ platforms.darwin ] # depends on alsa-core
|
||||||
|
reflex-dom-fragment-shader-canvas: [ platforms.darwin, aarch64-linux ]
|
||||||
|
reflex-dom: [ platforms.darwin ]
|
||||||
|
reflex-localize-dom: [ platforms.darwin, aarch64-linux ]
|
||||||
|
rsi-break: [ platforms.darwin ] # depends on monomer
|
||||||
|
rtlsdr: [ platforms.darwin ]
|
||||||
|
rubberband: [ platforms.darwin ]
|
||||||
|
SDL-mixer: [ platforms.darwin ] # depends on mesa
|
||||||
|
SDL-mpeg: [ platforms.darwin ] # depends on mesa
|
||||||
|
sdl2-mixer: [ platforms.darwin ]
|
||||||
|
sdl2-ttf: [ platforms.darwin ]
|
||||||
|
sdr: [ platforms.darwin ] # depends on rtlsdr
|
||||||
|
sensei: [ platforms.darwin ]
|
||||||
|
spade: [ platforms.darwin ] # depends on sdl2-mixer, which doesn't work on darwin
|
||||||
|
synthesizer-alsa: [ platforms.darwin ]
|
||||||
|
taffybar: [ platforms.darwin ]
|
||||||
|
twirl: [ platforms.darwin ] # depends on sdl2-mixer
|
||||||
|
emanote: [ x86_64-darwin ] # Depends on stork which is broken on macOS sdk < 10.14
|
||||||
|
termonad: [ platforms.darwin ]
|
||||||
|
tokyotyrant-haskell: [ platforms.darwin ]
|
||||||
|
Unixutils-shadow: [ platforms.darwin ]
|
||||||
|
verifiable-expressions: [ aarch64-linux ]
|
||||||
|
vrpn: [ platforms.darwin ]
|
||||||
|
vulkan: [ i686-linux, armv7l-linux, platforms.darwin ]
|
||||||
|
VulkanMemoryAllocator: [ i686-linux, armv7l-linux, platforms.darwin ]
|
||||||
|
vulkan-utils: [ platforms.darwin ]
|
||||||
|
webkit2gtk3-javascriptcore: [ platforms.darwin ]
|
||||||
|
wiringPi: [ aarch64-darwin ]
|
||||||
|
xattr: [ platforms.darwin ]
|
||||||
|
xgboost-haskell: [ aarch64-linux, armv7l-linux, platforms.darwin ]
|
||||||
|
xmobar: [ platforms.darwin ]
|
||||||
|
xmonad-extras: [ platforms.darwin ]
|
||||||
|
xmonad-volume: [ platforms.darwin ]
|
||||||
|
|
||||||
|
supported-platforms:
|
||||||
|
AWin32Console: [ platforms.windows ]
|
||||||
|
alsa-mixer: [ platforms.linux ]
|
||||||
|
alsa-pcm: [ platforms.linux ]
|
||||||
|
alsa-seq: [ platforms.linux ]
|
||||||
|
barbly: [ platforms.darwin ]
|
||||||
|
bindings-parport: [ platforms.linux ] # parport is a linux kernel component
|
||||||
|
blake3: [ platforms.x86 ] # uses x86 intrinsics
|
||||||
|
btrfs: [ platforms.linux ] # depends on linux
|
||||||
|
bytepatch: [ platforms.x86 ] # due to blake3
|
||||||
|
cpuid: [ platforms.x86 ] # needs to be i386 compatible (IA-32)
|
||||||
|
cpython: [ platforms.x86 ] # c2hs errors on glibc headers
|
||||||
|
crc32c: [ platforms.x86 ] # uses x86 intrinsics
|
||||||
|
d3d11binding: [ platforms.windows ]
|
||||||
|
DirectSound: [ platforms.windows ]
|
||||||
|
dx9base: [ platforms.windows ]
|
||||||
|
dx9d3d: [ platforms.windows ]
|
||||||
|
dx9d3dx: [ platforms.windows ]
|
||||||
|
evdev: [ platforms.linux ]
|
||||||
|
evdev-streamly: [ platforms.linux ]
|
||||||
|
geomancy: [ platforms.x86 ] # x86 intrinsics
|
||||||
|
geomancy-layout: [ platforms.x86 ] # x86 intrinsics
|
||||||
|
gi-gtkosxapplication: [ platforms.darwin ]
|
||||||
|
gtk-mac-integration: [ platforms.darwin ]
|
||||||
|
gtk3-mac-integration: [ platforms.darwin ]
|
||||||
|
halide-haskell: [ platforms.linux ]
|
||||||
|
halide-JuicyPixels: [ platforms.linux ]
|
||||||
|
hb3sum: [ platforms.x86 ] # due to blake3
|
||||||
|
hommage-ds: [ platforms.windows ]
|
||||||
|
hpapi: [ platforms.linux ] # limited by pkgs.papi
|
||||||
|
hsignal: [ platforms.x86 ] # -msse2
|
||||||
|
HFuse: [ platforms.linux ]
|
||||||
|
HQu: [ platforms.x86 ] # vendored C++ library needs i686/x86_64
|
||||||
|
hs-swisstable-hashtables-class: [ platforms.x86_64 ] # depends on swisstable, which Needs AVX2
|
||||||
|
htune: [ platforms.linux ] # depends on alsa-pcm
|
||||||
|
hw-prim-bits: [ platforms.x86 ] # x86 assembler
|
||||||
|
inline-asm: [ platforms.x86 ] # x86 assembler
|
||||||
|
keid-core: [ x86_64-linux ] # geomancy (only x86), vulkan (no i686, no darwin, …)
|
||||||
|
keid-frp-banana: [ x86_64-linux ] # geomancy (only x86), vulkan (no i686, no darwin, …)
|
||||||
|
keid-geometry: [ x86_64-linux ] # geomancy (only x86), vulkan (no i686, no darwin, …)
|
||||||
|
keid-render-basic: [ x86_64-linux ] # geomancy (only x86), vulkan (no i686, no darwin, …)
|
||||||
|
keid-resource-gltf: [ x86_64-linux ] # geomancy (only x86), vulkan (no i686, no darwin, …)
|
||||||
|
keid-sound-openal: [ x86_64-linux ] # geomancy (only x86), vulkan (no i686, no darwin, …)
|
||||||
|
keid-ui-dearimgui: [ x86_64-linux ] # geomancy (only x86), vulkan (no i686, no darwin, …)
|
||||||
|
kqueue: [ platforms.netbsd, platforms.freebsd, platforms.openbsd, platforms.darwin ]
|
||||||
|
libfuse3: [ platforms.linux ]
|
||||||
|
linux-evdev: [ platforms.linux ]
|
||||||
|
linux-file-extents: [ platforms.linux ]
|
||||||
|
linux-inotify: [ platforms.linux ]
|
||||||
|
linux-mount: [ platforms.linux ]
|
||||||
|
linux-namespaces: [ platforms.linux ]
|
||||||
|
lxc: [ platforms.linux ]
|
||||||
|
memfd: [ platforms.linux ]
|
||||||
|
midi-alsa: [ platforms.linux ] # alsa-core only supported on linux
|
||||||
|
midisurface: [ platforms.linux ] # alsa-core only supported on linux
|
||||||
|
OrderedBits: [ platforms.x86 ] # lacks implementations for non-x86: https://github.com/choener/OrderedBits/blob/401cbbe933b1635aa33e8e9b29a4a570b0a8f044/lib/Data/Bits/Ordered.hs#L316
|
||||||
|
password: [ platforms.x86 ] # uses scrypt, which requries x86
|
||||||
|
password-instances: [ platforms.x86 ] # uses scrypt, which requries x86
|
||||||
|
reactivity: [ platforms.windows ]
|
||||||
|
reflex-libtelnet: [ platforms.linux ] # pkgs.libtelnet only supports linux
|
||||||
|
scat: [ platforms.x86 ] # uses scrypt, which requries x86
|
||||||
|
scrypt: [ platforms.x86 ] # https://github.com/informatikr/scrypt/issues/8
|
||||||
|
seqalign: [ platforms.x86 ] # x86 intrinsics
|
||||||
|
streamed: [ platforms.linux] # alsa-core only supported on linux
|
||||||
|
swisstable: [ platforms.x86_64 ] # Needs AVX2
|
||||||
|
systemd-api: [ platforms.linux ]
|
||||||
|
tasty-papi: [ platforms.linux ] # limited by pkgs.papi
|
||||||
|
tcod-haskell: [ platforms.linux ] # limited by pkgs.libtcod
|
||||||
|
udev: [ platforms.linux ]
|
||||||
|
vty-windows: [ platforms.windows ] # depends on Win32
|
||||||
|
Win32-console: [ platforms.windows ]
|
||||||
|
Win32-dhcp-server: [ platforms.windows ]
|
||||||
|
Win32-errors: [ platforms.windows ]
|
||||||
|
Win32-extras: [ platforms.windows ]
|
||||||
|
Win32-junction-point: [ platforms.windows ]
|
||||||
|
Win32-notify: [ platforms.windows ]
|
||||||
|
Win32: [ platforms.windows ]
|
||||||
|
Win32-security: [ platforms.windows ]
|
||||||
|
Win32-services: [ platforms.windows ]
|
||||||
|
Win32-services-wrapper: [ platforms.windows ]
|
||||||
|
XInput: [ platforms.windows ]
|
||||||
|
yesod-auth-simple: [ platforms.x86 ] # requires scrypt which only supports x86
|
||||||
|
|
||||||
|
dont-distribute-packages:
|
||||||
|
# Depends on shine, which is a ghcjs project.
|
||||||
|
- shine-varying
|
||||||
|
|
||||||
|
# these packages depend on software with an unfree license
|
||||||
|
- accelerate-bignum
|
||||||
|
- accelerate-blas
|
||||||
|
- accelerate-cublas
|
||||||
|
- accelerate-cuda
|
||||||
|
- accelerate-cufft
|
||||||
|
- accelerate-examples
|
||||||
|
- accelerate-fft
|
||||||
|
- accelerate-fourier-benchmark
|
||||||
|
- accelerate-io-array
|
||||||
|
- accelerate-io-bmp
|
||||||
|
- accelerate-io-bytestring
|
||||||
|
- accelerate-io-cereal
|
||||||
|
- accelerate-io-JuicyPixels
|
||||||
|
- accelerate-io-repa
|
||||||
|
- accelerate-io-vector
|
||||||
|
- accelerate-kullback-liebler
|
||||||
|
- accelerate-llvm-ptx
|
||||||
|
- bindings-yices
|
||||||
|
- boolector
|
||||||
|
- ccelerate-cuda
|
||||||
|
- containers-accelerate
|
||||||
|
- cplex-hs
|
||||||
|
- cublas
|
||||||
|
- cuda # 2020-08-18 because of dependency nvidia-x11
|
||||||
|
- cufft
|
||||||
|
- cusolver
|
||||||
|
- cusparse
|
||||||
|
- gloss-raster-accelerate
|
||||||
|
- hashable-accelerate
|
||||||
|
- libnvvm
|
||||||
|
- matlab
|
||||||
|
- nvvm
|
||||||
|
- Obsidian
|
||||||
|
- odpic-raw
|
||||||
|
- patch-image
|
||||||
|
# license for input data unclear, dependency not on Hackage
|
||||||
|
# see https://github.com/NixOS/nixpkgs/pull/88604
|
||||||
|
- tensorflow-mnist
|
||||||
|
- yices-easy
|
||||||
|
- yices-painless
|
||||||
|
|
||||||
|
# These packages don’t build because they use deprecated webkit versions.
|
||||||
|
- diagrams-hsqml
|
||||||
|
- dialog
|
||||||
|
- ghcjs-dom-webkit
|
||||||
|
- gi-webkit
|
||||||
|
- hsqml
|
||||||
|
- hsqml-datamodel
|
||||||
|
- hsqml-datamodel-vinyl
|
||||||
|
- hsqml-demo-manic
|
||||||
|
- hsqml-demo-morris
|
||||||
|
- hsqml-demo-notes
|
||||||
|
- hsqml-demo-samples
|
||||||
|
- hsqml-morris
|
||||||
|
- hstorchat
|
||||||
|
- jsaddle-webkitgtk
|
||||||
|
- jsc
|
||||||
|
- lambdacat
|
||||||
|
- manatee-all
|
||||||
|
- manatee-browser
|
||||||
|
- manatee-reader
|
||||||
|
- markup-preview
|
||||||
|
- spike
|
||||||
|
- web-browser-in-haskell
|
||||||
|
- webkit
|
||||||
|
- webkitgtk3-javascriptcore
|
||||||
|
- websnap
|
||||||
|
|
||||||
|
# mesos was removed from nixpkgs
|
||||||
|
- hs-mesos
|
||||||
|
|
||||||
|
# Output exceeds Hydra's maximum allowable size
|
||||||
|
- stripeapi
|
||||||
|
|
||||||
|
# Packages that (transitively) depend on insecure packages
|
||||||
|
- distributed-process-zookeeper # depends on hzk
|
||||||
|
- HDRUtils # depends on pfstools, which depends on imagemagick
|
||||||
|
- hzk # depends on zookeeper_mt, which depends on openssl-1.1
|
||||||
|
- jobqueue # depends on hzk
|
||||||
|
- persistent-zookeeper # depends on hzk
|
||||||
|
- pocket-dns # depends on persistent-zookeeper
|
||||||
|
- zoovisitor # depends on zookeeper_mt, which depends on openssl-1.1
|
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
1380
pkgs/by-name/ha/haskell/haskell-modules/configuration-nix.nix
Normal file
1380
pkgs/by-name/ha/haskell/haskell-modules/configuration-nix.nix
Normal file
File diff suppressed because it is too large
Load diff
|
@ -0,0 +1,37 @@
|
||||||
|
{ pkgs, haskellLib }:
|
||||||
|
|
||||||
|
with haskellLib;
|
||||||
|
|
||||||
|
self: super:
|
||||||
|
let
|
||||||
|
# This contains updates to the dependencies, without which it would
|
||||||
|
# be even more work to get it to build.
|
||||||
|
# As of 2020-04, there's no new release in sight, which is why we're
|
||||||
|
# pulling from Github.
|
||||||
|
tensorflow-haskell = pkgs.fetchFromGitHub {
|
||||||
|
owner = "tensorflow";
|
||||||
|
repo = "haskell";
|
||||||
|
rev = "555d90c43202d5a3021893013bfc8e2ffff58c97";
|
||||||
|
sha256 = "uOuIeD4o+pcjvluTqyVU3GJUQ4e1+p3FhINJ9b6oK+k=";
|
||||||
|
fetchSubmodules = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
setTensorflowSourceRoot = dir: drv:
|
||||||
|
(overrideCabal (drv: { src = tensorflow-haskell; }) drv)
|
||||||
|
.overrideAttrs (_oldAttrs: { sourceRoot = "${tensorflow-haskell.name}/${dir}"; });
|
||||||
|
in
|
||||||
|
{
|
||||||
|
tensorflow-proto = doJailbreak (setTensorflowSourceRoot "tensorflow-proto" super.tensorflow-proto);
|
||||||
|
|
||||||
|
tensorflow = overrideCabal
|
||||||
|
(drv: { libraryHaskellDepends = drv.libraryHaskellDepends ++ [self.vector-split]; })
|
||||||
|
(setTensorflowSourceRoot "tensorflow" super.tensorflow);
|
||||||
|
|
||||||
|
tensorflow-core-ops = setTensorflowSourceRoot "tensorflow-core-ops" super.tensorflow-core-ops;
|
||||||
|
|
||||||
|
tensorflow-logging = setTensorflowSourceRoot "tensorflow-logging" super.tensorflow-logging;
|
||||||
|
|
||||||
|
tensorflow-opgen = setTensorflowSourceRoot "tensorflow-opgen" super.tensorflow-opgen;
|
||||||
|
|
||||||
|
tensorflow-ops = setTensorflowSourceRoot "tensorflow-ops" super.tensorflow-ops;
|
||||||
|
}
|
45
pkgs/by-name/ha/haskell/haskell-modules/default.nix
Normal file
45
pkgs/by-name/ha/haskell/haskell-modules/default.nix
Normal file
|
@ -0,0 +1,45 @@
|
||||||
|
{ pkgs, stdenv, lib, haskellLib, ghc, all-cabal-hashes
|
||||||
|
, buildHaskellPackages
|
||||||
|
, compilerConfig ? (self: super: {})
|
||||||
|
, packageSetConfig ? (self: super: {})
|
||||||
|
, overrides ? (self: super: {})
|
||||||
|
, initialPackages ? import ./initial-packages.nix
|
||||||
|
, nonHackagePackages ? import ./non-hackage-packages.nix
|
||||||
|
, configurationCommon ? import ./configuration-common.nix
|
||||||
|
, configurationNix ? import ./configuration-nix.nix
|
||||||
|
, configurationArm ? import ./configuration-arm.nix
|
||||||
|
, configurationDarwin ? import ./configuration-darwin.nix
|
||||||
|
}:
|
||||||
|
|
||||||
|
let
|
||||||
|
|
||||||
|
inherit (lib) extends makeExtensible;
|
||||||
|
inherit (haskellLib) makePackageSet;
|
||||||
|
|
||||||
|
haskellPackages = pkgs.callPackage makePackageSet {
|
||||||
|
package-set = initialPackages;
|
||||||
|
inherit stdenv haskellLib ghc extensible-self all-cabal-hashes;
|
||||||
|
buildHaskellPackages = buildHaskellPackages // { __attrsFailEvaluation = true; };
|
||||||
|
};
|
||||||
|
|
||||||
|
platformConfigurations = lib.optionals stdenv.hostPlatform.isAarch [
|
||||||
|
(configurationArm { inherit pkgs haskellLib; })
|
||||||
|
] ++ lib.optionals stdenv.hostPlatform.isDarwin [
|
||||||
|
(configurationDarwin { inherit pkgs haskellLib; })
|
||||||
|
];
|
||||||
|
|
||||||
|
extensions = lib.composeManyExtensions ([
|
||||||
|
(nonHackagePackages { inherit pkgs haskellLib; })
|
||||||
|
(configurationNix { inherit pkgs haskellLib; })
|
||||||
|
(configurationCommon { inherit pkgs haskellLib; })
|
||||||
|
] ++ platformConfigurations ++ [
|
||||||
|
compilerConfig
|
||||||
|
packageSetConfig
|
||||||
|
overrides
|
||||||
|
]);
|
||||||
|
|
||||||
|
extensible-self = makeExtensible (extends extensions haskellPackages);
|
||||||
|
|
||||||
|
in
|
||||||
|
|
||||||
|
extensible-self
|
818
pkgs/by-name/ha/haskell/haskell-modules/generic-builder.nix
Normal file
818
pkgs/by-name/ha/haskell/haskell-modules/generic-builder.nix
Normal file
|
@ -0,0 +1,818 @@
|
||||||
|
{ lib, stdenv, buildPackages, buildHaskellPackages, ghc
|
||||||
|
, jailbreak-cabal, hscolour, cpphs
|
||||||
|
, ghcWithHoogle, ghcWithPackages
|
||||||
|
, nodejs
|
||||||
|
}:
|
||||||
|
|
||||||
|
let
|
||||||
|
isCross = stdenv.buildPlatform != stdenv.hostPlatform;
|
||||||
|
|
||||||
|
# Pass the "wrong" C compiler rather than none at all so packages that just
|
||||||
|
# use the C preproccessor still work, see
|
||||||
|
# https://github.com/haskell/cabal/issues/6466 for details.
|
||||||
|
cc =
|
||||||
|
if stdenv.hasCC then "$CC"
|
||||||
|
else if stdenv.hostPlatform.isGhcjs then "${emscripten}/bin/emcc"
|
||||||
|
else "$CC_FOR_BUILD";
|
||||||
|
|
||||||
|
inherit (buildPackages)
|
||||||
|
fetchurl removeReferencesTo
|
||||||
|
pkg-config coreutils gnugrep glibcLocales
|
||||||
|
emscripten;
|
||||||
|
in
|
||||||
|
|
||||||
|
{ pname
|
||||||
|
# Note that ghc.isGhcjs != stdenv.hostPlatform.isGhcjs.
|
||||||
|
# ghc.isGhcjs implies that we are using ghcjs, a project separate from GHC.
|
||||||
|
# (mere) stdenv.hostPlatform.isGhcjs means that we are using GHC's JavaScript
|
||||||
|
# backend. The latter is a normal cross compilation backend and needs little
|
||||||
|
# special accommodation.
|
||||||
|
, dontStrip ? (ghc.isGhcjs or false || stdenv.hostPlatform.isGhcjs)
|
||||||
|
, version, revision ? null
|
||||||
|
, sha256 ? null
|
||||||
|
, src ? fetchurl { url = "mirror://hackage/${pname}-${version}.tar.gz"; inherit sha256; }
|
||||||
|
, buildDepends ? [], setupHaskellDepends ? [], libraryHaskellDepends ? [], executableHaskellDepends ? []
|
||||||
|
, buildTarget ? ""
|
||||||
|
, buildTools ? [], libraryToolDepends ? [], executableToolDepends ? [], testToolDepends ? [], benchmarkToolDepends ? []
|
||||||
|
, configureFlags ? []
|
||||||
|
, buildFlags ? []
|
||||||
|
, haddockFlags ? []
|
||||||
|
, description ? null
|
||||||
|
, doCheck ? !isCross
|
||||||
|
, doBenchmark ? false
|
||||||
|
, doHoogle ? true
|
||||||
|
, doHaddockQuickjump ? doHoogle
|
||||||
|
, doInstallIntermediates ? false
|
||||||
|
, editedCabalFile ? null
|
||||||
|
, enableLibraryProfiling ? !(ghc.isGhcjs or false)
|
||||||
|
, enableExecutableProfiling ? false
|
||||||
|
, profilingDetail ? "exported-functions"
|
||||||
|
# TODO enable shared libs for cross-compiling
|
||||||
|
, enableSharedExecutables ? false
|
||||||
|
, enableSharedLibraries ? !stdenv.hostPlatform.isStatic && (ghc.enableShared or false)
|
||||||
|
, enableDeadCodeElimination ? (!stdenv.isDarwin) # TODO: use -dead_strip for darwin
|
||||||
|
# Disabling this for ghcjs prevents this crash: https://gitlab.haskell.org/ghc/ghc/-/issues/23235
|
||||||
|
, enableStaticLibraries ? !(stdenv.hostPlatform.isWindows || stdenv.hostPlatform.isWasm || stdenv.hostPlatform.isGhcjs)
|
||||||
|
, enableHsc2hsViaAsm ? stdenv.hostPlatform.isWindows
|
||||||
|
, extraLibraries ? [], librarySystemDepends ? [], executableSystemDepends ? []
|
||||||
|
# On macOS, statically linking against system frameworks is not supported;
|
||||||
|
# see https://developer.apple.com/library/content/qa/qa1118/_index.html
|
||||||
|
# They must be propagated to the environment of any executable linking with the library
|
||||||
|
, libraryFrameworkDepends ? [], executableFrameworkDepends ? []
|
||||||
|
, homepage ? "https://hackage.haskell.org/package/${pname}"
|
||||||
|
, platforms ? with lib.platforms; all # GHC can cross-compile
|
||||||
|
, badPlatforms ? lib.platforms.none
|
||||||
|
, hydraPlatforms ? null
|
||||||
|
, hyperlinkSource ? true
|
||||||
|
, isExecutable ? false, isLibrary ? !isExecutable
|
||||||
|
, jailbreak ? false
|
||||||
|
, license
|
||||||
|
, enableParallelBuilding ? true
|
||||||
|
, maintainers ? null
|
||||||
|
, changelog ? null
|
||||||
|
, mainProgram ? null
|
||||||
|
, doCoverage ? false
|
||||||
|
, doHaddock ? !(ghc.isHaLVM or false) && (ghc.hasHaddock or true)
|
||||||
|
, doHaddockInterfaces ? doHaddock && lib.versionAtLeast ghc.version "9.0.1"
|
||||||
|
, passthru ? {}
|
||||||
|
, pkg-configDepends ? [], libraryPkgconfigDepends ? [], executablePkgconfigDepends ? [], testPkgconfigDepends ? [], benchmarkPkgconfigDepends ? []
|
||||||
|
, testDepends ? [], testHaskellDepends ? [], testSystemDepends ? [], testFrameworkDepends ? []
|
||||||
|
, benchmarkDepends ? [], benchmarkHaskellDepends ? [], benchmarkSystemDepends ? [], benchmarkFrameworkDepends ? []
|
||||||
|
, testTarget ? "", testFlags ? []
|
||||||
|
, broken ? false
|
||||||
|
, preCompileBuildDriver ? null, postCompileBuildDriver ? null
|
||||||
|
, preUnpack ? null, postUnpack ? null
|
||||||
|
, patches ? null, patchPhase ? null, prePatch ? "", postPatch ? ""
|
||||||
|
, preConfigure ? null, postConfigure ? null
|
||||||
|
, preBuild ? null, postBuild ? null
|
||||||
|
, preHaddock ? null, postHaddock ? null
|
||||||
|
, installPhase ? null, preInstall ? null, postInstall ? null
|
||||||
|
, checkPhase ? null, preCheck ? null, postCheck ? null
|
||||||
|
, preFixup ? null, postFixup ? null
|
||||||
|
, shellHook ? ""
|
||||||
|
, coreSetup ? false # Use only core packages to build Setup.hs.
|
||||||
|
, useCpphs ? false
|
||||||
|
, hardeningDisable ? null
|
||||||
|
, enableSeparateBinOutput ? false
|
||||||
|
, enableSeparateDataOutput ? false
|
||||||
|
, enableSeparateDocOutput ? doHaddock
|
||||||
|
, enableSeparateIntermediatesOutput ? false
|
||||||
|
, # Don't fail at configure time if there are multiple versions of the
|
||||||
|
# same package in the (recursive) dependencies of the package being
|
||||||
|
# built. Will delay failures, if any, to compile time.
|
||||||
|
allowInconsistentDependencies ? false
|
||||||
|
, maxBuildCores ? 16 # more cores usually don't improve performance: https://ghc.haskell.org/trac/ghc/ticket/9221
|
||||||
|
, # If set to true, this builds a pre-linked .o file for this Haskell library.
|
||||||
|
# This can make it slightly faster to load this library into GHCi, but takes
|
||||||
|
# extra disk space and compile time.
|
||||||
|
enableLibraryForGhci ? false
|
||||||
|
# Set this to a previous build of this same package to reuse the intermediate
|
||||||
|
# build products from that prior build as a starting point for accelerating
|
||||||
|
# this build
|
||||||
|
, previousIntermediates ? null
|
||||||
|
, # Cabal 3.8 which is shipped by default for GHC >= 9.3 always calls
|
||||||
|
# `pkg-config --libs --static` as part of the configure step. This requires
|
||||||
|
# Requires.private dependencies of pkg-config dependencies to be present in
|
||||||
|
# PKG_CONFIG_PATH which is normally not the case in nixpkgs (except in pkgsStatic).
|
||||||
|
# Since there is no patch or upstream patch yet, we replicate the automatic
|
||||||
|
# propagation of dependencies in pkgsStatic for allPkgConfigDepends for
|
||||||
|
# GHC >= 9.3 by default. This option allows overriding this behavior manually
|
||||||
|
# if mismatching Cabal and GHC versions are used.
|
||||||
|
# See also <https://github.com/haskell/cabal/issues/8455>.
|
||||||
|
__propagatePkgConfigDepends ? lib.versionAtLeast ghc.version "9.3"
|
||||||
|
, # Propagation can easily lead to the argv limit being exceeded in linker or C
|
||||||
|
# compiler invocations. To work around this we can only propagate derivations
|
||||||
|
# that are known to provide pkg-config modules, as indicated by the presence
|
||||||
|
# of `meta.pkgConfigModules`. This option defaults to false for now, since
|
||||||
|
# this metadata is far from complete in nixpkgs.
|
||||||
|
__onlyPropagateKnownPkgConfigModules ? false
|
||||||
|
} @ args:
|
||||||
|
|
||||||
|
assert editedCabalFile != null -> revision != null;
|
||||||
|
|
||||||
|
# --enable-static does not work on windows. This is a bug in GHC.
|
||||||
|
# --enable-static will pass -staticlib to ghc, which only works for mach-o and elf.
|
||||||
|
assert stdenv.hostPlatform.isWindows -> enableStaticLibraries == false;
|
||||||
|
assert stdenv.hostPlatform.isWasm -> enableStaticLibraries == false;
|
||||||
|
|
||||||
|
let
|
||||||
|
|
||||||
|
inherit (lib) optional optionals optionalString versionAtLeast
|
||||||
|
concatStringsSep enableFeature optionalAttrs;
|
||||||
|
|
||||||
|
isGhcjs = ghc.isGhcjs or false;
|
||||||
|
isHaLVM = ghc.isHaLVM or false;
|
||||||
|
|
||||||
|
# GHC used for building Setup.hs
|
||||||
|
#
|
||||||
|
# Same as our GHC, unless we're cross, in which case it is native GHC with the
|
||||||
|
# same version, or ghcjs, in which case its the ghc used to build ghcjs.
|
||||||
|
nativeGhc = buildHaskellPackages.ghc;
|
||||||
|
|
||||||
|
# the target dir for haddock documentation
|
||||||
|
docdir = docoutput: docoutput + "/share/doc/" + pname + "-" + version;
|
||||||
|
|
||||||
|
binDir = if enableSeparateBinOutput then "$bin/bin" else "$out/bin";
|
||||||
|
|
||||||
|
newCabalFileUrl = "mirror://hackage/${pname}-${version}/revision/${revision}.cabal";
|
||||||
|
newCabalFile = fetchurl {
|
||||||
|
url = newCabalFileUrl;
|
||||||
|
sha256 = editedCabalFile;
|
||||||
|
name = "${pname}-${version}-r${revision}.cabal";
|
||||||
|
};
|
||||||
|
|
||||||
|
defaultSetupHs = builtins.toFile "Setup.hs" ''
|
||||||
|
import Distribution.Simple
|
||||||
|
main = defaultMain
|
||||||
|
'';
|
||||||
|
|
||||||
|
# This awk expression transforms a package conf file like
|
||||||
|
#
|
||||||
|
# author: John Doe <john-doe@example.com>
|
||||||
|
# description:
|
||||||
|
# The purpose of this library is to do
|
||||||
|
# foo and bar among other things
|
||||||
|
#
|
||||||
|
# into a more easily processeable form:
|
||||||
|
#
|
||||||
|
# author: John Doe <john-doe@example.com>
|
||||||
|
# description: The purpose of this library is to do foo and bar among other things
|
||||||
|
unprettyConf = builtins.toFile "unpretty-cabal-conf.awk" ''
|
||||||
|
/^[^ ]+:/ {
|
||||||
|
# When the line starts with a new field, terminate the previous one with a newline
|
||||||
|
if (started == 1) print ""
|
||||||
|
# to strip leading spaces
|
||||||
|
$1=$1
|
||||||
|
printf "%s", $0
|
||||||
|
started=1
|
||||||
|
}
|
||||||
|
|
||||||
|
/^ +/ {
|
||||||
|
# to strip leading spaces
|
||||||
|
$1=$1
|
||||||
|
printf " %s", $0
|
||||||
|
}
|
||||||
|
|
||||||
|
# Terminate the final field with a newline
|
||||||
|
END { print "" }
|
||||||
|
'';
|
||||||
|
|
||||||
|
crossCabalFlags = [
|
||||||
|
"--with-ghc=${ghcCommand}"
|
||||||
|
"--with-ghc-pkg=${ghc.targetPrefix}ghc-pkg"
|
||||||
|
"--with-gcc=${cc}"
|
||||||
|
] ++ optionals stdenv.hasCC [
|
||||||
|
"--with-ld=${stdenv.cc.bintools.targetPrefix}ld"
|
||||||
|
"--with-ar=${stdenv.cc.bintools.targetPrefix}ar"
|
||||||
|
# use the one that comes with the cross compiler.
|
||||||
|
"--with-hsc2hs=${ghc.targetPrefix}hsc2hs"
|
||||||
|
"--with-strip=${stdenv.cc.bintools.targetPrefix}strip"
|
||||||
|
] ++ optionals (!isHaLVM) [
|
||||||
|
"--hsc2hs-option=--cross-compile"
|
||||||
|
(optionalString enableHsc2hsViaAsm "--hsc2hs-option=--via-asm")
|
||||||
|
] ++ optional (allPkgconfigDepends != [])
|
||||||
|
"--with-pkg-config=${pkg-config.targetPrefix}pkg-config";
|
||||||
|
|
||||||
|
parallelBuildingFlags = "-j$NIX_BUILD_CORES" + optionalString stdenv.isLinux " +RTS -A64M -RTS";
|
||||||
|
|
||||||
|
crossCabalFlagsString =
|
||||||
|
lib.optionalString isCross (" " + lib.concatStringsSep " " crossCabalFlags);
|
||||||
|
|
||||||
|
buildFlagsString = optionalString (buildFlags != []) (" " + concatStringsSep " " buildFlags);
|
||||||
|
|
||||||
|
defaultConfigureFlags = [
|
||||||
|
"--verbose"
|
||||||
|
"--prefix=$out"
|
||||||
|
# Note: This must be kept in sync manually with mkGhcLibdir
|
||||||
|
("--libdir=\\$prefix/lib/\\$compiler" + lib.optionalString (ghc ? hadrian) "/lib")
|
||||||
|
"--libsubdir=\\$abi/\\$libname"
|
||||||
|
(optionalString enableSeparateDataOutput "--datadir=$data/share/${ghcNameWithPrefix}")
|
||||||
|
(optionalString enableSeparateDocOutput "--docdir=${docdir "$doc"}")
|
||||||
|
] ++ optionals stdenv.hasCC [
|
||||||
|
"--with-gcc=$CC" # Clang won't work without that extra information.
|
||||||
|
] ++ [
|
||||||
|
"--package-db=$packageConfDir"
|
||||||
|
(optionalString (enableSharedExecutables && stdenv.isLinux) "--ghc-option=-optl=-Wl,-rpath=$out/${ghcLibdir}/${pname}-${version}")
|
||||||
|
(optionalString (enableSharedExecutables && stdenv.isDarwin) "--ghc-option=-optl=-Wl,-headerpad_max_install_names")
|
||||||
|
(optionalString enableParallelBuilding "--ghc-options=${parallelBuildingFlags}")
|
||||||
|
(optionalString useCpphs "--with-cpphs=${cpphs}/bin/cpphs --ghc-options=-cpp --ghc-options=-pgmP${cpphs}/bin/cpphs --ghc-options=-optP--cpp")
|
||||||
|
(enableFeature enableLibraryProfiling "library-profiling")
|
||||||
|
(optionalString (enableExecutableProfiling || enableLibraryProfiling) "--profiling-detail=${profilingDetail}")
|
||||||
|
(enableFeature enableExecutableProfiling "profiling")
|
||||||
|
(enableFeature enableSharedLibraries "shared")
|
||||||
|
(enableFeature doCoverage "coverage")
|
||||||
|
(enableFeature enableStaticLibraries "static")
|
||||||
|
(enableFeature enableSharedExecutables "executable-dynamic")
|
||||||
|
(enableFeature doCheck "tests")
|
||||||
|
(enableFeature doBenchmark "benchmarks")
|
||||||
|
"--enable-library-vanilla" # TODO: Should this be configurable?
|
||||||
|
(enableFeature enableLibraryForGhci "library-for-ghci")
|
||||||
|
(enableFeature enableDeadCodeElimination "split-sections")
|
||||||
|
(enableFeature (!dontStrip) "library-stripping")
|
||||||
|
(enableFeature (!dontStrip) "executable-stripping")
|
||||||
|
] ++ optionals isGhcjs [
|
||||||
|
"--ghcjs"
|
||||||
|
] ++ optionals isCross ([
|
||||||
|
"--configure-option=--host=${stdenv.hostPlatform.config}"
|
||||||
|
] ++ crossCabalFlags
|
||||||
|
) ++ optionals enableSeparateBinOutput [
|
||||||
|
"--bindir=${binDir}"
|
||||||
|
] ++ optionals (doHaddockInterfaces && isLibrary) [
|
||||||
|
"--ghc-options=-haddock"
|
||||||
|
];
|
||||||
|
|
||||||
|
postPhases = optional doInstallIntermediates "installIntermediatesPhase";
|
||||||
|
|
||||||
|
setupCompileFlags = [
|
||||||
|
(optionalString (!coreSetup) "-package-db=$setupPackageConfDir")
|
||||||
|
(optionalString enableParallelBuilding parallelBuildingFlags)
|
||||||
|
"-threaded" # https://github.com/haskell/cabal/issues/2398
|
||||||
|
"-rtsopts" # allow us to pass RTS flags to the generated Setup executable
|
||||||
|
];
|
||||||
|
|
||||||
|
isHaskellPkg = x: x ? isHaskellLibrary;
|
||||||
|
|
||||||
|
# Work around a Cabal bug requiring pkg-config --static --libs to work even
|
||||||
|
# when linking dynamically, affecting Cabal 3.8 and 3.9.
|
||||||
|
# https://github.com/haskell/cabal/issues/8455
|
||||||
|
#
|
||||||
|
# For this, we treat the runtime system/pkg-config dependencies of a Haskell
|
||||||
|
# derivation as if they were propagated from their dependencies which allows
|
||||||
|
# pkg-config --static to work in most cases.
|
||||||
|
allPkgconfigDepends =
|
||||||
|
let
|
||||||
|
# If __onlyPropagateKnownPkgConfigModules is set, packages without
|
||||||
|
# meta.pkgConfigModules will be filtered out, otherwise all packages in
|
||||||
|
# buildInputs and propagatePlainBuildInputs are propagated.
|
||||||
|
propagateValue = drv:
|
||||||
|
lib.isDerivation drv
|
||||||
|
&& (__onlyPropagateKnownPkgConfigModules -> drv ? meta.pkgConfigModules);
|
||||||
|
|
||||||
|
# Take list of derivations and return list of the transitive dependency
|
||||||
|
# closure, only taking into account buildInputs. Loosely based on
|
||||||
|
# closePropagationFast.
|
||||||
|
propagatePlainBuildInputs = drvs:
|
||||||
|
builtins.map (i: i.val) (
|
||||||
|
builtins.genericClosure {
|
||||||
|
startSet = builtins.map (drv:
|
||||||
|
{ key = drv.outPath; val = drv; }
|
||||||
|
) (builtins.filter propagateValue drvs);
|
||||||
|
operator = { val, ... }:
|
||||||
|
builtins.concatMap (drv:
|
||||||
|
if propagateValue drv
|
||||||
|
then [ { key = drv.outPath; val = drv; } ]
|
||||||
|
else [ ]
|
||||||
|
) (val.buildInputs or [ ] ++ val.propagatedBuildInputs or [ ]);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
in
|
||||||
|
|
||||||
|
if __propagatePkgConfigDepends
|
||||||
|
then propagatePlainBuildInputs allPkgconfigDepends'
|
||||||
|
else allPkgconfigDepends';
|
||||||
|
allPkgconfigDepends' =
|
||||||
|
pkg-configDepends ++ libraryPkgconfigDepends ++ executablePkgconfigDepends ++
|
||||||
|
optionals doCheck testPkgconfigDepends ++ optionals doBenchmark benchmarkPkgconfigDepends;
|
||||||
|
|
||||||
|
depsBuildBuild = [ nativeGhc ]
|
||||||
|
# CC_FOR_BUILD may be necessary if we have no C preprocessor for the host
|
||||||
|
# platform. See crossCabalFlags above for more details.
|
||||||
|
++ lib.optionals (!stdenv.hasCC) [ buildPackages.stdenv.cc ];
|
||||||
|
collectedToolDepends =
|
||||||
|
buildTools ++ libraryToolDepends ++ executableToolDepends ++
|
||||||
|
optionals doCheck testToolDepends ++
|
||||||
|
optionals doBenchmark benchmarkToolDepends;
|
||||||
|
nativeBuildInputs =
|
||||||
|
[ ghc removeReferencesTo ] ++ optional (allPkgconfigDepends != []) (assert pkg-config != null; pkg-config) ++
|
||||||
|
setupHaskellDepends ++ collectedToolDepends ++ optional stdenv.hostPlatform.isGhcjs nodejs;
|
||||||
|
propagatedBuildInputs = buildDepends ++ libraryHaskellDepends ++ executableHaskellDepends ++ libraryFrameworkDepends;
|
||||||
|
otherBuildInputsHaskell =
|
||||||
|
optionals doCheck (testDepends ++ testHaskellDepends) ++
|
||||||
|
optionals doBenchmark (benchmarkDepends ++ benchmarkHaskellDepends);
|
||||||
|
otherBuildInputsSystem =
|
||||||
|
extraLibraries ++ librarySystemDepends ++ executableSystemDepends ++ executableFrameworkDepends ++
|
||||||
|
allPkgconfigDepends ++
|
||||||
|
optionals doCheck (testSystemDepends ++ testFrameworkDepends) ++
|
||||||
|
optionals doBenchmark (benchmarkSystemDepends ++ benchmarkFrameworkDepends);
|
||||||
|
# TODO next rebuild just define as `otherBuildInputsHaskell ++ otherBuildInputsSystem`
|
||||||
|
otherBuildInputs =
|
||||||
|
extraLibraries ++ librarySystemDepends ++ executableSystemDepends ++ executableFrameworkDepends ++
|
||||||
|
allPkgconfigDepends ++
|
||||||
|
optionals doCheck (testDepends ++ testHaskellDepends ++ testSystemDepends ++ testFrameworkDepends) ++
|
||||||
|
optionals doBenchmark (benchmarkDepends ++ benchmarkHaskellDepends ++ benchmarkSystemDepends ++ benchmarkFrameworkDepends);
|
||||||
|
|
||||||
|
setupCommand = "./Setup";
|
||||||
|
|
||||||
|
ghcCommand' = if isGhcjs then "ghcjs" else "ghc";
|
||||||
|
ghcCommand = "${ghc.targetPrefix}${ghcCommand'}";
|
||||||
|
|
||||||
|
ghcNameWithPrefix = "${ghc.targetPrefix}${ghc.haskellCompilerName}";
|
||||||
|
mkGhcLibdir = ghc: "lib/${ghc.targetPrefix}${ghc.haskellCompilerName}"
|
||||||
|
+ lib.optionalString (ghc ? hadrian) "/lib";
|
||||||
|
ghcLibdir = mkGhcLibdir ghc;
|
||||||
|
|
||||||
|
nativeGhcCommand = "${nativeGhc.targetPrefix}ghc";
|
||||||
|
|
||||||
|
buildPkgDb = thisGhc: packageConfDir: ''
|
||||||
|
# If this dependency has a package database, then copy the contents of it,
|
||||||
|
# unless it is one of our GHCs. These can appear in our dependencies when
|
||||||
|
# we are doing native builds, and they have package databases in them, but
|
||||||
|
# we do not want to copy them over.
|
||||||
|
#
|
||||||
|
# We don't need to, since those packages will be provided by the GHC when
|
||||||
|
# we compile with it, and doing so can result in having multiple copies of
|
||||||
|
# e.g. Cabal in the database with the same name and version, which is
|
||||||
|
# ambiguous.
|
||||||
|
if [ -d "$p/${mkGhcLibdir thisGhc}/package.conf.d" ] && [ "$p" != "${ghc}" ] && [ "$p" != "${nativeGhc}" ]; then
|
||||||
|
cp -f "$p/${mkGhcLibdir thisGhc}/package.conf.d/"*.conf ${packageConfDir}/
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
'';
|
||||||
|
|
||||||
|
intermediatesDir = "share/haskell/${ghc.version}/${pname}-${version}/dist";
|
||||||
|
in lib.fix (drv:
|
||||||
|
|
||||||
|
stdenv.mkDerivation ({
|
||||||
|
inherit pname version;
|
||||||
|
|
||||||
|
outputs = [ "out" ]
|
||||||
|
++ (optional enableSeparateDataOutput "data")
|
||||||
|
++ (optional enableSeparateDocOutput "doc")
|
||||||
|
++ (optional enableSeparateBinOutput "bin")
|
||||||
|
++ (optional enableSeparateIntermediatesOutput "intermediates");
|
||||||
|
|
||||||
|
setOutputFlags = false;
|
||||||
|
|
||||||
|
pos = builtins.unsafeGetAttrPos "pname" args;
|
||||||
|
|
||||||
|
prePhases = ["setupCompilerEnvironmentPhase"];
|
||||||
|
preConfigurePhases = ["compileBuildDriverPhase"];
|
||||||
|
preInstallPhases = ["haddockPhase"];
|
||||||
|
|
||||||
|
inherit src;
|
||||||
|
|
||||||
|
inherit depsBuildBuild nativeBuildInputs;
|
||||||
|
buildInputs = otherBuildInputs ++ optionals (!isLibrary) propagatedBuildInputs
|
||||||
|
# For patchShebangsAuto in fixupPhase
|
||||||
|
++ optionals stdenv.hostPlatform.isGhcjs [ nodejs ];
|
||||||
|
propagatedBuildInputs = optionals isLibrary propagatedBuildInputs;
|
||||||
|
|
||||||
|
LANG = "en_US.UTF-8"; # GHC needs the locale configured during the Haddock phase.
|
||||||
|
|
||||||
|
prePatch = optionalString (editedCabalFile != null) ''
|
||||||
|
echo "Replace Cabal file with edited version from ${newCabalFileUrl}."
|
||||||
|
cp ${newCabalFile} ${pname}.cabal
|
||||||
|
'' + prePatch;
|
||||||
|
|
||||||
|
postPatch = optionalString jailbreak ''
|
||||||
|
echo "Run jailbreak-cabal to lift version restrictions on build inputs."
|
||||||
|
${jailbreak-cabal}/bin/jailbreak-cabal ${pname}.cabal
|
||||||
|
'' + postPatch;
|
||||||
|
|
||||||
|
setupCompilerEnvironmentPhase = ''
|
||||||
|
NIX_BUILD_CORES=$(( NIX_BUILD_CORES < ${toString maxBuildCores} ? NIX_BUILD_CORES : ${toString maxBuildCores} ))
|
||||||
|
runHook preSetupCompilerEnvironment
|
||||||
|
|
||||||
|
echo "Build with ${ghc}."
|
||||||
|
${optionalString (isLibrary && hyperlinkSource) "export PATH=${hscolour}/bin:$PATH"}
|
||||||
|
|
||||||
|
builddir="$(mktemp -d)"
|
||||||
|
setupPackageConfDir="$builddir/setup-package.conf.d"
|
||||||
|
mkdir -p $setupPackageConfDir
|
||||||
|
packageConfDir="$builddir/package.conf.d"
|
||||||
|
mkdir -p $packageConfDir
|
||||||
|
|
||||||
|
setupCompileFlags="${concatStringsSep " " setupCompileFlags}"
|
||||||
|
configureFlags="${concatStringsSep " " defaultConfigureFlags} $configureFlags"
|
||||||
|
''
|
||||||
|
# We build the Setup.hs on the *build* machine, and as such should only add
|
||||||
|
# dependencies for the build machine.
|
||||||
|
#
|
||||||
|
# pkgs* arrays defined in stdenv/setup.hs
|
||||||
|
+ ''
|
||||||
|
for p in "''${pkgsBuildBuild[@]}" "''${pkgsBuildHost[@]}" "''${pkgsBuildTarget[@]}"; do
|
||||||
|
${buildPkgDb nativeGhc "$setupPackageConfDir"}
|
||||||
|
done
|
||||||
|
${nativeGhcCommand}-pkg --package-db="$setupPackageConfDir" recache
|
||||||
|
''
|
||||||
|
# For normal components
|
||||||
|
+ ''
|
||||||
|
for p in "''${pkgsHostHost[@]}" "''${pkgsHostTarget[@]}"; do
|
||||||
|
${buildPkgDb ghc "$packageConfDir"}
|
||||||
|
if [ -d "$p/include" ]; then
|
||||||
|
configureFlags+=" --extra-include-dirs=$p/include"
|
||||||
|
fi
|
||||||
|
if [ -d "$p/lib" ]; then
|
||||||
|
configureFlags+=" --extra-lib-dirs=$p/lib"
|
||||||
|
fi
|
||||||
|
if [[ -d "$p/Library/Frameworks" ]]; then
|
||||||
|
configureFlags+=" --extra-framework-dirs=$p/Library/Frameworks"
|
||||||
|
fi
|
||||||
|
'' + ''
|
||||||
|
done
|
||||||
|
''
|
||||||
|
+ (optionalString stdenv.hostPlatform.isGhcjs ''
|
||||||
|
export EM_CACHE="$(realpath "$(mktemp -d emcache.XXXXXXXXXX)")"
|
||||||
|
cp -Lr ${emscripten}/share/emscripten/cache/* "$EM_CACHE/"
|
||||||
|
chmod u+rwX -R "$EM_CACHE"
|
||||||
|
'')
|
||||||
|
# only use the links hack if we're actually building dylibs. otherwise, the
|
||||||
|
# "dynamic-library-dirs" point to nonexistent paths, and the ln command becomes
|
||||||
|
# "ln -s $out/lib/links", which tries to recreate the links dir and fails
|
||||||
|
#
|
||||||
|
# Note: We need to disable this work-around when using intermediate build
|
||||||
|
# products from a prior build because otherwise Nix will change permissions on
|
||||||
|
# the `$out/lib/links` directory to read-only when the build is done after the
|
||||||
|
# dist directory has already been exported, which triggers an unnecessary
|
||||||
|
# rebuild of modules included in the exported dist directory.
|
||||||
|
+ (optionalString (stdenv.isDarwin && (enableSharedLibraries || enableSharedExecutables) && !enableSeparateIntermediatesOutput) ''
|
||||||
|
# Work around a limit in the macOS Sierra linker on the number of paths
|
||||||
|
# referenced by any one dynamic library:
|
||||||
|
#
|
||||||
|
# Create a local directory with symlinks of the *.dylib (macOS shared
|
||||||
|
# libraries) from all the dependencies.
|
||||||
|
local dynamicLinksDir="$out/lib/links"
|
||||||
|
mkdir -p $dynamicLinksDir
|
||||||
|
|
||||||
|
# Unprettify all package conf files before reading/writing them
|
||||||
|
for d in "$packageConfDir/"*; do
|
||||||
|
# gawk -i inplace seems to strip the last newline
|
||||||
|
gawk -f ${unprettyConf} "$d" > tmp
|
||||||
|
mv tmp "$d"
|
||||||
|
done
|
||||||
|
|
||||||
|
for d in $(grep '^dynamic-library-dirs:' "$packageConfDir"/* | cut -d' ' -f2- | tr ' ' '\n' | sort -u); do
|
||||||
|
for lib in "$d/"*.{dylib,so}; do
|
||||||
|
# Allow overwriting because C libs can be pulled in multiple times.
|
||||||
|
ln -sf "$lib" "$dynamicLinksDir"
|
||||||
|
done
|
||||||
|
done
|
||||||
|
# Edit the local package DB to reference the links directory.
|
||||||
|
for f in "$packageConfDir/"*.conf; do
|
||||||
|
sed -i "s,dynamic-library-dirs: .*,dynamic-library-dirs: $dynamicLinksDir," "$f"
|
||||||
|
done
|
||||||
|
'') + ''
|
||||||
|
${ghcCommand}-pkg --package-db="$packageConfDir" recache
|
||||||
|
|
||||||
|
runHook postSetupCompilerEnvironment
|
||||||
|
'';
|
||||||
|
|
||||||
|
compileBuildDriverPhase = ''
|
||||||
|
runHook preCompileBuildDriver
|
||||||
|
|
||||||
|
for i in Setup.hs Setup.lhs ${defaultSetupHs}; do
|
||||||
|
test -f $i && break
|
||||||
|
done
|
||||||
|
|
||||||
|
echo setupCompileFlags: $setupCompileFlags
|
||||||
|
${nativeGhcCommand} $setupCompileFlags --make -o Setup -odir $builddir -hidir $builddir $i
|
||||||
|
|
||||||
|
runHook postCompileBuildDriver
|
||||||
|
'';
|
||||||
|
|
||||||
|
# Cabal takes flags like `--configure-option=--host=...` instead
|
||||||
|
configurePlatforms = [];
|
||||||
|
inherit configureFlags;
|
||||||
|
|
||||||
|
# Note: the options here must be always added, regardless of whether the
|
||||||
|
# package specifies `hardeningDisable`.
|
||||||
|
hardeningDisable = lib.optionals (args ? hardeningDisable) hardeningDisable
|
||||||
|
++ lib.optional (ghc.isHaLVM or false) "all"
|
||||||
|
# Static libraries (ie. all of pkgsStatic.haskellPackages) fail to build
|
||||||
|
# because by default Nix adds `-pie` to the linker flags: this
|
||||||
|
# conflicts with the `-r` and `-no-pie` flags added by GHC (see
|
||||||
|
# https://gitlab.haskell.org/ghc/ghc/-/issues/19580). hardeningDisable
|
||||||
|
# changes the default Nix behavior regarding adding "hardening" flags.
|
||||||
|
++ lib.optional enableStaticLibraries "pie";
|
||||||
|
|
||||||
|
configurePhase = ''
|
||||||
|
runHook preConfigure
|
||||||
|
|
||||||
|
unset GHC_PACKAGE_PATH # Cabal complains if this variable is set during configure.
|
||||||
|
|
||||||
|
echo configureFlags: $configureFlags
|
||||||
|
${setupCommand} configure $configureFlags 2>&1 | ${coreutils}/bin/tee "$NIX_BUILD_TOP/cabal-configure.log"
|
||||||
|
${lib.optionalString (!allowInconsistentDependencies) ''
|
||||||
|
if ${gnugrep}/bin/egrep -q -z 'Warning:.*depends on multiple versions' "$NIX_BUILD_TOP/cabal-configure.log"; then
|
||||||
|
echo >&2 "*** abort because of serious configure-time warning from Cabal"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
''}
|
||||||
|
export GHC_PACKAGE_PATH="$packageConfDir:"
|
||||||
|
|
||||||
|
runHook postConfigure
|
||||||
|
'';
|
||||||
|
|
||||||
|
buildPhase =
|
||||||
|
''
|
||||||
|
runHook preBuild
|
||||||
|
''
|
||||||
|
+ lib.optionalString (previousIntermediates != null)
|
||||||
|
''
|
||||||
|
mkdir -p dist;
|
||||||
|
rm -r dist/build
|
||||||
|
cp -r ${previousIntermediates}/${intermediatesDir}/build dist/build
|
||||||
|
find dist/build -exec chmod u+w {} +
|
||||||
|
find dist/build -exec touch -d '1970-01-01T00:00:00Z' {} +
|
||||||
|
''
|
||||||
|
+ ''
|
||||||
|
${setupCommand} build ${buildTarget}${crossCabalFlagsString}${buildFlagsString}
|
||||||
|
runHook postBuild
|
||||||
|
'';
|
||||||
|
|
||||||
|
inherit doCheck;
|
||||||
|
|
||||||
|
# Run test suite(s) and pass `checkFlags` as well as `checkFlagsArray`.
|
||||||
|
# `testFlags` are added to `checkFlagsArray` each prefixed with
|
||||||
|
# `--test-option`, so Cabal passes it to the underlying test suite binary.
|
||||||
|
checkPhase = ''
|
||||||
|
runHook preCheck
|
||||||
|
checkFlagsArray+=(
|
||||||
|
"--show-details=streaming"
|
||||||
|
${lib.escapeShellArgs (builtins.map (opt: "--test-option=${opt}") testFlags)}
|
||||||
|
)
|
||||||
|
${setupCommand} test ${testTarget} $checkFlags ''${checkFlagsArray:+"''${checkFlagsArray[@]}"}
|
||||||
|
runHook postCheck
|
||||||
|
'';
|
||||||
|
|
||||||
|
haddockPhase = ''
|
||||||
|
runHook preHaddock
|
||||||
|
${optionalString (doHaddock && isLibrary) ''
|
||||||
|
${setupCommand} haddock --html \
|
||||||
|
${optionalString doHoogle "--hoogle"} \
|
||||||
|
${optionalString doHaddockQuickjump "--quickjump"} \
|
||||||
|
${optionalString (isLibrary && hyperlinkSource) "--hyperlink-source"} \
|
||||||
|
${lib.concatStringsSep " " haddockFlags}
|
||||||
|
''}
|
||||||
|
runHook postHaddock
|
||||||
|
'';
|
||||||
|
|
||||||
|
installPhase = ''
|
||||||
|
runHook preInstall
|
||||||
|
|
||||||
|
${if !isLibrary && buildTarget == "" then "${setupCommand} install"
|
||||||
|
# ^^ if the project is not a library, and no build target is specified, we can just use "install".
|
||||||
|
else if !isLibrary then "${setupCommand} copy ${buildTarget}"
|
||||||
|
# ^^ if the project is not a library, and we have a build target, then use "copy" to install
|
||||||
|
# just the target specified; "install" will error here, since not all targets have been built.
|
||||||
|
else ''
|
||||||
|
${setupCommand} copy ${buildTarget}
|
||||||
|
local packageConfDir="$out/${ghcLibdir}/package.conf.d"
|
||||||
|
local packageConfFile="$packageConfDir/${pname}-${version}.conf"
|
||||||
|
mkdir -p "$packageConfDir"
|
||||||
|
${setupCommand} register --gen-pkg-config=$packageConfFile
|
||||||
|
if [ -d "$packageConfFile" ]; then
|
||||||
|
mv "$packageConfFile/"* "$packageConfDir"
|
||||||
|
rmdir "$packageConfFile"
|
||||||
|
fi
|
||||||
|
for packageConfFile in "$packageConfDir/"*; do
|
||||||
|
local pkgId=$(gawk -f ${unprettyConf} "$packageConfFile" \
|
||||||
|
| grep '^id:' | cut -d' ' -f2)
|
||||||
|
mv "$packageConfFile" "$packageConfDir/$pkgId.conf"
|
||||||
|
done
|
||||||
|
|
||||||
|
# delete confdir if there are no libraries
|
||||||
|
find $packageConfDir -maxdepth 0 -empty -delete;
|
||||||
|
''}
|
||||||
|
${optionalString isGhcjs ''
|
||||||
|
for exeDir in "${binDir}/"*.jsexe; do
|
||||||
|
exe="''${exeDir%.jsexe}"
|
||||||
|
printWords '#!${nodejs}/bin/node' > "$exe"
|
||||||
|
echo >> "$exe"
|
||||||
|
cat "$exeDir/all.js" >> "$exe"
|
||||||
|
chmod +x "$exe"
|
||||||
|
done
|
||||||
|
''}
|
||||||
|
${optionalString doCoverage "mkdir -p $out/share && cp -r dist/hpc $out/share"}
|
||||||
|
|
||||||
|
${optionalString enableSeparateDocOutput ''
|
||||||
|
for x in ${docdir "$doc"}"/html/src/"*.html; do
|
||||||
|
remove-references-to -t $out $x
|
||||||
|
done
|
||||||
|
mkdir -p $doc
|
||||||
|
''}
|
||||||
|
${optionalString enableSeparateDataOutput "mkdir -p $data"}
|
||||||
|
|
||||||
|
runHook postInstall
|
||||||
|
'';
|
||||||
|
|
||||||
|
${if doInstallIntermediates then "installIntermediatesPhase" else null} = ''
|
||||||
|
runHook preInstallIntermediates
|
||||||
|
intermediatesOutput=${if enableSeparateIntermediatesOutput then "$intermediates" else "$out"}
|
||||||
|
installIntermediatesDir="$intermediatesOutput/${intermediatesDir}"
|
||||||
|
mkdir -p "$installIntermediatesDir"
|
||||||
|
cp -r dist/build "$installIntermediatesDir"
|
||||||
|
runHook postInstallIntermediates
|
||||||
|
'';
|
||||||
|
|
||||||
|
passthru = passthru // rec {
|
||||||
|
|
||||||
|
inherit pname version;
|
||||||
|
|
||||||
|
compiler = ghc;
|
||||||
|
|
||||||
|
# All this information is intended just for `shellFor`. It should be
|
||||||
|
# considered unstable and indeed we knew how to keep it private we would.
|
||||||
|
getCabalDeps = {
|
||||||
|
inherit
|
||||||
|
buildDepends
|
||||||
|
buildTools
|
||||||
|
executableFrameworkDepends
|
||||||
|
executableHaskellDepends
|
||||||
|
executablePkgconfigDepends
|
||||||
|
executableSystemDepends
|
||||||
|
executableToolDepends
|
||||||
|
extraLibraries
|
||||||
|
libraryFrameworkDepends
|
||||||
|
libraryHaskellDepends
|
||||||
|
libraryPkgconfigDepends
|
||||||
|
librarySystemDepends
|
||||||
|
libraryToolDepends
|
||||||
|
pkg-configDepends
|
||||||
|
setupHaskellDepends
|
||||||
|
;
|
||||||
|
} // lib.optionalAttrs doCheck {
|
||||||
|
inherit
|
||||||
|
testDepends
|
||||||
|
testFrameworkDepends
|
||||||
|
testHaskellDepends
|
||||||
|
testPkgconfigDepends
|
||||||
|
testSystemDepends
|
||||||
|
testToolDepends
|
||||||
|
;
|
||||||
|
} // lib.optionalAttrs doBenchmark {
|
||||||
|
inherit
|
||||||
|
benchmarkDepends
|
||||||
|
benchmarkFrameworkDepends
|
||||||
|
benchmarkHaskellDepends
|
||||||
|
benchmarkPkgconfigDepends
|
||||||
|
benchmarkSystemDepends
|
||||||
|
benchmarkToolDepends
|
||||||
|
;
|
||||||
|
};
|
||||||
|
|
||||||
|
# Attributes for the old definition of `shellFor`. Should be removed but
|
||||||
|
# this predates the warning at the top of `getCabalDeps`.
|
||||||
|
getBuildInputs = rec {
|
||||||
|
inherit propagatedBuildInputs otherBuildInputs allPkgconfigDepends;
|
||||||
|
haskellBuildInputs = isHaskellPartition.right;
|
||||||
|
systemBuildInputs = isHaskellPartition.wrong;
|
||||||
|
isHaskellPartition = lib.partition
|
||||||
|
isHaskellPkg
|
||||||
|
(propagatedBuildInputs ++ otherBuildInputs ++ depsBuildBuild ++ nativeBuildInputs);
|
||||||
|
};
|
||||||
|
|
||||||
|
isHaskellLibrary = isLibrary;
|
||||||
|
|
||||||
|
# TODO: ask why the split outputs are configurable at all?
|
||||||
|
# TODO: include tests for split if possible
|
||||||
|
# Given the haskell package, returns
|
||||||
|
# the directory containing the haddock documentation.
|
||||||
|
# `null' if no haddock documentation was built.
|
||||||
|
# TODO: fetch the self from the fixpoint instead
|
||||||
|
haddockDir = self: if doHaddock then "${docdir self.doc}/html" else null;
|
||||||
|
|
||||||
|
# Creates a derivation containing all of the necessary dependencies for building the
|
||||||
|
# parent derivation. The attribute set that it takes as input can be viewed as:
|
||||||
|
#
|
||||||
|
# { withHoogle }
|
||||||
|
#
|
||||||
|
# The derivation that it builds contains no outpaths because it is meant for use
|
||||||
|
# as an environment
|
||||||
|
#
|
||||||
|
# # Example use
|
||||||
|
# # Creates a shell with all of the dependencies required to build the "hello" package,
|
||||||
|
# # and with python:
|
||||||
|
#
|
||||||
|
# > nix-shell -E 'with (import <nixpkgs> {}); \
|
||||||
|
# > haskell.packages.ghc865.hello.envFunc { buildInputs = [ python ]; }'
|
||||||
|
envFunc = { withHoogle ? false }:
|
||||||
|
let
|
||||||
|
name = "ghc-shell-for-${drv.name}";
|
||||||
|
|
||||||
|
withPackages = if withHoogle then ghcWithHoogle else ghcWithPackages;
|
||||||
|
|
||||||
|
# We use the `ghcWithPackages` function from `buildHaskellPackages` if we
|
||||||
|
# want a shell for the sake of cross compiling a package. In the native case
|
||||||
|
# we don't use this at all, and instead put the setupDepends in the main
|
||||||
|
# `ghcWithPackages`. This way we don't have two wrapper scripts called `ghc`
|
||||||
|
# shadowing each other on the PATH.
|
||||||
|
ghcEnvForBuild =
|
||||||
|
assert isCross;
|
||||||
|
buildHaskellPackages.ghcWithPackages (_: setupHaskellDepends);
|
||||||
|
|
||||||
|
ghcEnv = withPackages (_:
|
||||||
|
otherBuildInputsHaskell ++
|
||||||
|
propagatedBuildInputs ++
|
||||||
|
lib.optionals (!isCross) setupHaskellDepends);
|
||||||
|
|
||||||
|
ghcCommandCaps = lib.toUpper ghcCommand';
|
||||||
|
in stdenv.mkDerivation {
|
||||||
|
inherit name shellHook;
|
||||||
|
|
||||||
|
depsBuildBuild = lib.optional isCross ghcEnvForBuild;
|
||||||
|
nativeBuildInputs =
|
||||||
|
[ ghcEnv ] ++ optional (allPkgconfigDepends != []) pkg-config ++
|
||||||
|
collectedToolDepends;
|
||||||
|
buildInputs =
|
||||||
|
otherBuildInputsSystem;
|
||||||
|
phases = ["installPhase"];
|
||||||
|
installPhase = "echo $nativeBuildInputs $buildInputs > $out";
|
||||||
|
LANG = "en_US.UTF-8";
|
||||||
|
LOCALE_ARCHIVE = lib.optionalString (stdenv.hostPlatform.libc == "glibc") "${buildPackages.glibcLocales}/lib/locale/locale-archive";
|
||||||
|
"NIX_${ghcCommandCaps}" = "${ghcEnv}/bin/${ghcCommand}";
|
||||||
|
"NIX_${ghcCommandCaps}PKG" = "${ghcEnv}/bin/${ghcCommand}-pkg";
|
||||||
|
# TODO: is this still valid?
|
||||||
|
"NIX_${ghcCommandCaps}_DOCDIR" = "${ghcEnv}/share/doc/ghc/html";
|
||||||
|
"NIX_${ghcCommandCaps}_LIBDIR" = if ghc.isHaLVM or false
|
||||||
|
then "${ghcEnv}/lib/HaLVM-${ghc.version}"
|
||||||
|
else "${ghcEnv}/${ghcLibdir}";
|
||||||
|
};
|
||||||
|
|
||||||
|
env = envFunc { };
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
meta = { inherit homepage license platforms; }
|
||||||
|
// optionalAttrs (args ? broken) { inherit broken; }
|
||||||
|
// optionalAttrs (args ? description) { inherit description; }
|
||||||
|
// optionalAttrs (args ? maintainers) { inherit maintainers; }
|
||||||
|
// optionalAttrs (args ? hydraPlatforms) { inherit hydraPlatforms; }
|
||||||
|
// optionalAttrs (args ? badPlatforms) { inherit badPlatforms; }
|
||||||
|
// optionalAttrs (args ? changelog) { inherit changelog; }
|
||||||
|
// optionalAttrs (args ? mainProgram) { inherit mainProgram; }
|
||||||
|
;
|
||||||
|
|
||||||
|
}
|
||||||
|
// optionalAttrs (args ? preCompileBuildDriver) { inherit preCompileBuildDriver; }
|
||||||
|
// optionalAttrs (args ? postCompileBuildDriver) { inherit postCompileBuildDriver; }
|
||||||
|
// optionalAttrs (args ? preUnpack) { inherit preUnpack; }
|
||||||
|
// optionalAttrs (args ? postUnpack) { inherit postUnpack; }
|
||||||
|
// optionalAttrs (args ? patches) { inherit patches; }
|
||||||
|
// optionalAttrs (args ? patchPhase) { inherit patchPhase; }
|
||||||
|
// optionalAttrs (args ? preConfigure) { inherit preConfigure; }
|
||||||
|
// optionalAttrs (args ? postConfigure) { inherit postConfigure; }
|
||||||
|
// optionalAttrs (args ? preBuild) { inherit preBuild; }
|
||||||
|
// optionalAttrs (args ? postBuild) { inherit postBuild; }
|
||||||
|
// optionalAttrs (args ? doBenchmark) { inherit doBenchmark; }
|
||||||
|
// optionalAttrs (args ? checkPhase) { inherit checkPhase; }
|
||||||
|
// optionalAttrs (args ? preCheck) { inherit preCheck; }
|
||||||
|
// optionalAttrs (args ? postCheck) { inherit postCheck; }
|
||||||
|
// optionalAttrs (args ? preHaddock) { inherit preHaddock; }
|
||||||
|
// optionalAttrs (args ? postHaddock) { inherit postHaddock; }
|
||||||
|
// optionalAttrs (args ? preInstall) { inherit preInstall; }
|
||||||
|
// optionalAttrs (args ? installPhase) { inherit installPhase; }
|
||||||
|
// optionalAttrs (args ? postInstall) { inherit postInstall; }
|
||||||
|
// optionalAttrs (args ? preFixup) { inherit preFixup; }
|
||||||
|
// optionalAttrs (args ? postFixup) { inherit postFixup; }
|
||||||
|
// optionalAttrs (args ? dontStrip) { inherit dontStrip; }
|
||||||
|
// optionalAttrs (postPhases != []) { inherit postPhases; }
|
||||||
|
// optionalAttrs (stdenv.buildPlatform.libc == "glibc"){ LOCALE_ARCHIVE = "${glibcLocales}/lib/locale/locale-archive"; }
|
||||||
|
|
||||||
|
# Implicit pointer to integer conversions are errors by default since clang 15.
|
||||||
|
# Works around https://gitlab.haskell.org/ghc/ghc/-/issues/23456.
|
||||||
|
// lib.optionalAttrs (stdenv.hasCC && stdenv.cc.isClang) {
|
||||||
|
NIX_CFLAGS_COMPILE = "-Wno-error=int-conversion";
|
||||||
|
}
|
||||||
|
)
|
||||||
|
)
|
|
@ -0,0 +1,80 @@
|
||||||
|
{ stdenv, ghc, pkg-config, glibcLocales
|
||||||
|
, cacert, stack, makeSetupHook, lib }@depArgs:
|
||||||
|
|
||||||
|
{ buildInputs ? []
|
||||||
|
, nativeBuildInputs ? []
|
||||||
|
, extraArgs ? []
|
||||||
|
, LD_LIBRARY_PATH ? []
|
||||||
|
, ghc ? depArgs.ghc
|
||||||
|
, stack ? depArgs.stack
|
||||||
|
, ...
|
||||||
|
}@args:
|
||||||
|
|
||||||
|
let
|
||||||
|
|
||||||
|
stackCmd = "stack --internal-re-exec-version=${stack.version}";
|
||||||
|
|
||||||
|
# Add all dependencies in buildInputs including propagated ones to
|
||||||
|
# STACK_IN_NIX_EXTRA_ARGS.
|
||||||
|
stackHook = makeSetupHook {
|
||||||
|
name = "stack-hook";
|
||||||
|
} ./stack-hook.sh;
|
||||||
|
|
||||||
|
in stdenv.mkDerivation (args // {
|
||||||
|
|
||||||
|
# Doesn't work in the sandbox. Pass `--option sandbox relaxed` or
|
||||||
|
# `--option sandbox false` to be able to build this
|
||||||
|
__noChroot = true;
|
||||||
|
|
||||||
|
buildInputs = buildInputs
|
||||||
|
++ lib.optional (stdenv.hostPlatform.libc == "glibc") glibcLocales;
|
||||||
|
|
||||||
|
nativeBuildInputs = nativeBuildInputs
|
||||||
|
++ [ ghc pkg-config stack stackHook ];
|
||||||
|
|
||||||
|
STACK_PLATFORM_VARIANT = "nix";
|
||||||
|
STACK_IN_NIX_SHELL = 1;
|
||||||
|
STACK_IN_NIX_EXTRA_ARGS = extraArgs;
|
||||||
|
|
||||||
|
# XXX: workaround for https://ghc.haskell.org/trac/ghc/ticket/11042.
|
||||||
|
LD_LIBRARY_PATH = lib.makeLibraryPath (LD_LIBRARY_PATH ++ buildInputs);
|
||||||
|
# ^^^ Internally uses `getOutput "lib"` (equiv. to getLib)
|
||||||
|
|
||||||
|
# Non-NixOS git needs cert
|
||||||
|
GIT_SSL_CAINFO = "${cacert}/etc/ssl/certs/ca-bundle.crt";
|
||||||
|
|
||||||
|
# Fixes https://github.com/commercialhaskell/stack/issues/2358
|
||||||
|
LANG = "en_US.UTF-8";
|
||||||
|
|
||||||
|
preferLocalBuild = true;
|
||||||
|
|
||||||
|
preConfigure = ''
|
||||||
|
export STACK_ROOT=$NIX_BUILD_TOP/.stack
|
||||||
|
'';
|
||||||
|
|
||||||
|
buildPhase = args.buildPhase or ''
|
||||||
|
runHook preBuild
|
||||||
|
|
||||||
|
${stackCmd} build
|
||||||
|
|
||||||
|
runHook postBuild
|
||||||
|
'';
|
||||||
|
|
||||||
|
checkPhase = args.checkPhase or ''
|
||||||
|
runHook preCheck
|
||||||
|
|
||||||
|
${stackCmd} test
|
||||||
|
|
||||||
|
runHook postCheck
|
||||||
|
'';
|
||||||
|
|
||||||
|
doCheck = args.doCheck or true;
|
||||||
|
|
||||||
|
installPhase = args.installPhase or ''
|
||||||
|
runHook preInstall
|
||||||
|
|
||||||
|
${stackCmd} --local-bin-path=$out/bin build --copy-bins
|
||||||
|
|
||||||
|
runHook postInstall
|
||||||
|
'';
|
||||||
|
})
|
336739
pkgs/by-name/ha/haskell/haskell-modules/hackage-packages.nix
Normal file
336739
pkgs/by-name/ha/haskell/haskell-modules/hackage-packages.nix
Normal file
File diff suppressed because it is too large
Load diff
|
@ -0,0 +1,5 @@
|
||||||
|
#! @shell@
|
||||||
|
|
||||||
|
COMMAND=$1
|
||||||
|
shift
|
||||||
|
exec @hoogle@/bin/hoogle "$COMMAND" --database @out@/share/doc/hoogle/default.hoo "$@"
|
126
pkgs/by-name/ha/haskell/haskell-modules/hoogle.nix
Normal file
126
pkgs/by-name/ha/haskell/haskell-modules/hoogle.nix
Normal file
|
@ -0,0 +1,126 @@
|
||||||
|
# Install not only the Hoogle library and executable, but also a local Hoogle
|
||||||
|
# database which provides "Source" links to all specified 'packages' -- or the
|
||||||
|
# current Haskell Platform if no custom package set is provided.
|
||||||
|
|
||||||
|
{ lib, stdenv, buildPackages, haskellPackages
|
||||||
|
, writeText
|
||||||
|
}:
|
||||||
|
|
||||||
|
# This argument is a function which selects a list of Haskell packages from any
|
||||||
|
# passed Haskell package set.
|
||||||
|
#
|
||||||
|
# Example:
|
||||||
|
# (hpkgs: [ hpkgs.mtl hpkgs.lens ])
|
||||||
|
selectPackages:
|
||||||
|
|
||||||
|
let
|
||||||
|
inherit (haskellPackages) ghc hoogle;
|
||||||
|
packages = selectPackages haskellPackages;
|
||||||
|
|
||||||
|
wrapper = ./hoogle-local-wrapper.sh;
|
||||||
|
isGhcjs = ghc.isGhcjs or false;
|
||||||
|
opts = lib.optionalString;
|
||||||
|
haddockExe =
|
||||||
|
if !isGhcjs
|
||||||
|
then "haddock"
|
||||||
|
else "haddock-ghcjs";
|
||||||
|
ghcDocLibDir =
|
||||||
|
if !isGhcjs
|
||||||
|
then ghc.doc + "/share/doc/ghc*/html/libraries"
|
||||||
|
else ghc + "/doc/lib";
|
||||||
|
# On GHCJS, use a stripped down version of GHC's prologue.txt
|
||||||
|
prologue =
|
||||||
|
if !isGhcjs
|
||||||
|
then "${ghcDocLibDir}/prologue.txt"
|
||||||
|
else writeText "ghcjs-prologue.txt" ''
|
||||||
|
This index includes documentation for many Haskell modules.
|
||||||
|
'';
|
||||||
|
|
||||||
|
docPackages = lib.closePropagation
|
||||||
|
# we grab the doc outputs
|
||||||
|
(map (lib.getOutput "doc") packages);
|
||||||
|
|
||||||
|
in
|
||||||
|
buildPackages.stdenv.mkDerivation {
|
||||||
|
name = "hoogle-with-packages";
|
||||||
|
buildInputs = [ghc hoogle];
|
||||||
|
|
||||||
|
# compiling databases takes less time than copying the results
|
||||||
|
# between machines.
|
||||||
|
preferLocalBuild = true;
|
||||||
|
|
||||||
|
# we still allow substitutes because a database is relatively small and if it
|
||||||
|
# is already built downloading is probably faster. The substitution will only
|
||||||
|
# trigger for users who have already cached the database on a substituter and
|
||||||
|
# thus probably intend to substitute it.
|
||||||
|
allowSubstitutes = true;
|
||||||
|
|
||||||
|
inherit docPackages;
|
||||||
|
|
||||||
|
passAsFile = ["buildCommand"];
|
||||||
|
|
||||||
|
buildCommand = ''
|
||||||
|
${let # Filter out nulls here to work around https://github.com/NixOS/nixpkgs/issues/82245
|
||||||
|
# If we don't then grabbing `p.name` here will fail.
|
||||||
|
packages' = lib.filter (p: p != null) packages;
|
||||||
|
in lib.optionalString (packages' != [] -> docPackages == [])
|
||||||
|
("echo WARNING: localHoogle package list empty, even though"
|
||||||
|
+ " the following were specified: "
|
||||||
|
+ lib.concatMapStringsSep ", " (p: p.name) packages')}
|
||||||
|
mkdir -p $out/share/doc/hoogle
|
||||||
|
|
||||||
|
echo importing builtin packages
|
||||||
|
for docdir in ${ghcDocLibDir}"/"*; do
|
||||||
|
name="$(basename $docdir)"
|
||||||
|
${opts isGhcjs ''docdir="$docdir/html"''}
|
||||||
|
if [[ -d $docdir ]]; then
|
||||||
|
ln -sfn $docdir $out/share/doc/hoogle/$name
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
echo importing other packages
|
||||||
|
${lib.concatMapStringsSep "\n" (el: ''
|
||||||
|
ln -sfn ${el.haddockDir} "$out/share/doc/hoogle/${el.name}"
|
||||||
|
'')
|
||||||
|
(lib.filter (el: el.haddockDir != null)
|
||||||
|
(builtins.map (p: { haddockDir = if p ? haddockDir then p.haddockDir p else null;
|
||||||
|
name = p.pname; })
|
||||||
|
docPackages))}
|
||||||
|
|
||||||
|
echo building hoogle database
|
||||||
|
hoogle generate --database $out/share/doc/hoogle/default.hoo --local=$out/share/doc/hoogle
|
||||||
|
|
||||||
|
echo building haddock index
|
||||||
|
# adapted from GHC's gen_contents_index
|
||||||
|
cd $out/share/doc/hoogle
|
||||||
|
|
||||||
|
args=
|
||||||
|
for hdfile in $(ls -1 *"/"*.haddock | grep -v '/ghc\.haddock' | sort); do
|
||||||
|
name_version=`echo "$hdfile" | sed 's#/.*##'`
|
||||||
|
args="$args --read-interface=$name_version,$hdfile"
|
||||||
|
done
|
||||||
|
|
||||||
|
${ghc}/bin/${haddockExe} --gen-index --gen-contents -o . \
|
||||||
|
-t "Haskell Hierarchical Libraries" \
|
||||||
|
-p ${prologue} \
|
||||||
|
$args
|
||||||
|
|
||||||
|
echo finishing up
|
||||||
|
mkdir -p $out/bin
|
||||||
|
substitute ${wrapper} $out/bin/hoogle \
|
||||||
|
--subst-var out --subst-var-by shell ${stdenv.shell} \
|
||||||
|
--subst-var-by hoogle ${hoogle}
|
||||||
|
chmod +x $out/bin/hoogle
|
||||||
|
'';
|
||||||
|
|
||||||
|
passthru = {
|
||||||
|
isHaskellLibrary = false; # for the filter in ./with-packages-wrapper.nix
|
||||||
|
};
|
||||||
|
|
||||||
|
meta = {
|
||||||
|
description = "A local Hoogle database";
|
||||||
|
platforms = ghc.meta.platforms;
|
||||||
|
hydraPlatforms = with lib.platforms; none;
|
||||||
|
maintainers = with lib.maintainers; [ ttuegel ];
|
||||||
|
};
|
||||||
|
}
|
|
@ -0,0 +1,2 @@
|
||||||
|
args@{ pkgs, lib, callPackage }: self:
|
||||||
|
(import ./hackage-packages.nix args self)
|
519
pkgs/by-name/ha/haskell/haskell-modules/lib/compose.nix
Normal file
519
pkgs/by-name/ha/haskell/haskell-modules/lib/compose.nix
Normal file
|
@ -0,0 +1,519 @@
|
||||||
|
# TODO(@Ericson2314): Remove `pkgs` param, which is only used for
|
||||||
|
# `buildStackProject`, `justStaticExecutables` and `checkUnusedPackages`
|
||||||
|
{ pkgs, lib }:
|
||||||
|
|
||||||
|
rec {
|
||||||
|
|
||||||
|
/* This function takes a file like `hackage-packages.nix` and constructs
|
||||||
|
a full package set out of that.
|
||||||
|
*/
|
||||||
|
makePackageSet = import ../make-package-set.nix;
|
||||||
|
|
||||||
|
/* The function overrideCabal lets you alter the arguments to the
|
||||||
|
mkDerivation function.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
First, note how the aeson package is constructed in hackage-packages.nix:
|
||||||
|
|
||||||
|
"aeson" = callPackage ({ mkDerivation, attoparsec, <snip>
|
||||||
|
}:
|
||||||
|
mkDerivation {
|
||||||
|
pname = "aeson";
|
||||||
|
<snip>
|
||||||
|
homepage = "https://github.com/bos/aeson";
|
||||||
|
})
|
||||||
|
|
||||||
|
The mkDerivation function of haskellPackages will take care of putting
|
||||||
|
the homepage in the right place, in meta.
|
||||||
|
|
||||||
|
> haskellPackages.aeson.meta.homepage
|
||||||
|
"https://github.com/bos/aeson"
|
||||||
|
|
||||||
|
> x = haskell.lib.compose.overrideCabal (old: { homepage = old.homepage + "#readme"; }) haskellPackages.aeson
|
||||||
|
> x.meta.homepage
|
||||||
|
"https://github.com/bos/aeson#readme"
|
||||||
|
|
||||||
|
*/
|
||||||
|
overrideCabal = f: drv: (drv.override (args: args // {
|
||||||
|
mkDerivation = drv: (args.mkDerivation drv).override f;
|
||||||
|
})) // {
|
||||||
|
overrideScope = scope: overrideCabal f (drv.overrideScope scope);
|
||||||
|
};
|
||||||
|
|
||||||
|
# : Map Name (Either Path VersionNumber) -> HaskellPackageOverrideSet
|
||||||
|
# Given a set whose values are either paths or version strings, produces
|
||||||
|
# a package override set (i.e. (self: super: { etc. })) that sets
|
||||||
|
# the packages named in the input set to the corresponding versions
|
||||||
|
packageSourceOverrides =
|
||||||
|
overrides: self: super: pkgs.lib.mapAttrs (name: src:
|
||||||
|
let isPath = x: builtins.substring 0 1 (toString x) == "/";
|
||||||
|
generateExprs = if isPath src
|
||||||
|
then self.callCabal2nix
|
||||||
|
else self.callHackage;
|
||||||
|
in generateExprs name src {}) overrides;
|
||||||
|
|
||||||
|
/* doCoverage modifies a haskell package to enable the generation
|
||||||
|
and installation of a coverage report.
|
||||||
|
|
||||||
|
See https://wiki.haskell.org/Haskell_program_coverage
|
||||||
|
*/
|
||||||
|
doCoverage = overrideCabal (drv: { doCoverage = true; });
|
||||||
|
|
||||||
|
/* dontCoverage modifies a haskell package to disable the generation
|
||||||
|
and installation of a coverage report.
|
||||||
|
*/
|
||||||
|
dontCoverage = overrideCabal (drv: { doCoverage = false; });
|
||||||
|
|
||||||
|
/* doHaddock modifies a haskell package to enable the generation and
|
||||||
|
installation of API documentation from code comments using the
|
||||||
|
haddock tool.
|
||||||
|
*/
|
||||||
|
doHaddock = overrideCabal (drv: { doHaddock = true; });
|
||||||
|
|
||||||
|
/* dontHaddock modifies a haskell package to disable the generation and
|
||||||
|
installation of API documentation from code comments using the
|
||||||
|
haddock tool.
|
||||||
|
*/
|
||||||
|
dontHaddock = overrideCabal (drv: { doHaddock = false; });
|
||||||
|
|
||||||
|
/* doJailbreak enables the removal of version bounds from the cabal
|
||||||
|
file. You may want to avoid this function.
|
||||||
|
|
||||||
|
This is useful when a package reports that it can not be built
|
||||||
|
due to version mismatches. In some cases, removing the version
|
||||||
|
bounds entirely is an easy way to make a package build, but at
|
||||||
|
the risk of breaking software in non-obvious ways now or in the
|
||||||
|
future.
|
||||||
|
|
||||||
|
Instead of jailbreaking, you can patch the cabal file.
|
||||||
|
|
||||||
|
Note that jailbreaking at this time, doesn't lift bounds on
|
||||||
|
conditional branches.
|
||||||
|
https://github.com/peti/jailbreak-cabal/issues/7 has further details.
|
||||||
|
|
||||||
|
*/
|
||||||
|
doJailbreak = overrideCabal (drv: { jailbreak = true; });
|
||||||
|
|
||||||
|
/* dontJailbreak restores the use of the version bounds the check
|
||||||
|
the use of dependencies in the package description.
|
||||||
|
*/
|
||||||
|
dontJailbreak = overrideCabal (drv: { jailbreak = false; });
|
||||||
|
|
||||||
|
/* doCheck enables dependency checking, compilation and execution
|
||||||
|
of test suites listed in the package description file.
|
||||||
|
*/
|
||||||
|
doCheck = overrideCabal (drv: { doCheck = true; });
|
||||||
|
/* dontCheck disables dependency checking, compilation and execution
|
||||||
|
of test suites listed in the package description file.
|
||||||
|
*/
|
||||||
|
dontCheck = overrideCabal (drv: { doCheck = false; });
|
||||||
|
/* The dontCheckIf variant sets doCheck = false if the condition
|
||||||
|
applies. In any other case the previously set/default value is used.
|
||||||
|
This prevents accidentally re-enabling tests in a later override.
|
||||||
|
*/
|
||||||
|
dontCheckIf = condition: if condition then dontCheck else lib.id;
|
||||||
|
|
||||||
|
/* doBenchmark enables dependency checking and compilation
|
||||||
|
for benchmarks listed in the package description file.
|
||||||
|
Benchmarks are, however, not executed at the moment.
|
||||||
|
*/
|
||||||
|
doBenchmark = overrideCabal (drv: { doBenchmark = true; });
|
||||||
|
/* dontBenchmark disables dependency checking, compilation and execution
|
||||||
|
for benchmarks listed in the package description file.
|
||||||
|
*/
|
||||||
|
dontBenchmark = overrideCabal (drv: { doBenchmark = false; });
|
||||||
|
|
||||||
|
/* doDistribute enables the distribution of binaries for the package
|
||||||
|
via hydra.
|
||||||
|
*/
|
||||||
|
doDistribute = overrideCabal (drv: {
|
||||||
|
# lib.platforms.all is the default value for platforms (since GHC can cross-compile)
|
||||||
|
hydraPlatforms = lib.subtractLists (drv.badPlatforms or [])
|
||||||
|
(drv.platforms or lib.platforms.all);
|
||||||
|
});
|
||||||
|
/* dontDistribute disables the distribution of binaries for the package
|
||||||
|
via hydra.
|
||||||
|
*/
|
||||||
|
dontDistribute = overrideCabal (drv: { hydraPlatforms = []; });
|
||||||
|
|
||||||
|
/* appendConfigureFlag adds a single argument that will be passed to the
|
||||||
|
cabal configure command, after the arguments that have been defined
|
||||||
|
in the initial declaration or previous overrides.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
> haskell.lib.compose.appendConfigureFlag "--profiling-detail=all-functions" haskellPackages.servant
|
||||||
|
*/
|
||||||
|
appendConfigureFlag = x: appendConfigureFlags [x];
|
||||||
|
appendConfigureFlags = xs: overrideCabal (drv: { configureFlags = (drv.configureFlags or []) ++ xs; });
|
||||||
|
|
||||||
|
appendBuildFlag = x: overrideCabal (drv: { buildFlags = (drv.buildFlags or []) ++ [x]; });
|
||||||
|
appendBuildFlags = xs: overrideCabal (drv: { buildFlags = (drv.buildFlags or []) ++ xs; });
|
||||||
|
|
||||||
|
/* removeConfigureFlag drv x is a Haskell package like drv, but with
|
||||||
|
all cabal configure arguments that are equal to x removed.
|
||||||
|
|
||||||
|
> haskell.lib.compose.removeConfigureFlag "--verbose" haskellPackages.servant
|
||||||
|
*/
|
||||||
|
removeConfigureFlag = x: overrideCabal (drv: { configureFlags = lib.remove x (drv.configureFlags or []); });
|
||||||
|
|
||||||
|
addBuildTool = x: addBuildTools [x];
|
||||||
|
addBuildTools = xs: overrideCabal (drv: { buildTools = (drv.buildTools or []) ++ xs; });
|
||||||
|
|
||||||
|
addExtraLibrary = x: addExtraLibraries [x];
|
||||||
|
addExtraLibraries = xs: overrideCabal (drv: { extraLibraries = (drv.extraLibraries or []) ++ xs; });
|
||||||
|
|
||||||
|
addBuildDepend = x: addBuildDepends [x];
|
||||||
|
addBuildDepends = xs: overrideCabal (drv: { buildDepends = (drv.buildDepends or []) ++ xs; });
|
||||||
|
|
||||||
|
addTestToolDepend = x: addTestToolDepends [x];
|
||||||
|
addTestToolDepends = xs: overrideCabal (drv: { testToolDepends = (drv.testToolDepends or []) ++ xs; });
|
||||||
|
|
||||||
|
addPkgconfigDepend = x: addPkgconfigDepends [x];
|
||||||
|
addPkgconfigDepends = xs: overrideCabal (drv: { pkg-configDepends = (drv.pkg-configDepends or []) ++ xs; });
|
||||||
|
|
||||||
|
addSetupDepend = x: addSetupDepends [x];
|
||||||
|
addSetupDepends = xs: overrideCabal (drv: { setupHaskellDepends = (drv.setupHaskellDepends or []) ++ xs; });
|
||||||
|
|
||||||
|
enableCabalFlag = x: drv: appendConfigureFlag "-f${x}" (removeConfigureFlag "-f-${x}" drv);
|
||||||
|
disableCabalFlag = x: drv: appendConfigureFlag "-f-${x}" (removeConfigureFlag "-f${x}" drv);
|
||||||
|
|
||||||
|
markBroken = overrideCabal (drv: { broken = true; hydraPlatforms = []; });
|
||||||
|
unmarkBroken = overrideCabal (drv: { broken = false; });
|
||||||
|
markBrokenVersion = version: drv: assert drv.version == version; markBroken drv;
|
||||||
|
markUnbroken = overrideCabal (drv: { broken = false; });
|
||||||
|
|
||||||
|
enableLibraryProfiling = overrideCabal (drv: { enableLibraryProfiling = true; });
|
||||||
|
disableLibraryProfiling = overrideCabal (drv: { enableLibraryProfiling = false; });
|
||||||
|
|
||||||
|
enableExecutableProfiling = overrideCabal (drv: { enableExecutableProfiling = true; });
|
||||||
|
disableExecutableProfiling = overrideCabal (drv: { enableExecutableProfiling = false; });
|
||||||
|
|
||||||
|
enableSharedExecutables = overrideCabal (drv: { enableSharedExecutables = true; });
|
||||||
|
disableSharedExecutables = overrideCabal (drv: { enableSharedExecutables = false; });
|
||||||
|
|
||||||
|
enableSharedLibraries = overrideCabal (drv: { enableSharedLibraries = true; });
|
||||||
|
disableSharedLibraries = overrideCabal (drv: { enableSharedLibraries = false; });
|
||||||
|
|
||||||
|
enableDeadCodeElimination = overrideCabal (drv: { enableDeadCodeElimination = true; });
|
||||||
|
disableDeadCodeElimination = overrideCabal (drv: { enableDeadCodeElimination = false; });
|
||||||
|
|
||||||
|
enableStaticLibraries = overrideCabal (drv: { enableStaticLibraries = true; });
|
||||||
|
disableStaticLibraries = overrideCabal (drv: { enableStaticLibraries = false; });
|
||||||
|
|
||||||
|
enableSeparateBinOutput = overrideCabal (drv: { enableSeparateBinOutput = true; });
|
||||||
|
|
||||||
|
appendPatch = x: appendPatches [x];
|
||||||
|
appendPatches = xs: overrideCabal (drv: { patches = (drv.patches or []) ++ xs; });
|
||||||
|
|
||||||
|
/* Set a specific build target instead of compiling all targets in the package.
|
||||||
|
* For example, imagine we have a .cabal file with a library, and 2 executables "dev" and "server".
|
||||||
|
* We can build only "server" and not wait on the compilation of "dev" by using setBuildTarget as follows:
|
||||||
|
*
|
||||||
|
* > setBuildTarget "server" (callCabal2nix "thePackageName" thePackageSrc {})
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
setBuildTargets = xs: overrideCabal (drv: { buildTarget = lib.concatStringsSep " " xs; });
|
||||||
|
setBuildTarget = x: setBuildTargets [x];
|
||||||
|
|
||||||
|
doHyperlinkSource = overrideCabal (drv: { hyperlinkSource = true; });
|
||||||
|
dontHyperlinkSource = overrideCabal (drv: { hyperlinkSource = false; });
|
||||||
|
|
||||||
|
disableHardening = flags: overrideCabal (drv: { hardeningDisable = flags; });
|
||||||
|
|
||||||
|
/* Let Nix strip the binary files.
|
||||||
|
* This removes debugging symbols.
|
||||||
|
*/
|
||||||
|
doStrip = overrideCabal (drv: { dontStrip = false; });
|
||||||
|
|
||||||
|
/* Stop Nix from stripping the binary files.
|
||||||
|
* This keeps debugging symbols.
|
||||||
|
*/
|
||||||
|
dontStrip = overrideCabal (drv: { dontStrip = true; });
|
||||||
|
|
||||||
|
/* Useful for debugging segfaults with gdb.
|
||||||
|
* This includes dontStrip.
|
||||||
|
*/
|
||||||
|
enableDWARFDebugging = drv:
|
||||||
|
# -g: enables debugging symbols
|
||||||
|
# --disable-*-stripping: tell GHC not to strip resulting binaries
|
||||||
|
# dontStrip: see above
|
||||||
|
appendConfigureFlag "--ghc-options=-g --disable-executable-stripping --disable-library-stripping" (dontStrip drv);
|
||||||
|
|
||||||
|
/* Create a source distribution tarball like those found on hackage,
|
||||||
|
instead of building the package.
|
||||||
|
*/
|
||||||
|
sdistTarball = pkg: lib.overrideDerivation pkg (drv: {
|
||||||
|
name = "${drv.pname}-source-${drv.version}";
|
||||||
|
# Since we disable the haddock phase, we also need to override the
|
||||||
|
# outputs since the separate doc output will not be produced.
|
||||||
|
outputs = ["out"];
|
||||||
|
buildPhase = "./Setup sdist";
|
||||||
|
haddockPhase = ":";
|
||||||
|
checkPhase = ":";
|
||||||
|
installPhase = "install -D dist/${drv.pname}-*.tar.gz $out/${drv.pname}-${drv.version}.tar.gz";
|
||||||
|
fixupPhase = ":";
|
||||||
|
});
|
||||||
|
|
||||||
|
/* Create a documentation tarball suitable for uploading to Hackage instead
|
||||||
|
of building the package.
|
||||||
|
*/
|
||||||
|
documentationTarball = pkg:
|
||||||
|
pkgs.lib.overrideDerivation pkg (drv: {
|
||||||
|
name = "${drv.name}-docs";
|
||||||
|
# Like sdistTarball, disable the "doc" output here.
|
||||||
|
outputs = [ "out" ];
|
||||||
|
buildPhase = ''
|
||||||
|
runHook preHaddock
|
||||||
|
./Setup haddock --for-hackage
|
||||||
|
runHook postHaddock
|
||||||
|
'';
|
||||||
|
haddockPhase = ":";
|
||||||
|
checkPhase = ":";
|
||||||
|
installPhase = ''
|
||||||
|
runHook preInstall
|
||||||
|
mkdir -p "$out"
|
||||||
|
tar --format=ustar \
|
||||||
|
-czf "$out/${drv.name}-docs.tar.gz" \
|
||||||
|
-C dist/doc/html "${drv.name}-docs"
|
||||||
|
runHook postInstall
|
||||||
|
'';
|
||||||
|
});
|
||||||
|
|
||||||
|
/* Use the gold linker. It is a linker for ELF that is designed
|
||||||
|
"to run as fast as possible on modern systems"
|
||||||
|
*/
|
||||||
|
linkWithGold = appendConfigureFlag
|
||||||
|
"--ghc-option=-optl-fuse-ld=gold --ld-option=-fuse-ld=gold --with-ld=ld.gold";
|
||||||
|
|
||||||
|
/* link executables statically against haskell libs to reduce
|
||||||
|
closure size
|
||||||
|
*/
|
||||||
|
justStaticExecutables = overrideCabal (drv: {
|
||||||
|
enableSharedExecutables = false;
|
||||||
|
enableLibraryProfiling = false;
|
||||||
|
isLibrary = false;
|
||||||
|
doHaddock = false;
|
||||||
|
postFixup = drv.postFixup or "" + ''
|
||||||
|
|
||||||
|
# Remove every directory which could have links to other store paths.
|
||||||
|
rm -rf $out/lib $out/nix-support $out/share/doc
|
||||||
|
'';
|
||||||
|
});
|
||||||
|
|
||||||
|
/* Build a source distribution tarball instead of using the source files
|
||||||
|
directly. The effect is that the package is built as if it were published
|
||||||
|
on hackage. This can be used as a test for the source distribution,
|
||||||
|
assuming the build fails when packaging mistakes are in the cabal file.
|
||||||
|
|
||||||
|
A faster implementation using `cabal-install` is available as
|
||||||
|
`buildFromCabalSdist` in your Haskell package set.
|
||||||
|
*/
|
||||||
|
buildFromSdist = pkg: overrideCabal (drv: {
|
||||||
|
src = "${sdistTarball pkg}/${pkg.pname}-${pkg.version}.tar.gz";
|
||||||
|
|
||||||
|
# Revising and jailbreaking the cabal file has been handled in sdistTarball
|
||||||
|
revision = null;
|
||||||
|
editedCabalFile = null;
|
||||||
|
jailbreak = false;
|
||||||
|
}) pkg;
|
||||||
|
|
||||||
|
/* Build the package in a strict way to uncover potential problems.
|
||||||
|
This includes buildFromSdist and failOnAllWarnings.
|
||||||
|
*/
|
||||||
|
buildStrictly = pkg: buildFromSdist (failOnAllWarnings pkg);
|
||||||
|
|
||||||
|
/* Disable core optimizations, significantly speeds up build time */
|
||||||
|
disableOptimization = appendConfigureFlag "--disable-optimization";
|
||||||
|
|
||||||
|
/* Turn on most of the compiler warnings and fail the build if any
|
||||||
|
of them occur. */
|
||||||
|
failOnAllWarnings = appendConfigureFlag "--ghc-option=-Wall --ghc-option=-Werror";
|
||||||
|
|
||||||
|
/* Add a post-build check to verify that dependencies declared in
|
||||||
|
the cabal file are actually used.
|
||||||
|
|
||||||
|
The first attrset argument can be used to configure the strictness
|
||||||
|
of this check and a list of ignored package names that would otherwise
|
||||||
|
cause false alarms.
|
||||||
|
*/
|
||||||
|
checkUnusedPackages =
|
||||||
|
{ ignoreEmptyImports ? false
|
||||||
|
, ignoreMainModule ? false
|
||||||
|
, ignorePackages ? []
|
||||||
|
} : drv :
|
||||||
|
overrideCabal (_drv: {
|
||||||
|
postBuild = with lib;
|
||||||
|
let args = concatStringsSep " " (
|
||||||
|
optional ignoreEmptyImports "--ignore-empty-imports" ++
|
||||||
|
optional ignoreMainModule "--ignore-main-module" ++
|
||||||
|
map (pkg: "--ignore-package ${pkg}") ignorePackages
|
||||||
|
);
|
||||||
|
in "${pkgs.haskellPackages.packunused}/bin/packunused" +
|
||||||
|
optionalString (args != "") " ${args}";
|
||||||
|
}) (appendConfigureFlag "--ghc-option=-ddump-minimal-imports" drv);
|
||||||
|
|
||||||
|
buildStackProject = pkgs.callPackage ../generic-stack-builder.nix { };
|
||||||
|
|
||||||
|
/* Add a dummy command to trigger a build despite an equivalent
|
||||||
|
earlier build that is present in the store or cache.
|
||||||
|
*/
|
||||||
|
triggerRebuild = i: overrideCabal (drv: {
|
||||||
|
postUnpack = drv.postUnpack or "" + ''
|
||||||
|
|
||||||
|
# trigger rebuild ${toString i}
|
||||||
|
'';
|
||||||
|
});
|
||||||
|
|
||||||
|
/* Override the sources for the package and optionally the version.
|
||||||
|
This also takes of removing editedCabalFile.
|
||||||
|
*/
|
||||||
|
overrideSrc = { src, version ? null }: drv:
|
||||||
|
overrideCabal (_: { inherit src; version = if version == null then drv.version else version; editedCabalFile = null; }) drv;
|
||||||
|
|
||||||
|
# Get all of the build inputs of a haskell package, divided by category.
|
||||||
|
getBuildInputs = p: p.getBuildInputs;
|
||||||
|
|
||||||
|
# Extract the haskell build inputs of a haskell package.
|
||||||
|
# This is useful to build environments for developing on that
|
||||||
|
# package.
|
||||||
|
getHaskellBuildInputs = p: (getBuildInputs p).haskellBuildInputs;
|
||||||
|
|
||||||
|
# Under normal evaluation, simply return the original package. Under
|
||||||
|
# nix-shell evaluation, return a nix-shell optimized environment.
|
||||||
|
shellAware = p: if lib.inNixShell then p.env else p;
|
||||||
|
|
||||||
|
ghcInfo = ghc:
|
||||||
|
rec { isCross = (ghc.cross or null) != null;
|
||||||
|
isGhcjs = ghc.isGhcjs or false;
|
||||||
|
nativeGhc = if isCross || isGhcjs
|
||||||
|
then ghc.bootPkgs.ghc
|
||||||
|
else ghc;
|
||||||
|
};
|
||||||
|
|
||||||
|
### mkDerivation helpers
|
||||||
|
# These allow external users of a haskell package to extract
|
||||||
|
# information about how it is built in the same way that the
|
||||||
|
# generic haskell builder does, by reusing the same functions.
|
||||||
|
# Each function here has the same interface as mkDerivation and thus
|
||||||
|
# can be called for a given package simply by overriding the
|
||||||
|
# mkDerivation argument it used. See getHaskellBuildInputs above for
|
||||||
|
# an example of this.
|
||||||
|
|
||||||
|
# Some information about which phases should be run.
|
||||||
|
controlPhases = ghc: let inherit (ghcInfo ghc) isCross; in
|
||||||
|
{ doCheck ? !isCross
|
||||||
|
, doBenchmark ? false
|
||||||
|
, ...
|
||||||
|
}: { inherit doCheck doBenchmark; };
|
||||||
|
|
||||||
|
# Utility to convert a directory full of `cabal2nix`-generated files into a
|
||||||
|
# package override set
|
||||||
|
#
|
||||||
|
# packagesFromDirectory : { directory : Directory, ... } -> HaskellPackageOverrideSet
|
||||||
|
packagesFromDirectory =
|
||||||
|
{ directory, ... }:
|
||||||
|
|
||||||
|
self: super:
|
||||||
|
let
|
||||||
|
haskellPaths =
|
||||||
|
lib.filter (lib.hasSuffix ".nix")
|
||||||
|
(builtins.attrNames (builtins.readDir directory));
|
||||||
|
|
||||||
|
toKeyVal = file: {
|
||||||
|
name = builtins.replaceStrings [ ".nix" ] [ "" ] file;
|
||||||
|
|
||||||
|
value = self.callPackage (directory + "/${file}") { };
|
||||||
|
};
|
||||||
|
|
||||||
|
in
|
||||||
|
builtins.listToAttrs (map toKeyVal haskellPaths);
|
||||||
|
|
||||||
|
/*
|
||||||
|
INTERNAL function retained for backwards compatibility, use
|
||||||
|
haskell.packages.*.generateOptparseApplicativeCompletions instead!
|
||||||
|
*/
|
||||||
|
__generateOptparseApplicativeCompletion = exeName: overrideCabal (drv: {
|
||||||
|
postInstall = (drv.postInstall or "") + ''
|
||||||
|
bashCompDir="''${!outputBin}/share/bash-completion/completions"
|
||||||
|
zshCompDir="''${!outputBin}/share/zsh/vendor-completions"
|
||||||
|
fishCompDir="''${!outputBin}/share/fish/vendor_completions.d"
|
||||||
|
mkdir -p "$bashCompDir" "$zshCompDir" "$fishCompDir"
|
||||||
|
"''${!outputBin}/bin/${exeName}" --bash-completion-script "''${!outputBin}/bin/${exeName}" >"$bashCompDir/${exeName}"
|
||||||
|
"''${!outputBin}/bin/${exeName}" --zsh-completion-script "''${!outputBin}/bin/${exeName}" >"$zshCompDir/_${exeName}"
|
||||||
|
"''${!outputBin}/bin/${exeName}" --fish-completion-script "''${!outputBin}/bin/${exeName}" >"$fishCompDir/${exeName}.fish"
|
||||||
|
|
||||||
|
# Sanity check
|
||||||
|
grep -F ${exeName} <$bashCompDir/${exeName} >/dev/null || {
|
||||||
|
echo 'Could not find ${exeName} in completion script.'
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
'';
|
||||||
|
});
|
||||||
|
|
||||||
|
/*
|
||||||
|
Retained for backwards compatibility.
|
||||||
|
Use haskell.packages.*.generateOptparseApplicativeCompletions
|
||||||
|
which is cross aware instead.
|
||||||
|
*/
|
||||||
|
generateOptparseApplicativeCompletions = commands: pkg:
|
||||||
|
lib.warnIf (lib.isInOldestRelease 2211) "haskellLib.generateOptparseApplicativeCompletions is deprecated in favor of haskellPackages.generateOptparseApplicativeCompletions. Please change ${pkg.name} to use the latter and make sure it uses its matching haskell.packages set!"
|
||||||
|
(pkgs.lib.foldr __generateOptparseApplicativeCompletion pkg commands);
|
||||||
|
|
||||||
|
/*
|
||||||
|
Retained for backwards compatibility.
|
||||||
|
Use haskell.packages.*.generateOptparseApplicativeCompletions
|
||||||
|
which is cross aware instead.
|
||||||
|
*/
|
||||||
|
generateOptparseApplicativeCompletion = command: pkg:
|
||||||
|
lib.warnIf (lib.isInOldestRelease 2211) "haskellLib.generateOptparseApplicativeCompletion is deprecated in favor of haskellPackages.generateOptparseApplicativeCompletions (plural!). Please change ${pkg.name} to use the latter and make sure it uses its matching haskell.packages set!"
|
||||||
|
(__generateOptparseApplicativeCompletion command pkg);
|
||||||
|
|
||||||
|
# Don't fail at configure time if there are multiple versions of the
|
||||||
|
# same package in the (recursive) dependencies of the package being
|
||||||
|
# built. Will delay failures, if any, to compile time.
|
||||||
|
allowInconsistentDependencies = overrideCabal (drv: {
|
||||||
|
allowInconsistentDependencies = true;
|
||||||
|
});
|
||||||
|
|
||||||
|
# Work around a Cabal bug requiring pkg-config --static --libs to work even
|
||||||
|
# when linking dynamically, affecting Cabal 3.8 and 3.9.
|
||||||
|
# https://github.com/haskell/cabal/issues/8455
|
||||||
|
#
|
||||||
|
# For this, we treat the runtime system/pkg-config dependencies of a Haskell
|
||||||
|
# derivation as if they were propagated from their dependencies which allows
|
||||||
|
# pkg-config --static to work in most cases.
|
||||||
|
#
|
||||||
|
# Warning: This function may change or be removed at any time, e.g. if we find
|
||||||
|
# a different workaround, upstream fixes the bug or we patch Cabal.
|
||||||
|
__CabalEagerPkgConfigWorkaround =
|
||||||
|
let
|
||||||
|
# Take list of derivations and return list of the transitive dependency
|
||||||
|
# closure, only taking into account buildInputs. Loosely based on
|
||||||
|
# closePropagationFast.
|
||||||
|
propagatedPlainBuildInputs = drvs:
|
||||||
|
builtins.map (i: i.val) (
|
||||||
|
builtins.genericClosure {
|
||||||
|
startSet = builtins.map (drv:
|
||||||
|
{ key = drv.outPath; val = drv; }
|
||||||
|
) drvs;
|
||||||
|
operator = { val, ... }:
|
||||||
|
if !lib.isDerivation val
|
||||||
|
then [ ]
|
||||||
|
else
|
||||||
|
builtins.concatMap (drv:
|
||||||
|
if !lib.isDerivation drv
|
||||||
|
then [ ]
|
||||||
|
else [ { key = drv.outPath; val = drv; } ]
|
||||||
|
) (val.buildInputs or [ ] ++ val.propagatedBuildInputs or [ ]);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
in
|
||||||
|
overrideCabal (old: {
|
||||||
|
benchmarkPkgconfigDepends = propagatedPlainBuildInputs old.benchmarkPkgconfigDepends or [ ];
|
||||||
|
executablePkgconfigDepends = propagatedPlainBuildInputs old.executablePkgconfigDepends or [ ];
|
||||||
|
libraryPkgconfigDepends = propagatedPlainBuildInputs old.libraryPkgconfigDepends or [ ];
|
||||||
|
testPkgconfigDepends = propagatedPlainBuildInputs old.testPkgconfigDepends or [ ];
|
||||||
|
});
|
||||||
|
}
|
362
pkgs/by-name/ha/haskell/haskell-modules/lib/default.nix
Normal file
362
pkgs/by-name/ha/haskell/haskell-modules/lib/default.nix
Normal file
|
@ -0,0 +1,362 @@
|
||||||
|
# TODO(@Ericson2314): Remove `pkgs` param, which is only used for
|
||||||
|
# `buildStackProject`, `justStaticExecutables` and `checkUnusedPackages`
|
||||||
|
{ pkgs, lib }:
|
||||||
|
|
||||||
|
rec {
|
||||||
|
/* The same functionality as this haskell.lib, except that the derivation
|
||||||
|
being overridden is always the last parameter. This permits more natural
|
||||||
|
composition of several overrides, i.e. without having to nestle one call
|
||||||
|
between the function name and argument of another. haskell.lib.compose is
|
||||||
|
preferred for any new code.
|
||||||
|
*/
|
||||||
|
compose = import ./compose.nix { inherit pkgs lib; };
|
||||||
|
|
||||||
|
/* This function takes a file like `hackage-packages.nix` and constructs
|
||||||
|
a full package set out of that.
|
||||||
|
*/
|
||||||
|
makePackageSet = compose.makePackageSet;
|
||||||
|
|
||||||
|
/* The function overrideCabal lets you alter the arguments to the
|
||||||
|
mkDerivation function.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
First, note how the aeson package is constructed in hackage-packages.nix:
|
||||||
|
|
||||||
|
"aeson" = callPackage ({ mkDerivation, attoparsec, <snip>
|
||||||
|
}:
|
||||||
|
mkDerivation {
|
||||||
|
pname = "aeson";
|
||||||
|
<snip>
|
||||||
|
homepage = "https://github.com/bos/aeson";
|
||||||
|
})
|
||||||
|
|
||||||
|
The mkDerivation function of haskellPackages will take care of putting
|
||||||
|
the homepage in the right place, in meta.
|
||||||
|
|
||||||
|
> haskellPackages.aeson.meta.homepage
|
||||||
|
"https://github.com/bos/aeson"
|
||||||
|
|
||||||
|
> x = haskell.lib.overrideCabal haskellPackages.aeson (old: { homepage = old.homepage + "#readme"; })
|
||||||
|
> x.meta.homepage
|
||||||
|
"https://github.com/bos/aeson#readme"
|
||||||
|
|
||||||
|
*/
|
||||||
|
overrideCabal = drv: f: compose.overrideCabal f drv;
|
||||||
|
|
||||||
|
# : Map Name (Either Path VersionNumber) -> HaskellPackageOverrideSet
|
||||||
|
# Given a set whose values are either paths or version strings, produces
|
||||||
|
# a package override set (i.e. (self: super: { etc. })) that sets
|
||||||
|
# the packages named in the input set to the corresponding versions
|
||||||
|
packageSourceOverrides = compose.packageSourceOverrides;
|
||||||
|
|
||||||
|
/* doCoverage modifies a haskell package to enable the generation
|
||||||
|
and installation of a coverage report.
|
||||||
|
|
||||||
|
See https://wiki.haskell.org/Haskell_program_coverage
|
||||||
|
*/
|
||||||
|
doCoverage = compose.doCoverage;
|
||||||
|
|
||||||
|
/* dontCoverage modifies a haskell package to disable the generation
|
||||||
|
and installation of a coverage report.
|
||||||
|
*/
|
||||||
|
dontCoverage = compose.dontCoverage;
|
||||||
|
|
||||||
|
/* doHaddock modifies a haskell package to enable the generation and
|
||||||
|
installation of API documentation from code comments using the
|
||||||
|
haddock tool.
|
||||||
|
*/
|
||||||
|
doHaddock = compose.doHaddock;
|
||||||
|
|
||||||
|
/* dontHaddock modifies a haskell package to disable the generation and
|
||||||
|
installation of API documentation from code comments using the
|
||||||
|
haddock tool.
|
||||||
|
*/
|
||||||
|
dontHaddock = compose.dontHaddock;
|
||||||
|
|
||||||
|
/* doJailbreak enables the removal of version bounds from the cabal
|
||||||
|
file. You may want to avoid this function.
|
||||||
|
|
||||||
|
This is useful when a package reports that it can not be built
|
||||||
|
due to version mismatches. In some cases, removing the version
|
||||||
|
bounds entirely is an easy way to make a package build, but at
|
||||||
|
the risk of breaking software in non-obvious ways now or in the
|
||||||
|
future.
|
||||||
|
|
||||||
|
Instead of jailbreaking, you can patch the cabal file.
|
||||||
|
|
||||||
|
Note that jailbreaking at this time, doesn't lift bounds on
|
||||||
|
conditional branches.
|
||||||
|
https://github.com/peti/jailbreak-cabal/issues/7 has further details.
|
||||||
|
|
||||||
|
*/
|
||||||
|
doJailbreak = compose.doJailbreak;
|
||||||
|
|
||||||
|
/* dontJailbreak restores the use of the version bounds the check
|
||||||
|
the use of dependencies in the package description.
|
||||||
|
*/
|
||||||
|
dontJailbreak = compose.dontJailbreak;
|
||||||
|
|
||||||
|
/* doCheck enables dependency checking, compilation and execution
|
||||||
|
of test suites listed in the package description file.
|
||||||
|
*/
|
||||||
|
doCheck = compose.doCheck;
|
||||||
|
/* dontCheck disables dependency checking, compilation and execution
|
||||||
|
of test suites listed in the package description file.
|
||||||
|
*/
|
||||||
|
dontCheck = compose.dontCheck;
|
||||||
|
/* The dontCheckIf variant sets doCheck = false if the condition
|
||||||
|
applies. In any other case the previously set/default value is used.
|
||||||
|
This prevents accidentally re-enabling tests in a later override.
|
||||||
|
*/
|
||||||
|
dontCheckIf = drv: condition: compose.dontCheckIf condition drv;
|
||||||
|
|
||||||
|
/* doBenchmark enables dependency checking, compilation and execution
|
||||||
|
for benchmarks listed in the package description file.
|
||||||
|
*/
|
||||||
|
doBenchmark = compose.doBenchmark;
|
||||||
|
/* dontBenchmark disables dependency checking, compilation and execution
|
||||||
|
for benchmarks listed in the package description file.
|
||||||
|
*/
|
||||||
|
dontBenchmark = compose.dontBenchmark;
|
||||||
|
|
||||||
|
/* doDistribute enables the distribution of binaries for the package
|
||||||
|
via hydra.
|
||||||
|
*/
|
||||||
|
doDistribute = compose.doDistribute;
|
||||||
|
/* dontDistribute disables the distribution of binaries for the package
|
||||||
|
via hydra.
|
||||||
|
*/
|
||||||
|
dontDistribute = compose.dontDistribute;
|
||||||
|
|
||||||
|
/* appendConfigureFlag adds a single argument that will be passed to the
|
||||||
|
cabal configure command, after the arguments that have been defined
|
||||||
|
in the initial declaration or previous overrides.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
> haskell.lib.appendConfigureFlag haskellPackages.servant "--profiling-detail=all-functions"
|
||||||
|
*/
|
||||||
|
appendConfigureFlag = drv: x: compose.appendConfigureFlag x drv;
|
||||||
|
appendConfigureFlags = drv: xs: compose.appendConfigureFlags xs drv;
|
||||||
|
|
||||||
|
appendBuildFlag = drv: x: compose.appendBuildFlag x drv;
|
||||||
|
appendBuildFlags = drv: xs: compose.appendBuildFlags xs drv;
|
||||||
|
|
||||||
|
/* removeConfigureFlag drv x is a Haskell package like drv, but with
|
||||||
|
all cabal configure arguments that are equal to x removed.
|
||||||
|
|
||||||
|
> haskell.lib.removeConfigureFlag haskellPackages.servant "--verbose"
|
||||||
|
*/
|
||||||
|
removeConfigureFlag = drv: x: compose.removeConfigureFlag x drv;
|
||||||
|
|
||||||
|
addBuildTool = drv: x: compose.addBuildTool x drv;
|
||||||
|
addBuildTools = drv: xs: compose.addBuildTools xs drv;
|
||||||
|
|
||||||
|
addExtraLibrary = drv: x: compose.addExtraLibrary x drv;
|
||||||
|
addExtraLibraries = drv: xs: compose.addExtraLibraries xs drv;
|
||||||
|
|
||||||
|
addBuildDepend = drv: x: compose.addBuildDepend x drv;
|
||||||
|
addBuildDepends = drv: xs: compose.addBuildDepends xs drv;
|
||||||
|
|
||||||
|
addTestToolDepend = drv: x: compose.addTestToolDepend x drv;
|
||||||
|
addTestToolDepends = drv: xs: compose.addTestToolDepends xs drv;
|
||||||
|
|
||||||
|
addPkgconfigDepend = drv: x: compose.addPkgconfigDepend x drv;
|
||||||
|
addPkgconfigDepends = drv: xs: compose.addPkgconfigDepends xs drv;
|
||||||
|
|
||||||
|
addSetupDepend = drv: x: compose.addSetupDepend x drv;
|
||||||
|
addSetupDepends = drv: xs: compose.addSetupDepends xs drv;
|
||||||
|
|
||||||
|
enableCabalFlag = drv: x: compose.enableCabalFlag x drv;
|
||||||
|
disableCabalFlag = drv: x: compose.disableCabalFlag x drv;
|
||||||
|
|
||||||
|
markBroken = compose.markBroken;
|
||||||
|
unmarkBroken = compose.unmarkBroken;
|
||||||
|
markBrokenVersion = compose.markBrokenVersion;
|
||||||
|
markUnbroken = compose.markUnbroken;
|
||||||
|
|
||||||
|
enableLibraryProfiling = compose.enableLibraryProfiling;
|
||||||
|
disableLibraryProfiling = compose.disableLibraryProfiling;
|
||||||
|
|
||||||
|
enableExecutableProfiling = compose.enableExecutableProfiling;
|
||||||
|
disableExecutableProfiling = compose.disableExecutableProfiling;
|
||||||
|
|
||||||
|
enableSharedExecutables = compose.enableSharedExecutables;
|
||||||
|
disableSharedExecutables = compose.disableSharedExecutables;
|
||||||
|
|
||||||
|
enableSharedLibraries = compose.enableSharedLibraries;
|
||||||
|
disableSharedLibraries = compose.disableSharedLibraries;
|
||||||
|
|
||||||
|
enableDeadCodeElimination = compose.enableDeadCodeElimination;
|
||||||
|
disableDeadCodeElimination = compose.disableDeadCodeElimination;
|
||||||
|
|
||||||
|
enableStaticLibraries = compose.enableStaticLibraries;
|
||||||
|
disableStaticLibraries = compose.disableStaticLibraries;
|
||||||
|
|
||||||
|
enableSeparateBinOutput = compose.enableSeparateBinOutput;
|
||||||
|
|
||||||
|
appendPatch = drv: x: compose.appendPatch x drv;
|
||||||
|
appendPatches = drv: xs: compose.appendPatches xs drv;
|
||||||
|
|
||||||
|
/* Set a specific build target instead of compiling all targets in the package.
|
||||||
|
* For example, imagine we have a .cabal file with a library, and 2 executables "dev" and "server".
|
||||||
|
* We can build only "server" and not wait on the compilation of "dev" by using setBuildTarget as follows:
|
||||||
|
*
|
||||||
|
* setBuildTarget (callCabal2nix "thePackageName" thePackageSrc {}) "server"
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
setBuildTargets = drv: xs: compose.setBuildTargets xs drv;
|
||||||
|
setBuildTarget = drv: x: compose.setBuildTarget x drv;
|
||||||
|
|
||||||
|
doHyperlinkSource = compose.doHyperlinkSource;
|
||||||
|
dontHyperlinkSource = compose.dontHyperlinkSource;
|
||||||
|
|
||||||
|
disableHardening = drv: flags: compose.disableHardening flags drv;
|
||||||
|
|
||||||
|
/* Let Nix strip the binary files.
|
||||||
|
* This removes debugging symbols.
|
||||||
|
*/
|
||||||
|
doStrip = compose.doStrip;
|
||||||
|
|
||||||
|
/* Stop Nix from stripping the binary files.
|
||||||
|
* This keeps debugging symbols.
|
||||||
|
*/
|
||||||
|
dontStrip = compose.dontStrip;
|
||||||
|
|
||||||
|
/* Useful for debugging segfaults with gdb.
|
||||||
|
* This includes dontStrip.
|
||||||
|
*/
|
||||||
|
enableDWARFDebugging = compose.enableDWARFDebugging;
|
||||||
|
|
||||||
|
/* Create a source distribution tarball like those found on hackage,
|
||||||
|
instead of building the package.
|
||||||
|
*/
|
||||||
|
sdistTarball = compose.sdistTarball;
|
||||||
|
|
||||||
|
/* Create a documentation tarball suitable for uploading to Hackage instead
|
||||||
|
of building the package.
|
||||||
|
*/
|
||||||
|
documentationTarball = compose.documentationTarball;
|
||||||
|
|
||||||
|
/* Use the gold linker. It is a linker for ELF that is designed
|
||||||
|
"to run as fast as possible on modern systems"
|
||||||
|
*/
|
||||||
|
linkWithGold = compose.linkWithGold;
|
||||||
|
|
||||||
|
/* link executables statically against haskell libs to reduce
|
||||||
|
closure size
|
||||||
|
*/
|
||||||
|
justStaticExecutables = compose.justStaticExecutables;
|
||||||
|
|
||||||
|
/* Build a source distribution tarball instead of using the source files
|
||||||
|
directly. The effect is that the package is built as if it were published
|
||||||
|
on hackage. This can be used as a test for the source distribution,
|
||||||
|
assuming the build fails when packaging mistakes are in the cabal file.
|
||||||
|
*/
|
||||||
|
buildFromSdist = compose.buildFromSdist;
|
||||||
|
|
||||||
|
/* Build the package in a strict way to uncover potential problems.
|
||||||
|
This includes buildFromSdist and failOnAllWarnings.
|
||||||
|
*/
|
||||||
|
buildStrictly = compose.buildStrictly;
|
||||||
|
|
||||||
|
/* Disable core optimizations, significantly speeds up build time */
|
||||||
|
disableOptimization = compose.disableOptimization;
|
||||||
|
|
||||||
|
/* Turn on most of the compiler warnings and fail the build if any
|
||||||
|
of them occur. */
|
||||||
|
failOnAllWarnings = compose.failOnAllWarnings;
|
||||||
|
|
||||||
|
/* Add a post-build check to verify that dependencies declared in
|
||||||
|
the cabal file are actually used.
|
||||||
|
|
||||||
|
The first attrset argument can be used to configure the strictness
|
||||||
|
of this check and a list of ignored package names that would otherwise
|
||||||
|
cause false alarms.
|
||||||
|
*/
|
||||||
|
checkUnusedPackages = compose.checkUnusedPackages;
|
||||||
|
|
||||||
|
buildStackProject = compose.buildStackProject;
|
||||||
|
|
||||||
|
/* Add a dummy command to trigger a build despite an equivalent
|
||||||
|
earlier build that is present in the store or cache.
|
||||||
|
*/
|
||||||
|
triggerRebuild = drv: i: compose.triggerRebuild i drv;
|
||||||
|
|
||||||
|
/* Override the sources for the package and optionally the version.
|
||||||
|
This also takes of removing editedCabalFile.
|
||||||
|
*/
|
||||||
|
overrideSrc = drv: src: compose.overrideSrc src drv;
|
||||||
|
|
||||||
|
# Get all of the build inputs of a haskell package, divided by category.
|
||||||
|
getBuildInputs = compose.getBuildInputs;
|
||||||
|
|
||||||
|
# Extract the haskell build inputs of a haskell package.
|
||||||
|
# This is useful to build environments for developing on that
|
||||||
|
# package.
|
||||||
|
getHaskellBuildInputs = compose.getHaskellBuildInputs;
|
||||||
|
|
||||||
|
# Under normal evaluation, simply return the original package. Under
|
||||||
|
# nix-shell evaluation, return a nix-shell optimized environment.
|
||||||
|
shellAware = compose.shellAware;
|
||||||
|
|
||||||
|
ghcInfo = compose.ghcInfo;
|
||||||
|
|
||||||
|
### mkDerivation helpers
|
||||||
|
# These allow external users of a haskell package to extract
|
||||||
|
# information about how it is built in the same way that the
|
||||||
|
# generic haskell builder does, by reusing the same functions.
|
||||||
|
# Each function here has the same interface as mkDerivation and thus
|
||||||
|
# can be called for a given package simply by overriding the
|
||||||
|
# mkDerivation argument it used. See getHaskellBuildInputs above for
|
||||||
|
# an example of this.
|
||||||
|
|
||||||
|
# Some information about which phases should be run.
|
||||||
|
controlPhases = compose.controlPhases;
|
||||||
|
|
||||||
|
# Utility to convert a directory full of `cabal2nix`-generated files into a
|
||||||
|
# package override set
|
||||||
|
#
|
||||||
|
# packagesFromDirectory : { directory : Directory, ... } -> HaskellPackageOverrideSet
|
||||||
|
packagesFromDirectory = compose.packagesFromDirectory;
|
||||||
|
|
||||||
|
addOptparseApplicativeCompletionScripts = exeName: pkg:
|
||||||
|
lib.warn "addOptparseApplicativeCompletionScripts is deprecated in favor of haskellPackages.generateOptparseApplicativeCompletions. Please change ${pkg.name} to use the latter and make sure it uses its matching haskell.packages set!"
|
||||||
|
(compose.__generateOptparseApplicativeCompletion exeName pkg);
|
||||||
|
|
||||||
|
/*
|
||||||
|
Modify a Haskell package to add shell completion scripts for the
|
||||||
|
given executable produced by it. These completion scripts will be
|
||||||
|
picked up automatically if the resulting derivation is installed,
|
||||||
|
e.g. by `nix-env -i`.
|
||||||
|
|
||||||
|
Invocation:
|
||||||
|
generateOptparseApplicativeCompletions command pkg
|
||||||
|
|
||||||
|
|
||||||
|
command: name of an executable
|
||||||
|
pkg: Haskell package that builds the executables
|
||||||
|
*/
|
||||||
|
generateOptparseApplicativeCompletion = compose.generateOptparseApplicativeCompletion;
|
||||||
|
|
||||||
|
/*
|
||||||
|
Modify a Haskell package to add shell completion scripts for the
|
||||||
|
given executables produced by it. These completion scripts will be
|
||||||
|
picked up automatically if the resulting derivation is installed,
|
||||||
|
e.g. by `nix-env -i`.
|
||||||
|
|
||||||
|
Invocation:
|
||||||
|
generateOptparseApplicativeCompletions commands pkg
|
||||||
|
|
||||||
|
|
||||||
|
commands: name of an executable
|
||||||
|
pkg: Haskell package that builds the executables
|
||||||
|
*/
|
||||||
|
generateOptparseApplicativeCompletions = compose.generateOptparseApplicativeCompletions;
|
||||||
|
|
||||||
|
# Don't fail at configure time if there are multiple versions of the
|
||||||
|
# same package in the (recursive) dependencies of the package being
|
||||||
|
# built. Will delay failures, if any, to compile time.
|
||||||
|
allowInconsistentDependencies = compose.allowInconsistentDependencies;
|
||||||
|
}
|
646
pkgs/by-name/ha/haskell/haskell-modules/make-package-set.nix
Normal file
646
pkgs/by-name/ha/haskell/haskell-modules/make-package-set.nix
Normal file
|
@ -0,0 +1,646 @@
|
||||||
|
# This expression takes a file like `hackage-packages.nix` and constructs
|
||||||
|
# a full package set out of that.
|
||||||
|
|
||||||
|
{ # package-set used for build tools (all of nixpkgs)
|
||||||
|
buildPackages
|
||||||
|
|
||||||
|
, # A haskell package set for Setup.hs, compiler plugins, and similar
|
||||||
|
# build-time uses.
|
||||||
|
buildHaskellPackages
|
||||||
|
|
||||||
|
, # package-set used for non-haskell dependencies (all of nixpkgs)
|
||||||
|
pkgs
|
||||||
|
|
||||||
|
, # stdenv provides our build and host platforms
|
||||||
|
stdenv
|
||||||
|
|
||||||
|
, # this module provides the list of known licenses and maintainers
|
||||||
|
lib
|
||||||
|
|
||||||
|
# needed for overrideCabal & packageSourceOverrides
|
||||||
|
, haskellLib
|
||||||
|
|
||||||
|
, # hashes for downloading Hackage packages
|
||||||
|
# This is either a directory or a .tar.gz containing the cabal files and
|
||||||
|
# hashes of Hackage as exemplified by this repository:
|
||||||
|
# https://github.com/commercialhaskell/all-cabal-hashes/tree/hackage
|
||||||
|
all-cabal-hashes
|
||||||
|
|
||||||
|
, # compiler to use
|
||||||
|
ghc
|
||||||
|
|
||||||
|
, # A function that takes `{ pkgs, lib, callPackage }` as the first arg and
|
||||||
|
# `self` as second, and returns a set of haskell packages
|
||||||
|
package-set
|
||||||
|
|
||||||
|
, # The final, fully overridden package set usable with the nixpkgs fixpoint
|
||||||
|
# overriding functionality
|
||||||
|
extensible-self
|
||||||
|
}:
|
||||||
|
|
||||||
|
# return value: a function from self to the package set
|
||||||
|
self:
|
||||||
|
|
||||||
|
let
|
||||||
|
inherit (stdenv) buildPlatform hostPlatform;
|
||||||
|
|
||||||
|
inherit (lib) fix' extends makeOverridable;
|
||||||
|
inherit (haskellLib) overrideCabal;
|
||||||
|
|
||||||
|
mkDerivationImpl = pkgs.callPackage ./generic-builder.nix {
|
||||||
|
inherit stdenv;
|
||||||
|
nodejs = buildPackages.nodejs-slim;
|
||||||
|
inherit (self) buildHaskellPackages ghc ghcWithHoogle ghcWithPackages;
|
||||||
|
inherit (self.buildHaskellPackages) jailbreak-cabal;
|
||||||
|
hscolour = overrideCabal (drv: {
|
||||||
|
isLibrary = false;
|
||||||
|
doHaddock = false;
|
||||||
|
hyperlinkSource = false; # Avoid depending on hscolour for this build.
|
||||||
|
postFixup = "rm -rf $out/lib $out/share $out/nix-support";
|
||||||
|
}) self.buildHaskellPackages.hscolour;
|
||||||
|
cpphs = overrideCabal (drv: {
|
||||||
|
isLibrary = false;
|
||||||
|
postFixup = "rm -rf $out/lib $out/share $out/nix-support";
|
||||||
|
}) (self.cpphs.overrideScope (self: super: {
|
||||||
|
mkDerivation = drv: super.mkDerivation (drv // {
|
||||||
|
enableSharedExecutables = false;
|
||||||
|
enableSharedLibraries = false;
|
||||||
|
doHaddock = false;
|
||||||
|
useCpphs = false;
|
||||||
|
});
|
||||||
|
}));
|
||||||
|
};
|
||||||
|
|
||||||
|
mkDerivation = makeOverridable mkDerivationImpl;
|
||||||
|
|
||||||
|
# manualArgs are the arguments that were explicitly passed to `callPackage`, like:
|
||||||
|
#
|
||||||
|
# callPackage foo { bar = null; };
|
||||||
|
#
|
||||||
|
# here `bar` is a manual argument.
|
||||||
|
callPackageWithScope = scope: fn: manualArgs:
|
||||||
|
let
|
||||||
|
# this code is copied from callPackage in lib/customisation.nix
|
||||||
|
#
|
||||||
|
# we cannot use `callPackage` here because we want to call `makeOverridable`
|
||||||
|
# on `drvScope` (we cannot add `overrideScope` after calling `callPackage` because then it is
|
||||||
|
# lost on `.override`) but determine the auto-args based on `drv` (the problem here
|
||||||
|
# is that nix has no way to "passthrough" args while preserving the reflection
|
||||||
|
# info that callPackage uses to determine the arguments).
|
||||||
|
drv = if lib.isFunction fn then fn else import fn;
|
||||||
|
auto = builtins.intersectAttrs (lib.functionArgs drv) scope;
|
||||||
|
|
||||||
|
# Converts a returned function to a functor attribute set if necessary
|
||||||
|
ensureAttrs = v: if builtins.isFunction v then { __functor = _: v; } else v;
|
||||||
|
|
||||||
|
# this wraps the `drv` function to add `scope` and `overrideScope` to the result.
|
||||||
|
drvScope = allArgs: ensureAttrs (drv allArgs) // {
|
||||||
|
inherit scope;
|
||||||
|
overrideScope = f:
|
||||||
|
let newScope = mkScope (fix' (extends f scope.__unfix__));
|
||||||
|
# note that we have to be careful here: `allArgs` includes the auto-arguments that
|
||||||
|
# weren't manually specified. If we would just pass `allArgs` to the recursive call here,
|
||||||
|
# then we wouldn't look up any packages in the scope in the next interation, because it
|
||||||
|
# appears as if all arguments were already manually passed, so the scope change would do
|
||||||
|
# nothing.
|
||||||
|
in callPackageWithScope newScope drv manualArgs;
|
||||||
|
};
|
||||||
|
in lib.makeOverridable drvScope (auto // manualArgs);
|
||||||
|
|
||||||
|
mkScope = scope: let
|
||||||
|
ps = pkgs.__splicedPackages;
|
||||||
|
scopeSpliced = pkgs.splicePackages {
|
||||||
|
pkgsBuildBuild = scope.buildHaskellPackages.buildHaskellPackages;
|
||||||
|
pkgsBuildHost = scope.buildHaskellPackages;
|
||||||
|
pkgsBuildTarget = {};
|
||||||
|
pkgsHostHost = {};
|
||||||
|
pkgsHostTarget = scope;
|
||||||
|
pkgsTargetTarget = {};
|
||||||
|
} // {
|
||||||
|
# Don't splice these
|
||||||
|
inherit (scope) ghc buildHaskellPackages;
|
||||||
|
};
|
||||||
|
in ps // ps.xorg // { inherit stdenv; } // scopeSpliced;
|
||||||
|
defaultScope = mkScope self;
|
||||||
|
callPackage = drv: args: callPackageWithScope defaultScope drv args;
|
||||||
|
|
||||||
|
# Use cabal2nix to create a default.nix for the package sources found at 'src'.
|
||||||
|
haskellSrc2nix = { name, src, sha256 ? null, extraCabal2nixOptions ? "" }:
|
||||||
|
let
|
||||||
|
sha256Arg = if sha256 == null then "--sha256=" else ''--sha256="${sha256}"'';
|
||||||
|
in buildPackages.runCommand "cabal2nix-${name}" {
|
||||||
|
nativeBuildInputs = [ buildPackages.cabal2nix-unwrapped ];
|
||||||
|
preferLocalBuild = true;
|
||||||
|
allowSubstitutes = false;
|
||||||
|
LANG = "en_US.UTF-8";
|
||||||
|
LOCALE_ARCHIVE = pkgs.lib.optionalString (buildPlatform.libc == "glibc") "${buildPackages.glibcLocales}/lib/locale/locale-archive";
|
||||||
|
} ''
|
||||||
|
export HOME="$TMP"
|
||||||
|
mkdir -p "$out"
|
||||||
|
cabal2nix --compiler=${self.ghc.haskellCompilerName} --system=${hostPlatform.config} ${sha256Arg} "${src}" ${extraCabal2nixOptions} > "$out/default.nix"
|
||||||
|
'';
|
||||||
|
|
||||||
|
# Given a package name and version, e.g. name = "async", version = "2.2.4",
|
||||||
|
# gives its cabal file and hashes (JSON file) as discovered from the
|
||||||
|
# all-cabal-hashes value. If that's a directory, it will copy the relevant
|
||||||
|
# files to $out; if it's a tarball, it will extract and move them to $out.
|
||||||
|
all-cabal-hashes-component = name: version: buildPackages.runCommand "all-cabal-hashes-component-${name}-${version}" {} ''
|
||||||
|
mkdir -p $out
|
||||||
|
if [ -d ${all-cabal-hashes} ]
|
||||||
|
then
|
||||||
|
cp ${all-cabal-hashes}/${name}/${version}/${name}.json $out
|
||||||
|
cp ${all-cabal-hashes}/${name}/${version}/${name}.cabal $out
|
||||||
|
else
|
||||||
|
tar --wildcards -xzvf ${all-cabal-hashes} \*/${name}/${version}/${name}.{json,cabal}
|
||||||
|
mv */${name}/${version}/${name}.{json,cabal} $out
|
||||||
|
fi
|
||||||
|
'';
|
||||||
|
|
||||||
|
hackage2nix = name: version: let component = all-cabal-hashes-component name version; in self.haskellSrc2nix {
|
||||||
|
name = "${name}-${version}";
|
||||||
|
sha256 = ''$(sed -e 's/.*"SHA256":"//' -e 's/".*$//' "${component}/${name}.json")'';
|
||||||
|
src = "${component}/${name}.cabal";
|
||||||
|
};
|
||||||
|
|
||||||
|
# Adds a nix file derived from cabal2nix in the passthru of the derivation it
|
||||||
|
# produces. This is useful to debug callHackage / callCabal2nix by looking at
|
||||||
|
# the content of the nix file pointed by `cabal2nixDeriver`.
|
||||||
|
# However, it does not keep a reference to that file, which may be garbage
|
||||||
|
# collected, which may be an annoyance.
|
||||||
|
callPackageKeepDeriver = src: args:
|
||||||
|
overrideCabal (orig: {
|
||||||
|
passthru = orig.passthru or {} // {
|
||||||
|
# When using callCabal2nix or callHackage, it is often useful
|
||||||
|
# to debug a failure by inspecting the Nix expression
|
||||||
|
# generated by cabal2nix. This can be accessed via this
|
||||||
|
# cabal2nixDeriver field.
|
||||||
|
cabal2nixDeriver = src;
|
||||||
|
};
|
||||||
|
}) (self.callPackage src args);
|
||||||
|
|
||||||
|
in package-set { inherit pkgs lib callPackage; } self // {
|
||||||
|
|
||||||
|
inherit mkDerivation callPackage haskellSrc2nix hackage2nix buildHaskellPackages;
|
||||||
|
|
||||||
|
inherit (haskellLib) packageSourceOverrides;
|
||||||
|
|
||||||
|
# callHackage :: Text -> Text -> AttrSet -> HaskellPackage
|
||||||
|
#
|
||||||
|
# e.g., while overriding a package set:
|
||||||
|
# '... foo = self.callHackage "foo" "1.5.3" {}; ...'
|
||||||
|
callHackage = name: version: callPackageKeepDeriver (self.hackage2nix name version);
|
||||||
|
|
||||||
|
# callHackageDirect
|
||||||
|
# :: { pkg :: Text, ver :: Text, sha256 :: Text }
|
||||||
|
# -> AttrSet
|
||||||
|
# -> HaskellPackage
|
||||||
|
#
|
||||||
|
# This function does not depend on all-cabal-hashes and therefore will work
|
||||||
|
# for any version that has been released on hackage as opposed to only
|
||||||
|
# versions released before whatever version of all-cabal-hashes you happen
|
||||||
|
# to be currently using.
|
||||||
|
callHackageDirect = {pkg, ver, sha256, rev ? { revision = null; sha256 = null; }}: args:
|
||||||
|
let pkgver = "${pkg}-${ver}";
|
||||||
|
firstRevision = self.callCabal2nix pkg (pkgs.fetchzip {
|
||||||
|
url = "mirror://hackage/${pkgver}/${pkgver}.tar.gz";
|
||||||
|
inherit sha256;
|
||||||
|
}) args;
|
||||||
|
in overrideCabal (orig: {
|
||||||
|
revision = rev.revision;
|
||||||
|
editedCabalFile = rev.sha256;
|
||||||
|
}) firstRevision;
|
||||||
|
|
||||||
|
# Creates a Haskell package from a source package by calling cabal2nix on the source.
|
||||||
|
callCabal2nixWithOptions = name: src: extraCabal2nixOptions: args:
|
||||||
|
let
|
||||||
|
filter = path: type:
|
||||||
|
pkgs.lib.hasSuffix ".cabal" path ||
|
||||||
|
baseNameOf path == "package.yaml";
|
||||||
|
expr = self.haskellSrc2nix {
|
||||||
|
inherit name extraCabal2nixOptions;
|
||||||
|
src = if pkgs.lib.canCleanSource src
|
||||||
|
then pkgs.lib.cleanSourceWith { inherit src filter; }
|
||||||
|
else src;
|
||||||
|
};
|
||||||
|
in overrideCabal (orig: {
|
||||||
|
inherit src;
|
||||||
|
}) (callPackageKeepDeriver expr args);
|
||||||
|
|
||||||
|
callCabal2nix = name: src: args: self.callCabal2nixWithOptions name src "" args;
|
||||||
|
|
||||||
|
# : { root : Path
|
||||||
|
# , name : Defaulted String
|
||||||
|
# , source-overrides : Defaulted (Either Path VersionNumber)
|
||||||
|
# , overrides : Defaulted (HaskellPackageOverrideSet)
|
||||||
|
# , modifier : Defaulted
|
||||||
|
# , returnShellEnv : Defaulted
|
||||||
|
# , withHoogle : Defaulted
|
||||||
|
# , cabal2nixOptions : Defaulted
|
||||||
|
# } -> NixShellAwareDerivation
|
||||||
|
#
|
||||||
|
# Given a path to a haskell package directory, an optional package name
|
||||||
|
# which defaults to the base name of the path, an optional set of source
|
||||||
|
# overrides as appropriate for the 'packageSourceOverrides' function, an
|
||||||
|
# optional set of arbitrary overrides, and an optional haskell package
|
||||||
|
# modifier, return a derivation appropriate for nix-build or nix-shell to
|
||||||
|
# build that package.
|
||||||
|
#
|
||||||
|
# If 'returnShellEnv' is true this returns a derivation which will give you
|
||||||
|
# an environment suitable for developing the listed packages with an
|
||||||
|
# incremental tool like cabal-install.
|
||||||
|
#
|
||||||
|
# If 'withHoogle' is true (the default if a shell environment is requested)
|
||||||
|
# then 'ghcWithHoogle' is used to generate the derivation (instead of
|
||||||
|
# 'ghcWithPackages'), see the documentation there for more information.
|
||||||
|
#
|
||||||
|
# 'cabal2nixOptions' can contain extra command line arguments to pass to
|
||||||
|
# 'cabal2nix' when generating the package derivation, for example setting
|
||||||
|
# a cabal flag with '--flag=myflag'.
|
||||||
|
developPackage =
|
||||||
|
{ root
|
||||||
|
, name ? lib.optionalString (builtins.typeOf root == "path") (builtins.baseNameOf root)
|
||||||
|
, source-overrides ? {}
|
||||||
|
, overrides ? self: super: {}
|
||||||
|
, modifier ? drv: drv
|
||||||
|
, returnShellEnv ? pkgs.lib.inNixShell
|
||||||
|
, withHoogle ? returnShellEnv
|
||||||
|
, cabal2nixOptions ? "" }:
|
||||||
|
let drv =
|
||||||
|
(extensible-self.extend
|
||||||
|
(pkgs.lib.composeExtensions
|
||||||
|
(self.packageSourceOverrides source-overrides)
|
||||||
|
overrides))
|
||||||
|
.callCabal2nixWithOptions name root cabal2nixOptions {};
|
||||||
|
in if returnShellEnv
|
||||||
|
then (modifier drv).envFunc {inherit withHoogle;}
|
||||||
|
else modifier drv;
|
||||||
|
|
||||||
|
# This can be used to easily create a derivation containing GHC and the specified set of Haskell packages.
|
||||||
|
#
|
||||||
|
# Example:
|
||||||
|
# $ nix-shell -p 'haskellPackages.ghcWithPackages (hpkgs: [ hpkgs.mtl hpkgs.lens ])'
|
||||||
|
# $ ghci # in the nix-shell
|
||||||
|
# Prelude > import Control.Lens
|
||||||
|
#
|
||||||
|
# GHC is setup with a package database with all the specified Haskell packages.
|
||||||
|
#
|
||||||
|
# ghcWithPackages :: (HaskellPkgSet -> [ HaskellPkg ]) -> Derivation
|
||||||
|
ghcWithPackages = buildHaskellPackages.callPackage ./with-packages-wrapper.nix {
|
||||||
|
haskellPackages = self;
|
||||||
|
inherit (self) hoogleWithPackages;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
# Put 'hoogle' into the derivation's PATH with a database containing all
|
||||||
|
# the package's dependencies; run 'hoogle server --local' in a shell to
|
||||||
|
# host a search engine for the dependencies.
|
||||||
|
#
|
||||||
|
# Example usage:
|
||||||
|
# $ nix-shell -p 'haskellPackages.hoogleWithPackages (p: [ p.mtl p.lens ])'
|
||||||
|
# [nix-shell] $ hoogle server
|
||||||
|
#
|
||||||
|
# hoogleWithPackages :: (HaskellPkgSet -> [ HaskellPkg ]) -> Derivation
|
||||||
|
#
|
||||||
|
# To reload the Hoogle server automatically on .cabal file changes try
|
||||||
|
# this:
|
||||||
|
# echo *.cabal | entr -r -- nix-shell --run 'hoogle server --local'
|
||||||
|
hoogleWithPackages = self.callPackage ./hoogle.nix {
|
||||||
|
haskellPackages = self;
|
||||||
|
};
|
||||||
|
hoogleLocal =
|
||||||
|
{ packages ? [] }:
|
||||||
|
lib.warn "hoogleLocal is deprecated, use hoogleWithPackages instead" (
|
||||||
|
self.hoogleWithPackages (_: packages)
|
||||||
|
);
|
||||||
|
# This is like a combination of ghcWithPackages and hoogleWithPackages.
|
||||||
|
# It provides a derivation containing both GHC and Hoogle with an index of
|
||||||
|
# the given Haskell package database.
|
||||||
|
#
|
||||||
|
# Example:
|
||||||
|
# $ nix-shell -p 'haskellPackages.ghcWithHoogle (hpkgs: [ hpkgs.conduit hpkgs.lens ])'
|
||||||
|
#
|
||||||
|
# ghcWithHoogle :: (HaskellPkgSet -> [ HaskellPkg ]) -> Derivation
|
||||||
|
ghcWithHoogle = self.ghcWithPackages.override {
|
||||||
|
withHoogle = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
# Returns a derivation whose environment contains a GHC with only
|
||||||
|
# the dependencies of packages listed in `packages`, not the
|
||||||
|
# packages themselves. Using nix-shell on this derivation will
|
||||||
|
# give you an environment suitable for developing the listed
|
||||||
|
# packages with an incremental tool like cabal-install.
|
||||||
|
#
|
||||||
|
# In addition to the "packages" arg and "withHoogle" arg, anything that
|
||||||
|
# can be passed into stdenv.mkDerivation can be included in the input attrset
|
||||||
|
#
|
||||||
|
# # default.nix
|
||||||
|
# with import <nixpkgs> {};
|
||||||
|
# haskellPackages.extend (haskell.lib.compose.packageSourceOverrides {
|
||||||
|
# frontend = ./frontend;
|
||||||
|
# backend = ./backend;
|
||||||
|
# common = ./common;
|
||||||
|
# })
|
||||||
|
#
|
||||||
|
# # shell.nix
|
||||||
|
# let pkgs = import <nixpkgs> {} in
|
||||||
|
# (import ./.).shellFor {
|
||||||
|
# packages = p: [p.frontend p.backend p.common];
|
||||||
|
# withHoogle = true;
|
||||||
|
# buildInputs = [ pkgs.python pkgs.cabal-install ];
|
||||||
|
# }
|
||||||
|
#
|
||||||
|
# -- cabal.project
|
||||||
|
# packages:
|
||||||
|
# frontend/
|
||||||
|
# backend/
|
||||||
|
# common/
|
||||||
|
#
|
||||||
|
# bash$ nix-shell --run "cabal new-build all"
|
||||||
|
# bash$ nix-shell --run "python"
|
||||||
|
shellFor =
|
||||||
|
{ # Packages to create this development shell for. These are usually
|
||||||
|
# your local packages.
|
||||||
|
packages
|
||||||
|
, # Whether or not to generate a Hoogle database for all the
|
||||||
|
# dependencies.
|
||||||
|
withHoogle ? false
|
||||||
|
, # Whether or not to include benchmark dependencies of your local
|
||||||
|
# packages. You should set this to true if you have benchmarks defined
|
||||||
|
# in your local packages that you want to be able to run with cabal benchmark
|
||||||
|
doBenchmark ? false
|
||||||
|
# An optional function that can modify the generic builder arguments
|
||||||
|
# for the fake package that shellFor uses to construct its environment.
|
||||||
|
#
|
||||||
|
# Example:
|
||||||
|
# let
|
||||||
|
# # elided...
|
||||||
|
# haskellPkgs = pkgs.haskell.packages.ghc884.override (hpArgs: {
|
||||||
|
# overrides = pkgs.lib.composeExtensions (hpArgs.overrides or (_: _: { })) (
|
||||||
|
# _hfinal: hprev: {
|
||||||
|
# mkDerivation = args: hprev.mkDerivation ({
|
||||||
|
# doCheck = false;
|
||||||
|
# doBenchmark = false;
|
||||||
|
# doHoogle = true;
|
||||||
|
# doHaddock = true;
|
||||||
|
# enableLibraryProfiling = false;
|
||||||
|
# enableExecutableProfiling = false;
|
||||||
|
# } // args);
|
||||||
|
# }
|
||||||
|
# );
|
||||||
|
# });
|
||||||
|
# in
|
||||||
|
# haskellPkgs.shellFor {
|
||||||
|
# packages = p: [ p.foo ];
|
||||||
|
# genericBuilderArgsModifier = args: args // { doCheck = true; doBenchmark = true };
|
||||||
|
# }
|
||||||
|
#
|
||||||
|
# This will disable tests and benchmarks for everything in "haskellPkgs"
|
||||||
|
# (which will invalidate the binary cache), and then re-enable them
|
||||||
|
# for the "shellFor" environment (ensuring that any test/benchmark
|
||||||
|
# dependencies for "foo" will be available within the nix-shell).
|
||||||
|
, genericBuilderArgsModifier ? (args: args)
|
||||||
|
|
||||||
|
# Extra dependencies, in the form of cabal2nix build attributes.
|
||||||
|
#
|
||||||
|
# An example use case is when you have Haskell scripts that use
|
||||||
|
# libraries that don't occur in your packages' dependencies.
|
||||||
|
#
|
||||||
|
# Example:
|
||||||
|
#
|
||||||
|
# extraDependencies = p: {
|
||||||
|
# libraryHaskellDepends = [ p.releaser ];
|
||||||
|
# };
|
||||||
|
, extraDependencies ? p: {}
|
||||||
|
, ...
|
||||||
|
} @ args:
|
||||||
|
let
|
||||||
|
# A list of the packages we want to build a development shell for.
|
||||||
|
# This is a list of Haskell package derivations.
|
||||||
|
selected = packages self;
|
||||||
|
|
||||||
|
# This is a list of attribute sets, where each attribute set
|
||||||
|
# corresponds to the build inputs of one of the packages input to shellFor.
|
||||||
|
#
|
||||||
|
# Each attribute has keys like buildDepends, executableHaskellDepends,
|
||||||
|
# testPkgconfigDepends, etc. The values for the keys of the attribute
|
||||||
|
# set are lists of dependencies.
|
||||||
|
#
|
||||||
|
# Example:
|
||||||
|
# cabalDepsForSelected
|
||||||
|
# => [
|
||||||
|
# # This may be the attribute set corresponding to the `backend`
|
||||||
|
# # package in the example above.
|
||||||
|
# { buildDepends = [ gcc ... ];
|
||||||
|
# libraryHaskellDepends = [ lens conduit ... ];
|
||||||
|
# ...
|
||||||
|
# }
|
||||||
|
# # This may be the attribute set corresponding to the `common`
|
||||||
|
# # package in the example above.
|
||||||
|
# { testHaskellDepends = [ tasty hspec ... ];
|
||||||
|
# libraryHaskellDepends = [ lens aeson ];
|
||||||
|
# benchmarkHaskellDepends = [ criterion ... ];
|
||||||
|
# ...
|
||||||
|
# }
|
||||||
|
# ...
|
||||||
|
# ]
|
||||||
|
cabalDepsForSelected = map (p: p.getCabalDeps) selected;
|
||||||
|
|
||||||
|
# A predicate that takes a derivation as input, and tests whether it is
|
||||||
|
# the same as any of the `selected` packages.
|
||||||
|
#
|
||||||
|
# Returns true if the input derivation is not in the list of `selected`
|
||||||
|
# packages.
|
||||||
|
#
|
||||||
|
# isNotSelected :: Derivation -> Bool
|
||||||
|
#
|
||||||
|
# Example:
|
||||||
|
#
|
||||||
|
# isNotSelected common [ frontend backend common ]
|
||||||
|
# => false
|
||||||
|
#
|
||||||
|
# isNotSelected lens [ frontend backend common ]
|
||||||
|
# => true
|
||||||
|
isNotSelected = input: pkgs.lib.all (p: input.outPath or null != p.outPath) selected;
|
||||||
|
|
||||||
|
# A function that takes a list of list of derivations, filters out all
|
||||||
|
# the `selected` packages from each list, and concats the results.
|
||||||
|
#
|
||||||
|
# zipperCombinedPkgs :: [[Derivation]] -> [Derivation]
|
||||||
|
#
|
||||||
|
# Example:
|
||||||
|
# zipperCombinedPkgs [ [ lens conduit ] [ aeson frontend ] ]
|
||||||
|
# => [ lens conduit aeson ]
|
||||||
|
#
|
||||||
|
# Note: The reason this isn't just the function `pkgs.lib.concat` is
|
||||||
|
# that we need to be careful to remove dependencies that are in the
|
||||||
|
# `selected` packages.
|
||||||
|
#
|
||||||
|
# For instance, in the above example, if `common` is a dependency of
|
||||||
|
# `backend`, then zipperCombinedPkgs needs to be careful to filter out
|
||||||
|
# `common`, because cabal will end up ignoring that built version,
|
||||||
|
# assuming new-style commands.
|
||||||
|
zipperCombinedPkgs = vals:
|
||||||
|
pkgs.lib.concatMap
|
||||||
|
(drvList: pkgs.lib.filter isNotSelected drvList)
|
||||||
|
vals;
|
||||||
|
|
||||||
|
# Zip `cabalDepsForSelected` into a single attribute list, combining
|
||||||
|
# the derivations in all the individual attributes.
|
||||||
|
#
|
||||||
|
# Example:
|
||||||
|
# packageInputs
|
||||||
|
# => # Assuming the value of cabalDepsForSelected is the same as
|
||||||
|
# # the example in cabalDepsForSelected:
|
||||||
|
# { buildDepends = [ gcc ... ];
|
||||||
|
# libraryHaskellDepends = [ lens conduit aeson ... ];
|
||||||
|
# testHaskellDepends = [ tasty hspec ... ];
|
||||||
|
# benchmarkHaskellDepends = [ criterion ... ];
|
||||||
|
# ...
|
||||||
|
# }
|
||||||
|
#
|
||||||
|
# See the Note in `zipperCombinedPkgs` for what gets filtered out from
|
||||||
|
# each of these dependency lists.
|
||||||
|
packageInputs =
|
||||||
|
pkgs.lib.zipAttrsWith (_name: zipperCombinedPkgs) (cabalDepsForSelected ++ [ (extraDependencies self) ]);
|
||||||
|
|
||||||
|
# A attribute set to pass to `haskellPackages.mkDerivation`.
|
||||||
|
#
|
||||||
|
# The important thing to note here is that all the fields from
|
||||||
|
# packageInputs are set correctly.
|
||||||
|
genericBuilderArgs = {
|
||||||
|
pname =
|
||||||
|
if pkgs.lib.length selected == 1
|
||||||
|
then (pkgs.lib.head selected).name
|
||||||
|
else "packages";
|
||||||
|
version = "0";
|
||||||
|
license = null;
|
||||||
|
}
|
||||||
|
// packageInputs
|
||||||
|
// pkgs.lib.optionalAttrs doBenchmark {
|
||||||
|
# `doBenchmark` needs to explicitly be set here because haskellPackages.mkDerivation defaults it to `false`. If the user wants benchmark dependencies included in their development shell, it has to be explicitly enabled here.
|
||||||
|
doBenchmark = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
# This is a pseudo Haskell package derivation that contains all the
|
||||||
|
# dependencies for the packages in `selected`.
|
||||||
|
#
|
||||||
|
# This is a derivation created with `haskellPackages.mkDerivation`.
|
||||||
|
#
|
||||||
|
# pkgWithCombinedDeps :: HaskellDerivation
|
||||||
|
pkgWithCombinedDeps = self.mkDerivation (genericBuilderArgsModifier genericBuilderArgs);
|
||||||
|
|
||||||
|
# The derivation returned from `envFunc` for `pkgWithCombinedDeps`.
|
||||||
|
#
|
||||||
|
# This is a derivation that can be run with `nix-shell`. It provides a
|
||||||
|
# GHC with a package database with all the dependencies of our
|
||||||
|
# `selected` packages.
|
||||||
|
#
|
||||||
|
# This is a derivation created with `stdenv.mkDerivation` (not
|
||||||
|
# `haskellPackages.mkDerivation`).
|
||||||
|
#
|
||||||
|
# pkgWithCombinedDepsDevDrv :: Derivation
|
||||||
|
pkgWithCombinedDepsDevDrv = pkgWithCombinedDeps.envFunc { inherit withHoogle; };
|
||||||
|
|
||||||
|
mkDerivationArgs = builtins.removeAttrs args [ "genericBuilderArgsModifier" "packages" "withHoogle" "doBenchmark" "extraDependencies" ];
|
||||||
|
|
||||||
|
in pkgWithCombinedDepsDevDrv.overrideAttrs (old: mkDerivationArgs // {
|
||||||
|
nativeBuildInputs = old.nativeBuildInputs ++ mkDerivationArgs.nativeBuildInputs or [];
|
||||||
|
buildInputs = old.buildInputs ++ mkDerivationArgs.buildInputs or [];
|
||||||
|
});
|
||||||
|
|
||||||
|
ghc = ghc // {
|
||||||
|
withPackages = self.ghcWithPackages;
|
||||||
|
withHoogle = self.ghcWithHoogle;
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
Run `cabal sdist` on a source.
|
||||||
|
|
||||||
|
Unlike `haskell.lib.sdistTarball`, this does not require any dependencies
|
||||||
|
to be present, as it uses `cabal-install` instead of building `Setup.hs`.
|
||||||
|
This makes `cabalSdist` faster than `sdistTarball`.
|
||||||
|
*/
|
||||||
|
cabalSdist = {
|
||||||
|
src,
|
||||||
|
name ? if src?name then "${src.name}-sdist.tar.gz" else "source.tar.gz"
|
||||||
|
}:
|
||||||
|
pkgs.runCommandLocal name
|
||||||
|
{
|
||||||
|
inherit src;
|
||||||
|
nativeBuildInputs = [
|
||||||
|
buildHaskellPackages.cabal-install
|
||||||
|
|
||||||
|
# TODO after https://github.com/haskell/cabal/issues/8352
|
||||||
|
# remove ghc
|
||||||
|
self.ghc
|
||||||
|
];
|
||||||
|
dontUnpack = false;
|
||||||
|
} ''
|
||||||
|
unpackPhase
|
||||||
|
cd "''${sourceRoot:-.}"
|
||||||
|
patchPhase
|
||||||
|
mkdir out
|
||||||
|
HOME=$PWD cabal sdist --output-directory out
|
||||||
|
mv out/*.tar.gz $out
|
||||||
|
'';
|
||||||
|
|
||||||
|
/*
|
||||||
|
Like `haskell.lib.buildFromSdist`, but using `cabal sdist` instead of
|
||||||
|
building `./Setup`.
|
||||||
|
|
||||||
|
Unlike `haskell.lib.buildFromSdist`, this does not require any dependencies
|
||||||
|
to be present. This makes `buildFromCabalSdist` faster than `haskell.lib.buildFromSdist`.
|
||||||
|
*/
|
||||||
|
buildFromCabalSdist = pkg:
|
||||||
|
haskellLib.overrideSrc
|
||||||
|
{
|
||||||
|
src = self.cabalSdist { inherit (pkg) src; };
|
||||||
|
version = pkg.version;
|
||||||
|
}
|
||||||
|
pkg;
|
||||||
|
|
||||||
|
/*
|
||||||
|
Modify a Haskell package to add shell completion scripts for the
|
||||||
|
given executables produced by it. These completion scripts will be
|
||||||
|
picked up automatically if the resulting derivation is installed,
|
||||||
|
e.g. by `nix-env -i`.
|
||||||
|
|
||||||
|
This depends on the `--*-completion` flag `optparse-applicative` provides
|
||||||
|
automatically. Since we need to invoke installed executables, completions
|
||||||
|
are not generated if we are cross-compiling.
|
||||||
|
|
||||||
|
commands: names of the executables built by the derivation
|
||||||
|
pkg: Haskell package that builds the executables
|
||||||
|
|
||||||
|
Example:
|
||||||
|
generateOptparseApplicativeCompletions [ "exec1" "exec2" ] pkg
|
||||||
|
|
||||||
|
Type: [str] -> drv -> drv
|
||||||
|
*/
|
||||||
|
generateOptparseApplicativeCompletions =
|
||||||
|
(self.callPackage (
|
||||||
|
{ stdenv }:
|
||||||
|
|
||||||
|
commands:
|
||||||
|
pkg:
|
||||||
|
|
||||||
|
if stdenv.buildPlatform.canExecute stdenv.hostPlatform
|
||||||
|
then lib.foldr haskellLib.__generateOptparseApplicativeCompletion pkg commands
|
||||||
|
else pkg
|
||||||
|
) { }) // { __attrsFailEvaluation = true; };
|
||||||
|
|
||||||
|
/*
|
||||||
|
Modify given Haskell package to force GHC to employ the LLVM
|
||||||
|
codegen backend when compiling. Useful when working around bugs
|
||||||
|
in a native codegen backend GHC defaults to.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
forceLlvmCodegenBackend tls
|
||||||
|
|
||||||
|
Type: drv -> drv
|
||||||
|
*/
|
||||||
|
forceLlvmCodegenBackend = overrideCabal (drv: {
|
||||||
|
configureFlags = drv.configureFlags or [ ] ++ [ "--ghc-option=-fllvm" ];
|
||||||
|
buildTools = drv.buildTools or [ ] ++ [ self.llvmPackages.llvm ];
|
||||||
|
});
|
||||||
|
}
|
|
@ -0,0 +1,44 @@
|
||||||
|
{ pkgs, haskellLib }:
|
||||||
|
|
||||||
|
# EXTRA HASKELL PACKAGES NOT ON HACKAGE
|
||||||
|
#
|
||||||
|
# This file should only contain packages that are not in ./hackage-packages.nix.
|
||||||
|
# Attributes in this set should be nothing more than a callPackage call.
|
||||||
|
# Overrides to these packages should go to either configuration-nix.nix,
|
||||||
|
# configuration-common.nix or to one of the compiler specific configuration
|
||||||
|
# files.
|
||||||
|
self: super: {
|
||||||
|
|
||||||
|
changelog-d = self.callPackage ../misc/haskell/changelog-d {};
|
||||||
|
|
||||||
|
dconf2nix = self.callPackage ../tools/haskell/dconf2nix/dconf2nix.nix { };
|
||||||
|
|
||||||
|
# Used by maintainers/scripts/regenerate-hackage-packages.sh, and generated
|
||||||
|
# from the latest master instead of the current version on Hackage.
|
||||||
|
cabal2nix-unstable = self.callPackage ./cabal2nix-unstable.nix { };
|
||||||
|
|
||||||
|
# https://github.com/channable/vaultenv/issues/1
|
||||||
|
vaultenv = self.callPackage ../tools/haskell/vaultenv { };
|
||||||
|
|
||||||
|
# spago is not released to Hackage.
|
||||||
|
# https://github.com/spacchetti/spago/issues/512
|
||||||
|
spago = self.callPackage ../tools/purescript/spago/spago.nix { };
|
||||||
|
|
||||||
|
nix-linter = self.callPackage ../../development/tools/analysis/nix-linter { };
|
||||||
|
|
||||||
|
# hasura graphql-engine is not released to hackage.
|
||||||
|
# https://github.com/hasura/graphql-engine/issues/7391
|
||||||
|
ci-info = self.callPackage ../misc/haskell/hasura/ci-info.nix {};
|
||||||
|
pg-client = self.callPackage ../misc/haskell/hasura/pg-client.nix {};
|
||||||
|
graphql-parser = self.callPackage ../misc/haskell/hasura/graphql-parser.nix {};
|
||||||
|
graphql-engine = self.callPackage ../misc/haskell/hasura/graphql-engine.nix {};
|
||||||
|
kriti-lang = self.callPackage ../misc/haskell/hasura/kriti-lang.nix {};
|
||||||
|
hasura-resource-pool = self.callPackage ../misc/haskell/hasura/pool.nix {};
|
||||||
|
hasura-ekg-core = self.callPackage ../misc/haskell/hasura/ekg-core.nix {};
|
||||||
|
hasura-ekg-json = self.callPackage ../misc/haskell/hasura/ekg-json.nix {};
|
||||||
|
|
||||||
|
# Unofficial fork until PRs are merged https://github.com/pcapriotti/optparse-applicative/pulls/roberth
|
||||||
|
# cabal2nix --maintainer roberth https://github.com/hercules-ci/optparse-applicative.git > pkgs/development/misc/haskell/hercules-ci-optparse-applicative.nix
|
||||||
|
hercules-ci-optparse-applicative = self.callPackage ../misc/haskell/hercules-ci-optparse-applicative.nix {};
|
||||||
|
|
||||||
|
}
|
25
pkgs/by-name/ha/haskell/haskell-modules/package-list.nix
Normal file
25
pkgs/by-name/ha/haskell/haskell-modules/package-list.nix
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
{ runCommand, haskellPackages, lib, all-cabal-hashes, writeShellScript }:
|
||||||
|
let
|
||||||
|
# Checks if the version looks like a Haskell PVP version which is the format
|
||||||
|
# Hackage enforces. This will return false if the version strings is empty or
|
||||||
|
# we've overridden the package to ship an unstable version of the package
|
||||||
|
# (sadly there's no good way to show something useful on hackage in this case).
|
||||||
|
isPvpVersion = v: builtins.match "([0-9]+)(\\.[0-9]+)*" v != null;
|
||||||
|
|
||||||
|
pkgLine = name: pkg:
|
||||||
|
let
|
||||||
|
version = pkg.version or "";
|
||||||
|
in
|
||||||
|
lib.optionalString (isPvpVersion version && (pkg.meta.hydraPlatforms or null) != lib.platforms.none)
|
||||||
|
''"${name}","${version}","http://hydra.nixos.org/job/nixpkgs/trunk/haskellPackages.${name}.x86_64-linux"'';
|
||||||
|
all-haskellPackages = builtins.toFile "all-haskellPackages" (lib.concatStringsSep "\n" (lib.filter (x: x != "") (lib.mapAttrsToList pkgLine haskellPackages)));
|
||||||
|
in
|
||||||
|
runCommand "hackage-package-list" { }
|
||||||
|
# This command will make a join between all packages on hackage and haskellPackages.*.
|
||||||
|
# It ignores packages marked as broken (according to hydraPlatforms)
|
||||||
|
# It creates a valid csv file which can be uploaded to hackage.haskell.org.
|
||||||
|
# The call is wrapped in echo $(...) to trim trailing newline, which hackage requires.
|
||||||
|
''
|
||||||
|
mkdir -p $out/bin
|
||||||
|
echo -n "$(tar -t -f ${all-cabal-hashes} | sed 's![^/]*/\([^/]*\)/.*!"\1"!' | sort -u | join -t , - ${all-haskellPackages})" > $out/nixos-hackage-packages.csv
|
||||||
|
''
|
12
pkgs/by-name/ha/haskell/haskell-modules/patches/GLUT.patch
Normal file
12
pkgs/by-name/ha/haskell/haskell-modules/patches/GLUT.patch
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
diff --git a/GLUT.cabal b/GLUT.cabal
|
||||||
|
index f370d6c..a404e1e 100644
|
||||||
|
--- a/GLUT.cabal
|
||||||
|
+++ b/GLUT.cabal
|
||||||
|
@@ -103,6 +103,7 @@ library
|
||||||
|
else
|
||||||
|
cpp-options: "-DCALLCONV=ccall"
|
||||||
|
cc-options: "-DUSE_DLSYM"
|
||||||
|
+ pkgconfig-depends: glut
|
||||||
|
|
||||||
|
executable BOGLGP01-OnYourOwn1
|
||||||
|
if !flag(BuildExamples)
|
|
@ -0,0 +1,17 @@
|
||||||
|
diff --git a/HSH/ShellEquivs.hs b/HSH/ShellEquivs.hs
|
||||||
|
index f9287e8..b132737 100644
|
||||||
|
--- a/HSH/ShellEquivs.hs
|
||||||
|
+++ b/HSH/ShellEquivs.hs
|
||||||
|
@@ -223,9 +223,9 @@ catToFIFO fp ichan =
|
||||||
|
return (ChanString "")
|
||||||
|
|
||||||
|
fifoOpen :: FilePath -> IO Handle
|
||||||
|
-fifoOpen fp =
|
||||||
|
- do fd <- throwErrnoPathIf (< 0) "HSH fifoOpen" fp $
|
||||||
|
- openFd fp WriteOnly Nothing defaultFileFlags
|
||||||
|
+fifoOpen fp =
|
||||||
|
+ do fd <- throwErrnoPathIf (< 0) "HSH fifoOpen" fp $
|
||||||
|
+ openFd fp WriteOnly defaultFileFlags
|
||||||
|
fdToHandle fd
|
||||||
|
|
||||||
|
#endif
|
|
@ -0,0 +1,9 @@
|
||||||
|
--- SDL-image-0.6.2.0/Graphics/UI/SDL/Image/Version.hsc.orig 2021-08-06 01:21:05.000000000 +0200
|
||||||
|
+++ SDL-image-0.6.2.0/Graphics/UI/SDL/Image/Version.hsc 2021-08-06 01:21:56.000000000 +0200
|
||||||
|
@@ -1,4 +1,6 @@
|
||||||
|
#include "SDL_image.h"
|
||||||
|
+-- override SDL_main.h redefining main to SDL_main on darwin
|
||||||
|
+#define main main
|
||||||
|
module Graphics.UI.SDL.Image.Version
|
||||||
|
( compiledFor
|
||||||
|
, linkedWith
|
|
@ -0,0 +1,9 @@
|
||||||
|
--- SDL-ttf-0.6.3.0/Graphics/UI/SDL/TTF/Version.hsc.orig 2021-08-06 01:31:39.000000000 +0200
|
||||||
|
+++ SDL-ttf-0.6.3.0/Graphics/UI/SDL/TTF/Version.hsc 2021-08-06 01:32:03.000000000 +0200
|
||||||
|
@@ -1,4 +1,6 @@
|
||||||
|
#include "SDL_ttf.h"
|
||||||
|
+-- override SDL_main.h redefining main to SDL_main on darwin
|
||||||
|
+#define main main
|
||||||
|
module Graphics.UI.SDL.TTF.Version
|
||||||
|
( compiledFor
|
||||||
|
, linkedWith
|
|
@ -0,0 +1,23 @@
|
||||||
|
diff --git a/Cheapskate/Parse.hs b/Cheapskate/Parse.hs
|
||||||
|
index b90d8e5..2925132 100644
|
||||||
|
--- a/Cheapskate/Parse.hs
|
||||||
|
+++ b/Cheapskate/Parse.hs
|
||||||
|
@@ -1,4 +1,5 @@
|
||||||
|
{-# LANGUAGE OverloadedStrings #-}
|
||||||
|
+{-# LANGUAGE CPP #-}
|
||||||
|
module Cheapskate.Parse (
|
||||||
|
markdown
|
||||||
|
) where
|
||||||
|
@@ -21,6 +22,12 @@ import Control.Applicative
|
||||||
|
import qualified Data.Map as M
|
||||||
|
import Data.List (intercalate)
|
||||||
|
|
||||||
|
+#if MIN_VERSION_mtl(2, 3, 0)
|
||||||
|
+import Control.Monad (guard, unless, replicateM)
|
||||||
|
+#else
|
||||||
|
+#endif
|
||||||
|
+
|
||||||
|
+
|
||||||
|
import Debug.Trace
|
||||||
|
|
||||||
|
-- | Parses the input as a markdown document. Note that 'Doc' is an instance
|
|
@ -0,0 +1,69 @@
|
||||||
|
diff --git a/Crypto/KDF/Argon2.hs b/Crypto/KDF/Argon2.hs
|
||||||
|
index 044ba00..31dc6f1 100644
|
||||||
|
--- a/Crypto/KDF/Argon2.hs
|
||||||
|
+++ b/Crypto/KDF/Argon2.hs
|
||||||
|
@@ -12,6 +12,7 @@
|
||||||
|
-- File started from Argon2.hs, from Oliver Charles
|
||||||
|
-- at https://github.com/ocharles/argon2
|
||||||
|
--
|
||||||
|
+{-# LANGUAGE DataKinds #-}
|
||||||
|
module Crypto.KDF.Argon2
|
||||||
|
(
|
||||||
|
Options(..)
|
||||||
|
@@ -32,6 +33,7 @@ import Control.Monad (when)
|
||||||
|
import Data.Word
|
||||||
|
import Foreign.C
|
||||||
|
import Foreign.Ptr
|
||||||
|
+import Data.Proxy
|
||||||
|
|
||||||
|
-- | Which variant of Argon2 to use. You should choose the variant that is most
|
||||||
|
-- applicable to your intention to hash inputs.
|
||||||
|
@@ -100,33 +102,12 @@ defaultOptions =
|
||||||
|
}
|
||||||
|
|
||||||
|
hash :: (ByteArrayAccess password, ByteArrayAccess salt, ByteArray out)
|
||||||
|
- => Options
|
||||||
|
+ => [Proxy "cryptonite:Crypto.KDF.Argon2.hash is known to be broken on this architecture. See https://github.com/haskell-crypto/cryptonite/issues/360"]
|
||||||
|
-> password
|
||||||
|
-> salt
|
||||||
|
-> Int
|
||||||
|
-> CryptoFailable out
|
||||||
|
-hash options password salt outLen
|
||||||
|
- | saltLen < saltMinLength = CryptoFailed CryptoError_SaltTooSmall
|
||||||
|
- | outLen < outputMinLength = CryptoFailed CryptoError_OutputLengthTooSmall
|
||||||
|
- | outLen > outputMaxLength = CryptoFailed CryptoError_OutputLengthTooBig
|
||||||
|
- | otherwise = CryptoPassed $ B.allocAndFreeze outLen $ \out -> do
|
||||||
|
- res <- B.withByteArray password $ \pPass ->
|
||||||
|
- B.withByteArray salt $ \pSalt ->
|
||||||
|
- argon2_hash (iterations options)
|
||||||
|
- (memory options)
|
||||||
|
- (parallelism options)
|
||||||
|
- pPass
|
||||||
|
- (csizeOfInt passwordLen)
|
||||||
|
- pSalt
|
||||||
|
- (csizeOfInt saltLen)
|
||||||
|
- out
|
||||||
|
- (csizeOfInt outLen)
|
||||||
|
- (cOfVariant $ variant options)
|
||||||
|
- (cOfVersion $ version options)
|
||||||
|
- when (res /= 0) $ error "argon2: hash: internal error"
|
||||||
|
- where
|
||||||
|
- saltLen = B.length salt
|
||||||
|
- passwordLen = B.length password
|
||||||
|
+hash options password salt outLen = error "cryptonite:Crypto.KDF.Argon2.hash is known to be broken on this architecture. See https://github.com/haskell-crypto/cryptonite/issues/360"
|
||||||
|
|
||||||
|
data Pass
|
||||||
|
data Salt
|
||||||
|
diff --git a/tests/KAT_Argon2.hs b/tests/KAT_Argon2.hs
|
||||||
|
index a347fc5..fdba079 100644
|
||||||
|
--- a/tests/KAT_Argon2.hs
|
||||||
|
+++ b/tests/KAT_Argon2.hs
|
||||||
|
@@ -32,7 +32,7 @@ kdfTests = zipWith toKDFTest is vectors
|
||||||
|
where
|
||||||
|
toKDFTest i v =
|
||||||
|
testCase (show i)
|
||||||
|
- (CryptoPassed (kdfResult v) @=? Argon2.hash (kdfOptions v) (kdfPass v) (kdfSalt v) (B.length $ kdfResult v))
|
||||||
|
+ (pure ())
|
||||||
|
|
||||||
|
is :: [Int]
|
||||||
|
is = [1..]
|
|
@ -0,0 +1,67 @@
|
||||||
|
From 67bb87ceff53f0178c988dd4e15eeb2daee92b84 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Gregor Kleen <pngwjpgh@users.noreply.github.com>
|
||||||
|
Date: Tue, 20 Feb 2018 17:46:24 +0100
|
||||||
|
Subject: [PATCH] Relax upper version bounds on dependencies
|
||||||
|
|
||||||
|
---
|
||||||
|
Setup.hs | 20 ++++++++++++++++----
|
||||||
|
encoding.cabal | 4 ++--
|
||||||
|
stack.yaml | 4 ++--
|
||||||
|
3 files changed, 20 insertions(+), 8 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/Setup.hs b/Setup.hs
|
||||||
|
index de719e6..fe5b84c 100644
|
||||||
|
--- a/Setup.hs
|
||||||
|
+++ b/Setup.hs
|
||||||
|
@@ -1,13 +1,25 @@
|
||||||
|
+{-# LANGUAGE CPP #-}
|
||||||
|
+
|
||||||
|
module Main where
|
||||||
|
|
||||||
|
import Distribution.Simple
|
||||||
|
import Data.Encoding.Preprocessor.Mapping
|
||||||
|
import Data.Encoding.Preprocessor.XMLMappingBuilder
|
||||||
|
|
||||||
|
+#if MIN_VERSION_Cabal(2,0,0)
|
||||||
|
+main = defaultMainWithHooks (simpleUserHooks
|
||||||
|
+ {hookedPreProcessors = ( ("mapping" , \_ _ _ -> mappingPreprocessor)
|
||||||
|
+ : ("mapping2", \_ _ _ -> mappingPreprocessor)
|
||||||
|
+ : ("xml" , \_ _ _ -> xmlPreprocessor)
|
||||||
|
+ : (hookedPreProcessors simpleUserHooks)
|
||||||
|
+ )
|
||||||
|
+ })
|
||||||
|
+#else
|
||||||
|
main = defaultMainWithHooks (simpleUserHooks
|
||||||
|
- {hookedPreProcessors = (("mapping",\_ _ -> mappingPreprocessor)
|
||||||
|
- :("mapping2",\_ _ -> mappingPreprocessor)
|
||||||
|
- :("xml",\_ _ -> xmlPreprocessor)
|
||||||
|
- :(hookedPreProcessors simpleUserHooks)
|
||||||
|
+ {hookedPreProcessors = ( ("mapping" , \_ _ -> mappingPreprocessor)
|
||||||
|
+ : ("mapping2", \_ _ -> mappingPreprocessor)
|
||||||
|
+ : ("xml" , \_ _ -> xmlPreprocessor)
|
||||||
|
+ : (hookedPreProcessors simpleUserHooks)
|
||||||
|
)
|
||||||
|
})
|
||||||
|
+#endif
|
||||||
|
diff --git a/encoding.cabal b/encoding.cabal
|
||||||
|
index ec20617..f221715 100644
|
||||||
|
--- a/encoding.cabal
|
||||||
|
+++ b/encoding.cabal
|
||||||
|
@@ -36,7 +36,7 @@ Source-Repository this
|
||||||
|
|
||||||
|
Custom-Setup
|
||||||
|
Setup-Depends: base >=3 && <5,
|
||||||
|
- Cabal >=1.24 && <1.25,
|
||||||
|
+ Cabal >=1.24 && <2.1,
|
||||||
|
containers,
|
||||||
|
filepath,
|
||||||
|
ghc-prim,
|
||||||
|
@@ -51,7 +51,7 @@ Library
|
||||||
|
extensible-exceptions >=0.1 && <0.2,
|
||||||
|
ghc-prim >=0.3 && <0.6,
|
||||||
|
mtl >=2.0 && <2.3,
|
||||||
|
- regex-compat >=0.71 && <0.95
|
||||||
|
+ regex-compat >=0.71 && <0.96
|
||||||
|
|
||||||
|
Extensions: CPP
|
||||||
|
|
|
@ -0,0 +1,43 @@
|
||||||
|
diff -Naur ghc-paths-0.1.0.9/GHC/Paths.hs ghc-paths-0.1.0.9-new/GHC/Paths.hs
|
||||||
|
--- ghc-paths-0.1.0.9/GHC/Paths.hs 2012-12-16 13:53:45.720148396 +0100
|
||||||
|
+++ ghc-paths-0.1.0.9-new/GHC/Paths.hs 2012-12-16 17:22:12.765576568 +0100
|
||||||
|
@@ -1,13 +1,35 @@
|
||||||
|
{-# LANGUAGE CPP #-}
|
||||||
|
+{-# LANGUAGE ScopedTypeVariables #-}
|
||||||
|
|
||||||
|
module GHC.Paths (
|
||||||
|
ghc, ghc_pkg, libdir, docdir
|
||||||
|
) where
|
||||||
|
|
||||||
|
+import Control.Exception as E
|
||||||
|
+import Data.Maybe
|
||||||
|
+import System.Environment
|
||||||
|
+import System.IO.Unsafe
|
||||||
|
+
|
||||||
|
+-- Yes, there's lookupEnv now, but we want to be compatible
|
||||||
|
+-- with older GHCs.
|
||||||
|
+checkEnv :: String -> IO (Maybe String)
|
||||||
|
+checkEnv var = E.catch (fmap Just (getEnv var))
|
||||||
|
+ (\ (e :: IOException) -> return Nothing)
|
||||||
|
+
|
||||||
|
+nixLibdir, nixDocdir, nixGhc, nixGhcPkg :: Maybe FilePath
|
||||||
|
+nixLibdir = unsafePerformIO (checkEnv "NIX_GHC_LIBDIR")
|
||||||
|
+nixDocdir = unsafePerformIO (checkEnv "NIX_GHC_DOCDIR")
|
||||||
|
+nixGhc = unsafePerformIO (checkEnv "NIX_GHC")
|
||||||
|
+nixGhcPkg = unsafePerformIO (checkEnv "NIX_GHCPKG")
|
||||||
|
+{-# NOINLINE nixLibdir #-}
|
||||||
|
+{-# NOINLINE nixDocdir #-}
|
||||||
|
+{-# NOINLINE nixGhc #-}
|
||||||
|
+{-# NOINLINE nixGhcPkg #-}
|
||||||
|
+
|
||||||
|
libdir, docdir, ghc, ghc_pkg :: FilePath
|
||||||
|
|
||||||
|
-libdir = GHC_PATHS_LIBDIR
|
||||||
|
-docdir = GHC_PATHS_DOCDIR
|
||||||
|
+libdir = fromMaybe GHC_PATHS_LIBDIR nixLibdir
|
||||||
|
+docdir = fromMaybe GHC_PATHS_DOCDIR nixDocdir
|
||||||
|
|
||||||
|
-ghc = GHC_PATHS_GHC
|
||||||
|
-ghc_pkg = GHC_PATHS_GHC_PKG
|
||||||
|
+ghc = fromMaybe GHC_PATHS_GHC nixGhc
|
||||||
|
+ghc_pkg = fromMaybe GHC_PATHS_GHC_PKG nixGhcPkg
|
|
@ -0,0 +1,13 @@
|
||||||
|
diff --git a/Utility/FreeDesktop.hs b/Utility/FreeDesktop.hs
|
||||||
|
index 896b89b991..6cbb4f90ae 100644
|
||||||
|
--- a/Utility/FreeDesktop.hs
|
||||||
|
+++ b/Utility/FreeDesktop.hs
|
||||||
|
@@ -112,7 +112,7 @@ desktopfile f = f ++ ".desktop"
|
||||||
|
|
||||||
|
{- Directory used for installation of system wide data files.. -}
|
||||||
|
systemDataDir :: FilePath
|
||||||
|
-systemDataDir = "/usr/share"
|
||||||
|
+systemDataDir = "/share"
|
||||||
|
|
||||||
|
{- Directory used for installation of system wide config files. -}
|
||||||
|
systemConfigDir :: FilePath
|
|
@ -0,0 +1,26 @@
|
||||||
|
diff --git a/gogol-core.cabal b/gogol-core.cabal
|
||||||
|
index 4c47988..caa4796 100644
|
||||||
|
--- a/gogol-core.cabal
|
||||||
|
+++ b/gogol-core.cabal
|
||||||
|
@@ -62,7 +62,7 @@ library
|
||||||
|
, lens >= 4.4
|
||||||
|
, resourcet >= 1.1
|
||||||
|
, scientific >= 0.3
|
||||||
|
- , servant >= 0.4.4
|
||||||
|
+ , servant >= 0.14.1
|
||||||
|
, text >= 1.1
|
||||||
|
, unordered-containers >= 0.2.5
|
||||||
|
|
||||||
|
diff --git a/src/Network/Google/Prelude.hs b/src/Network/Google/Prelude.hs
|
||||||
|
index a4ad9de..795c690 100644
|
||||||
|
--- a/src/Network/Google/Prelude.hs
|
||||||
|
+++ b/src/Network/Google/Prelude.hs
|
||||||
|
@@ -28,7 +28,7 @@ import Network.HTTP.Client as Export (RequestBody)
|
||||||
|
import Numeric.Natural as Export (Natural)
|
||||||
|
import Prelude as Export hiding (product, span, any, Word)
|
||||||
|
import Servant.API as Export hiding (Headers, Link, getResponse, Stream, ResponseHeader, Header, header)
|
||||||
|
-import Servant.Utils.Links as Export hiding (Link)
|
||||||
|
+import Servant.Links as Export hiding (Link)
|
||||||
|
import Web.HttpApiData as Export (FromHttpApiData (..), ToHttpApiData (..))
|
||||||
|
|
||||||
|
import Network.Google.Data.Bytes as Export
|
|
@ -0,0 +1,40 @@
|
||||||
|
diff --git a/Data/GraphViz/Commands.hs b/Data/GraphViz/Commands.hs
|
||||||
|
index 20e7dbe..514c29d 100644
|
||||||
|
--- a/Data/GraphViz/Commands.hs
|
||||||
|
+++ b/Data/GraphViz/Commands.hs
|
||||||
|
@@ -63,14 +63,14 @@ import System.IO (Handle, hPutStrLn, hSetBinaryMode, stderr)
|
||||||
|
-- -----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
showCmd :: GraphvizCommand -> String
|
||||||
|
-showCmd Dot = "dot"
|
||||||
|
-showCmd Neato = "neato"
|
||||||
|
-showCmd TwoPi = "twopi"
|
||||||
|
-showCmd Circo = "circo"
|
||||||
|
-showCmd Fdp = "fdp"
|
||||||
|
-showCmd Sfdp = "sfdp"
|
||||||
|
-showCmd Osage = "osage"
|
||||||
|
-showCmd Patchwork = "patchwork"
|
||||||
|
+showCmd Dot = "@graphviz@/bin/dot"
|
||||||
|
+showCmd Neato = "@graphviz@/bin/neato"
|
||||||
|
+showCmd TwoPi = "@graphviz@/bin/twopi"
|
||||||
|
+showCmd Circo = "@graphviz@/bin/circo"
|
||||||
|
+showCmd Fdp = "@graphviz@/bin/fdp"
|
||||||
|
+showCmd Sfdp = "@graphviz@/bin/sfdp"
|
||||||
|
+showCmd Osage = "@graphviz@/bin/osage"
|
||||||
|
+showCmd Patchwork = "@graphviz@/bin/patchwork"
|
||||||
|
|
||||||
|
-- | The default command for directed graphs.
|
||||||
|
dirCommand :: GraphvizCommand
|
||||||
|
@@ -312,8 +312,11 @@ runGraphvizCanvas' d = runGraphvizCanvas (commandFor d) d
|
||||||
|
|
||||||
|
-- | Is the Graphviz suite of tools installed? This is determined by
|
||||||
|
-- whether @dot@ is available in the @PATH@.
|
||||||
|
+--
|
||||||
|
+-- Note: With nixpkgs, this will always return 'True' as graphviz'
|
||||||
|
+-- store paths are hardcoded instead of looking at @PATH@.
|
||||||
|
isGraphvizInstalled :: IO Bool
|
||||||
|
-isGraphvizInstalled = liftM isJust . findExecutable $ showCmd Dot
|
||||||
|
+isGraphvizInstalled = pure True -- :)
|
||||||
|
|
||||||
|
-- | If Graphviz does not seem to be available, print the provided
|
||||||
|
-- error message and then exit fatally.
|
|
@ -0,0 +1,52 @@
|
||||||
|
diff -rN -u old-mbox/Data/MBox/String.hs new-mbox/Data/MBox/String.hs
|
||||||
|
--- old-mbox/Data/MBox/String.hs 2022-11-22 19:14:52.332543098 +0100
|
||||||
|
+++ new-mbox/Data/MBox/String.hs 2022-11-22 19:14:52.332543098 +0100
|
||||||
|
@@ -1,3 +1,4 @@
|
||||||
|
+{-# LANGUAGE CPP #-}
|
||||||
|
|
||||||
|
-----------------------------------------------------------------------------
|
||||||
|
{- |
|
||||||
|
@@ -31,7 +32,11 @@
|
||||||
|
-- | Reads a date header as a UTCTime
|
||||||
|
parseDateHeader :: String -> Maybe UTCTime
|
||||||
|
parseDateHeader header = listToMaybe . catMaybes $ map tryParse formats where
|
||||||
|
+#if MIN_VERSION_time(1,9,0)
|
||||||
|
+ tryParse f = parseTimeM True LC.defaultTimeLocale f header
|
||||||
|
+#else
|
||||||
|
tryParse f = parseTime LC.defaultTimeLocale f header
|
||||||
|
+#endif
|
||||||
|
formats =
|
||||||
|
[ "%a, %_d %b %Y %T %z"
|
||||||
|
, "%a, %_d %b %Y %T %Z"
|
||||||
|
diff -rN -u old-mbox/Data/MBox.hs new-mbox/Data/MBox.hs
|
||||||
|
--- old-mbox/Data/MBox.hs 2022-11-22 19:14:52.332543098 +0100
|
||||||
|
+++ new-mbox/Data/MBox.hs 2022-11-22 19:14:52.332543098 +0100
|
||||||
|
@@ -1,3 +1,4 @@
|
||||||
|
+{-# LANGUAGE CPP #-}
|
||||||
|
{-# LANGUAGE ViewPatterns #-}
|
||||||
|
|
||||||
|
-----------------------------------------------------------------------------
|
||||||
|
@@ -34,7 +35,11 @@
|
||||||
|
parseDateHeader :: T.Text -> Maybe UTCTime
|
||||||
|
parseDateHeader txt = listToMaybe . catMaybes $ map tryParse formats where
|
||||||
|
header = T.unpack txt
|
||||||
|
+#if MIN_VERSION_time(1,9,0)
|
||||||
|
+ tryParse f = parseTimeM True LC.defaultTimeLocale f header
|
||||||
|
+#else
|
||||||
|
tryParse f = parseTime LC.defaultTimeLocale f header
|
||||||
|
+#endif
|
||||||
|
formats =
|
||||||
|
[ "%a, %_d %b %Y %T %z"
|
||||||
|
, "%a, %_d %b %Y %T %Z"
|
||||||
|
diff -rN -u old-mbox/mbox.cabal new-mbox/mbox.cabal
|
||||||
|
--- old-mbox/mbox.cabal 2022-11-22 19:14:52.332543098 +0100
|
||||||
|
+++ new-mbox/mbox.cabal 2022-11-22 19:14:52.332543098 +0100
|
||||||
|
@@ -13,7 +13,7 @@
|
||||||
|
Cabal-Version: >= 1.6
|
||||||
|
|
||||||
|
library
|
||||||
|
- build-depends: base >= 4, base < 6, safe, time < 1.9, time-locale-compat, text
|
||||||
|
+ build-depends: base >= 4, base < 6, safe, time, time-locale-compat, text
|
||||||
|
exposed-modules: Data.MBox, Data.MBox.String
|
||||||
|
ghc-options: -Wall
|
||||||
|
|
|
@ -0,0 +1,11 @@
|
||||||
|
diff -ur opencv-0.0.2.1.bak/Setup.hs opencv-0.0.2.1/Setup.hs
|
||||||
|
--- opencv-0.0.2.1.bak/Setup.hs 2018-11-10 17:18:41.355731189 +0100
|
||||||
|
+++ opencv-0.0.2.1/Setup.hs 2018-11-10 17:18:56.901681162 +0100
|
||||||
|
@@ -3,6 +3,6 @@
|
||||||
|
|
||||||
|
main = do
|
||||||
|
args <- getArgs
|
||||||
|
- let args' | "configure" `elem` args = args ++ ["--with-gcc","c++", "--with-ld","c++"]
|
||||||
|
+ let args' | "configure" `elem` args = args ++ ["--with-gcc","c++"]
|
||||||
|
| otherwise = args
|
||||||
|
defaultMainArgs args'
|
|
@ -0,0 +1,12 @@
|
||||||
|
diff --git a/src/Control/PatternArrows.hs b/src/Control/PatternArrows.hs
|
||||||
|
index d382c19..0b067dd 100644
|
||||||
|
--- a/src/Control/PatternArrows.hs
|
||||||
|
+++ b/src/Control/PatternArrows.hs
|
||||||
|
@@ -23,6 +23,7 @@ import qualified Control.Category as C
|
||||||
|
import Control.Category ((>>>))
|
||||||
|
import qualified Control.Arrow as A
|
||||||
|
import Control.Arrow ((***), (<+>))
|
||||||
|
+import Data.Function (fix)
|
||||||
|
|
||||||
|
-- |
|
||||||
|
-- A first-order pattern match
|
|
@ -0,0 +1,31 @@
|
||||||
|
diff -Naurd PortMidi-0.2.0.0/portmidi/pm_linux/pmlinuxalsa.c PortMidi-0.2.0.0-alsafix/portmidi/pm_linux/pmlinuxalsa.c
|
||||||
|
--- PortMidi-0.2.0.0/portmidi/pm_linux/pmlinuxalsa.c 2023-12-13 11:35:12.517413022 +0000
|
||||||
|
+++ PortMidi-0.2.0.0-alsafix/portmidi/pm_linux/pmlinuxalsa.c 2023-12-13 11:35:12.565413037 +0000
|
||||||
|
@@ -719,6 +719,18 @@
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
+static void set_alsa_plugin_path( void )
|
||||||
|
+{
|
||||||
|
+ char *existing;
|
||||||
|
+
|
||||||
|
+ existing = getenv("ALSA_PLUGIN_DIR");
|
||||||
|
+ if (NULL != existing) {
|
||||||
|
+ return;
|
||||||
|
+ }
|
||||||
|
+ setenv("ALSA_PLUGIN_DIR", "@alsa_plugin_dir@", 0);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+
|
||||||
|
PmError pm_linuxalsa_init( void )
|
||||||
|
{
|
||||||
|
int err;
|
||||||
|
@@ -726,6 +738,8 @@
|
||||||
|
snd_seq_port_info_t *pinfo;
|
||||||
|
unsigned int caps;
|
||||||
|
|
||||||
|
+ set_alsa_plugin_path();
|
||||||
|
+
|
||||||
|
/* Previously, the last parameter was SND_SEQ_NONBLOCK, but this
|
||||||
|
* would cause messages to be dropped if the ALSA buffer fills up.
|
||||||
|
* The correct behavior is for writes to block until there is
|
|
@ -0,0 +1,8 @@
|
||||||
|
--- a/Setup.hs 2021-02-04 14:01:09.557970245 +0100
|
||||||
|
+++ b/Setup.hs 2021-02-04 14:07:45.047443753 +0100
|
||||||
|
@@ -3,4 +3,4 @@
|
||||||
|
import Distribution.Simple
|
||||||
|
|
||||||
|
main :: IO ()
|
||||||
|
-main = defaultMainWithHooks defaultUserHooks
|
||||||
|
+main = defaultMainWithHooks autoconfUserHooks
|
|
@ -0,0 +1,19 @@
|
||||||
|
diff -rN -u old-regex-compat-tdfa/Text/Regex.hs new-regex-compat-tdfa/Text/Regex.hs
|
||||||
|
--- old-regex-compat-tdfa/Text/Regex.hs 2022-02-20 13:42:36.828752458 +0100
|
||||||
|
+++ new-regex-compat-tdfa/Text/Regex.hs 2022-02-20 13:42:36.828752458 +0100
|
||||||
|
@@ -139,7 +139,7 @@
|
||||||
|
splitRegex :: Regex -> String -> [String]
|
||||||
|
splitRegex _ [] = []
|
||||||
|
splitRegex delim strIn =
|
||||||
|
- let matches = map (!0) (matchAll delim strIn)
|
||||||
|
+ let matches = map (! 0) (matchAll delim strIn)
|
||||||
|
go _i str [] = str : []
|
||||||
|
go i str ((off,len):rest) =
|
||||||
|
let i' = off+len
|
||||||
|
@@ -194,4 +194,4 @@
|
||||||
|
then [firstline,""]
|
||||||
|
else firstline : loop remainder
|
||||||
|
|
||||||
|
--}
|
||||||
|
\ No newline at end of file
|
||||||
|
+-}
|
|
@ -0,0 +1,75 @@
|
||||||
|
diff --git a/servant-client-core.cabal b/servant-client-core.cabal
|
||||||
|
index 5789da601..3faf65bb4 100644
|
||||||
|
--- a/servant-client-core.cabal
|
||||||
|
+++ b/servant-client-core.cabal
|
||||||
|
@@ -96,6 +96,7 @@ test-suite spec
|
||||||
|
main-is: Spec.hs
|
||||||
|
other-modules:
|
||||||
|
Servant.Client.Core.Internal.BaseUrlSpec
|
||||||
|
+ Servant.Client.Core.RequestSpec
|
||||||
|
|
||||||
|
-- Dependencies inherited from the library. No need to specify bounds.
|
||||||
|
build-depends:
|
||||||
|
diff --git a/src/Servant/Client/Core/Request.hs b/src/Servant/Client/Core/Request.hs
|
||||||
|
index 73756e702..0276d46f8 100644
|
||||||
|
--- a/src/Servant/Client/Core/Request.hs
|
||||||
|
+++ b/src/Servant/Client/Core/Request.hs
|
||||||
|
@@ -64,8 +64,32 @@ data RequestF body path = Request
|
||||||
|
, requestHeaders :: Seq.Seq Header
|
||||||
|
, requestHttpVersion :: HttpVersion
|
||||||
|
, requestMethod :: Method
|
||||||
|
- } deriving (Generic, Typeable, Eq, Show, Functor, Foldable, Traversable)
|
||||||
|
+ } deriving (Generic, Typeable, Eq, Functor, Foldable, Traversable)
|
||||||
|
|
||||||
|
+instance (Show a, Show b) =>
|
||||||
|
+ Show (Servant.Client.Core.Request.RequestF a b) where
|
||||||
|
+ showsPrec p req
|
||||||
|
+ = showParen
|
||||||
|
+ (p >= 11)
|
||||||
|
+ ( showString "Request {requestPath = "
|
||||||
|
+ . showsPrec 0 (requestPath req)
|
||||||
|
+ . showString ", requestQueryString = "
|
||||||
|
+ . showsPrec 0 (requestQueryString req)
|
||||||
|
+ . showString ", requestBody = "
|
||||||
|
+ . showsPrec 0 (requestBody req)
|
||||||
|
+ . showString ", requestAccept = "
|
||||||
|
+ . showsPrec 0 (requestAccept req)
|
||||||
|
+ . showString ", requestHeaders = "
|
||||||
|
+ . showsPrec 0 (redactSensitiveHeader <$> requestHeaders req))
|
||||||
|
+ . showString ", requestHttpVersion = "
|
||||||
|
+ . showsPrec 0 (requestHttpVersion req)
|
||||||
|
+ . showString ", requestMethod = "
|
||||||
|
+ . showsPrec 0 (requestMethod req)
|
||||||
|
+ . showString "}"
|
||||||
|
+ where
|
||||||
|
+ redactSensitiveHeader :: Header -> Header
|
||||||
|
+ redactSensitiveHeader ("Authorization", _) = ("Authorization", "<REDACTED>")
|
||||||
|
+ redactSensitiveHeader h = h
|
||||||
|
instance Bifunctor RequestF where bimap = bimapDefault
|
||||||
|
instance Bifoldable RequestF where bifoldMap = bifoldMapDefault
|
||||||
|
instance Bitraversable RequestF where
|
||||||
|
diff --git a/test/Servant/Client/Core/RequestSpec.hs b/test/Servant/Client/Core/RequestSpec.hs
|
||||||
|
new file mode 100644
|
||||||
|
index 000000000..99a1db7d3
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/test/Servant/Client/Core/RequestSpec.hs
|
||||||
|
@@ -0,0 +1,19 @@
|
||||||
|
+{-# OPTIONS_GHC -fno-warn-orphans #-}
|
||||||
|
+{-# LANGUAGE OverloadedStrings #-}
|
||||||
|
+module Servant.Client.Core.RequestSpec (spec) where
|
||||||
|
+
|
||||||
|
+
|
||||||
|
+import Prelude ()
|
||||||
|
+import Prelude.Compat
|
||||||
|
+import Control.Monad
|
||||||
|
+import Data.List (isInfixOf)
|
||||||
|
+import Servant.Client.Core.Request
|
||||||
|
+import Test.Hspec
|
||||||
|
+
|
||||||
|
+spec :: Spec
|
||||||
|
+spec = do
|
||||||
|
+ describe "Request" $ do
|
||||||
|
+ describe "show" $ do
|
||||||
|
+ it "redacts the authorization header" $ do
|
||||||
|
+ let request = void $ defaultRequest { requestHeaders = pure ("authorization", "secret") }
|
||||||
|
+ isInfixOf "secret" (show request) `shouldBe` False
|
|
@ -0,0 +1,86 @@
|
||||||
|
diff -Naurw sexpr-0.2.1/Codec/Sexpr/Internal.hs sexpr-0.2.1-patched/Codec/Sexpr/Internal.hs
|
||||||
|
--- sexpr-0.2.1/Codec/Sexpr/Internal.hs 2009-04-30 00:51:06.000000000 +0200
|
||||||
|
+++ sexpr-0.2.1-patched/Codec/Sexpr/Internal.hs 2018-08-03 01:38:08.000000000 +0200
|
||||||
|
@@ -62,11 +62,6 @@
|
||||||
|
return $ List []]
|
||||||
|
arbSexpr n = oneof [Atom <$> arbitrary,
|
||||||
|
List <$> (resize (n `div` 2) arbitrary)]
|
||||||
|
- coarbitrary (Atom s) = variant 0 . coarbitrary s
|
||||||
|
- coarbitrary (HintedAtom h s) = variant 1 . coarbitrary_h . coarbitrary s
|
||||||
|
- where coarbitrary_h =
|
||||||
|
- foldr (\a b -> variant (ord a) . variant 1 . b) (variant 0) h
|
||||||
|
- coarbitrary (List ss) = variant 2 . coarbitrary ss
|
||||||
|
|
||||||
|
-- |@fold f s@ applies f to each sub-S-expression of s, from each leaf
|
||||||
|
-- to the root. @f@ need not preserve the shape of @s@, in contrast
|
||||||
|
diff -Naurw sexpr-0.2.1/Codec/Sexpr/Printer.hs sexpr-0.2.1-patched/Codec/Sexpr/Printer.hs
|
||||||
|
--- sexpr-0.2.1/Codec/Sexpr/Printer.hs 2009-04-30 00:51:06.000000000 +0200
|
||||||
|
+++ sexpr-0.2.1-patched/Codec/Sexpr/Printer.hs 2018-08-03 01:41:56.000000000 +0200
|
||||||
|
@@ -1,4 +1,4 @@
|
||||||
|
-{-# LANGUAGE FlexibleInstances, OverlappingInstances #-}
|
||||||
|
+{-# LANGUAGE FlexibleInstances #-}
|
||||||
|
|
||||||
|
-- | Export S-expressions in any of the three ordinary forms:
|
||||||
|
--
|
||||||
|
@@ -17,6 +17,8 @@
|
||||||
|
|
||||||
|
module Codec.Sexpr.Printer where
|
||||||
|
|
||||||
|
+import Prelude hiding ((<>))
|
||||||
|
+
|
||||||
|
import Codec.Sexpr.Internal
|
||||||
|
|
||||||
|
import Data.Binary.Put
|
||||||
|
@@ -30,7 +32,7 @@
|
||||||
|
instance Show (Sexpr String) where
|
||||||
|
show s = advancedString s
|
||||||
|
|
||||||
|
-instance Show s => Show (Sexpr s) where
|
||||||
|
+instance {-# OVERLAPPABLE #-} Show s => Show (Sexpr s) where
|
||||||
|
show s = advancedString $ fmap show s
|
||||||
|
|
||||||
|
raw :: String -> String -> String
|
||||||
|
diff -Naurw sexpr-0.2.1/Codec/Sexpr/Tests.hs sexpr-0.2.1-patched/Codec/Sexpr/Tests.hs
|
||||||
|
--- sexpr-0.2.1/Codec/Sexpr/Tests.hs 2009-04-30 00:51:06.000000000 +0200
|
||||||
|
+++ sexpr-0.2.1-patched/Codec/Sexpr/Tests.hs 2018-08-03 01:46:32.000000000 +0200
|
||||||
|
@@ -67,11 +67,9 @@
|
||||||
|
|
||||||
|
instance Arbitrary B.ByteString where
|
||||||
|
arbitrary = B.pack `fmap` arbitrary
|
||||||
|
- coarbitrary = undefined
|
||||||
|
|
||||||
|
instance Arbitrary Char where
|
||||||
|
arbitrary = choose (32,255) >>= \n -> return (chr n)
|
||||||
|
- coarbitrary n = variant (ord n)
|
||||||
|
|
||||||
|
|
||||||
|
main :: IO ()
|
||||||
|
diff -Naurw sexpr-0.2.1/sexpr.cabal sexpr-0.2.1-patched/sexpr.cabal
|
||||||
|
--- sexpr-0.2.1/sexpr.cabal 2018-08-03 01:36:11.000000000 +0200
|
||||||
|
+++ sexpr-0.2.1-patched/sexpr.cabal 2018-08-03 01:49:13.000000000 +0200
|
||||||
|
@@ -13,23 +13,9 @@
|
||||||
|
maintainer: bts@evenmere.org
|
||||||
|
build-type: Simple
|
||||||
|
|
||||||
|
-flag testing
|
||||||
|
- description: build test executable
|
||||||
|
- default: False
|
||||||
|
-
|
||||||
|
library
|
||||||
|
- if flag(testing)
|
||||||
|
- ghc-options: -Wall
|
||||||
|
- Build-Depends: base, base64-string, pretty, bytestring, binary
|
||||||
|
+ Build-Depends: base, base64-string, pretty, bytestring, binary, QuickCheck
|
||||||
|
Exposed-modules: Codec.Sexpr
|
||||||
|
-
|
||||||
|
-executable sexpr-test
|
||||||
|
- if !flag(testing)
|
||||||
|
- buildable: False
|
||||||
|
- ghc-options: -Wall
|
||||||
|
- main-is: Codec/Sexpr/Tests.hs
|
||||||
|
- other-modules: Codec.Sexpr
|
||||||
|
- Codec.Sexpr.Parser
|
||||||
|
+ other-modules: Codec.Sexpr.Parser
|
||||||
|
Codec.Sexpr.Printer
|
||||||
|
Codec.Sexpr.Internal
|
||||||
|
- build-depends: QuickCheck, random
|
|
@ -0,0 +1,16 @@
|
||||||
|
diff --git a/System/Xattr.hsc b/System/Xattr.hsc
|
||||||
|
index adaf9cb..9b49996 100644
|
||||||
|
--- a/System/Xattr.hsc
|
||||||
|
+++ b/System/Xattr.hsc
|
||||||
|
@@ -45,11 +45,7 @@ module System.Xattr
|
||||||
|
where
|
||||||
|
|
||||||
|
#include <sys/types.h>
|
||||||
|
-#ifdef __APPLE__
|
||||||
|
#include <sys/xattr.h>
|
||||||
|
-#else
|
||||||
|
-#include <attr/xattr.h>
|
||||||
|
-#endif
|
||||||
|
|
||||||
|
import Data.Functor ((<$>))
|
||||||
|
import Foreign.C
|
11
pkgs/by-name/ha/haskell/haskell-modules/stack-hook.sh
Normal file
11
pkgs/by-name/ha/haskell/haskell-modules/stack-hook.sh
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
addStackArgs () {
|
||||||
|
if [ -n "$(echo $1/lib/lib*)" ]; then
|
||||||
|
STACK_IN_NIX_EXTRA_ARGS+=" --extra-lib-dirs=$1/lib"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -d "$1/include" ]; then
|
||||||
|
STACK_IN_NIX_EXTRA_ARGS+=" --extra-include-dirs=$1/include"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
addEnvHooks "$targetOffset" addStackArgs
|
|
@ -0,0 +1,202 @@
|
||||||
|
{ lib, stdenv, haskellPackages, symlinkJoin, makeWrapper
|
||||||
|
# GHC will have LLVM available if necessary for the respective target,
|
||||||
|
# so useLLVM only needs to be changed if -fllvm is to be used for a
|
||||||
|
# platform that has NCG support
|
||||||
|
, useLLVM ? false
|
||||||
|
, withHoogle ? false
|
||||||
|
# Whether to install `doc` outputs for GHC and all included libraries.
|
||||||
|
, installDocumentation ? true
|
||||||
|
, hoogleWithPackages
|
||||||
|
, postBuild ? ""
|
||||||
|
, ghcLibdir ? null # only used by ghcjs, when resolving plugins
|
||||||
|
}:
|
||||||
|
|
||||||
|
# This argument is a function which selects a list of Haskell packages from any
|
||||||
|
# passed Haskell package set.
|
||||||
|
#
|
||||||
|
# Example:
|
||||||
|
# (hpkgs: [ hpkgs.mtl hpkgs.lens ])
|
||||||
|
selectPackages:
|
||||||
|
|
||||||
|
# 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
|
||||||
|
inherit (haskellPackages) llvmPackages ghc;
|
||||||
|
|
||||||
|
packages = selectPackages haskellPackages
|
||||||
|
++ lib.optional withHoogle (hoogleWithPackages selectPackages);
|
||||||
|
|
||||||
|
isGhcjs = ghc.isGhcjs or false;
|
||||||
|
isHaLVM = ghc.isHaLVM or false;
|
||||||
|
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/${ghc.targetPrefix}${ghc.haskellCompilerName}"
|
||||||
|
+ lib.optionalString (ghc ? hadrian) "/lib";
|
||||||
|
# Boot libraries for GHC are present in a separate directory.
|
||||||
|
bootLibDir = let arch = if stdenv.targetPlatform.isAarch64
|
||||||
|
then "aarch64"
|
||||||
|
else "x86_64";
|
||||||
|
platform = if stdenv.targetPlatform.isDarwin then "osx" else "linux";
|
||||||
|
in "${ghc}/lib/${ghc.haskellCompilerName}/lib/${arch}-${platform}-${ghc.haskellCompilerName}";
|
||||||
|
docDir = "$out/share/doc/ghc/html";
|
||||||
|
packageCfgDir = "${libDir}/package.conf.d";
|
||||||
|
paths = lib.concatLists (
|
||||||
|
builtins.map
|
||||||
|
(pkg: [ pkg ] ++ lib.optionals installDocumentation [ (lib.getOutput "doc" pkg) ])
|
||||||
|
(lib.filter (x: x ? isHaskellLibrary) (lib.closePropagation packages))
|
||||||
|
);
|
||||||
|
hasLibraries = lib.any (x: x.isHaskellLibrary) paths;
|
||||||
|
# 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
|
||||||
|
|
||||||
|
assert ghcLibdir != null -> (ghc.isGhcjs or false);
|
||||||
|
|
||||||
|
if paths == [] && !useLLVM then ghc else
|
||||||
|
symlinkJoin {
|
||||||
|
# this makes computing paths from the name attribute impossible;
|
||||||
|
# if such a feature is needed, the real compiler name should be saved
|
||||||
|
# as a dedicated drv attribute, like `compiler-name`
|
||||||
|
name = ghc.name + "-with-packages";
|
||||||
|
paths = paths
|
||||||
|
++ [ ghc ]
|
||||||
|
++ lib.optionals installDocumentation [ (lib.getOutput "doc" ghc) ];
|
||||||
|
nativeBuildInputs = [ makeWrapper ];
|
||||||
|
postBuild = ''
|
||||||
|
# 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 useLLVM ''--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 "--global-package-db=${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="${packageCfgDir}";
|
||||||
|
local dynamicLinksDir="$out/lib/links";
|
||||||
|
mkdir -p $dynamicLinksDir
|
||||||
|
# Clean up the old links that may have been (transitively) included by
|
||||||
|
# symlinkJoin:
|
||||||
|
rm -f $dynamicLinksDir/*
|
||||||
|
|
||||||
|
# Boot libraries are located differently than other libraries since GHC 9.6, so handle them separately.
|
||||||
|
if [[ -x "${bootLibDir}" ]]; then
|
||||||
|
ln -s "${bootLibDir}"/*.dylib $dynamicLinksDir
|
||||||
|
fi
|
||||||
|
|
||||||
|
for d in $(grep -Poz "dynamic-library-dirs:\s*\K .+\n" $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 "N;s,dynamic-library-dirs:\s*.*\n,dynamic-library-dirs: $dynamicLinksDir\n," $f-tmp > $f
|
||||||
|
rm $f-tmp
|
||||||
|
done
|
||||||
|
'') + ''
|
||||||
|
${lib.optionalString hasLibraries ''
|
||||||
|
# GHC 8.10 changes.
|
||||||
|
# Instead of replacing package.cache[.lock] with the new file,
|
||||||
|
# ghc-pkg is now trying to open the file. These file are symlink
|
||||||
|
# to another nix derivation, so they are not writable. Removing
|
||||||
|
# them allow the correct behavior of ghc-pkg recache
|
||||||
|
# See: https://github.com/NixOS/nixpkgs/issues/79441
|
||||||
|
rm ${packageCfgDir}/package.cache.lock
|
||||||
|
rm ${packageCfgDir}/package.cache
|
||||||
|
|
||||||
|
$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"
|
||||||
|
''}
|
||||||
|
$out/bin/${ghcCommand}-pkg check
|
||||||
|
'' + postBuild;
|
||||||
|
preferLocalBuild = true;
|
||||||
|
passthru = {
|
||||||
|
inherit (ghc) version meta;
|
||||||
|
|
||||||
|
# Inform users about backwards incompatibilities with <= 21.05
|
||||||
|
override = _: throw ''
|
||||||
|
The ghc.withPackages wrapper itself can now be overridden, but no longer
|
||||||
|
the result of calling it (as before). Consequently overrides need to be
|
||||||
|
adjusted: Instead of
|
||||||
|
|
||||||
|
(ghc.withPackages (p: [ p.my-package ])).override { withLLLVM = true; }
|
||||||
|
|
||||||
|
use
|
||||||
|
|
||||||
|
(ghc.withPackages.override { useLLVM = true; }) (p: [ p.my-package ])
|
||||||
|
|
||||||
|
Also note that withLLVM has been renamed to useLLVM for consistency with
|
||||||
|
the GHC Nix expressions.'';
|
||||||
|
};
|
||||||
|
}
|
576
pkgs/by-name/ha/haskell/haskell-packages.nix
Normal file
576
pkgs/by-name/ha/haskell/haskell-packages.nix
Normal file
|
@ -0,0 +1,576 @@
|
||||||
|
{ buildPackages, pkgsBuildTarget, pkgs, newScope, stdenv }:
|
||||||
|
|
||||||
|
let
|
||||||
|
# These are attributes in compiler that support integer-simple.
|
||||||
|
integerSimpleIncludes = [
|
||||||
|
"ghc88"
|
||||||
|
"ghc884"
|
||||||
|
"ghc810"
|
||||||
|
"ghc8107"
|
||||||
|
];
|
||||||
|
|
||||||
|
nativeBignumExcludes = integerSimpleIncludes ++ [
|
||||||
|
# haskell.compiler sub groups
|
||||||
|
"integer-simple"
|
||||||
|
"native-bignum"
|
||||||
|
# Binary GHCs
|
||||||
|
"ghc865Binary"
|
||||||
|
"ghc8107Binary"
|
||||||
|
"ghc924Binary"
|
||||||
|
"ghc963Binary"
|
||||||
|
# ghcjs
|
||||||
|
"ghcjs"
|
||||||
|
"ghcjs810"
|
||||||
|
];
|
||||||
|
|
||||||
|
haskellLibUncomposable = import ./haskell-modules/lib {
|
||||||
|
inherit (pkgs) lib;
|
||||||
|
inherit pkgs;
|
||||||
|
};
|
||||||
|
|
||||||
|
callPackage = newScope {
|
||||||
|
haskellLib = haskellLibUncomposable.compose;
|
||||||
|
overrides = pkgs.haskell.packageOverrides;
|
||||||
|
};
|
||||||
|
|
||||||
|
bootstrapPackageSet = self: super: {
|
||||||
|
mkDerivation = drv: super.mkDerivation (drv // {
|
||||||
|
doCheck = false;
|
||||||
|
doHaddock = false;
|
||||||
|
enableExecutableProfiling = false;
|
||||||
|
enableLibraryProfiling = false;
|
||||||
|
enableSharedExecutables = false;
|
||||||
|
enableSharedLibraries = false;
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
# Use this rather than `rec { ... }` below for sake of overlays.
|
||||||
|
inherit (pkgs.haskell) compiler packages;
|
||||||
|
|
||||||
|
in {
|
||||||
|
lib = haskellLibUncomposable;
|
||||||
|
|
||||||
|
package-list = callPackage ./haskell-modules/package-list.nix {};
|
||||||
|
|
||||||
|
compiler = {
|
||||||
|
ghc865Binary = callPackage ./ghc/8.6.5-binary.nix {
|
||||||
|
# Should be llvmPackages_6 which has been removed from nixpkgs
|
||||||
|
llvmPackages = null;
|
||||||
|
};
|
||||||
|
|
||||||
|
ghc8107Binary = callPackage ./ghc/8.10.7-binary.nix {
|
||||||
|
llvmPackages = pkgs.llvmPackages_12;
|
||||||
|
};
|
||||||
|
|
||||||
|
ghc924Binary = callPackage ./ghc/9.2.4-binary.nix {
|
||||||
|
llvmPackages = pkgs.llvmPackages_12;
|
||||||
|
};
|
||||||
|
|
||||||
|
ghc963Binary = callPackage ./ghc/9.6.3-binary.nix {
|
||||||
|
llvmPackages = pkgs.llvmPackages_15;
|
||||||
|
};
|
||||||
|
|
||||||
|
ghc8107 = callPackage ./ghc/8.10.7.nix {
|
||||||
|
bootPkgs =
|
||||||
|
# the oldest ghc with aarch64-darwin support is 8.10.5
|
||||||
|
if stdenv.hostPlatform.isPower64 && stdenv.hostPlatform.isLittleEndian then
|
||||||
|
# to my (@a-m-joseph) knowledge there are no newer official binaries for this platform
|
||||||
|
packages.ghc865Binary
|
||||||
|
else
|
||||||
|
packages.ghc8107Binary;
|
||||||
|
inherit (buildPackages.python3Packages) sphinx;
|
||||||
|
# Need to use apple's patched xattr until
|
||||||
|
# https://github.com/xattr/xattr/issues/44 and
|
||||||
|
# https://github.com/xattr/xattr/issues/55 are solved.
|
||||||
|
inherit (buildPackages.darwin) xattr autoSignDarwinBinariesHook;
|
||||||
|
buildTargetLlvmPackages = pkgsBuildTarget.llvmPackages_12;
|
||||||
|
llvmPackages = pkgs.llvmPackages_12;
|
||||||
|
};
|
||||||
|
ghc810 = compiler.ghc8107;
|
||||||
|
ghc902 = callPackage ./ghc/9.0.2.nix {
|
||||||
|
bootPkgs =
|
||||||
|
# the oldest ghc with aarch64-darwin support is 8.10.5
|
||||||
|
if stdenv.hostPlatform.isPower64 && stdenv.hostPlatform.isLittleEndian then
|
||||||
|
packages.ghc810
|
||||||
|
else
|
||||||
|
packages.ghc8107Binary;
|
||||||
|
inherit (buildPackages.python3Packages) sphinx;
|
||||||
|
inherit (buildPackages.darwin) autoSignDarwinBinariesHook xattr;
|
||||||
|
buildTargetLlvmPackages = pkgsBuildTarget.llvmPackages_12;
|
||||||
|
llvmPackages = pkgs.llvmPackages_12;
|
||||||
|
};
|
||||||
|
ghc90 = compiler.ghc902;
|
||||||
|
ghc925 = callPackage ./ghc/9.2.5.nix {
|
||||||
|
bootPkgs =
|
||||||
|
if stdenv.hostPlatform.isPower64 && stdenv.hostPlatform.isLittleEndian then
|
||||||
|
packages.ghc810
|
||||||
|
else
|
||||||
|
packages.ghc8107Binary;
|
||||||
|
inherit (buildPackages.python3Packages) sphinx;
|
||||||
|
# Need to use apple's patched xattr until
|
||||||
|
# https://github.com/xattr/xattr/issues/44 and
|
||||||
|
# https://github.com/xattr/xattr/issues/55 are solved.
|
||||||
|
inherit (buildPackages.darwin) xattr autoSignDarwinBinariesHook;
|
||||||
|
buildTargetLlvmPackages = pkgsBuildTarget.llvmPackages_12;
|
||||||
|
llvmPackages = pkgs.llvmPackages_12;
|
||||||
|
};
|
||||||
|
ghc926 = callPackage ./ghc/9.2.6.nix {
|
||||||
|
bootPkgs =
|
||||||
|
if stdenv.hostPlatform.isPower64 && stdenv.hostPlatform.isLittleEndian then
|
||||||
|
packages.ghc810
|
||||||
|
else
|
||||||
|
packages.ghc8107Binary;
|
||||||
|
inherit (buildPackages.python3Packages) sphinx;
|
||||||
|
# Need to use apple's patched xattr until
|
||||||
|
# https://github.com/xattr/xattr/issues/44 and
|
||||||
|
# https://github.com/xattr/xattr/issues/55 are solved.
|
||||||
|
inherit (buildPackages.darwin) xattr autoSignDarwinBinariesHook;
|
||||||
|
buildTargetLlvmPackages = pkgsBuildTarget.llvmPackages_12;
|
||||||
|
llvmPackages = pkgs.llvmPackages_12;
|
||||||
|
};
|
||||||
|
ghc927 = callPackage ./ghc/9.2.7.nix {
|
||||||
|
bootPkgs =
|
||||||
|
if stdenv.hostPlatform.isPower64 && stdenv.hostPlatform.isLittleEndian then
|
||||||
|
packages.ghc810
|
||||||
|
else
|
||||||
|
packages.ghc8107Binary;
|
||||||
|
inherit (buildPackages.python3Packages) sphinx;
|
||||||
|
# Need to use apple's patched xattr until
|
||||||
|
# https://github.com/xattr/xattr/issues/44 and
|
||||||
|
# https://github.com/xattr/xattr/issues/55 are solved.
|
||||||
|
inherit (buildPackages.darwin) xattr autoSignDarwinBinariesHook;
|
||||||
|
buildTargetLlvmPackages = pkgsBuildTarget.llvmPackages_12;
|
||||||
|
llvmPackages = pkgs.llvmPackages_12;
|
||||||
|
};
|
||||||
|
ghc928 = callPackage ./ghc/9.2.8.nix {
|
||||||
|
bootPkgs =
|
||||||
|
if stdenv.hostPlatform.isPower64 && stdenv.hostPlatform.isLittleEndian then
|
||||||
|
packages.ghc810
|
||||||
|
else
|
||||||
|
packages.ghc8107Binary;
|
||||||
|
inherit (buildPackages.python3Packages) sphinx;
|
||||||
|
# Need to use apple's patched xattr until
|
||||||
|
# https://github.com/xattr/xattr/issues/44 and
|
||||||
|
# https://github.com/xattr/xattr/issues/55 are solved.
|
||||||
|
inherit (buildPackages.darwin) xattr autoSignDarwinBinariesHook;
|
||||||
|
buildTargetLlvmPackages = pkgsBuildTarget.llvmPackages_12;
|
||||||
|
llvmPackages = pkgs.llvmPackages_12;
|
||||||
|
};
|
||||||
|
ghc92 = compiler.ghc928;
|
||||||
|
ghc945 = callPackage ./ghc/9.4.5.nix {
|
||||||
|
bootPkgs =
|
||||||
|
# Building with 9.2 is broken due to
|
||||||
|
# https://gitlab.haskell.org/ghc/ghc/-/issues/21914
|
||||||
|
# Use 8.10 as a workaround where possible to keep bootstrap path short.
|
||||||
|
|
||||||
|
# On ARM text won't build with GHC 8.10.*
|
||||||
|
if stdenv.hostPlatform.isAarch then
|
||||||
|
# TODO(@sternenseemann): package bindist
|
||||||
|
packages.ghc902
|
||||||
|
# No suitable bindists for powerpc64le
|
||||||
|
else if stdenv.hostPlatform.isPower64 && stdenv.hostPlatform.isLittleEndian then
|
||||||
|
packages.ghc902
|
||||||
|
else
|
||||||
|
packages.ghc8107Binary;
|
||||||
|
inherit (buildPackages.python3Packages) sphinx;
|
||||||
|
# Need to use apple's patched xattr until
|
||||||
|
# https://github.com/xattr/xattr/issues/44 and
|
||||||
|
# https://github.com/xattr/xattr/issues/55 are solved.
|
||||||
|
inherit (buildPackages.darwin) xattr autoSignDarwinBinariesHook;
|
||||||
|
# Support range >= 10 && < 14
|
||||||
|
buildTargetLlvmPackages = pkgsBuildTarget.llvmPackages_12;
|
||||||
|
llvmPackages = pkgs.llvmPackages_12;
|
||||||
|
};
|
||||||
|
ghc946 = callPackage ./ghc/9.4.6.nix {
|
||||||
|
bootPkgs =
|
||||||
|
# Building with 9.2 is broken due to
|
||||||
|
# https://gitlab.haskell.org/ghc/ghc/-/issues/21914
|
||||||
|
# Use 8.10 as a workaround where possible to keep bootstrap path short.
|
||||||
|
|
||||||
|
# On ARM text won't build with GHC 8.10.*
|
||||||
|
if stdenv.hostPlatform.isAarch then
|
||||||
|
# TODO(@sternenseemann): package bindist
|
||||||
|
packages.ghc902
|
||||||
|
# No suitable bindists for powerpc64le
|
||||||
|
else if stdenv.hostPlatform.isPower64 && stdenv.hostPlatform.isLittleEndian then
|
||||||
|
packages.ghc902
|
||||||
|
else
|
||||||
|
packages.ghc8107Binary;
|
||||||
|
inherit (buildPackages.python3Packages) sphinx;
|
||||||
|
# Need to use apple's patched xattr until
|
||||||
|
# https://github.com/xattr/xattr/issues/44 and
|
||||||
|
# https://github.com/xattr/xattr/issues/55 are solved.
|
||||||
|
inherit (buildPackages.darwin) xattr autoSignDarwinBinariesHook;
|
||||||
|
# Support range >= 10 && < 14
|
||||||
|
buildTargetLlvmPackages = pkgsBuildTarget.llvmPackages_12;
|
||||||
|
llvmPackages = pkgs.llvmPackages_12;
|
||||||
|
};
|
||||||
|
ghc947 = callPackage ./ghc/9.4.7.nix {
|
||||||
|
bootPkgs =
|
||||||
|
# Building with 9.2 is broken due to
|
||||||
|
# https://gitlab.haskell.org/ghc/ghc/-/issues/21914
|
||||||
|
# Use 8.10 as a workaround where possible to keep bootstrap path short.
|
||||||
|
|
||||||
|
# On ARM text won't build with GHC 8.10.*
|
||||||
|
if stdenv.hostPlatform.isAarch then
|
||||||
|
# TODO(@sternenseemann): package bindist
|
||||||
|
packages.ghc902
|
||||||
|
# No suitable bindists for powerpc64le
|
||||||
|
else if stdenv.hostPlatform.isPower64 && stdenv.hostPlatform.isLittleEndian then
|
||||||
|
packages.ghc902
|
||||||
|
else
|
||||||
|
packages.ghc8107Binary;
|
||||||
|
inherit (buildPackages.python3Packages) sphinx;
|
||||||
|
# Need to use apple's patched xattr until
|
||||||
|
# https://github.com/xattr/xattr/issues/44 and
|
||||||
|
# https://github.com/xattr/xattr/issues/55 are solved.
|
||||||
|
inherit (buildPackages.darwin) xattr autoSignDarwinBinariesHook;
|
||||||
|
# Support range >= 10 && < 14
|
||||||
|
buildTargetLlvmPackages = pkgsBuildTarget.llvmPackages_12;
|
||||||
|
llvmPackages = pkgs.llvmPackages_12;
|
||||||
|
};
|
||||||
|
ghc948 = callPackage ./ghc/9.4.8.nix {
|
||||||
|
bootPkgs =
|
||||||
|
# Building with 9.2 is broken due to
|
||||||
|
# https://gitlab.haskell.org/ghc/ghc/-/issues/21914
|
||||||
|
# Use 8.10 as a workaround where possible to keep bootstrap path short.
|
||||||
|
|
||||||
|
# On ARM text won't build with GHC 8.10.*
|
||||||
|
if stdenv.hostPlatform.isAarch then
|
||||||
|
# TODO(@sternenseemann): package bindist
|
||||||
|
packages.ghc902
|
||||||
|
# No suitable bindists for powerpc64le
|
||||||
|
else if stdenv.hostPlatform.isPower64 && stdenv.hostPlatform.isLittleEndian then
|
||||||
|
packages.ghc902
|
||||||
|
else
|
||||||
|
packages.ghc8107Binary;
|
||||||
|
inherit (buildPackages.python3Packages) sphinx;
|
||||||
|
# Need to use apple's patched xattr until
|
||||||
|
# https://github.com/xattr/xattr/issues/44 and
|
||||||
|
# https://github.com/xattr/xattr/issues/55 are solved.
|
||||||
|
inherit (buildPackages.darwin) xattr autoSignDarwinBinariesHook;
|
||||||
|
# Support range >= 10 && < 14
|
||||||
|
buildTargetLlvmPackages = pkgsBuildTarget.llvmPackages_12;
|
||||||
|
llvmPackages = pkgs.llvmPackages_12;
|
||||||
|
};
|
||||||
|
ghc94 = compiler.ghc948;
|
||||||
|
ghc963 = callPackage ./ghc/9.6.3.nix {
|
||||||
|
bootPkgs =
|
||||||
|
# For GHC 9.2 no armv7l bindists are available.
|
||||||
|
if stdenv.hostPlatform.isAarch32 then
|
||||||
|
packages.ghc928
|
||||||
|
else if stdenv.hostPlatform.isPower64 && stdenv.hostPlatform.isLittleEndian then
|
||||||
|
packages.ghc928
|
||||||
|
else
|
||||||
|
packages.ghc924Binary;
|
||||||
|
inherit (buildPackages.python3Packages) sphinx;
|
||||||
|
# Need to use apple's patched xattr until
|
||||||
|
# https://github.com/xattr/xattr/issues/44 and
|
||||||
|
# https://github.com/xattr/xattr/issues/55 are solved.
|
||||||
|
inherit (buildPackages.darwin) xattr autoSignDarwinBinariesHook;
|
||||||
|
# Support range >= 11 && < 16
|
||||||
|
buildTargetLlvmPackages = pkgsBuildTarget.llvmPackages_15;
|
||||||
|
llvmPackages = pkgs.llvmPackages_15;
|
||||||
|
};
|
||||||
|
ghc964 = callPackage ./ghc/9.6.4.nix {
|
||||||
|
bootPkgs =
|
||||||
|
# For GHC 9.2 no armv7l bindists are available.
|
||||||
|
if stdenv.hostPlatform.isAarch32 then
|
||||||
|
packages.ghc928
|
||||||
|
else if stdenv.hostPlatform.isPower64 && stdenv.hostPlatform.isLittleEndian then
|
||||||
|
packages.ghc928
|
||||||
|
else
|
||||||
|
packages.ghc924Binary;
|
||||||
|
inherit (buildPackages.python3Packages) sphinx;
|
||||||
|
# Need to use apple's patched xattr until
|
||||||
|
# https://github.com/xattr/xattr/issues/44 and
|
||||||
|
# https://github.com/xattr/xattr/issues/55 are solved.
|
||||||
|
inherit (buildPackages.darwin) xattr autoSignDarwinBinariesHook;
|
||||||
|
# Support range >= 11 && < 16
|
||||||
|
buildTargetLlvmPackages = pkgsBuildTarget.llvmPackages_15;
|
||||||
|
llvmPackages = pkgs.llvmPackages_15;
|
||||||
|
};
|
||||||
|
ghc965 = callPackage ./ghc/9.6.5.nix {
|
||||||
|
bootPkgs =
|
||||||
|
# For GHC 9.2 no armv7l bindists are available.
|
||||||
|
if stdenv.hostPlatform.isAarch32 then
|
||||||
|
packages.ghc928
|
||||||
|
else if stdenv.hostPlatform.isPower64 && stdenv.hostPlatform.isLittleEndian then
|
||||||
|
packages.ghc928
|
||||||
|
else
|
||||||
|
packages.ghc924Binary;
|
||||||
|
inherit (buildPackages.python3Packages) sphinx;
|
||||||
|
# Need to use apple's patched xattr until
|
||||||
|
# https://github.com/xattr/xattr/issues/44 and
|
||||||
|
# https://github.com/xattr/xattr/issues/55 are solved.
|
||||||
|
inherit (buildPackages.darwin) xattr autoSignDarwinBinariesHook;
|
||||||
|
# Support range >= 11 && < 16
|
||||||
|
buildTargetLlvmPackages = pkgsBuildTarget.llvmPackages_15;
|
||||||
|
llvmPackages = pkgs.llvmPackages_15;
|
||||||
|
};
|
||||||
|
ghc96 = compiler.ghc965;
|
||||||
|
ghc981 = callPackage ./ghc/9.8.1.nix {
|
||||||
|
bootPkgs =
|
||||||
|
# For GHC 9.6 no armv7l bindists are available.
|
||||||
|
if stdenv.hostPlatform.isAarch32 then
|
||||||
|
packages.ghc963
|
||||||
|
else if stdenv.hostPlatform.isPower64 && stdenv.hostPlatform.isLittleEndian then
|
||||||
|
packages.ghc963
|
||||||
|
else if stdenv.hostPlatform.isDarwin then
|
||||||
|
# it seems like the GHC 9.6.* bindists are built with a different
|
||||||
|
# toolchain than we are using (which I'm guessing from the fact
|
||||||
|
# that 9.6.4 bindists pass linker flags our ld doesn't support).
|
||||||
|
# With both 9.6.3 and 9.6.4 binary it is impossible to link against
|
||||||
|
# the clock package (probably a hsc2hs problem).
|
||||||
|
packages.ghc963
|
||||||
|
else
|
||||||
|
packages.ghc963Binary;
|
||||||
|
inherit (buildPackages.python3Packages) sphinx;
|
||||||
|
# Need to use apple's patched xattr until
|
||||||
|
# https://github.com/xattr/xattr/issues/44 and
|
||||||
|
# https://github.com/xattr/xattr/issues/55 are solved.
|
||||||
|
inherit (buildPackages.darwin) xattr autoSignDarwinBinariesHook;
|
||||||
|
# Support range >= 11 && < 16
|
||||||
|
buildTargetLlvmPackages = pkgsBuildTarget.llvmPackages_15;
|
||||||
|
llvmPackages = pkgs.llvmPackages_15;
|
||||||
|
};
|
||||||
|
ghc982 = callPackage ./ghc/9.8.2.nix {
|
||||||
|
bootPkgs =
|
||||||
|
# For GHC 9.6 no armv7l bindists are available.
|
||||||
|
if stdenv.hostPlatform.isAarch32 then
|
||||||
|
packages.ghc963
|
||||||
|
else if stdenv.hostPlatform.isPower64 && stdenv.hostPlatform.isLittleEndian then
|
||||||
|
packages.ghc963
|
||||||
|
else if stdenv.hostPlatform.isDarwin then
|
||||||
|
# it seems like the GHC 9.6.* bindists are built with a different
|
||||||
|
# toolchain than we are using (which I'm guessing from the fact
|
||||||
|
# that 9.6.4 bindists pass linker flags our ld doesn't support).
|
||||||
|
# With both 9.6.3 and 9.6.4 binary it is impossible to link against
|
||||||
|
# the clock package (probably a hsc2hs problem).
|
||||||
|
packages.ghc963
|
||||||
|
else
|
||||||
|
packages.ghc963Binary;
|
||||||
|
inherit (buildPackages.python3Packages) sphinx;
|
||||||
|
# Need to use apple's patched xattr until
|
||||||
|
# https://github.com/xattr/xattr/issues/44 and
|
||||||
|
# https://github.com/xattr/xattr/issues/55 are solved.
|
||||||
|
inherit (buildPackages.darwin) xattr autoSignDarwinBinariesHook;
|
||||||
|
# Support range >= 11 && < 16
|
||||||
|
buildTargetLlvmPackages = pkgsBuildTarget.llvmPackages_15;
|
||||||
|
llvmPackages = pkgs.llvmPackages_15;
|
||||||
|
};
|
||||||
|
ghc98 = compiler.ghc982;
|
||||||
|
ghcHEAD = callPackage ./ghc/head.nix {
|
||||||
|
bootPkgs =
|
||||||
|
# For GHC 9.6 no armv7l bindists are available.
|
||||||
|
if stdenv.hostPlatform.isAarch32 then
|
||||||
|
packages.ghc963
|
||||||
|
else if stdenv.hostPlatform.isPower64 && stdenv.hostPlatform.isLittleEndian then
|
||||||
|
packages.ghc963
|
||||||
|
else if stdenv.hostPlatform.isDarwin then
|
||||||
|
# it seems like the GHC 9.6.* bindists are built with a different
|
||||||
|
# toolchain than we are using (which I'm guessing from the fact
|
||||||
|
# that 9.6.4 bindists pass linker flags our ld doesn't support).
|
||||||
|
# With both 9.6.3 and 9.6.4 binary it is impossible to link against
|
||||||
|
# the clock package (probably a hsc2hs problem).
|
||||||
|
packages.ghc963
|
||||||
|
else
|
||||||
|
packages.ghc963Binary;
|
||||||
|
inherit (buildPackages.python3Packages) sphinx;
|
||||||
|
# Need to use apple's patched xattr until
|
||||||
|
# https://github.com/xattr/xattr/issues/44 and
|
||||||
|
# https://github.com/xattr/xattr/issues/55 are solved.
|
||||||
|
inherit (buildPackages.darwin) xattr autoSignDarwinBinariesHook;
|
||||||
|
# 2023-01-15: Support range >= 11 && < 16
|
||||||
|
buildTargetLlvmPackages = pkgsBuildTarget.llvmPackages_15;
|
||||||
|
llvmPackages = pkgs.llvmPackages_15;
|
||||||
|
};
|
||||||
|
|
||||||
|
ghcjs = compiler.ghcjs810;
|
||||||
|
ghcjs810 = callPackage ./ghcjs/8.10 {
|
||||||
|
bootPkgs = packages.ghc810;
|
||||||
|
ghcjsSrcJson = ./ghcjs/8.10/git.json;
|
||||||
|
stage0 = ./ghcjs/8.10/stage0.nix;
|
||||||
|
};
|
||||||
|
|
||||||
|
# The integer-simple attribute set contains all the GHC compilers
|
||||||
|
# build with integer-simple instead of integer-gmp.
|
||||||
|
integer-simple = let
|
||||||
|
integerSimpleGhcNames = pkgs.lib.filter
|
||||||
|
(name: builtins.elem name integerSimpleIncludes)
|
||||||
|
(pkgs.lib.attrNames compiler);
|
||||||
|
in pkgs.recurseIntoAttrs (pkgs.lib.genAttrs
|
||||||
|
integerSimpleGhcNames
|
||||||
|
(name: compiler.${name}.override { enableIntegerSimple = true; }));
|
||||||
|
|
||||||
|
# Starting from GHC 9, integer-{simple,gmp} is replaced by ghc-bignum
|
||||||
|
# with "native" and "gmp" backends.
|
||||||
|
native-bignum = let
|
||||||
|
nativeBignumGhcNames = pkgs.lib.filter
|
||||||
|
(name: !(builtins.elem name nativeBignumExcludes))
|
||||||
|
(pkgs.lib.attrNames compiler);
|
||||||
|
in pkgs.recurseIntoAttrs (pkgs.lib.genAttrs
|
||||||
|
nativeBignumGhcNames
|
||||||
|
(name: compiler.${name}.override { enableNativeBignum = true; }));
|
||||||
|
};
|
||||||
|
|
||||||
|
# Default overrides that are applied to all package sets.
|
||||||
|
packageOverrides = self : super : {};
|
||||||
|
|
||||||
|
# Always get compilers from `buildPackages`
|
||||||
|
packages = let bh = buildPackages.haskell; in {
|
||||||
|
|
||||||
|
ghc865Binary = callPackage ./haskell-modules {
|
||||||
|
buildHaskellPackages = bh.packages.ghc865Binary;
|
||||||
|
ghc = bh.compiler.ghc865Binary;
|
||||||
|
compilerConfig = callPackage ./haskell-modules/configuration-ghc-8.6.x.nix { };
|
||||||
|
packageSetConfig = bootstrapPackageSet;
|
||||||
|
};
|
||||||
|
ghc8107Binary = callPackage ./haskell-modules {
|
||||||
|
buildHaskellPackages = bh.packages.ghc8107Binary;
|
||||||
|
ghc = bh.compiler.ghc8107Binary;
|
||||||
|
compilerConfig = callPackage ./haskell-modules/configuration-ghc-8.10.x.nix { };
|
||||||
|
packageSetConfig = bootstrapPackageSet;
|
||||||
|
};
|
||||||
|
ghc924Binary = callPackage ./haskell-modules {
|
||||||
|
buildHaskellPackages = bh.packages.ghc924Binary;
|
||||||
|
ghc = bh.compiler.ghc924Binary;
|
||||||
|
compilerConfig = callPackage ./haskell-modules/configuration-ghc-9.2.x.nix { };
|
||||||
|
packageSetConfig = bootstrapPackageSet;
|
||||||
|
};
|
||||||
|
ghc963Binary = callPackage ./haskell-modules {
|
||||||
|
buildHaskellPackages = bh.packages.ghc963Binary;
|
||||||
|
ghc = bh.compiler.ghc963Binary;
|
||||||
|
compilerConfig = callPackage ./haskell-modules/configuration-ghc-9.6.x.nix { };
|
||||||
|
packageSetConfig = bootstrapPackageSet;
|
||||||
|
};
|
||||||
|
ghc8107 = callPackage ./haskell-modules {
|
||||||
|
buildHaskellPackages = bh.packages.ghc8107;
|
||||||
|
ghc = bh.compiler.ghc8107;
|
||||||
|
compilerConfig = callPackage ./haskell-modules/configuration-ghc-8.10.x.nix { };
|
||||||
|
};
|
||||||
|
ghc810 = packages.ghc8107;
|
||||||
|
ghc902 = callPackage ./haskell-modules {
|
||||||
|
buildHaskellPackages = bh.packages.ghc902;
|
||||||
|
ghc = bh.compiler.ghc902;
|
||||||
|
compilerConfig = callPackage ./haskell-modules/configuration-ghc-9.0.x.nix { };
|
||||||
|
};
|
||||||
|
ghc90 = packages.ghc902;
|
||||||
|
ghc925 = callPackage ./haskell-modules {
|
||||||
|
buildHaskellPackages = bh.packages.ghc925;
|
||||||
|
ghc = bh.compiler.ghc925;
|
||||||
|
compilerConfig = callPackage ./haskell-modules/configuration-ghc-9.2.x.nix { };
|
||||||
|
};
|
||||||
|
ghc926 = callPackage ./haskell-modules {
|
||||||
|
buildHaskellPackages = bh.packages.ghc926;
|
||||||
|
ghc = bh.compiler.ghc926;
|
||||||
|
compilerConfig = callPackage ./haskell-modules/configuration-ghc-9.2.x.nix { };
|
||||||
|
};
|
||||||
|
ghc927 = callPackage ./haskell-modules {
|
||||||
|
buildHaskellPackages = bh.packages.ghc927;
|
||||||
|
ghc = bh.compiler.ghc927;
|
||||||
|
compilerConfig = callPackage ./haskell-modules/configuration-ghc-9.2.x.nix { };
|
||||||
|
};
|
||||||
|
ghc928 = callPackage ./haskell-modules {
|
||||||
|
buildHaskellPackages = bh.packages.ghc928;
|
||||||
|
ghc = bh.compiler.ghc928;
|
||||||
|
compilerConfig = callPackage ./haskell-modules/configuration-ghc-9.2.x.nix { };
|
||||||
|
};
|
||||||
|
ghc92 = packages.ghc928;
|
||||||
|
ghc945 = callPackage ./haskell-modules {
|
||||||
|
buildHaskellPackages = bh.packages.ghc945;
|
||||||
|
ghc = bh.compiler.ghc945;
|
||||||
|
compilerConfig = callPackage ./haskell-modules/configuration-ghc-9.4.x.nix { };
|
||||||
|
};
|
||||||
|
ghc946 = callPackage ./haskell-modules {
|
||||||
|
buildHaskellPackages = bh.packages.ghc946;
|
||||||
|
ghc = bh.compiler.ghc946;
|
||||||
|
compilerConfig = callPackage ./haskell-modules/configuration-ghc-9.4.x.nix { };
|
||||||
|
};
|
||||||
|
ghc947 = callPackage ./haskell-modules {
|
||||||
|
buildHaskellPackages = bh.packages.ghc947;
|
||||||
|
ghc = bh.compiler.ghc947;
|
||||||
|
compilerConfig = callPackage ./haskell-modules/configuration-ghc-9.4.x.nix { };
|
||||||
|
};
|
||||||
|
ghc948 = callPackage ./haskell-modules {
|
||||||
|
buildHaskellPackages = bh.packages.ghc948;
|
||||||
|
ghc = bh.compiler.ghc948;
|
||||||
|
compilerConfig = callPackage ./haskell-modules/configuration-ghc-9.4.x.nix { };
|
||||||
|
};
|
||||||
|
ghc94 = packages.ghc948;
|
||||||
|
ghc963 = callPackage ./haskell-modules {
|
||||||
|
buildHaskellPackages = bh.packages.ghc963;
|
||||||
|
ghc = bh.compiler.ghc963;
|
||||||
|
compilerConfig = callPackage ./haskell-modules/configuration-ghc-9.6.x.nix { };
|
||||||
|
};
|
||||||
|
ghc964 = callPackage ./haskell-modules {
|
||||||
|
buildHaskellPackages = bh.packages.ghc964;
|
||||||
|
ghc = bh.compiler.ghc964;
|
||||||
|
compilerConfig = callPackage ./haskell-modules/configuration-ghc-9.6.x.nix { };
|
||||||
|
};
|
||||||
|
ghc965 = callPackage ./haskell-modules {
|
||||||
|
buildHaskellPackages = bh.packages.ghc965;
|
||||||
|
ghc = bh.compiler.ghc965;
|
||||||
|
compilerConfig = callPackage ./haskell-modules/configuration-ghc-9.6.x.nix { };
|
||||||
|
};
|
||||||
|
ghc96 = packages.ghc965;
|
||||||
|
ghc981 = callPackage ./haskell-modules {
|
||||||
|
buildHaskellPackages = bh.packages.ghc981;
|
||||||
|
ghc = bh.compiler.ghc981;
|
||||||
|
compilerConfig = callPackage ./haskell-modules/configuration-ghc-9.8.x.nix { };
|
||||||
|
};
|
||||||
|
ghc982 = callPackage ./haskell-modules {
|
||||||
|
buildHaskellPackages = bh.packages.ghc982;
|
||||||
|
ghc = bh.compiler.ghc982;
|
||||||
|
compilerConfig = callPackage ./haskell-modules/configuration-ghc-9.8.x.nix { };
|
||||||
|
};
|
||||||
|
ghc98 = packages.ghc982;
|
||||||
|
ghcHEAD = callPackage ./haskell-modules {
|
||||||
|
buildHaskellPackages = bh.packages.ghcHEAD;
|
||||||
|
ghc = bh.compiler.ghcHEAD;
|
||||||
|
compilerConfig = callPackage ./haskell-modules/configuration-ghc-9.12.x.nix { };
|
||||||
|
};
|
||||||
|
|
||||||
|
ghcjs = packages.ghcjs810;
|
||||||
|
ghcjs810 = callPackage ./haskell-modules rec {
|
||||||
|
buildHaskellPackages = ghc.bootPkgs;
|
||||||
|
ghc = bh.compiler.ghcjs810;
|
||||||
|
compilerConfig = callPackage ./haskell-modules/configuration-ghc-8.10.x.nix { };
|
||||||
|
packageSetConfig = callPackage ./haskell-modules/configuration-ghcjs.nix { };
|
||||||
|
};
|
||||||
|
|
||||||
|
# The integer-simple attribute set contains package sets for all the GHC compilers
|
||||||
|
# using integer-simple instead of integer-gmp.
|
||||||
|
integer-simple =
|
||||||
|
let
|
||||||
|
integerSimpleGhcNames = pkgs.lib.filter
|
||||||
|
(name: builtins.elem name integerSimpleIncludes)
|
||||||
|
(pkgs.lib.attrNames packages);
|
||||||
|
in
|
||||||
|
pkgs.lib.genAttrs integerSimpleGhcNames
|
||||||
|
(name:
|
||||||
|
packages.${name}.override (oldAttrs: {
|
||||||
|
ghc = bh.compiler.integer-simple.${name};
|
||||||
|
buildHaskellPackages = bh.packages.integer-simple.${name};
|
||||||
|
overrides =
|
||||||
|
pkgs.lib.composeExtensions
|
||||||
|
(oldAttrs.overrides or (_: _: {}))
|
||||||
|
(_: _: { integer-simple = null; });
|
||||||
|
})
|
||||||
|
);
|
||||||
|
|
||||||
|
native-bignum =
|
||||||
|
let
|
||||||
|
nativeBignumGhcNames = pkgs.lib.filter
|
||||||
|
(name: !(builtins.elem name nativeBignumExcludes))
|
||||||
|
(pkgs.lib.attrNames compiler);
|
||||||
|
in
|
||||||
|
pkgs.lib.genAttrs nativeBignumGhcNames
|
||||||
|
(name:
|
||||||
|
packages.${name}.override {
|
||||||
|
ghc = bh.compiler.native-bignum.${name};
|
||||||
|
buildHaskellPackages = bh.packages.native-bignum.${name};
|
||||||
|
}
|
||||||
|
);
|
||||||
|
};
|
||||||
|
}
|
35
pkgs/by-name/ha/haskell/packages.nix
Normal file
35
pkgs/by-name/ha/haskell/packages.nix
Normal file
|
@ -0,0 +1,35 @@
|
||||||
|
{ ... }:
|
||||||
|
res: pkgs: super:
|
||||||
|
|
||||||
|
with pkgs;
|
||||||
|
{
|
||||||
|
haskell = callPackage ./haskell-packages.nix { };
|
||||||
|
|
||||||
|
haskellPackages = dontRecurseIntoAttrs
|
||||||
|
# Prefer native-bignum to avoid linking issues with gmp
|
||||||
|
# GHC 9.6 rts can't be built statically with hadrian, so we need to use 9.4
|
||||||
|
# until 9.8 is ready
|
||||||
|
(if stdenv.hostPlatform.isStatic then haskell.packages.native-bignum.ghc94
|
||||||
|
# JS backend can't use gmp
|
||||||
|
else if stdenv.hostPlatform.isGhcjs then haskell.packages.native-bignum.ghc96
|
||||||
|
else haskell.packages.ghc96)
|
||||||
|
// { __recurseIntoDerivationForReleaseJobs = true; };
|
||||||
|
|
||||||
|
# haskellPackages.ghc is build->host (it exposes the compiler used to build the
|
||||||
|
# set, similarly to stdenv.cc), but pkgs.ghc should be host->target to be more
|
||||||
|
# consistent with the gcc, gnat, clang etc. derivations
|
||||||
|
#
|
||||||
|
# We use targetPackages.haskellPackages.ghc if available since this also has
|
||||||
|
# the withPackages wrapper available. In the final cross-compiled package set
|
||||||
|
# however, targetPackages won't be populated, so we need to fall back to the
|
||||||
|
# plain, cross-compiled compiler (which is only theoretical at the moment).
|
||||||
|
ghc = targetPackages.haskellPackages.ghc or
|
||||||
|
# Prefer native-bignum to avoid linking issues with gmp
|
||||||
|
# Use 9.4 for static over broken 9.6
|
||||||
|
(if stdenv.targetPlatform.isStatic then haskell.compiler.native-bignum.ghc94
|
||||||
|
# JS backend can't use GMP
|
||||||
|
else if stdenv.targetPlatform.isGhcjs then haskell.compiler.native-bignum.ghc96
|
||||||
|
else haskell.compiler.ghc96);
|
||||||
|
|
||||||
|
nixfmt = haskellPackages.nixfmt.bin;
|
||||||
|
}
|
24
pkgs/by-name/hi/hiredis/default.nix
Normal file
24
pkgs/by-name/hi/hiredis/default.nix
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
{ lib, stdenv, fetchFromGitHub, openssl }:
|
||||||
|
|
||||||
|
stdenv.mkDerivation rec {
|
||||||
|
pname = "hiredis";
|
||||||
|
version = "1.2.0";
|
||||||
|
nativeBuildInputs = [openssl];
|
||||||
|
|
||||||
|
src = fetchFromGitHub {
|
||||||
|
owner = "redis";
|
||||||
|
repo = "hiredis";
|
||||||
|
rev = "v${version}";
|
||||||
|
sha256 = "sha256-ZxUITm3OcbERcvaNqGQU46bEfV+jN6safPalG0TVfBg=";
|
||||||
|
};
|
||||||
|
|
||||||
|
PREFIX = "\${out}";
|
||||||
|
USE_SSL = 1;
|
||||||
|
|
||||||
|
meta = with lib; {
|
||||||
|
homepage = "https://github.com/redis/hiredis";
|
||||||
|
description = "Minimalistic C client for Redis >= 1.2";
|
||||||
|
license = licenses.bsd3;
|
||||||
|
platforms = platforms.all;
|
||||||
|
};
|
||||||
|
}
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue