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 + ''; +})