ghcjs: init at 8.10.7

The src points to the obsidiansystems repo as it has the ghcjs ported from
8.10.5 to 8.10.7, and a bunch of other fixes (#812, #811, #809)
main
Divam 3 years ago
parent feac31b1f0
commit ba25b274f4
  1. 8
      pkgs/development/compilers/ghcjs/8.10/common-overrides.nix
  2. 60
      pkgs/development/compilers/ghcjs/8.10/configured-ghcjs-src.nix
  3. 114
      pkgs/development/compilers/ghcjs/8.10/default.nix
  4. 54
      pkgs/development/compilers/ghcjs/8.10/generate_host_version.hs
  5. 6
      pkgs/development/compilers/ghcjs/8.10/git.json
  6. 77
      pkgs/development/compilers/ghcjs/8.10/stage0.nix
  7. 0
      pkgs/development/compilers/ghcjs/ghcjs-base.nix
  8. 14
      pkgs/development/compilers/ghcjs/patches/vector-ghcjs-storable-set.patch
  9. 109
      pkgs/development/haskell-modules/configuration-ghcjs.nix
  10. 17
      pkgs/top-level/haskell-packages.nix

@ -0,0 +1,8 @@
{ haskellLib }:
let inherit (haskellLib) addBuildTools appendConfigureFlag dontHaddock doJailbreak;
in self: super: {
ghcjs = doJailbreak (super.ghcjs.overrideScope (self: super: {
optparse-applicative = self.optparse-applicative_0_15_1_0;
}));
}

@ -0,0 +1,60 @@
{ perl
, autoconf
, automake
, python3
, gcc
, cabal-install
, runCommand
, lib
, stdenv
, ghc
, happy
, alex
, ghcjsSrc
, version
}:
runCommand "configured-ghcjs-src" {
nativeBuildInputs = [
perl
autoconf
automake
python3
ghc
happy
alex
cabal-install
] ++ lib.optionals stdenv.isDarwin [
gcc # https://github.com/ghcjs/ghcjs/issues/663
];
inherit ghcjsSrc;
} ''
export HOME=$(pwd)
mkdir $HOME/.cabal
touch $HOME/.cabal/config
cp -r "$ghcjsSrc" "$out"
chmod -R +w "$out"
cd "$out"
# TODO: Find a better way to avoid impure version numbers
sed -i 's/RELEASE=NO/RELEASE=YES/' ghc/configure.ac
# These files are needed by ghc-boot package, and these are generated by the
# make/hadrian build system when compiling ghc. Since we dont have access to
# the generated code of the ghc while it got built, here is a little hack to
# generate these again.
runhaskell ${./generate_host_version.hs}
mkdir -p utils/pkg-cache/ghc/libraries/ghc-boot/dist-install/build/GHC/Platform
mv Host.hs utils/pkg-cache/ghc/libraries/ghc-boot/dist-install/build/GHC/Platform/Host.hs
mv Version.hs utils/pkg-cache/ghc/libraries/ghc-boot/dist-install/build/GHC/Version.hs
# The ghcjs has the following hardcoded paths of lib dir in its code. Patching
# these to match the path expected by the nixpkgs's generic-builder, etc.
sed -i 's/libSubDir = "lib"/libSubDir = "lib\/ghcjs-${version}"/' src-bin/Boot.hs
sed -i 's@let libDir = takeDirectory haddockPath </> ".." </> "lib"@let libDir = takeDirectory haddockPath </> ".." </> "lib/ghcjs-${version}"@' src-bin/HaddockDriver.hs
patchShebangs .
./utils/makePackages.sh copy
''

@ -0,0 +1,114 @@
{ stdenv
, pkgsHostHost
, callPackage
, fetchgit
, ghcjsSrcJson ? null
, ghcjsSrc ? fetchgit (builtins.fromJSON (builtins.readFile ghcjsSrcJson))
, bootPkgs
, stage0
, haskellLib
, cabal-install
, nodejs
, makeWrapper
, xorg
, gmp
, pkg-config
, gcc
, lib
, ghcjsDepOverrides ? (_:_:{})
, haskell
, linkFarm
, buildPackages
}:
let
passthru = {
configuredSrc = callPackage ./configured-ghcjs-src.nix {
inherit ghcjsSrc;
inherit (bootPkgs) ghc alex;
inherit (bootGhcjs) version;
happy = bootPkgs.happy_1_19_12;
};
bootPkgs = bootPkgs.extend (lib.foldr lib.composeExtensions (_:_:{}) [
(self: _: import stage0 {
inherit (passthru) configuredSrc;
inherit (self) callPackage;
})
(callPackage ./common-overrides.nix {
inherit haskellLib;
})
ghcjsDepOverrides
]);
targetPrefix = "";
inherit bootGhcjs;
inherit (bootGhcjs) version;
isGhcjs = true;
enableShared = true;
socket-io = pkgsHostHost.nodePackages."socket.io";
haskellCompilerName = "ghcjs-${bootGhcjs.version}";
};
bootGhcjs = haskellLib.justStaticExecutables passthru.bootPkgs.ghcjs;
# This provides the stuff we need from the emsdk
emsdk = linkFarm "emsdk" [
{ name = "upstream/bin"; path = buildPackages.clang + "/bin";}
{ name = "upstream/emscripten"; path = buildPackages.emscripten + "/bin"; }
];
in stdenv.mkDerivation {
name = bootGhcjs.name;
src = passthru.configuredSrc;
nativeBuildInputs = [
bootGhcjs
passthru.bootPkgs.ghc
cabal-install
nodejs
makeWrapper
xorg.lndir
gmp
pkg-config
] ++ lib.optionals stdenv.isDarwin [
gcc # https://github.com/ghcjs/ghcjs/issues/663
];
dontConfigure = true;
dontInstall = true;
buildPhase = ''
export HOME=$TMP
mkdir $HOME/.cabal
touch $HOME/.cabal/config
cd lib/boot
mkdir -p $out/bin
mkdir -p $out/lib/${bootGhcjs.name}
lndir ${bootGhcjs}/bin $out/bin
chmod -R +w $out/bin
rm $out/bin/ghcjs-boot
cp ${bootGhcjs}/bin/ghcjs-boot $out/bin
rm $out/bin/haddock
cp ${bootGhcjs}/bin/haddock $out/bin
cp ${bootGhcjs}/bin/private-ghcjs-hsc2hs $out/bin/ghcjs-hsc2hs
wrapProgram $out/bin/ghcjs-boot --set ghcjs_libexecdir $out/bin
wrapProgram $out/bin/ghcjs --add-flags "-B$out/lib/${bootGhcjs.name}"
wrapProgram $out/bin/haddock --add-flags "-B$out/lib/${bootGhcjs.name}"
wrapProgram $out/bin/ghcjs-pkg --add-flags "--global-package-db=$out/lib/${bootGhcjs.name}/package.conf.d"
wrapProgram $out/bin/ghcjs-hsc2hs --add-flags "-I$out/lib/${bootGhcjs.name}/include --template=$out/lib/${bootGhcjs.name}/include/template-hsc.h"
env PATH=$out/bin:$PATH $out/bin/ghcjs-boot --with-emsdk=${emsdk} --no-haddock
'';
enableParallelBuilding = true;
inherit passthru;
# The emscripten is broken on darwin
meta.platforms = lib.platforms.linux;
meta.maintainers = with lib.maintainers; [ obsidian-systems-maintenance ];
}

@ -0,0 +1,54 @@
-- Generate the Host.hs and Version.hs as done by hadrian/src/Rules/Generate.hs
import GHC.Platform.Host
import GHC.Version
main = do
writeFile "Version.hs" versionHs
writeFile "Host.hs" platformHostHs
-- | Generate @Version.hs@ files.
versionHs :: String
versionHs = unlines
[ "module GHC.Version where"
, ""
, "import Prelude -- See Note [Why do we import Prelude here?]"
, ""
, "cProjectGitCommitId :: String"
, "cProjectGitCommitId = " ++ show cProjectGitCommitId
, ""
, "cProjectVersion :: String"
, "cProjectVersion = " ++ show cProjectVersion
, ""
, "cProjectVersionInt :: String"
, "cProjectVersionInt = " ++ show cProjectVersionInt
, ""
, "cProjectPatchLevel :: String"
, "cProjectPatchLevel = " ++ show cProjectPatchLevel
, ""
, "cProjectPatchLevel1 :: String"
, "cProjectPatchLevel1 = " ++ show cProjectPatchLevel1
, ""
, "cProjectPatchLevel2 :: String"
, "cProjectPatchLevel2 = " ++ show cProjectPatchLevel2
]
-- | Generate @Platform/Host.hs@ files.
platformHostHs :: String
platformHostHs = unlines
[ "module GHC.Platform.Host where"
, ""
, "import GHC.Platform"
, ""
, "cHostPlatformArch :: Arch"
, "cHostPlatformArch = " ++ show cHostPlatformArch
, ""
, "cHostPlatformOS :: OS"
, "cHostPlatformOS = " ++ show cHostPlatformOS
, ""
, "cHostPlatformMini :: PlatformMini"
, "cHostPlatformMini = PlatformMini"
, " { platformMini_arch = cHostPlatformArch"
, " , platformMini_os = cHostPlatformOS"
, " }"
]

@ -0,0 +1,6 @@
{
"url": "https://github.com/obsidiansystems/ghcjs",
"rev": "9fc935f2c3ba6c33ec62eb83afc9f52a893eb68c",
"sha256": "sha256:063dmir39c4i1z8ypnmq86g1x2vhqndmdpzc4hyzsy5jjqcbx6i3",
"fetchSubmodules": true
}

@ -0,0 +1,77 @@
{ callPackage, configuredSrc }:
{
ghcjs = callPackage
({ mkDerivation, aeson, alex, array, attoparsec, base, base16-bytestring
, base64-bytestring, binary, bytestring, Cabal, containers
, cryptohash, data-default, deepseq, directory, executable-path
, filepath, ghc-boot, ghc-boot-th, ghc-compact, ghc-heap, ghc-paths
, ghci, happy, hashable, hpc, http-types, HUnit, lens, lib
, lifted-base, mtl, network, optparse-applicative, parallel, parsec
, process, random, safe, shelly, split, stringsearch, syb, tar
, template-haskell, terminfo, test-framework, test-framework-hunit
, text, time, transformers, unix, unix-compat, unordered-containers
, vector, wai, wai-app-static, wai-extra, wai-websockets, warp
, webdriver, websockets, wl-pprint-text, xhtml, yaml
}:
mkDerivation {
pname = "ghcjs";
version = "8.10.7";
src = configuredSrc + /.;
isLibrary = true;
isExecutable = true;
libraryHaskellDepends = [
aeson array attoparsec base base16-bytestring base64-bytestring
binary bytestring Cabal containers cryptohash data-default deepseq
directory filepath ghc-boot ghc-boot-th ghc-compact ghc-heap
ghc-paths ghci hashable hpc lens mtl optparse-applicative parallel
parsec process safe split stringsearch syb template-haskell
terminfo text time transformers unix unordered-containers vector
wl-pprint-text yaml
];
libraryToolDepends = [ alex happy ];
executableHaskellDepends = [
aeson array base binary bytestring Cabal containers deepseq
directory executable-path filepath ghc-boot lens mtl
optparse-applicative parsec process tar terminfo text time
transformers unix unix-compat unordered-containers vector xhtml
yaml
];
testHaskellDepends = [
aeson base bytestring data-default deepseq directory filepath
http-types HUnit lens lifted-base network optparse-applicative
process random shelly test-framework test-framework-hunit text time
transformers unordered-containers wai wai-app-static wai-extra
wai-websockets warp webdriver websockets yaml
];
description = "Haskell to JavaScript compiler";
license = lib.licenses.mit;
}) {};
ghcjs-th = callPackage
({ mkDerivation, base, binary, bytestring, containers, ghc-prim
, ghci, lib, template-haskell
}:
mkDerivation {
pname = "ghcjs-th";
version = "0.1.0.0";
src = configuredSrc + /lib/ghcjs-th;
libraryHaskellDepends = [
base binary bytestring containers ghc-prim ghci template-haskell
];
homepage = "http://github.com/ghcjs";
license = lib.licenses.mit;
}) {};
ghcjs-prim = callPackage
({ mkDerivation, base, ghc-prim, lib }:
mkDerivation {
pname = "ghcjs-prim";
version = "0.1.1.0";
src = ./.;
libraryHaskellDepends = [ base ghc-prim ];
homepage = "http://github.com/ghcjs";
license = lib.licenses.mit;
}) {};
}

@ -0,0 +1,14 @@
diff --git a/Data/Vector/Storable/Mutable.hs b/Data/Vector/Storable/Mutable.hs
index 8b538bc..2b74fce 100644
--- a/Data/Vector/Storable/Mutable.hs
+++ b/Data/Vector/Storable/Mutable.hs
@@ -197,7 +197,9 @@ storableSet (MVector n fp) x
1 -> storableSetAsPrim n fp x (undefined :: Word8)
2 -> storableSetAsPrim n fp x (undefined :: Word16)
4 -> storableSetAsPrim n fp x (undefined :: Word32)
+#if !defined(ghcjs_HOST_OS)
8 -> storableSetAsPrim n fp x (undefined :: Word64)
+#endif
_ -> unsafeWithForeignPtr fp $ \p -> do
poke p x

@ -0,0 +1,109 @@
# 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;
ghcjs-base = dontCheck (self.callPackage ../compilers/ghcjs/ghcjs-base.nix {
fetchgit = pkgs.buildPackages.fetchgit;
});
# GHCJS does not ship with the same core packages as GHC.
# https://github.com/ghcjs/ghcjs/issues/676
stm = doJailbreak self.stm_2_5_0_1;
exceptions = dontCheck self.exceptions_0_10_4;
## 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;
# 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 super.ghcjs-dom (drv: {
libraryHaskellDepends = with self; [
ghcjs-base ghcjs-dom-jsffi text transformers
];
configureFlags = [ "-fjsffi" "-f-webkit" ];
});
ghcjs-dom-jsffi = overrideCabal super.ghcjs-dom-jsffi (drv: {
libraryHaskellDepends = (drv.libraryHaskellDepends or []) ++ [ self.ghcjs-base self.text ];
broken = false;
});
# 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 super.jsaddle (drv: {
libraryHaskellDepends = (drv.libraryHaskellDepends or []) ++ [ self.ghcjs-base ];
});
# 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 super.reflex (drv: {
libraryHaskellDepends = (drv.libraryHaskellDepends or []) ++ [ self.ghcjs-base ];
});
reflex-dom = overrideCabal super.reflex-dom (drv: {
libraryHaskellDepends = removeLibraryHaskellDepends ["jsaddle-webkit2gtk"] (drv.libraryHaskellDepends or []);
});
# 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;
# https://github.com/haskell/vector/issues/410
vector = appendPatch super.vector (../compilers/ghcjs/patches/vector-ghcjs-storable-set.patch) ;
# Need hedgehog for tests, which fails to compile due to dep on concurrent-output
zenc = dontCheck super.zenc;
}

@ -8,6 +8,8 @@ let
"ghc8102BinaryMinimal"
"ghc8107Binary"
"ghc8107BinaryMinimal"
"ghcjs"
"ghcjs810"
"integer-simple"
"native-bignum"
"ghcHEAD"
@ -139,6 +141,13 @@ in {
libffi = pkgs.libffi;
};
ghcjs = compiler.ghcjs810;
ghcjs810 = callPackage ../development/compilers/ghcjs/8.10 {
bootPkgs = packages.ghc8107;
ghcjsSrcJson = ../development/compilers/ghcjs/8.10/git.json;
stage0 = ../development/compilers/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
@ -222,6 +231,14 @@ in {
compilerConfig = callPackage ../development/haskell-modules/configuration-ghc-head.nix { };
};
ghcjs = packages.ghcjs810;
ghcjs810 = callPackage ../development/haskell-modules rec {
buildHaskellPackages = ghc.bootPkgs;
ghc = bh.compiler.ghcjs810;
compilerConfig = callPackage ../development/haskell-modules/configuration-ghc-8.10.x.nix { };
packageSetConfig = callPackage ../development/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

Loading…
Cancel
Save