about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--doc/haskell-users-guide.md24
-rw-r--r--pkgs/development/haskell-modules/configuration-common.nix5
-rw-r--r--pkgs/development/tools/haskell/haste/haste-Cabal.nix35
-rw-r--r--pkgs/development/tools/haskell/haste/haste-cabal-install.nix46
-rw-r--r--pkgs/development/tools/haskell/haste/haste-compiler.nix32
5 files changed, 141 insertions, 1 deletions
diff --git a/doc/haskell-users-guide.md b/doc/haskell-users-guide.md
index ce61295e5674..b981466bf2e0 100644
--- a/doc/haskell-users-guide.md
+++ b/doc/haskell-users-guide.md
@@ -647,6 +647,30 @@ command, i.e. by running:
     rm /nix/var/nix/manifests/*
     rm /nix/var/nix/channel-cache/*
 
+### How to use the Haste Haskell-to-Javascript transpiler
+
+Open a shell with `haste-compiler` and `haste-cabal-install` (you don't actually need
+`node`, but it can be useful to test stuff):
+
+    $ nix-shell -p "haskellPackages.ghcWithPackages (self: with self; [haste-cabal-install haste-compiler])" -p nodejs
+
+You may not need the following step but if `haste-boot` fails to compile all the
+packages it needs, this might do the trick
+
+    $ haste-cabal update
+
+`haste-boot` builds a set of core libraries so that they can be used from Javascript
+transpiled programs:
+
+    $ haste-boot
+
+Transpile and run a "Hello world" program:
+
+    $ echo 'module Main where main = putStrLn "Hello world"' > hello-world.hs
+    $ hastec --onexec hello-world.hs
+    $ node hello-world.js
+    Hello world
+
 ### Builds on Darwin fail with `math.h` not found
 
 Users of GHC on Darwin have occasionally reported that builds fail, because the
diff --git a/pkgs/development/haskell-modules/configuration-common.nix b/pkgs/development/haskell-modules/configuration-common.nix
index 1833ce3ffced..6dbbd40a6305 100644
--- a/pkgs/development/haskell-modules/configuration-common.nix
+++ b/pkgs/development/haskell-modules/configuration-common.nix
@@ -154,7 +154,6 @@ self: super: {
   gl = dontHaddock super.gl;
   groupoids = dontHaddock super.groupoids;
   hamlet = dontHaddock super.hamlet;
-  haste-compiler = dontHaddock super.haste-compiler;
   HaXml = dontHaddock super.HaXml;
   HDBC-odbc = dontHaddock super.HDBC-odbc;
   hoodle-core = dontHaddock super.hoodle-core;
@@ -964,4 +963,8 @@ self: super: {
   # https://github.com/danidiaz/pipes-transduce/issues/2
   pipes-transduce = super.pipes-transduce.override { foldl = self.foldl_1_1_6; };
 
+  # Haste stuff
+  haste-Cabal         = self.callPackage ../tools/haskell/haste/haste-Cabal.nix {};
+  haste-cabal-install = self.callPackage ../tools/haskell/haste/haste-cabal-install.nix { Cabal = self.haste-Cabal; HTTP = self.HTTP_4000_2_23; };
+  haste-compiler      = self.callPackage ../tools/haskell/haste/haste-compiler.nix { inherit overrideCabal; super-haste-compiler = super.haste-compiler; };
 }
diff --git a/pkgs/development/tools/haskell/haste/haste-Cabal.nix b/pkgs/development/tools/haskell/haste/haste-Cabal.nix
new file mode 100644
index 000000000000..45a60172e395
--- /dev/null
+++ b/pkgs/development/tools/haskell/haste/haste-Cabal.nix
@@ -0,0 +1,35 @@
+# Haste requires its own patched up version of Cabal that's not on hackage
+{ mkDerivation, array, base, binary, bytestring, containers
+, deepseq, directory, extensible-exceptions, filepath, old-time
+, pretty, process, QuickCheck, regex-posix, stdenv, tasty
+, tasty-hunit, tasty-quickcheck, time, unix
+, fetchFromGitHub
+}:
+
+mkDerivation {
+  pname = "Cabal";
+  version = "1.23.0.0";
+  src = fetchFromGitHub {
+    owner = "valderman";
+    repo = "cabal";
+    rev = "a1962987ba32d5e20090830f50c6afdc78dae005";
+    sha256 = "1gjmscfsikcvgkv6zricpfxvj23wxahndm784lg9cpxrc3pn5hvh";
+  };
+  libraryHaskellDepends = [
+    array base binary bytestring containers deepseq directory filepath
+      pretty process time unix
+  ];
+  testHaskellDepends = [
+    base bytestring containers directory extensible-exceptions filepath
+      old-time pretty process QuickCheck regex-posix tasty tasty-hunit
+      tasty-quickcheck unix
+  ];
+  prePatch = ''
+    rm -rf cabal-install
+    cd Cabal
+    '';
+  doCheck = false;
+  homepage = "http://www.haskell.org/cabal/";
+  description = "A framework for packaging Haskell software";
+  license = stdenv.lib.licenses.bsd3;
+}
diff --git a/pkgs/development/tools/haskell/haste/haste-cabal-install.nix b/pkgs/development/tools/haskell/haste/haste-cabal-install.nix
new file mode 100644
index 000000000000..dd140409173e
--- /dev/null
+++ b/pkgs/development/tools/haskell/haste/haste-cabal-install.nix
@@ -0,0 +1,46 @@
+# Haste requires its own patched up version of cabal-install that's not on hackage
+{ mkDerivation, array, base, bytestring, Cabal, containers
+, directory, extensible-exceptions, filepath, HTTP, mtl, network
+, network-uri, pretty, process, QuickCheck, random, regex-posix
+, stdenv, stm, tagged, tasty, tasty-hunit, tasty-quickcheck, time
+, unix, zlib
+, fetchFromGitHub
+}:
+
+mkDerivation {
+  pname = "cabal-install";
+  version = "1.23.0.0";
+  src = fetchFromGitHub {
+    owner = "valderman";
+    repo = "cabal";
+    rev = "a1962987ba32d5e20090830f50c6afdc78dae005";
+    sha256 = "1gjmscfsikcvgkv6zricpfxvj23wxahndm784lg9cpxrc3pn5hvh";
+  };
+  isLibrary = false;
+  isExecutable = true;
+  executableHaskellDepends = [
+    array base bytestring Cabal containers directory filepath HTTP mtl
+    network network-uri pretty process random stm time unix zlib
+  ];
+  testHaskellDepends = [
+    array base bytestring Cabal containers directory
+    extensible-exceptions filepath HTTP mtl network network-uri pretty
+    process QuickCheck random regex-posix stm tagged tasty tasty-hunit
+    tasty-quickcheck time unix zlib
+  ];
+  prePatch = ''
+    rm -rf Cabal
+    cd cabal-install
+  '';
+  postInstall = ''
+    mkdir $out/etc
+    mv bash-completion $out/etc/bash_completion.d
+
+    # Manually added by Nix maintainer
+    mv -v $out/etc/bash_completion.d/cabal $out/etc/bash_completion.d/haste-cabal
+  '';
+  doCheck = false;
+  homepage = "http://www.haskell.org/cabal/";
+  description = "The command-line interface for Cabal and Hackage";
+  license = stdenv.lib.licenses.bsd3;
+}
diff --git a/pkgs/development/tools/haskell/haste/haste-compiler.nix b/pkgs/development/tools/haskell/haste/haste-compiler.nix
new file mode 100644
index 000000000000..54a247af6284
--- /dev/null
+++ b/pkgs/development/tools/haskell/haste/haste-compiler.nix
@@ -0,0 +1,32 @@
+{ overrideCabal
+, super-haste-compiler
+}:
+
+overrideCabal super-haste-compiler (drv: {
+  configureFlags = [ "-f-portable" ];
+  prePatch = ''
+    # Get ghc libdir by invoking ghc and point to haste-cabal binary
+    substituteInPlace src/Haste/Environment.hs \
+      --replace \
+        'hasteGhcLibDir = hasteSysDir' \
+        'hasteGhcLibDir = head $ lines $ either (error . show) id $ unsafePerformIO $ shell $ run "ghc" ["--print-libdir"] ""' \
+      --replace \
+        'hasteCabalBinary = hasteBinDir </> "haste-cabal" ++ binaryExt' \
+        'hasteCabalBinary = "haste-cabal" ++ binaryExt'
+
+    # Don't try to download/install haste-cabal in haste-boot:
+    patch src/haste-boot.hs << EOF
+    @@ -178,10 +178,6 @@
+                             pkgSysLibDir, jsmodSysDir, pkgSysDir]
+
+           mkdir True (hasteCabalRootDir portableHaste)
+    -      case getHasteCabal cfg of
+    -        Download    -> installHasteCabal portableHaste tmpdir
+    -        Prebuilt fp -> copyHasteCabal portableHaste fp
+    -        Source mdir -> buildHasteCabal portableHaste (maybe "../cabal" id mdir)
+
+           -- Spawn off closure download in the background.
+           dir <- pwd -- use absolute path for closure to avoid dir changing race
+    EOF
+  '';
+})