haskellPackages.mkDerivation: use emcc as C compiler for ghcjs

We need to set up EM_CACHE correctly so that it works, of course.

Note that the solution relies on the assumption that this should only
happen when we cross compile, i.e. the extra logic to account for the
cc-less stdenv in pkgsCross.ghcjs is only present in crossCabalFlags.

Co-authored-by: sternenseemann <sternenseemann@systemli.org>
This commit is contained in:
Slava Gorbunov 2024-04-12 17:50:59 +03:00 committed by sternenseemann
parent 78667e9c1b
commit 718851b229
2 changed files with 32 additions and 8 deletions

View File

@ -1,13 +1,24 @@
{ lib, stdenv, buildPackages, buildHaskellPackages, ghc { lib, stdenv, buildPackages, buildHaskellPackages, ghc
, jailbreak-cabal, hscolour, cpphs, nodejs , jailbreak-cabal, hscolour, cpphs
, ghcWithHoogle, ghcWithPackages , ghcWithHoogle, ghcWithPackages
, nodejs
}: }:
let let
isCross = stdenv.buildPlatform != stdenv.hostPlatform; 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) inherit (buildPackages)
fetchurl removeReferencesTo fetchurl removeReferencesTo
pkg-config coreutils gnugrep glibcLocales; pkg-config coreutils gnugrep glibcLocales
emscripten;
in in
{ pname { pname
@ -40,7 +51,8 @@ in
, enableSharedExecutables ? false , enableSharedExecutables ? false
, enableSharedLibraries ? !stdenv.hostPlatform.isStatic && (ghc.enableShared or false) , enableSharedLibraries ? !stdenv.hostPlatform.isStatic && (ghc.enableShared or false)
, enableDeadCodeElimination ? (!stdenv.isDarwin) # TODO: use -dead_strip for darwin , enableDeadCodeElimination ? (!stdenv.isDarwin) # TODO: use -dead_strip for darwin
, enableStaticLibraries ? !(stdenv.hostPlatform.isWindows || stdenv.hostPlatform.isWasm) # 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 , enableHsc2hsViaAsm ? stdenv.hostPlatform.isWindows
, extraLibraries ? [], librarySystemDepends ? [], executableSystemDepends ? [] , extraLibraries ? [], librarySystemDepends ? [], executableSystemDepends ? []
# On macOS, statically linking against system frameworks is not supported; # On macOS, statically linking against system frameworks is not supported;
@ -188,10 +200,7 @@ let
crossCabalFlags = [ crossCabalFlags = [
"--with-ghc=${ghcCommand}" "--with-ghc=${ghcCommand}"
"--with-ghc-pkg=${ghc.targetPrefix}ghc-pkg" "--with-ghc-pkg=${ghc.targetPrefix}ghc-pkg"
# Pass the "wrong" C compiler rather than none at all so packages that just "--with-gcc=${cc}"
# use the C preproccessor still work, see
# https://github.com/haskell/cabal/issues/6466 for details.
"--with-gcc=${if stdenv.hasCC then "$CC" else "$CC_FOR_BUILD"}"
] ++ optionals stdenv.hasCC [ ] ++ optionals stdenv.hasCC [
"--with-ld=${stdenv.cc.bintools.targetPrefix}ld" "--with-ld=${stdenv.cc.bintools.targetPrefix}ld"
"--with-ar=${stdenv.cc.bintools.targetPrefix}ar" "--with-ar=${stdenv.cc.bintools.targetPrefix}ar"
@ -315,7 +324,7 @@ let
optionals doBenchmark benchmarkToolDepends; optionals doBenchmark benchmarkToolDepends;
nativeBuildInputs = nativeBuildInputs =
[ ghc removeReferencesTo ] ++ optional (allPkgconfigDepends != []) (assert pkg-config != null; pkg-config) ++ [ ghc removeReferencesTo ] ++ optional (allPkgconfigDepends != []) (assert pkg-config != null; pkg-config) ++
setupHaskellDepends ++ collectedToolDepends; setupHaskellDepends ++ collectedToolDepends ++ optional stdenv.hostPlatform.isGhcjs nodejs;
propagatedBuildInputs = buildDepends ++ libraryHaskellDepends ++ executableHaskellDepends ++ libraryFrameworkDepends; propagatedBuildInputs = buildDepends ++ libraryHaskellDepends ++ executableHaskellDepends ++ libraryFrameworkDepends;
otherBuildInputsHaskell = otherBuildInputsHaskell =
optionals doCheck (testDepends ++ testHaskellDepends) ++ optionals doCheck (testDepends ++ testHaskellDepends) ++
@ -442,6 +451,11 @@ stdenv.mkDerivation ({
'' + '' '' + ''
done 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 # 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 # "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 # "ln -s $out/lib/links", which tries to recreate the links dir and fails

View File

@ -473,6 +473,15 @@ let
inherit (packagePlatforms pkgs.pkgsCross.ghcjs.haskellPackages) inherit (packagePlatforms pkgs.pkgsCross.ghcjs.haskellPackages)
ghc ghc
hello hello
microlens
;
};
haskell.packages.ghc98 = {
inherit (packagePlatforms pkgs.pkgsCross.ghcjs.haskell.packages.ghc98)
ghc
hello
microlens
; ;
}; };
@ -480,6 +489,7 @@ let
inherit (packagePlatforms pkgs.pkgsCross.ghcjs.haskell.packages.ghcHEAD) inherit (packagePlatforms pkgs.pkgsCross.ghcjs.haskell.packages.ghcHEAD)
ghc ghc
hello hello
microlens
; ;
}; };
}; };