From 2553ceb9820761e3c22c50db74513d5a0e1ba6d1 Mon Sep 17 00:00:00 2001 From: Leon Isenberg Date: Sat, 25 Mar 2017 05:23:01 +0100 Subject: [PATCH] haskell: use GHCJS to build Setup.hs for GHCJS packages Closes https://github.com/NixOS/nixpkgs/pull/23614. --- pkgs/development/compilers/ghcjs/stage2.nix | 1 + .../haskell-modules/configuration-ghcjs.nix | 8 ++++++++ pkgs/development/haskell-modules/default.nix | 1 + .../development/haskell-modules/generic-builder.nix | 13 +++++++++++-- pkgs/development/haskell-modules/lib.nix | 3 +++ 5 files changed, 24 insertions(+), 2 deletions(-) diff --git a/pkgs/development/compilers/ghcjs/stage2.nix b/pkgs/development/compilers/ghcjs/stage2.nix index 8c68b6f15a67..b88051113b55 100644 --- a/pkgs/development/compilers/ghcjs/stage2.nix +++ b/pkgs/development/compilers/ghcjs/stage2.nix @@ -327,6 +327,7 @@ version = "1.22.8.0"; src = "${ghcjsBoot}/boot/cabal/Cabal"; doCheck = false; + hyperlinkSource = false; libraryHaskellDepends = [ array base binary bytestring containers deepseq directory filepath pretty process time unix diff --git a/pkgs/development/haskell-modules/configuration-ghcjs.nix b/pkgs/development/haskell-modules/configuration-ghcjs.nix index 4ed6d8a957fb..d6d7277cc9d9 100644 --- a/pkgs/development/haskell-modules/configuration-ghcjs.nix +++ b/pkgs/development/haskell-modules/configuration-ghcjs.nix @@ -53,6 +53,14 @@ self: super: terminfo = self.terminfo_0_4_0_2; xhtml = self.xhtml_3000_2_1; + # Cabal isn't part of the stage1 packages which form the default package-db + # that GHCJS provides. + # Almost all packages require Cabal to build their Setup.hs, + # but usually they don't declare it explicitly as they don't need to for normal GHC. + # To account for that we add Cabal by default. + mkDerivation = args: + if args.pname == "Cabal" then super.mkDerivation args else super.mkDerivation (args // + { setupHaskellDepends = (args.setupHaskellDepends or []) ++ [ self.Cabal ]; }); ## OTHER PACKAGES diff --git a/pkgs/development/haskell-modules/default.nix b/pkgs/development/haskell-modules/default.nix index df17c769ea2d..8242990fe745 100644 --- a/pkgs/development/haskell-modules/default.nix +++ b/pkgs/development/haskell-modules/default.nix @@ -15,6 +15,7 @@ let mkDerivationImpl = pkgs.callPackage ./generic-builder.nix { inherit stdenv; inherit (pkgs) fetchurl pkgconfig glibcLocales coreutils gnugrep gnused; + nodejs = pkgs.nodejs-slim; jailbreak-cabal = if (self.ghc.cross or null) != null then self.ghc.bootPkgs.jailbreak-cabal else self.jailbreak-cabal; diff --git a/pkgs/development/haskell-modules/generic-builder.nix b/pkgs/development/haskell-modules/generic-builder.nix index 42678e342be4..1f5d97941ce5 100644 --- a/pkgs/development/haskell-modules/generic-builder.nix +++ b/pkgs/development/haskell-modules/generic-builder.nix @@ -1,5 +1,5 @@ { stdenv, fetchurl, ghc, pkgconfig, glibcLocales, coreutils, gnugrep, gnused -, jailbreak-cabal, hscolour, cpphs +, jailbreak-cabal, hscolour, cpphs, nodejs }: let isCross = (ghc.cross or null) != null; in { pname @@ -133,6 +133,7 @@ let setupCompileFlags = [ (optionalString (!coreSetup) "-${packageDbFlag}=$packageConfDir") + (optionalString isGhcjs "-build-runner") (optionalString (isGhcjs || isHaLVM || versionOlder "7.8" ghc.version) "-j$NIX_BUILD_CORES") # https://github.com/haskell/cabal/issues/2398 (optionalString (versionOlder "7.10" ghc.version && !isHaLVM) "-threaded") @@ -157,7 +158,7 @@ let ghcEnv = ghc.withPackages (p: haskellBuildInputs); - setupBuilder = if isCross || isGhcjs then "${nativeGhc}/bin/ghc" else ghcCommand; + setupBuilder = if isCross then "${nativeGhc}/bin/ghc" else ghcCommand; setupCommand = "./Setup"; ghcCommand' = if isGhcjs then "ghcjs" else "ghc"; crossPrefix = if (ghc.cross or null) != null then "${ghc.cross.config}-" else ""; @@ -294,6 +295,14 @@ stdenv.mkDerivation ({ local pkgId=$( ${gnused}/bin/sed -n -e 's|^id: ||p' $packageConfFile ) mv $packageConfFile $packageConfDir/$pkgId.conf ''} + ${optionalString isGhcjs '' + for exeDir in "$out/bin/"*.jsexe; do + exe="''${exeDir%.jsexe}" + printf '%s\n' '#!${nodejs}/bin/node' > "$exe" + cat "$exeDir/all.js" >> "$exe" + chmod +x "$exe" + done + ''} ${optionalString doCoverage "mkdir -p $out/share && cp -r dist/hpc $out/share"} ${optionalString (enableSharedExecutables && isExecutable && !isGhcjs && stdenv.isDarwin && stdenv.lib.versionOlder ghc.version "7.10") '' for exe in "$out/bin/"* ; do diff --git a/pkgs/development/haskell-modules/lib.nix b/pkgs/development/haskell-modules/lib.nix index 2093ec2b218b..912d26c806c7 100644 --- a/pkgs/development/haskell-modules/lib.nix +++ b/pkgs/development/haskell-modules/lib.nix @@ -38,6 +38,9 @@ rec { addPkgconfigDepend = drv: x: addPkgconfigDepends drv [x]; addPkgconfigDepends = drv: xs: overrideCabal drv (drv: { pkgconfigDepends = (drv.pkgconfigDepends or []) ++ xs; }); + addSetupDepend = drv: x: addSetupDepends drv [x]; + addSetupDepends = drv: xs: overrideCabal drv (drv: { setupHaskellDepends = (drv.setupHaskellDepends or []) ++ xs; }); + enableCabalFlag = drv: x: appendConfigureFlag (removeConfigureFlag drv "-f-${x}") "-f${x}"; disableCabalFlag = drv: x: appendConfigureFlag (removeConfigureFlag drv "-f${x}") "-f-${x}";