diff options
Diffstat (limited to 'nixpkgs/pkgs/development/compilers/ghcjs')
-rw-r--r-- | nixpkgs/pkgs/development/compilers/ghcjs/base.nix | 161 | ||||
-rwxr-xr-x | nixpkgs/pkgs/development/compilers/ghcjs/gen-stage2.rb | 54 | ||||
-rw-r--r-- | nixpkgs/pkgs/development/compilers/ghcjs/ghcjs-boot.nix | 25 |
3 files changed, 240 insertions, 0 deletions
diff --git a/nixpkgs/pkgs/development/compilers/ghcjs/base.nix b/nixpkgs/pkgs/development/compilers/ghcjs/base.nix new file mode 100644 index 000000000000..93e6a47934fc --- /dev/null +++ b/nixpkgs/pkgs/development/compilers/ghcjs/base.nix @@ -0,0 +1,161 @@ +{ mkDerivation +, lib +, broken ? false +, test-framework +, test-framework-hunit +, data-default +, ghc-paths +, haskell-src-exts +, haskell-src-meta +, optparse-applicative +, system-fileio +, system-filepath +, text-binary +, unordered-containers +, cabal-install +, wl-pprint-text +, base16-bytestring +, executable-path +, transformers-compat +, haddock-api +, regex-posix + +, bootPkgs, gmp + +, runCommand +, nodejs, stdenv, filepath, HTTP, HUnit, mtl, network, QuickCheck, random, stm +, time +, zlib, aeson, attoparsec, bzlib, hashable +, lens +, parallel, safe, shelly, split, stringsearch, syb +, tar, terminfo +, vector, yaml, fetchgit, fetchFromGitHub +, alex, happy, git, gnumake, autoconf, patch +, automake, libtool +, cryptohash +, haddock, hspec, xhtml, pkgs +, coreutils +, libiconv + +, version +, ghcjsSrc +, ghcjsBootSrc +, ghcjsBoot ? import ./ghcjs-boot.nix { + inherit runCommand; + src = ghcjsBootSrc; + } +, shims + +# This is the list of the Stage 1 packages that are built into a booted ghcjs installation +# It can be generated with the command: +# nix-shell -p haskell.packages.ghcjs.ghc --command "ghcjs-pkg list | sed -n 's/^ \(.*\)-\([0-9.]*\)$/\1_\2/ p' | sed 's/\./_/g' | sed 's/^\([^_]*\)\(.*\)$/ \"\1\"/'" +, stage1Packages + +, stage2 ? import ./stage2.nix + +, patches + +# used for resolving compiler plugins +, ghcLibdir ? null +}: +let + inherit (bootPkgs) ghc; + +in mkDerivation (rec { + pname = "ghcjs"; + inherit version; + src = ghcjsSrc; + isLibrary = true; + isExecutable = true; + jailbreak = true; + doHaddock = false; + doCheck = false; + buildDepends = [ + filepath HTTP mtl network random stm time zlib aeson attoparsec + bzlib data-default ghc-paths hashable haskell-src-exts haskell-src-meta + lens optparse-applicative parallel safe shelly split + stringsearch syb system-fileio system-filepath tar terminfo text-binary + unordered-containers vector wl-pprint-text yaml + alex happy git gnumake autoconf automake libtool patch gmp + base16-bytestring cryptohash executable-path haddock-api + transformers-compat QuickCheck haddock hspec xhtml + regex-posix libiconv + ]; + buildTools = [ nodejs git ]; + testDepends = [ + HUnit test-framework test-framework-hunit + ]; + inherit patches; + postPatch = '' + substituteInPlace Setup.hs \ + --replace "/usr/bin/env" "${coreutils}/bin/env" + + substituteInPlace src/Compiler/Info.hs \ + --replace "@PREFIX@" "$out" \ + --replace "@VERSION@" "${version}" + + substituteInPlace src-bin/Boot.hs \ + --replace "@PREFIX@" "$out" \ + --replace "@CC@" "${stdenv.cc}/bin/cc" + ''; + preBuild = '' + export HOME="$TMP" + + local topDir=$out/lib/ghcjs-${version} + mkdir -p $topDir + + cp -r ${ghcjsBoot} $topDir/ghcjs-boot + chmod -R u+w $topDir/ghcjs-boot + + cp -r ${shims} $topDir/shims + chmod -R u+w $topDir/shims + + # Make the patches be relative their corresponding package's directory. + # See: https://github.com/ghcjs/ghcjs-boot/pull/12 + for patch in "$topDir/ghcjs-boot/patches/"*.patch; do + echo "fixing patch: $patch" + sed -i -e 's@ \(a\|b\)/boot/[^/]\+@ \1@g' $patch + done + ''; + # We build with --quick so we can build stage 2 packages separately. + # This is necessary due to: https://github.com/haskell/cabal/commit/af19fb2c2d231d8deff1cb24164a2bf7efb8905a + # Cabal otherwise fails to build: http://hydra.nixos.org/build/31824079/nixlog/1/raw + postInstall = '' + PATH=$out/bin:$PATH LD_LIBRARY_PATH=${gmp.out}/lib:${stdenv.cc}/lib64:$LD_LIBRARY_PATH \ + env -u GHC_PACKAGE_PATH $out/bin/ghcjs-boot \ + --dev \ + --quick \ + --with-cabal ${cabal-install}/bin/cabal \ + --with-gmp-includes ${gmp.dev}/include \ + --with-gmp-libraries ${gmp.out}/lib + '' + lib.optionalString (ghcLibdir != null) '' + printf '%s' '${ghcLibdir}' > "$out/lib/ghcjs-${version}/ghc_libdir" + ''; + passthru = { + inherit bootPkgs; + ghcVersion = ghc.version; + isCross = true; + isGhcjs = true; + inherit nodejs ghcjsBoot; + socket-io = pkgs.nodePackages."socket.io"; + haskellCompilerName = "ghcjs-${version}"; + + # let us assume ghcjs is never actually cross compiled + targetPrefix = ""; + + enableShared = true; + + inherit stage1Packages; + mkStage2 = stage2 { + inherit ghcjsBoot; + }; + }; + + homepage = https://github.com/ghcjs/ghcjs; + description = "A Haskell to JavaScript compiler that uses the GHC API"; + license = stdenv.lib.licenses.bsd3; + platforms = ghc.meta.platforms; + maintainers = with stdenv.lib.maintainers; [ jwiegley cstrahan dmjio elvishjerricco ]; + hydraPlatforms = if broken then [] else ghc.meta.platforms; + inherit broken; +}) diff --git a/nixpkgs/pkgs/development/compilers/ghcjs/gen-stage2.rb b/nixpkgs/pkgs/development/compilers/ghcjs/gen-stage2.rb new file mode 100755 index 000000000000..709e635db55c --- /dev/null +++ b/nixpkgs/pkgs/development/compilers/ghcjs/gen-stage2.rb @@ -0,0 +1,54 @@ +#!/usr/bin/env ruby + +require 'pathname' + +# from boot.yaml in ghcjs/ghcjs +stage2_packages = [ + "boot/async", + "boot/aeson", + "boot/attoparsec", + "boot/case-insensitive", + "boot/dlist", + "boot/extensible-exceptions", + "boot/hashable", + "boot/mtl", + "boot/old-time", + "boot/parallel", + "boot/scientific", + "boot/stm", + "boot/syb", + "boot/text", + "boot/unordered-containers", + "boot/vector", + "ghcjs/ghcjs-base", + # not listed under stage2, but needed when "quick booting". + "boot/cabal/Cabal" +] + +nixpkgs = File.expand_path("../../../../..", __FILE__) +boot = ARGV[0] || `nix-build #{nixpkgs} -A haskell.packages.ghcjs.ghc.ghcjsBoot`.chomp + +out = "".dup +out << "{ ghcjsBoot }: { callPackage }:\n" +out << "\n" +out << "{\n" + +stage2_packages.each do |package| + name = Pathname.new(package).basename + nix = `cabal2nix file://#{boot}/#{package} --jailbreak` + nix.sub!(/src =.*?$/, "src = \"${ghcjsBoot}/#{package}\";") + nix.sub!(" doCheck = false;\n", "") + nix.sub!("libraryHaskellDepends", "doCheck = false;\n libraryHaskellDepends") + # cabal2nix somehow generates the deps for 'text' as if it had selected flag + # 'integer-simple' (despite not passing the flag within the generated + # expression). We want integer-gmp instead. + nix.gsub!(/integer-simple/, "integer-gmp") + nix = nix.split("\n").join("\n ") + + out << " #{name} = callPackage\n" + out << " (#{nix}) {};\n" +end + +out << "}" + +puts out diff --git a/nixpkgs/pkgs/development/compilers/ghcjs/ghcjs-boot.nix b/nixpkgs/pkgs/development/compilers/ghcjs/ghcjs-boot.nix new file mode 100644 index 000000000000..c00e13a92404 --- /dev/null +++ b/nixpkgs/pkgs/development/compilers/ghcjs/ghcjs-boot.nix @@ -0,0 +1,25 @@ +{ runCommand, src }: + +# we remove the patches so ghcjs-boot doesn't try to apply them again. +runCommand "${src.name}-patched" {} '' + cp -r ${src} $out + chmod -R +w $out + + # Make the patches be relative their corresponding package's directory. + # See: https://github.com/ghcjs/ghcjs-boot/pull/12 + for patch in $out/patches/*.patch; do + echo ">> fixing patch: $patch" + sed -i -e 's@ \(a\|b\)/boot/[^/]\+@ \1@g' $patch + done + + for package in $(cd $out/boot; echo *); do + patch=$out/patches/$package.patch + if [[ -e $patch ]]; then + echo ">> patching package: $package" + pushd $out/boot/$package + patch -p1 < $patch + rm $patch + popd + fi + done +'' |