From b399de297054509f6e8065cbc9895ec12746149a Mon Sep 17 00:00:00 2001 From: Profpatsch Date: Fri, 18 Nov 2016 16:13:56 +0100 Subject: [PATCH] =?UTF-8?q?ghcjsHEAD:=20don=E2=80=99t=20just=20copy=20&=20?= =?UTF-8?q?replace,=20reuse=20same=20code=20(#20493)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * ghcjsHEAD: don’t just copy & replace, reuse same code The HEAD file was just copied over and a few hashes replaced. Most of these hashes were already function arguments anyway, so no reason to not abstract over that. * ghcjs/base: factor out stage1Packages & regenerate for HEAD The stage1Packages have changed on ghcjs head, this adds the new list. --- pkgs/development/compilers/ghcjs/base.nix | 184 ++++++++++++++++ pkgs/development/compilers/ghcjs/default.nix | 180 +--------------- pkgs/development/compilers/ghcjs/head.nix | 208 ++++--------------- 3 files changed, 226 insertions(+), 346 deletions(-) create mode 100644 pkgs/development/compilers/ghcjs/base.nix diff --git a/pkgs/development/compilers/ghcjs/base.nix b/pkgs/development/compilers/ghcjs/base.nix new file mode 100644 index 000000000000..f342fffd63b5 --- /dev/null +++ b/pkgs/development/compilers/ghcjs/base.nix @@ -0,0 +1,184 @@ +{ mkDerivation +, test-framework +, test-framework-hunit +, test-framework-quickcheck2 +, 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 +, ghcjs-prim +, regex-posix +, callPackage + +, bootPkgs, gmp +, jailbreak-cabal + +, 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, Cabal +, alex, happy, git, gnumake, autoconf, patch +, automake, libtool +, cryptohash +, haddock, hspec, xhtml, primitive, cacert, pkgs +, coreutils +, libiconv + +, version ? "0.2.0" +, ghcjsSrc ? fetchFromGitHub { + owner = "ghcjs"; + repo = "ghcjs"; + rev = "689c7753f50353dd05606ed79c51cd5a94d3922a"; + sha256 = "076020a9gjv8ldj5ckm43sbzq9s6c5xj6lpd8v28ybpiama3m6b4"; + } +, ghcjsBootSrc ? fetchgit { + url = git://github.com/ghcjs/ghcjs-boot.git; + rev = "8c549931da27ba9e607f77195208ec156c840c8a"; + sha256 = "0yg9bnabja39qysh9pg1335qbvbc0r2mdw6cky94p7kavacndfdv"; + fetchSubmodules = true; + } +, ghcjsBoot ? import ./ghcjs-boot.nix { + inherit runCommand; + src = ghcjsBootSrc; + } +, shims ? import ./shims.nix { inherit fetchFromGitHub; } + +# 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 ? [ + "array" + "base" + "binary" + "bytestring" + "containers" + "deepseq" + "directory" + "filepath" + "ghc-boot" + "ghc-boot-th" + "ghc-prim" + "ghci" + "ghcjs-prim" + "ghcjs-th" + "integer-gmp" + "pretty" + "primitive" + "process" + "rts" + "template-haskell" + "time" + "transformers" + "unix" + ] +}: +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 + ghcjs-prim regex-posix libiconv + ]; + buildTools = [ nodejs git ]; + testDepends = [ + HUnit test-framework test-framework-hunit + ]; + patches = [ ./ghcjs.patch ]; + 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 + ''; + passthru = let + ghcjsNodePkgs = callPackage ../../../top-level/node-packages.nix { + generated = ./node-packages-generated.nix; + self = ghcjsNodePkgs; + }; + in { + inherit bootPkgs; + isCross = true; + isGhcjs = true; + inherit nodejs ghcjsBoot; + inherit (ghcjsNodePkgs) "socket.io"; + + inherit stage1Packages; + mkStage2 = import ./stage2.nix { + 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 ]; +}) diff --git a/pkgs/development/compilers/ghcjs/default.nix b/pkgs/development/compilers/ghcjs/default.nix index 565215f474ea..7400057b128f 100644 --- a/pkgs/development/compilers/ghcjs/default.nix +++ b/pkgs/development/compilers/ghcjs/default.nix @@ -1,179 +1,3 @@ -{ mkDerivation -, test-framework -, test-framework-hunit -, test-framework-quickcheck2 -, 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 -, ghcjs-prim -, regex-posix -, callPackage +{ bootPkgs }: -, bootPkgs, gmp -, jailbreak-cabal - -, 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, Cabal -, alex, happy, git, gnumake, autoconf, patch -, automake, libtool -, cryptohash -, haddock, hspec, xhtml, primitive, cacert, pkgs -, coreutils -, libiconv - -, ghcjsBootSrc ? fetchgit { - url = git://github.com/ghcjs/ghcjs-boot.git; - rev = "8c549931da27ba9e607f77195208ec156c840c8a"; - sha256 = "0yg9bnabja39qysh9pg1335qbvbc0r2mdw6cky94p7kavacndfdv"; - fetchSubmodules = true; - } -, ghcjsBoot ? import ./ghcjs-boot.nix { - inherit runCommand; - src = ghcjsBootSrc; - } -, shims ? import ./shims.nix { inherit fetchFromGitHub; } -}: -let - inherit (bootPkgs) ghc; - version = "0.2.0"; - -in mkDerivation (rec { - pname = "ghcjs"; - inherit version; - src = fetchFromGitHub { - owner = "ghcjs"; - repo = "ghcjs"; - rev = "689c7753f50353dd05606ed79c51cd5a94d3922a"; - sha256 = "076020a9gjv8ldj5ckm43sbzq9s6c5xj6lpd8v28ybpiama3m6b4"; - }; - 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 - ghcjs-prim regex-posix libiconv - ]; - buildTools = [ nodejs git ]; - testDepends = [ - HUnit test-framework test-framework-hunit - ]; - patches = [ ./ghcjs.patch ]; - 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 - ''; - passthru = let - ghcjsNodePkgs = callPackage ../../../top-level/node-packages.nix { - generated = ./node-packages-generated.nix; - self = ghcjsNodePkgs; - }; - in { - inherit bootPkgs; - isCross = true; - isGhcjs = true; - inherit nodejs ghcjsBoot; - inherit (ghcjsNodePkgs) "socket.io"; - - # 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 = [ - "array" - "base" - "binary" - "rts" - "bytestring" - "containers" - "deepseq" - "directory" - "filepath" - "ghc-prim" - "ghcjs-prim" - "integer-gmp" - "old-locale" - "pretty" - "primitive" - "process" - "template-haskell" - "time" - "transformers" - "unix" - ]; - - mkStage2 = import ./stage2.nix { - 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 ]; -}) +bootPkgs.callPackage ./base.nix { inherit bootPkgs; } diff --git a/pkgs/development/compilers/ghcjs/head.nix b/pkgs/development/compilers/ghcjs/head.nix index 2bf13cb895f5..96d2ee05f5a5 100644 --- a/pkgs/development/compilers/ghcjs/head.nix +++ b/pkgs/development/compilers/ghcjs/head.nix @@ -1,178 +1,50 @@ -{ mkDerivation -, test-framework -, test-framework-hunit -, test-framework-quickcheck2 -, 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 -, callPackage +{ fetchgit, fetchFromGitHub, bootPkgs }: -, bootPkgs, gmp -, jailbreak-cabal - -, 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, Cabal -, alex, happy, git, gnumake, autoconf, patch -, automake, libtool -, cryptohash -, haddock, hspec, xhtml, primitive, cacert, pkgs -, coreutils -, libiconv - -, ghcjsBootSrc ? fetchgit { - url = git://github.com/ghcjs/ghcjs-boot.git; - rev = "b000a4f4619b850bf3f9a45c9058f7a51e7709c8"; - sha256 = "164v0xf33r6mnympp6s70v8j6g7ccyg7z95gjp43bq150ppvisbq"; - fetchSubmodules = true; - } -, ghcjsBoot ? import ./ghcjs-boot.nix { - inherit runCommand; - src = ghcjsBootSrc; - } -, shims ? import ./head_shims.nix { inherit fetchFromGitHub; } -}: -let - inherit (bootPkgs) ghc; +bootPkgs.callPackage ./base.nix { version = "0.2.020161101"; -in mkDerivation (rec { - pname = "ghcjs"; - inherit version; - src = fetchFromGitHub { + # deprecated on HEAD, directly included in the distribution + ghcjs-prim = null; + inherit bootPkgs; + + ghcjsSrc = fetchFromGitHub { owner = "ghcjs"; repo = "ghcjs"; rev = "899c834a36692bbbde9b9d16fe5b92ce55a623c4"; sha256 = "024yj4k0dxy7nvyq19n3xbhh4b4csdrgj19a3l4bmm1zn84gmpl6"; }; - 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 - ]; - patches = [ ./ghcjs.patch ]; - 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 - ''; - passthru = let - ghcjsNodePkgs = callPackage ../../../top-level/node-packages.nix { - generated = ./node-packages-generated.nix; - self = ghcjsNodePkgs; - }; - in { - inherit bootPkgs; - isCross = true; - isGhcjs = true; - inherit nodejs ghcjsBoot; - inherit (ghcjsNodePkgs) "socket.io"; - - # 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 = [ - "array" - "base" - "binary" - "rts" - "bytestring" - "containers" - "deepseq" - "directory" - "filepath" - "ghc-prim" - "ghcjs-prim" - "integer-gmp" - "old-locale" - "pretty" - "primitive" - "process" - "template-haskell" - "time" - "transformers" - "unix" - ]; - - mkStage2 = import ./stage2.nix { - inherit ghcjsBoot; - }; + ghcjsBootSrc = fetchgit { + url = git://github.com/ghcjs/ghcjs-boot.git; + rev = "b000a4f4619b850bf3f9a45c9058f7a51e7709c8"; + sha256 = "164v0xf33r6mnympp6s70v8j6g7ccyg7z95gjp43bq150ppvisbq"; + fetchSubmodules = true; }; - 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 ]; -}) + shims = import ./head_shims.nix { inherit fetchFromGitHub; }; + stage1Packages = [ + "array" + "base" + "binary" + "bytestring" + "containers" + "deepseq" + "directory" + "filepath" + "ghc-boot" + "ghc-boot-th" + "ghc-prim" + "ghci" + "ghcjs-prim" + "ghcjs-th" + "integer-gmp" + "pretty" + "primitive" + "process" + "rts" + "template-haskell" + "time" + "transformers" + "unix" + ]; +} +