summary refs log tree commit diff
path: root/pkgs/development
diff options
context:
space:
mode:
authorDivam <dfordivam@gmail.com>2021-08-25 19:55:30 +0900
committerDivam <dfordivam@gmail.com>2021-09-15 12:51:34 +0900
commitba25b274f4bb0240a8ffa71e41b55712930af3d8 (patch)
treeda9d2a0d94135903fc1b9278bfd13ca85f91766f /pkgs/development
parentfeac31b1f05bf8be4681b461987f26a37a47c60f (diff)
downloadnixpkgs-ba25b274f4bb0240a8ffa71e41b55712930af3d8.tar
nixpkgs-ba25b274f4bb0240a8ffa71e41b55712930af3d8.tar.gz
nixpkgs-ba25b274f4bb0240a8ffa71e41b55712930af3d8.tar.bz2
nixpkgs-ba25b274f4bb0240a8ffa71e41b55712930af3d8.tar.lz
nixpkgs-ba25b274f4bb0240a8ffa71e41b55712930af3d8.tar.xz
nixpkgs-ba25b274f4bb0240a8ffa71e41b55712930af3d8.tar.zst
nixpkgs-ba25b274f4bb0240a8ffa71e41b55712930af3d8.zip
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)
Diffstat (limited to 'pkgs/development')
-rw-r--r--pkgs/development/compilers/ghcjs/8.10/common-overrides.nix8
-rw-r--r--pkgs/development/compilers/ghcjs/8.10/configured-ghcjs-src.nix60
-rw-r--r--pkgs/development/compilers/ghcjs/8.10/default.nix114
-rw-r--r--pkgs/development/compilers/ghcjs/8.10/generate_host_version.hs54
-rw-r--r--pkgs/development/compilers/ghcjs/8.10/git.json6
-rw-r--r--pkgs/development/compilers/ghcjs/8.10/stage0.nix77
-rw-r--r--pkgs/development/compilers/ghcjs/ghcjs-base.nix (renamed from pkgs/development/compilers/ghcjs-ng/ghcjs-base.nix)0
-rw-r--r--pkgs/development/compilers/ghcjs/patches/vector-ghcjs-storable-set.patch14
-rw-r--r--pkgs/development/haskell-modules/configuration-ghcjs.nix109
9 files changed, 442 insertions, 0 deletions
diff --git a/pkgs/development/compilers/ghcjs/8.10/common-overrides.nix b/pkgs/development/compilers/ghcjs/8.10/common-overrides.nix
new file mode 100644
index 00000000000..a83795635b9
--- /dev/null
+++ b/pkgs/development/compilers/ghcjs/8.10/common-overrides.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;
+  }));
+}
diff --git a/pkgs/development/compilers/ghcjs/8.10/configured-ghcjs-src.nix b/pkgs/development/compilers/ghcjs/8.10/configured-ghcjs-src.nix
new file mode 100644
index 00000000000..9fa6fae1a59
--- /dev/null
+++ b/pkgs/development/compilers/ghcjs/8.10/configured-ghcjs-src.nix
@@ -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
+''
diff --git a/pkgs/development/compilers/ghcjs/8.10/default.nix b/pkgs/development/compilers/ghcjs/8.10/default.nix
new file mode 100644
index 00000000000..f1ef34eed51
--- /dev/null
+++ b/pkgs/development/compilers/ghcjs/8.10/default.nix
@@ -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 ];
+  }
diff --git a/pkgs/development/compilers/ghcjs/8.10/generate_host_version.hs b/pkgs/development/compilers/ghcjs/8.10/generate_host_version.hs
new file mode 100644
index 00000000000..8bf2583d238
--- /dev/null
+++ b/pkgs/development/compilers/ghcjs/8.10/generate_host_version.hs
@@ -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"
+        , "  }"
+        ]
diff --git a/pkgs/development/compilers/ghcjs/8.10/git.json b/pkgs/development/compilers/ghcjs/8.10/git.json
new file mode 100644
index 00000000000..18804d84acb
--- /dev/null
+++ b/pkgs/development/compilers/ghcjs/8.10/git.json
@@ -0,0 +1,6 @@
+{
+  "url": "https://github.com/obsidiansystems/ghcjs",
+  "rev": "9fc935f2c3ba6c33ec62eb83afc9f52a893eb68c",
+  "sha256": "sha256:063dmir39c4i1z8ypnmq86g1x2vhqndmdpzc4hyzsy5jjqcbx6i3",
+  "fetchSubmodules": true
+}
diff --git a/pkgs/development/compilers/ghcjs/8.10/stage0.nix b/pkgs/development/compilers/ghcjs/8.10/stage0.nix
new file mode 100644
index 00000000000..1cb476ab0cb
--- /dev/null
+++ b/pkgs/development/compilers/ghcjs/8.10/stage0.nix
@@ -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;
+    }) {};
+}
diff --git a/pkgs/development/compilers/ghcjs-ng/ghcjs-base.nix b/pkgs/development/compilers/ghcjs/ghcjs-base.nix
index ca0086a918a..ca0086a918a 100644
--- a/pkgs/development/compilers/ghcjs-ng/ghcjs-base.nix
+++ b/pkgs/development/compilers/ghcjs/ghcjs-base.nix
diff --git a/pkgs/development/compilers/ghcjs/patches/vector-ghcjs-storable-set.patch b/pkgs/development/compilers/ghcjs/patches/vector-ghcjs-storable-set.patch
new file mode 100644
index 00000000000..20e19d8bf86
--- /dev/null
+++ b/pkgs/development/compilers/ghcjs/patches/vector-ghcjs-storable-set.patch
@@ -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
+ 
diff --git a/pkgs/development/haskell-modules/configuration-ghcjs.nix b/pkgs/development/haskell-modules/configuration-ghcjs.nix
new file mode 100644
index 00000000000..d4e443d6bea
--- /dev/null
+++ b/pkgs/development/haskell-modules/configuration-ghcjs.nix
@@ -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;
+}