Skip to content

Commit

Permalink
ghcjs: init at 8.10.7
Browse files Browse the repository at this point in the history
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 (NixOS#812, NixOS#811, NixOS#809)

(cherry picked from commit ba25b27)
Modified the stm_2_5_0_1 -> stm_2_5_0_0
  • Loading branch information
dfordivam committed Sep 23, 2021
1 parent 365f138 commit 9ec3ff5
Show file tree
Hide file tree
Showing 10 changed files with 459 additions and 0 deletions.
8 changes: 8 additions & 0 deletions pkgs/development/compilers/ghcjs/8.10/common-overrides.nix
Original file line number Diff line number Diff line change
@@ -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;
}));
}
60 changes: 60 additions & 0 deletions pkgs/development/compilers/ghcjs/8.10/configured-ghcjs-src.nix
Original file line number Diff line number Diff line change
@@ -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
''
114 changes: 114 additions & 0 deletions pkgs/development/compilers/ghcjs/8.10/default.nix
Original file line number Diff line number Diff line change
@@ -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 ];
}
54 changes: 54 additions & 0 deletions pkgs/development/compilers/ghcjs/8.10/generate_host_version.hs
Original file line number Diff line number Diff line change
@@ -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"
, " }"
]
6 changes: 6 additions & 0 deletions pkgs/development/compilers/ghcjs/8.10/git.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
{
"url": "https://github.com/obsidiansystems/ghcjs",
"rev": "9fc935f2c3ba6c33ec62eb83afc9f52a893eb68c",
"sha256": "sha256:063dmir39c4i1z8ypnmq86g1x2vhqndmdpzc4hyzsy5jjqcbx6i3",
"fetchSubmodules": true
}
77 changes: 77 additions & 0 deletions pkgs/development/compilers/ghcjs/8.10/stage0.nix
Original file line number Diff line number Diff line change
@@ -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;
}) {};
}
Original file line number Diff line number Diff line change
@@ -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

Loading

0 comments on commit 9ec3ff5

Please sign in to comment.