From 96f4cac65901256c3a3388dbe491de30f65543c7 Mon Sep 17 00:00:00 2001
From: Gleb Peregud <gleber.p@gmail.com>
Date: Sat, 3 Jun 2017 22:20:20 +0200
Subject: [PATCH 1/4] erlang: Move all BEAM packages into beam-packages.

This applies to Erlang, Elixir and LFE packages.

beam-packages provides interpreters and packages sets separately. This
is in preparation of generalizing BEAM interpreters definitions.
---
 pkgs/top-level/all-packages.nix  | 99 +++++---------------------------
 pkgs/top-level/beam-packages.nix | 99 ++++++++++++++++++++++++++++++++
 2 files changed, 113 insertions(+), 85 deletions(-)
 create mode 100644 pkgs/top-level/beam-packages.nix

diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix
index dcf644ac8ddc..641fbb125b65 100644
--- a/pkgs/top-level/all-packages.nix
+++ b/pkgs/top-level/all-packages.nix
@@ -5949,93 +5949,22 @@ with pkgs;
 
   clooj = callPackage ../development/interpreters/clojure/clooj.nix { };
 
-  erlangR16 = callPackage ../development/interpreters/erlang/R16.nix {
-    inherit (darwin.apple_sdk.frameworks) Carbon Cocoa;
-  };
-  erlangR16_odbc = callPackage ../development/interpreters/erlang/R16.nix {
-    inherit (darwin.apple_sdk.frameworks) Carbon Cocoa;
-    odbcSupport = true;
-  };
-  erlang_basho_R16B02 = callPackage ../development/interpreters/erlang/R16B02-8-basho.nix {
-    inherit (darwin.apple_sdk.frameworks) Carbon Cocoa;
-  };
-  erlang_basho_R16B02_odbc = callPackage ../development/interpreters/erlang/R16B02-8-basho.nix {
-    inherit (darwin.apple_sdk.frameworks) Carbon Cocoa;
-    odbcSupport = true;
-  };
-  erlangR17 = callPackage ../development/interpreters/erlang/R17.nix {
-    inherit (darwin.apple_sdk.frameworks) Carbon Cocoa;
-  };
-  erlangR17_odbc = callPackage ../development/interpreters/erlang/R17.nix {
-    inherit (darwin.apple_sdk.frameworks) Carbon Cocoa;
-    odbcSupport = true;
-  };
-  erlangR17_javac = callPackage ../development/interpreters/erlang/R17.nix {
-    inherit (darwin.apple_sdk.frameworks) Carbon Cocoa;
-    javacSupport = true;
-  };
-  erlangR17_odbc_javac = callPackage ../development/interpreters/erlang/R17.nix {
-    inherit (darwin.apple_sdk.frameworks) Carbon Cocoa;
-    javacSupport = true; odbcSupport = true;
-  };
-  erlangR18 = callPackage ../development/interpreters/erlang/R18.nix {
-    inherit (darwin.apple_sdk.frameworks) Carbon Cocoa;
-    wxGTK = wxGTK30;
-  };
-  erlangR18_odbc = callPackage ../development/interpreters/erlang/R18.nix {
-    inherit (darwin.apple_sdk.frameworks) Carbon Cocoa;
-    wxGTK = wxGTK30;
-    odbcSupport = true;
-  };
-  erlangR18_javac = callPackage ../development/interpreters/erlang/R18.nix {
-    inherit (darwin.apple_sdk.frameworks) Carbon Cocoa;
-    wxGTK = wxGTK30;
-    javacSupport = true;
-  };
-  erlangR18_odbc_javac = callPackage ../development/interpreters/erlang/R18.nix {
-    inherit (darwin.apple_sdk.frameworks) Carbon Cocoa;
-    wxGTK = wxGTK30;
-    javacSupport = true; odbcSupport = true;
-  };
-  erlangR19 = callPackage ../development/interpreters/erlang/R19.nix {
-    inherit (darwin.apple_sdk.frameworks) Carbon Cocoa;
-    wxGTK = wxGTK30;
-  };
-  erlangR19_odbc = callPackage ../development/interpreters/erlang/R19.nix {
-    inherit (darwin.apple_sdk.frameworks) Carbon Cocoa;
-    wxGTK = wxGTK30;
-    odbcSupport = true;
-  };
-  erlangR19_javac = callPackage ../development/interpreters/erlang/R19.nix {
-    inherit (darwin.apple_sdk.frameworks) Carbon Cocoa;
-    wxGTK = wxGTK30;
-    javacSupport = true;
-  };
-  erlangR19_odbc_javac = callPackage ../development/interpreters/erlang/R19.nix {
-    inherit (darwin.apple_sdk.frameworks) Carbon Cocoa;
-    wxGTK = wxGTK30;
-    javacSupport = true; odbcSupport = true;
-  };
-  erlang = erlangR18;
-  erlang_odbc = erlangR18_odbc;
-  erlang_javac = erlangR18_javac;
-  erlang_odbc_javac = erlangR18_odbc_javac;
+  beam = callPackage ./beam-packages.nix { };
 
-  rebar = callPackage ../development/tools/build-managers/rebar { };
-  rebar3-open = callPackage ../development/tools/build-managers/rebar3 { hermeticRebar3 = false; };
-  rebar3 = callPackage ../development/tools/build-managers/rebar3 { hermeticRebar3 = true; };
-  hexRegistrySnapshot = callPackage ../development/beam-modules/hex-registry-snapshot.nix { };
-  fetchHex = callPackage ../development/beam-modules/fetch-hex.nix { };
+  inherit (beam.interpreters)
+    erlang erlang_odbc erlang_javac erlang_odbc_javac
+    elixir
+    lfe
+    erlangR16 erlangR16_odbc
+    erlang_basho_R16B02 erlang_basho_R16B02_odbc
+    erlangR17 erlangR17_odbc erlangR17_javac erlangR17_odbc_javac
+    erlangR18 erlangR18_odbc erlangR18_javac erlangR18_odbc_javac
+    erlangR19 erlangR19_odbc erlangR19_javac erlangR19_odbc_javac;
 
-  beamPackages = callPackage ../development/beam-modules { };
-  hex2nix = beamPackages.callPackage ../development/tools/erlang/hex2nix { };
-  cuter = callPackage ../development/tools/erlang/cuter { };
-
-  relxExe = callPackage ../development/tools/erlang/relx-exe {};
-
-  elixir = callPackage ../development/interpreters/elixir { debugInfo = true; };
-
-  lfe = callPackage ../development/interpreters/lfe { };
+  inherit (beam.packages)
+    rebar rebar3-open rebar3
+    hexRegistrySnapshot fetchHex beamPackages
+    hex2nix cuter relxExe;
 
   groovy = callPackage ../development/interpreters/groovy { };
 
diff --git a/pkgs/top-level/beam-packages.nix b/pkgs/top-level/beam-packages.nix
new file mode 100644
index 000000000000..cd40192a3a51
--- /dev/null
+++ b/pkgs/top-level/beam-packages.nix
@@ -0,0 +1,99 @@
+{ pkgs, stdenv, callPackage, wxGTK30, darwin }:
+
+rec {
+
+  interpreters = rec {
+
+    erlang = erlangR18;
+    erlang_odbc = erlangR18_odbc;
+    erlang_javac = erlangR18_javac;
+    erlang_odbc_javac = erlangR18_odbc_javac;
+
+    erlangR16 = callPackage ../development/interpreters/erlang/R16.nix {
+      inherit (darwin.apple_sdk.frameworks) Carbon Cocoa;
+    };
+
+    erlangR16_odbc = callPackage ../development/interpreters/erlang/R16.nix {
+      inherit (darwin.apple_sdk.frameworks) Carbon Cocoa;
+      odbcSupport = true;
+    };
+    erlang_basho_R16B02 = callPackage ../development/interpreters/erlang/R16B02-8-basho.nix {
+      inherit (darwin.apple_sdk.frameworks) Carbon Cocoa;
+    };
+    erlang_basho_R16B02_odbc = callPackage ../development/interpreters/erlang/R16B02-8-basho.nix {
+      inherit (darwin.apple_sdk.frameworks) Carbon Cocoa;
+      odbcSupport = true;
+    };
+    erlangR17 = callPackage ../development/interpreters/erlang/R17.nix {
+      inherit (darwin.apple_sdk.frameworks) Carbon Cocoa;
+    };
+    erlangR17_odbc = callPackage ../development/interpreters/erlang/R17.nix {
+      inherit (darwin.apple_sdk.frameworks) Carbon Cocoa;
+      odbcSupport = true;
+    };
+    erlangR17_javac = callPackage ../development/interpreters/erlang/R17.nix {
+      inherit (darwin.apple_sdk.frameworks) Carbon Cocoa;
+      javacSupport = true;
+    };
+    erlangR17_odbc_javac = callPackage ../development/interpreters/erlang/R17.nix {
+      inherit (darwin.apple_sdk.frameworks) Carbon Cocoa;
+      javacSupport = true; odbcSupport = true;
+    };
+    erlangR18 = callPackage ../development/interpreters/erlang/R18.nix {
+      inherit (darwin.apple_sdk.frameworks) Carbon Cocoa;
+      wxGTK = wxGTK30;
+    };
+    erlangR18_odbc = callPackage ../development/interpreters/erlang/R18.nix {
+      inherit (darwin.apple_sdk.frameworks) Carbon Cocoa;
+      wxGTK = wxGTK30;
+      odbcSupport = true;
+    };
+    erlangR18_javac = callPackage ../development/interpreters/erlang/R18.nix {
+      inherit (darwin.apple_sdk.frameworks) Carbon Cocoa;
+      wxGTK = wxGTK30;
+      javacSupport = true;
+    };
+    erlangR18_odbc_javac = callPackage ../development/interpreters/erlang/R18.nix {
+      inherit (darwin.apple_sdk.frameworks) Carbon Cocoa;
+      wxGTK = wxGTK30;
+      javacSupport = true; odbcSupport = true;
+    };
+    erlangR19 = callPackage ../development/interpreters/erlang/R19.nix {
+      inherit (darwin.apple_sdk.frameworks) Carbon Cocoa;
+      wxGTK = wxGTK30;
+    };
+    erlangR19_odbc = callPackage ../development/interpreters/erlang/R19.nix {
+      inherit (darwin.apple_sdk.frameworks) Carbon Cocoa;
+      wxGTK = wxGTK30;
+      odbcSupport = true;
+    };
+    erlangR19_javac = callPackage ../development/interpreters/erlang/R19.nix {
+      inherit (darwin.apple_sdk.frameworks) Carbon Cocoa;
+      wxGTK = wxGTK30;
+      javacSupport = true;
+    };
+    erlangR19_odbc_javac = callPackage ../development/interpreters/erlang/R19.nix {
+      inherit (darwin.apple_sdk.frameworks) Carbon Cocoa;
+      wxGTK = wxGTK30;
+      javacSupport = true; odbcSupport = true;
+    };
+
+    elixir = callPackage ../development/interpreters/elixir { debugInfo = true; };
+
+    lfe = callPackage ../development/interpreters/lfe { };
+  };
+
+  packages = rec {
+    rebar = callPackage ../development/tools/build-managers/rebar { };
+    rebar3-open = callPackage ../development/tools/build-managers/rebar3 { hermeticRebar3 = false; };
+    rebar3 = callPackage ../development/tools/build-managers/rebar3 { hermeticRebar3 = true; };
+    hexRegistrySnapshot = callPackage ../development/beam-modules/hex-registry-snapshot.nix { };
+    fetchHex = callPackage ../development/beam-modules/fetch-hex.nix { };
+
+    beamPackages = callPackage ../development/beam-modules { };
+    hex2nix = beamPackages.callPackage ../development/tools/erlang/hex2nix { };
+    cuter = callPackage ../development/tools/erlang/cuter { };
+
+    relxExe = callPackage ../development/tools/erlang/relx-exe {};
+  };
+}

From 3426c88bff6988056163f147e06dcfac2556b588 Mon Sep 17 00:00:00 2001
From: Gleb Peregud <gleber.p@gmail.com>
Date: Sun, 4 Jun 2017 20:26:37 +0200
Subject: [PATCH 2/4] erlang: Generalize Erlang/OTP derivations.

Switch official Erlang versions to use a common builder.
---
 pkgs/development/beam-modules/lib.nix         |  21 +++
 pkgs/development/interpreters/erlang/R16.nix  |  57 +-------
 .../interpreters/erlang/R16B02-8-basho.nix    |   4 +
 pkgs/development/interpreters/erlang/R17.nix  |  74 +---------
 pkgs/development/interpreters/erlang/R18.nix  | 103 +-------------
 pkgs/development/interpreters/erlang/R19.nix  |  99 +------------
 .../interpreters/erlang/generic-builder.nix   | 132 ++++++++++++++++++
 pkgs/top-level/beam-packages.nix              | 114 +++++++--------
 8 files changed, 231 insertions(+), 373 deletions(-)
 create mode 100644 pkgs/development/beam-modules/lib.nix
 create mode 100644 pkgs/development/interpreters/erlang/generic-builder.nix

diff --git a/pkgs/development/beam-modules/lib.nix b/pkgs/development/beam-modules/lib.nix
new file mode 100644
index 000000000000..2d0eef09563a
--- /dev/null
+++ b/pkgs/development/beam-modules/lib.nix
@@ -0,0 +1,21 @@
+{ pkgs }:
+
+rec {
+
+  /* Uses generic-builder to evaluate provided drv containing OTP-version specific data.
+
+  drv: package containing version-specific args;
+  builder: generic builder for all Erlang versions;
+  gargs: arguments passed to the generic-builder, used mostly to customize dependencies;
+  args: arguments merged into version-specific args, used mostly to enable/disable high-level OTP
+    features, like ODBC or WX support;
+
+  Please note that "mkDerivation" defined here is the one called from R16.nix and similar files.
+  */
+  callErlang = drv: gargs: args: pkgs.callPackage drv (
+    let builder = pkgs.callPackage ../../development/interpreters/erlang/generic-builder.nix gargs;
+    in {
+      mkDerivation = a: builder (a // args);
+    });
+
+}
diff --git a/pkgs/development/interpreters/erlang/R16.nix b/pkgs/development/interpreters/erlang/R16.nix
index e2e0151de371..3ac37b5bde17 100644
--- a/pkgs/development/interpreters/erlang/R16.nix
+++ b/pkgs/development/interpreters/erlang/R16.nix
@@ -1,17 +1,6 @@
-{ stdenv, fetchurl, perl, gnum4, ncurses, openssl
-, gnused, gawk, makeWrapper
-, odbcSupport ? false, unixODBC ? null
-, wxSupport ? false, mesa ? null, wxGTK ? null, xorg ? null
-, enableDebugInfo ? false
-, Carbon ? null, Cocoa ? null }:
+{ mkDerivation, fetchurl }:
 
-assert wxSupport -> mesa != null && wxGTK != null && xorg != null;
-assert odbcSupport -> unixODBC != null;
-
-with stdenv.lib;
-
-stdenv.mkDerivation rec {
-  name = "erlang-" + version + "${optionalString odbcSupport "-odbc"}";
+mkDerivation rec {
   version = "16B03-1";
 
   src = fetchurl {
@@ -19,28 +8,17 @@ stdenv.mkDerivation rec {
     sha256 = "1rvyfh22g1fir1i4xn7v2md868wcmhajwhfsq97v7kn5kd2m7khp";
   };
 
-  debugInfo = enableDebugInfo;
-
-  buildInputs =
-    [ perl gnum4 ncurses openssl makeWrapper
-    ] ++ optionals wxSupport [ mesa wxGTK xorg.libX11 ]
-      ++ optional odbcSupport unixODBC
-      ++ optionals stdenv.isDarwin [ Carbon Cocoa ];
-
-  # Clang 4 (rightfully) thinks signed comparisons of pointers with NULL are nonsense
   prePatch = ''
-    substituteInPlace lib/wx/c_src/wxe_impl.cpp --replace 'temp > NULL' 'temp != NULL'
+    sed -i "s@/bin/rm@rm@" lib/odbc/configure erts/configure
   '';
 
-  patchPhase = '' sed -i "s@/bin/rm@rm@" lib/odbc/configure erts/configure '';
-
   preConfigure = ''
     export HOME=$PWD/../
     sed -e s@/bin/pwd@pwd@g -i otp_build
   '';
 
-  configureFlags= "--with-ssl=${openssl.dev} ${optionalString odbcSupport "--with-odbc=${unixODBC}"} ${optionalString stdenv.isDarwin "--enable-darwin-64bit"}";
-
+  # Do not install docs, instead use prebuilt versions.
+  installTargets = "install";
   postInstall = let
     manpages = fetchurl {
       url = "http://www.erlang.org/download/otp_doc_man_R${version}.tar.gz";
@@ -55,29 +33,4 @@ stdenv.mkDerivation rec {
       ln -s "$i" "$out/share/man/''${prefix##*/}/''${i##*/}erl"
     done
   '';
-
-  # Some erlang bin/ scripts run sed and awk
-  postFixup = ''
-    wrapProgram $out/lib/erlang/bin/erl --prefix PATH ":" "${gnused}/bin/"
-    wrapProgram $out/lib/erlang/bin/start_erl --prefix PATH ":" "${stdenv.lib.makeBinPath [ gnused gawk ]}"
-  '';
-
-  setupHook = ./setup-hook.sh;
-
-  meta = {
-    homepage = "http://www.erlang.org/";
-    description = "Programming language used for massively scalable soft real-time systems";
-
-    longDescription = ''
-      Erlang is a programming language used to build massively scalable
-      soft real-time systems with requirements on high availability.
-      Some of its uses are in telecoms, banking, e-commerce, computer
-      telephony and instant messaging. Erlang's runtime system has
-      built-in support for concurrency, distribution and fault
-      tolerance.
-    '';
-
-    platforms = platforms.unix;
-    maintainers = [ maintainers.the-kenny ];
-  };
 }
diff --git a/pkgs/development/interpreters/erlang/R16B02-8-basho.nix b/pkgs/development/interpreters/erlang/R16B02-8-basho.nix
index 80f524019df0..fe24ad64bf83 100644
--- a/pkgs/development/interpreters/erlang/R16B02-8-basho.nix
+++ b/pkgs/development/interpreters/erlang/R16B02-8-basho.nix
@@ -36,6 +36,10 @@ stdenv.mkDerivation rec {
 
   patchPhase = '' sed -i "s@/bin/rm@rm@" lib/odbc/configure.in erts/configure.in '';
 
+  postPatch = ''
+    patchSheBangs make
+  '';
+
   preConfigure = ''
     export HOME=$PWD/../
     export LANG=C
diff --git a/pkgs/development/interpreters/erlang/R17.nix b/pkgs/development/interpreters/erlang/R17.nix
index 0869285d4965..3d78c6ee242a 100644
--- a/pkgs/development/interpreters/erlang/R17.nix
+++ b/pkgs/development/interpreters/erlang/R17.nix
@@ -1,26 +1,6 @@
-{ stdenv, fetchurl, perl, gnum4, ncurses, openssl
-, gnused, gawk, makeWrapper
-, Carbon, Cocoa
-, odbcSupport ? false, unixODBC ? null
-, wxSupport ? true, mesa ? null, wxGTK ? null, xorg ? null, wxmac ? null
-, javacSupport ? false, openjdk ? null
-, enableHipe ? true
-, enableDebugInfo ? false
-, enableDirtySchedulers ? false
-}:
+{ mkDerivation, fetchurl }:
 
-assert wxSupport -> (if stdenv.isDarwin
-  then wxmac != null
-  else mesa != null && wxGTK != null && xorg != null);
-
-assert odbcSupport -> unixODBC != null;
-assert javacSupport ->  openjdk != null;
-
-with stdenv.lib;
-
-stdenv.mkDerivation rec {
-  name = "erlang-" + version + "${optionalString odbcSupport "-odbc"}"
-  + "${optionalString javacSupport "-javac"}";
+mkDerivation rec {
   version = "17.5";
 
   src = fetchurl {
@@ -28,36 +8,17 @@ stdenv.mkDerivation rec {
     sha256 = "0x34hj1a4j3rphqdaapdld7la4sqiqillamcz06wac0vk0684a1w";
   };
 
-  buildInputs =
-    [ perl gnum4 ncurses openssl makeWrapper
-    ] ++ optionals wxSupport (if stdenv.isDarwin then [ wxmac ] else [ mesa wxGTK xorg.libX11 ])
-      ++ optional odbcSupport unixODBC
-      ++ optional javacSupport openjdk
-      ++ stdenv.lib.optionals stdenv.isDarwin [ Carbon Cocoa ];
-
-  patchPhase = ''
-    # Clang 4 (rightfully) thinks signed comparisons of pointers with NULL are nonsense
-    substituteInPlace lib/wx/c_src/wxe_impl.cpp --replace 'temp > NULL' 'temp != NULL'
-
+  prePatch = ''
     sed -i "s@/bin/rm@rm@" lib/odbc/configure erts/configure
   '';
 
-  debugInfo = enableDebugInfo;
-
   preConfigure = ''
     export HOME=$PWD/../
     sed -e s@/bin/pwd@pwd@g -i otp_build
   '';
 
-  configureFlags= [
-    "--with-ssl=${openssl.dev}"
-  ] ++ optional enableHipe "--enable-hipe"
-    ++ optional enableDirtySchedulers "--enable-dirty-schedulers"
-    ++ optional wxSupport "--enable-wx"
-    ++ optional odbcSupport "--with-odbc=${unixODBC}"
-    ++ optional javacSupport "--with-javac"
-    ++ optional stdenv.isDarwin "--enable-darwin-64bit";
-
+  # Do not install docs, instead use prebuilt versions.
+  installTargets = "install";
   postInstall = let
     manpages = fetchurl {
       url = "http://www.erlang.org/download/otp_doc_man_${version}.tar.gz";
@@ -72,29 +33,4 @@ stdenv.mkDerivation rec {
       ln -s "$i" "$out/share/man/''${prefix##*/}/''${i##*/}erl"
     done
   '';
-
-  # Some erlang bin/ scripts run sed and awk
-  postFixup = ''
-    wrapProgram $out/lib/erlang/bin/erl --prefix PATH ":" "${gnused}/bin/"
-    wrapProgram $out/lib/erlang/bin/start_erl --prefix PATH ":" "${stdenv.lib.makeBinPath [ gnused gawk ]}"
-  '';
-
-  setupHook = ./setup-hook.sh;
-
-  meta = {
-    homepage = "http://www.erlang.org/";
-    description = "Programming language used for massively scalable soft real-time systems";
-
-    longDescription = ''
-      Erlang is a programming language used to build massively scalable
-      soft real-time systems with requirements on high availability.
-      Some of its uses are in telecoms, banking, e-commerce, computer
-      telephony and instant messaging. Erlang's runtime system has
-      built-in support for concurrency, distribution and fault
-      tolerance.
-    '';
-
-    platforms = platforms.unix;
-    maintainers = [ maintainers.the-kenny maintainers.sjmackenzie ];
-  };
 }
diff --git a/pkgs/development/interpreters/erlang/R18.nix b/pkgs/development/interpreters/erlang/R18.nix
index 1ed9bfbd70a2..0d20ae662a50 100644
--- a/pkgs/development/interpreters/erlang/R18.nix
+++ b/pkgs/development/interpreters/erlang/R18.nix
@@ -1,113 +1,22 @@
-{ stdenv, fetchurl, fetchpatch, fetchFromGitHub, perl, gnum4, ncurses, openssl
-, gnused, gawk, autoconf, libxslt, libxml2, makeWrapper
-, Carbon, Cocoa
-, odbcSupport ? false, unixODBC ? null
-, wxSupport ? true, mesa ? null, wxGTK ? null, xorg ? null, wxmac ? null
-, javacSupport ? false, openjdk ? null
-, enableHipe ? true
-, enableDebugInfo ? false
-, enableDirtySchedulers ? false
-}:
-
-assert wxSupport -> (if stdenv.isDarwin
-  then wxmac != null
-  else mesa != null && wxGTK != null && xorg != null);
-
-assert odbcSupport -> unixODBC != null;
-assert javacSupport ->  openjdk != null;
-
-with stdenv.lib;
-
-stdenv.mkDerivation rec {
-  name = "erlang-" + version + "${optionalString odbcSupport "-odbc"}"
-  + "${optionalString javacSupport "-javac"}";
-  version = "18.3.4.4";
-
-  # Minor OTP releases are not always released as tarbals at
-  # http://erlang.org/download/ So we have to download from
-  # github. And for the same reason we can't use a prebuilt manpages
-  # tarball and need to build manpages ourselves.
-  src = fetchFromGitHub {
-    owner = "erlang";
-    repo = "otp";
-    rev = "OTP-${version}";
-    sha256 = "0wilm21yi9m3v6j26vc04hsa58cxca5z4q9yxx71hm81cbm1xbwk";
-  };
-
-  buildInputs =
-    [ perl gnum4 ncurses openssl autoconf libxslt libxml2 makeWrapper
-    ] ++ optionals wxSupport (if stdenv.isDarwin then [ wxmac ] else [ mesa wxGTK xorg.libX11 ])
-      ++ optional odbcSupport unixODBC
-      ++ optional javacSupport openjdk
-      ++ stdenv.lib.optionals stdenv.isDarwin [ Carbon Cocoa ];
-
-  debugInfo = enableDebugInfo;
+{ mkDerivation, fetchurl }:
 
+let
   rmAndPwdPatch = fetchurl {
      url = "https://github.com/erlang/otp/commit/98b8650d22e94a5ff839170833f691294f6276d0.patch";
      sha256 = "0cd5pkqrigiqz6cyma5irqwzn0bi17k371k9vlg8ir31h3zmqfip";
   };
 
   envAndCpPatch = fetchurl {
-     url = "https://github.com/binarin/otp/commit/9f9841eb7327c9fe73e84e197fd2965a97b639cf.patch";
+     url = "https://github.com/erlang/otp/commit/9f9841eb7327c9fe73e84e197fd2965a97b639cf.patch";
      sha256 = "10h5348p6g279b4q01i5jdqlljww5chcvrx5b4b0dv79pk0p0m9f";
   };
 
-  # Clang 4 (rightfully) thinks signed comparisons of pointers with NULL are nonsense
-  prePatch = ''
-    substituteInPlace lib/wx/c_src/wxe_impl.cpp --replace 'temp > NULL' 'temp != NULL'
-  '';
+in mkDerivation rec {
+  version = "18.3.4.4";
+  sha256 = "0wilm21yi9m3v6j26vc04hsa58cxca5z4q9yxx71hm81cbm1xbwk";
 
   patches = [
     rmAndPwdPatch
     envAndCpPatch
   ];
-
-  preConfigure = ''
-    ./otp_build autoconf
-  '';
-
-  configureFlags= [
-    "--with-ssl=${openssl.dev}"
-  ] ++ optional enableHipe "--enable-hipe"
-    ++ optional enableDirtySchedulers "--enable-dirty-schedulers"
-    ++ optional wxSupport "--enable-wx"
-    ++ optional odbcSupport "--with-odbc=${unixODBC}"
-    ++ optional javacSupport "--with-javac"
-    ++ optional stdenv.isDarwin "--enable-darwin-64bit";
-
-  # install-docs will generate and install manpages and html docs
-  # (PDFs are generated only when fop is available).
-  installTargets = "install install-docs";
-
-  postInstall = ''
-    ln -s $out/lib/erlang/lib/erl_interface*/bin/erl_call $out/bin/erl_call
-  '';
-
-  # Some erlang bin/ scripts run sed and awk
-  postFixup = ''
-    wrapProgram $out/lib/erlang/bin/erl --prefix PATH ":" "${gnused}/bin/"
-    wrapProgram $out/lib/erlang/bin/start_erl --prefix PATH ":" "${stdenv.lib.makeBinPath [ gnused gawk ]}"
-  '';
-
-  setupHook = ./setup-hook.sh;
-
-  meta = {
-    homepage = "http://www.erlang.org/";
-    downloadPage = "http://www.erlang.org/download.html";
-    description = "Programming language used for massively scalable soft real-time systems";
-
-    longDescription = ''
-      Erlang is a programming language used to build massively scalable
-      soft real-time systems with requirements on high availability.
-      Some of its uses are in telecoms, banking, e-commerce, computer
-      telephony and instant messaging. Erlang's runtime system has
-      built-in support for concurrency, distribution and fault
-      tolerance.
-    '';
-
-    platforms = platforms.unix;
-    maintainers = with maintainers; [ the-kenny sjmackenzie couchemar ];
-    license = licenses.asl20;
-  };
 }
diff --git a/pkgs/development/interpreters/erlang/R19.nix b/pkgs/development/interpreters/erlang/R19.nix
index 4b1e3f4cb2f9..680111dbd77a 100644
--- a/pkgs/development/interpreters/erlang/R19.nix
+++ b/pkgs/development/interpreters/erlang/R19.nix
@@ -1,101 +1,10 @@
-{ stdenv, fetchurl, fetchFromGitHub, perl, gnum4, ncurses, openssl
-, gnused, gawk, autoconf, libxslt, libxml2, makeWrapper
-, Carbon, Cocoa
-, odbcSupport ? false, unixODBC ? null
-, wxSupport ? true, mesa ? null, wxGTK ? null, xorg ? null, wxmac ? null
-, javacSupport ? false, openjdk ? null
-, enableHipe ? true
-, enableDebugInfo ? false
-, enableDirtySchedulers ? false
-}:
+{ mkDerivation, fetchurl }:
 
-assert wxSupport -> (if stdenv.isDarwin
-  then wxmac != null
-  else mesa != null && wxGTK != null && xorg != null);
-
-assert odbcSupport -> unixODBC != null;
-assert javacSupport ->  openjdk != null;
-
-with stdenv.lib;
-
-stdenv.mkDerivation rec {
-  name = "erlang-" + version + "${optionalString odbcSupport "-odbc"}"
-  + "${optionalString javacSupport "-javac"}";
+mkDerivation rec {
   version = "19.3";
-
-  # Minor OTP releases are not always released as tarbals at
-  # http://erlang.org/download/ So we have to download from
-  # github. And for the same reason we can't use a prebuilt manpages
-  # tarball and need to build manpages ourselves.
-  src = fetchFromGitHub {
-    owner = "erlang";
-    repo = "otp";
-    rev = "OTP-${version}";
-    sha256 = "0pp2hl8jf4iafpnsmf0q7jbm313daqzif6ajqcmjyl87m5pssr86";
-  };
-
-  buildInputs =
-    [ perl gnum4 ncurses openssl autoconf libxslt libxml2 makeWrapper
-    ] ++ optionals wxSupport (if stdenv.isDarwin then [ wxmac ] else [ mesa wxGTK xorg.libX11 ])
-      ++ optional odbcSupport unixODBC
-      ++ optional javacSupport openjdk
-      ++ stdenv.lib.optionals stdenv.isDarwin [ Carbon Cocoa ];
-
-  debugInfo = enableDebugInfo;
+  sha256 = "0pp2hl8jf4iafpnsmf0q7jbm313daqzif6ajqcmjyl87m5pssr86";
 
   prePatch = ''
-    substituteInPlace configure.in \
-      --replace '`sw_vers -productVersion`' '10.10'
-
-    # Clang 4 (rightfully) thinks signed comparisons of pointers with NULL are nonsense
-    substituteInPlace lib/wx/c_src/wxe_impl.cpp --replace 'temp > NULL' 'temp != NULL'
+    substituteInPlace configure.in --replace '`sw_vers -productVersion`' '10.10'
   '';
-
-  preConfigure = ''
-    ./otp_build autoconf
-  '';
-
-  configureFlags= [
-    "--with-ssl=${openssl.dev}"
-  ] ++ optional enableHipe "--enable-hipe"
-    ++ optional enableDirtySchedulers "--enable-dirty-schedulers"
-    ++ optional wxSupport "--enable-wx"
-    ++ optional odbcSupport "--with-odbc=${unixODBC}"
-    ++ optional javacSupport "--with-javac"
-    ++ optional stdenv.isDarwin "--enable-darwin-64bit";
-
-  # install-docs will generate and install manpages and html docs
-  # (PDFs are generated only when fop is available).
-  installTargets = "install install-docs";
-
-  postInstall = ''
-    ln -s $out/lib/erlang/lib/erl_interface*/bin/erl_call $out/bin/erl_call
-  '';
-
-  # Some erlang bin/ scripts run sed and awk
-  postFixup = ''
-    wrapProgram $out/lib/erlang/bin/erl --prefix PATH ":" "${gnused}/bin/"
-    wrapProgram $out/lib/erlang/bin/start_erl --prefix PATH ":" "${stdenv.lib.makeBinPath [ gnused gawk ]}"
-  '';
-
-  setupHook = ./setup-hook.sh;
-
-  meta = {
-    homepage = "http://www.erlang.org/";
-    downloadPage = "http://www.erlang.org/download.html";
-    description = "Programming language used for massively scalable soft real-time systems";
-
-    longDescription = ''
-      Erlang is a programming language used to build massively scalable
-      soft real-time systems with requirements on high availability.
-      Some of its uses are in telecoms, banking, e-commerce, computer
-      telephony and instant messaging. Erlang's runtime system has
-      built-in support for concurrency, distribution and fault
-      tolerance.
-    '';
-
-    platforms = platforms.unix;
-    maintainers = with maintainers; [ yurrriq couchemar DerTim1 mdaiter ];
-    license = licenses.asl20;
-  };
 }
diff --git a/pkgs/development/interpreters/erlang/generic-builder.nix b/pkgs/development/interpreters/erlang/generic-builder.nix
new file mode 100644
index 000000000000..0127bb933c4a
--- /dev/null
+++ b/pkgs/development/interpreters/erlang/generic-builder.nix
@@ -0,0 +1,132 @@
+{ pkgs, stdenv, fetchurl, fetchFromGitHub, makeWrapper, autoconf, gawk, gnum4, gnused
+, libxml2, libxslt, ncurses, openssl, perl
+, openjdk ? null # javacSupport
+, unixODBC ? null # odbcSupport
+, mesa ? null, wxGTK ? null, wxmac ? null, xorg ? null # wxSupport
+}:
+
+{ version
+, sha256 ? null
+, rev ? "OTP-${version}"
+, src ? fetchFromGitHub { inherit rev sha256; owner = "erlang"; repo = "otp"; }
+, enableHipe ? true
+, enableDebugInfo ? false
+, javacSupport ? false, javacPackages ? [ openjdk ]
+, odbcSupport ? false, odbcPackages ? [ unixODBC ]
+, wxSupport ? true, wxPackages ? [ mesa wxGTK xorg.libX11 ]
+, preUnpack ? "", postUnpack ? ""
+, patches ? [], patchPhase ? "", prePatch ? "", postPatch ? ""
+, configureFlags ? [], configurePhase ? "", preConfigure ? "", postConfigure ? ""
+, buildPhase ? "", preBuild ? "", postBuild ? ""
+, installPhase ? "", preInstall ? "", postInstall ? ""
+, installTargets ? "install install-docs"
+, checkPhase ? "", preCheck ? "", postCheck ? ""
+, fixupPhase ? "", preFixup ? "", postFixup ? ""
+}:
+
+assert wxSupport -> (if stdenv.isDarwin
+  then wxmac != null
+  else mesa != null && wxGTK != null && xorg != null);
+
+assert odbcSupport -> unixODBC != null;
+assert javacSupport -> openjdk != null;
+
+let
+  inherit (stdenv.lib) optional optionals optionalAttrs optionalString;
+  wxPackages2 = if stdenv.isDarwin then [ wxmac ] else wxPackages;
+
+in stdenv.mkDerivation ({
+  name = "erlang-${version}"
+    + optionalString javacSupport "-javac"
+    + optionalString odbcSupport "-odbc";
+
+  inherit src version;
+
+  buildInputs = [ perl gnum4 ncurses openssl autoconf libxslt libxml2 makeWrapper ]
+    ++ optionals wxSupport wxPackages2
+    ++ optionals odbcSupport odbcPackages
+    ++ optionals javacSupport javacPackages
+    ++ optionals stdenv.isDarwin (with pkgs.darwin.apple_sdk.frameworks; [ Carbon Cocoa ]);
+
+  debugInfo = enableDebugInfo;
+
+  # Clang 4 (rightfully) thinks signed comparisons of pointers with NULL are nonsense
+  prePatch = ''
+    substituteInPlace lib/wx/c_src/wxe_impl.cpp --replace 'temp > NULL' 'temp != NULL'
+
+    ${prePatch}
+  '';
+
+  postPatch = ''
+    patchShebangs make
+
+    ${postPatch}
+  '';
+
+  preConfigure = ''
+    ./otp_build autoconf
+  '';
+
+  configureFlags = [ "--with-ssl=${openssl.dev}" ]
+    ++ optional enableHipe "--enable-hipe"
+    ++ optional javacSupport "--with-javac"
+    ++ optional odbcSupport "--with-odbc=${unixODBC}"
+    ++ optional wxSupport "--enable-wx"
+    ++ optional stdenv.isDarwin "--enable-darwin-64bit";
+
+  # install-docs will generate and install manpages and html docs
+  # (PDFs are generated only when fop is available).
+
+  postInstall = ''
+    ln -s $out/lib/erlang/lib/erl_interface*/bin/erl_call $out/bin/erl_call
+  '';
+
+  # Some erlang bin/ scripts run sed and awk
+  postFixup = ''
+    wrapProgram $out/lib/erlang/bin/erl --prefix PATH ":" "${gnused}/bin/"
+    wrapProgram $out/lib/erlang/bin/start_erl --prefix PATH ":" "${stdenv.lib.makeBinPath [ gnused gawk ]}"
+  '';
+
+  setupHook = ./setup-hook.sh;
+
+  meta = with stdenv.lib; {
+    homepage = "http://www.erlang.org/";
+    downloadPage = "http://www.erlang.org/download.html";
+    description = "Programming language used for massively scalable soft real-time systems";
+
+    longDescription = ''
+      Erlang is a programming language used to build massively scalable
+      soft real-time systems with requirements on high availability.
+      Some of its uses are in telecoms, banking, e-commerce, computer
+      telephony and instant messaging. Erlang's runtime system has
+      built-in support for concurrency, distribution and fault
+      tolerance.
+    '';
+
+    platforms = platforms.unix;
+    maintainers = with maintainers; [ the-kenny sjmackenzie couchemar gleber ];
+    license = licenses.asl20;
+  };
+}
+// optionalAttrs (preUnpack != "")      { inherit preUnpack; }
+// optionalAttrs (postUnpack != "")     { inherit postUnpack; }
+// optionalAttrs (patches != [])        { inherit patches; }
+// optionalAttrs (patchPhase != "")     { inherit patchPhase; }
+// optionalAttrs (configureFlags != []) { inherit configureFlags; }
+// optionalAttrs (configurePhase != "") { inherit configurePhase; }
+// optionalAttrs (preConfigure != "")   { inherit preConfigure; }
+// optionalAttrs (postConfigure != "")  { inherit postConfigure; }
+// optionalAttrs (buildPhase != "")     { inherit buildPhase; }
+// optionalAttrs (preBuild != "")       { inherit preBuild; }
+// optionalAttrs (postBuild != "")      { inherit postBuild; }
+// optionalAttrs (checkPhase != "")     { inherit checkPhase; }
+// optionalAttrs (preCheck != "")       { inherit preCheck; }
+// optionalAttrs (postCheck != "")      { inherit postCheck; }
+// optionalAttrs (installPhase != "")   { inherit installPhase; }
+// optionalAttrs (installTargets != "") { inherit installTargets; }
+// optionalAttrs (preInstall != "")     { inherit preInstall; }
+// optionalAttrs (postInstall != "")    { inherit postInstall; }
+// optionalAttrs (fixupPhase != "")     { inherit fixupPhase; }
+// optionalAttrs (preFixup != "")       { inherit preFixup; }
+// optionalAttrs (postFixup != "")      { inherit postFixup; }
+)
diff --git a/pkgs/top-level/beam-packages.nix b/pkgs/top-level/beam-packages.nix
index cd40192a3a51..94f3028ddb31 100644
--- a/pkgs/top-level/beam-packages.nix
+++ b/pkgs/top-level/beam-packages.nix
@@ -1,22 +1,69 @@
 { pkgs, stdenv, callPackage, wxGTK30, darwin }:
 
 rec {
+  lib = import ../development/beam-modules/lib.nix { inherit pkgs; };
 
   interpreters = rec {
 
+    # R18 is the Default version.
     erlang = erlangR18;
     erlang_odbc = erlangR18_odbc;
     erlang_javac = erlangR18_javac;
     erlang_odbc_javac = erlangR18_odbc_javac;
 
-    erlangR16 = callPackage ../development/interpreters/erlang/R16.nix {
-      inherit (darwin.apple_sdk.frameworks) Carbon Cocoa;
-    };
-
-    erlangR16_odbc = callPackage ../development/interpreters/erlang/R16.nix {
-      inherit (darwin.apple_sdk.frameworks) Carbon Cocoa;
+    # These are standard Erlang versions, using the generic builder.
+    erlangR16 = lib.callErlang ../development/interpreters/erlang/R16.nix {} {};
+    erlangR16_odbc = lib.callErlang ../development/interpreters/erlang/R16.nix {} {
       odbcSupport = true;
     };
+    erlangR17 = lib.callErlang ../development/interpreters/erlang/R17.nix {} {};
+    erlangR17_odbc = lib.callErlang ../development/interpreters/erlang/R17.nix {} {
+      odbcSupport = true;
+    };
+    erlangR17_javac = lib.callErlang ../development/interpreters/erlang/R17.nix {} {
+      javacSupport = true;
+    };
+    erlangR17_odbc_javac = lib.callErlang ../development/interpreters/erlang/R17.nix {} {
+      javacSupport = true; odbcSupport = true;
+    };
+    erlangR18 = lib.callErlang ../development/interpreters/erlang/R18.nix {
+      wxGTK = wxGTK30;
+    } {};
+    erlangR18_odbc = lib.callErlang ../development/interpreters/erlang/R18.nix {
+      wxGTK = wxGTK30;
+    } {
+      odbcSupport = true;
+    };
+    erlangR18_javac = lib.callErlang ../development/interpreters/erlang/R18.nix {
+      wxGTK = wxGTK30;
+    } {
+      javacSupport = true;
+    };
+    erlangR18_odbc_javac = lib.callErlang ../development/interpreters/erlang/R18.nix {
+      wxGTK = wxGTK30;
+    } {
+      javacSupport = true; odbcSupport = true;
+    };
+    erlangR19 = lib.callErlang ../development/interpreters/erlang/R19.nix {
+      wxGTK = wxGTK30;
+    } {};
+    erlangR19_odbc = lib.callErlang ../development/interpreters/erlang/R19.nix {
+      wxGTK = wxGTK30;
+    } {
+      odbcSupport = true;
+    };
+    erlangR19_javac = lib.callErlang ../development/interpreters/erlang/R19.nix {
+      wxGTK = wxGTK30;
+    } {
+      javacSupport = true;
+    };
+    erlangR19_odbc_javac = lib.callErlang ../development/interpreters/erlang/R19.nix {
+      wxGTK = wxGTK30;
+    } {
+      javacSupport = true; odbcSupport = true;
+    };
+
+    # Bash fork, using custom builder.
     erlang_basho_R16B02 = callPackage ../development/interpreters/erlang/R16B02-8-basho.nix {
       inherit (darwin.apple_sdk.frameworks) Carbon Cocoa;
     };
@@ -24,62 +71,9 @@ rec {
       inherit (darwin.apple_sdk.frameworks) Carbon Cocoa;
       odbcSupport = true;
     };
-    erlangR17 = callPackage ../development/interpreters/erlang/R17.nix {
-      inherit (darwin.apple_sdk.frameworks) Carbon Cocoa;
-    };
-    erlangR17_odbc = callPackage ../development/interpreters/erlang/R17.nix {
-      inherit (darwin.apple_sdk.frameworks) Carbon Cocoa;
-      odbcSupport = true;
-    };
-    erlangR17_javac = callPackage ../development/interpreters/erlang/R17.nix {
-      inherit (darwin.apple_sdk.frameworks) Carbon Cocoa;
-      javacSupport = true;
-    };
-    erlangR17_odbc_javac = callPackage ../development/interpreters/erlang/R17.nix {
-      inherit (darwin.apple_sdk.frameworks) Carbon Cocoa;
-      javacSupport = true; odbcSupport = true;
-    };
-    erlangR18 = callPackage ../development/interpreters/erlang/R18.nix {
-      inherit (darwin.apple_sdk.frameworks) Carbon Cocoa;
-      wxGTK = wxGTK30;
-    };
-    erlangR18_odbc = callPackage ../development/interpreters/erlang/R18.nix {
-      inherit (darwin.apple_sdk.frameworks) Carbon Cocoa;
-      wxGTK = wxGTK30;
-      odbcSupport = true;
-    };
-    erlangR18_javac = callPackage ../development/interpreters/erlang/R18.nix {
-      inherit (darwin.apple_sdk.frameworks) Carbon Cocoa;
-      wxGTK = wxGTK30;
-      javacSupport = true;
-    };
-    erlangR18_odbc_javac = callPackage ../development/interpreters/erlang/R18.nix {
-      inherit (darwin.apple_sdk.frameworks) Carbon Cocoa;
-      wxGTK = wxGTK30;
-      javacSupport = true; odbcSupport = true;
-    };
-    erlangR19 = callPackage ../development/interpreters/erlang/R19.nix {
-      inherit (darwin.apple_sdk.frameworks) Carbon Cocoa;
-      wxGTK = wxGTK30;
-    };
-    erlangR19_odbc = callPackage ../development/interpreters/erlang/R19.nix {
-      inherit (darwin.apple_sdk.frameworks) Carbon Cocoa;
-      wxGTK = wxGTK30;
-      odbcSupport = true;
-    };
-    erlangR19_javac = callPackage ../development/interpreters/erlang/R19.nix {
-      inherit (darwin.apple_sdk.frameworks) Carbon Cocoa;
-      wxGTK = wxGTK30;
-      javacSupport = true;
-    };
-    erlangR19_odbc_javac = callPackage ../development/interpreters/erlang/R19.nix {
-      inherit (darwin.apple_sdk.frameworks) Carbon Cocoa;
-      wxGTK = wxGTK30;
-      javacSupport = true; odbcSupport = true;
-    };
 
+    # Other Beam languages.
     elixir = callPackage ../development/interpreters/elixir { debugInfo = true; };
-
     lfe = callPackage ../development/interpreters/lfe { };
   };
 

From e88a89ad330743c6be885fef415307c9ff9197cc Mon Sep 17 00:00:00 2001
From: Daiderd Jordan <daiderd@gmail.com>
Date: Thu, 8 Jun 2017 01:39:17 +0200
Subject: [PATCH 3/4] erlang: use makeOverridable for customizations

---
 pkgs/development/beam-modules/lib.nix | 36 +++++++++++++------
 pkgs/top-level/beam-packages.nix      | 50 +++++++--------------------
 2 files changed, 38 insertions(+), 48 deletions(-)

diff --git a/pkgs/development/beam-modules/lib.nix b/pkgs/development/beam-modules/lib.nix
index 2d0eef09563a..ae2705613f0c 100644
--- a/pkgs/development/beam-modules/lib.nix
+++ b/pkgs/development/beam-modules/lib.nix
@@ -2,20 +2,36 @@
 
 rec {
 
-  /* Uses generic-builder to evaluate provided drv containing OTP-version specific data.
+  /* Similar to callPackageWith/callPackage, but without makeOverridable
+  */
+  callPackageWith = autoArgs: fn: args:
+    let
+      f = if builtins.isFunction fn then fn else import fn;
+      auto = builtins.intersectAttrs (builtins.functionArgs f) autoArgs;
+    in f (auto // args);
+
+  callPackage = callPackageWith pkgs;
+
+  /* Uses generic-builder to evaluate provided drv containing OTP-version
+  specific data.
 
   drv: package containing version-specific args;
   builder: generic builder for all Erlang versions;
-  gargs: arguments passed to the generic-builder, used mostly to customize dependencies;
-  args: arguments merged into version-specific args, used mostly to enable/disable high-level OTP
-    features, like ODBC or WX support;
+  args: arguments merged into version-specific args, used mostly to customize
+        dependencies;
 
-  Please note that "mkDerivation" defined here is the one called from R16.nix and similar files.
+  Arguments passed to the generic-builder are overridable, used to
+  enable/disable high-level OTP features, like ODBC or WX support;
+
+  Please note that "mkDerivation" defined here is the one called from R16.nix
+  and similar files.
   */
-  callErlang = drv: gargs: args: pkgs.callPackage drv (
-    let builder = pkgs.callPackage ../../development/interpreters/erlang/generic-builder.nix gargs;
-    in {
-      mkDerivation = a: builder (a // args);
-    });
+  callErlang = drv: args:
+    let
+      builder = callPackage ../../development/interpreters/erlang/generic-builder.nix args;
+    in
+      callPackage drv {
+        mkDerivation = pkgs.makeOverridable builder;
+      };
 
 }
diff --git a/pkgs/top-level/beam-packages.nix b/pkgs/top-level/beam-packages.nix
index 94f3028ddb31..547e650a636d 100644
--- a/pkgs/top-level/beam-packages.nix
+++ b/pkgs/top-level/beam-packages.nix
@@ -12,54 +12,28 @@ rec {
     erlang_odbc_javac = erlangR18_odbc_javac;
 
     # These are standard Erlang versions, using the generic builder.
-    erlangR16 = lib.callErlang ../development/interpreters/erlang/R16.nix {} {};
-    erlangR16_odbc = lib.callErlang ../development/interpreters/erlang/R16.nix {} {
-      odbcSupport = true;
-    };
-    erlangR17 = lib.callErlang ../development/interpreters/erlang/R17.nix {} {};
-    erlangR17_odbc = lib.callErlang ../development/interpreters/erlang/R17.nix {} {
-      odbcSupport = true;
-    };
-    erlangR17_javac = lib.callErlang ../development/interpreters/erlang/R17.nix {} {
-      javacSupport = true;
-    };
-    erlangR17_odbc_javac = lib.callErlang ../development/interpreters/erlang/R17.nix {} {
+    erlangR16 = lib.callErlang ../development/interpreters/erlang/R16.nix {};
+    erlangR16_odbc = erlangR16.override { odbcSupport = true; };
+    erlangR17 = lib.callErlang ../development/interpreters/erlang/R17.nix {};
+    erlangR17_odbc = erlangR17.override { odbcSupport = true; };
+    erlangR17_javac = erlangR17.override { javacSupport = true; };
+    erlangR17_odbc_javac = erlangR17.override {
       javacSupport = true; odbcSupport = true;
     };
     erlangR18 = lib.callErlang ../development/interpreters/erlang/R18.nix {
       wxGTK = wxGTK30;
-    } {};
-    erlangR18_odbc = lib.callErlang ../development/interpreters/erlang/R18.nix {
-      wxGTK = wxGTK30;
-    } {
-      odbcSupport = true;
     };
-    erlangR18_javac = lib.callErlang ../development/interpreters/erlang/R18.nix {
-      wxGTK = wxGTK30;
-    } {
-      javacSupport = true;
-    };
-    erlangR18_odbc_javac = lib.callErlang ../development/interpreters/erlang/R18.nix {
-      wxGTK = wxGTK30;
-    } {
+    erlangR18_odbc = erlangR18.override { odbcSupport = true; };
+    erlangR18_javac = erlangR18.override { javacSupport = true; };
+    erlangR18_odbc_javac = erlangR18.override {
       javacSupport = true; odbcSupport = true;
     };
     erlangR19 = lib.callErlang ../development/interpreters/erlang/R19.nix {
       wxGTK = wxGTK30;
-    } {};
-    erlangR19_odbc = lib.callErlang ../development/interpreters/erlang/R19.nix {
-      wxGTK = wxGTK30;
-    } {
-      odbcSupport = true;
     };
-    erlangR19_javac = lib.callErlang ../development/interpreters/erlang/R19.nix {
-      wxGTK = wxGTK30;
-    } {
-      javacSupport = true;
-    };
-    erlangR19_odbc_javac = lib.callErlang ../development/interpreters/erlang/R19.nix {
-      wxGTK = wxGTK30;
-    } {
+    erlangR19_odbc = erlangR19.override { odbcSupport = true; };
+    erlangR19_javac = erlangR19.override { javacSupport = true; };
+    erlangR19_odbc_javac = erlangR19.override {
       javacSupport = true; odbcSupport = true;
     };
 

From c9cb6403d3c72b01aeccc537d1cbe7954aecf29b Mon Sep 17 00:00:00 2001
From: Gleb Peregud <gleber.p@gmail.com>
Date: Wed, 7 Jun 2017 23:21:14 +0200
Subject: [PATCH 4/4] erlang: move erlang_basho_R16B02 to Erlang's general
 builder.

---
 pkgs/development/interpreters/erlang/R16.nix  |  1 -
 .../interpreters/erlang/R16B02-8-basho.nix    | 74 ++++---------------
 pkgs/development/interpreters/erlang/R17.nix  |  1 -
 .../interpreters/erlang/generic-builder.nix   | 28 +++++--
 pkgs/top-level/beam-packages.nix              |  6 +-
 5 files changed, 36 insertions(+), 74 deletions(-)

diff --git a/pkgs/development/interpreters/erlang/R16.nix b/pkgs/development/interpreters/erlang/R16.nix
index 3ac37b5bde17..123d813fc77a 100644
--- a/pkgs/development/interpreters/erlang/R16.nix
+++ b/pkgs/development/interpreters/erlang/R16.nix
@@ -25,7 +25,6 @@ mkDerivation rec {
       sha256 = "17f3k5j17rdsah18gywjngip6cbfgp6nb9di6il4pahmf9yvqc8g";
     };
   in ''
-    ln -s $out/lib/erlang/lib/erl_interface*/bin/erl_call $out/bin/erl_call
     tar xf "${manpages}" -C "$out/lib/erlang"
     for i in "$out"/lib/erlang/man/man[0-9]/*.[0-9]; do
       prefix="''${i%/*}"
diff --git a/pkgs/development/interpreters/erlang/R16B02-8-basho.nix b/pkgs/development/interpreters/erlang/R16B02-8-basho.nix
index fe24ad64bf83..89c97f5a0eb7 100644
--- a/pkgs/development/interpreters/erlang/R16B02-8-basho.nix
+++ b/pkgs/development/interpreters/erlang/R16B02-8-basho.nix
@@ -1,76 +1,38 @@
-{ stdenv, fetchurl, fetchFromGitHub, perl, gnum4, ncurses, openssl, autoconf264, gcc, erlang
-, gnused, gawk, makeWrapper
-, odbcSupport ? false, unixODBC ? null
-, wxSupport ? false, mesa ? null, wxGTK ? null, xorg ? null
-, enableDebugInfo ? false
-, Carbon ? null, Cocoa ? null }:
+{ pkgs, mkDerivation }:
 
-assert wxSupport -> mesa != null && wxGTK != null && xorg != null;
-assert odbcSupport -> unixODBC != null;
-
-with stdenv.lib;
-
-stdenv.mkDerivation rec {
-  name = "erlang-basho-" + version + "${optionalString odbcSupport "-odbc"}";
+mkDerivation rec {
+  baseName = "erlang";
   version = "16B02";
 
-  src = fetchFromGitHub {
+  src = pkgs.fetchFromGitHub {
     owner = "basho";
     repo = "otp";
     rev = "OTP_R16B02_basho8";
     sha256 = "1w0hbm0axxxa45v3kl6bywc9ayir5vwqxjpnjlzc616ldszb2m0x";
   };
 
-  debugInfo = enableDebugInfo;
-
-  buildInputs =
-    [ perl gnum4 ncurses openssl makeWrapper autoconf264 gcc
-    ] ++ optional wxSupport [ mesa wxGTK xorg.libX11 ]
-      ++ optional odbcSupport [ unixODBC ]
-      ++ optionals stdenv.isDarwin [ Carbon Cocoa ];
-
-  # Clang 4 (rightfully) thinks signed comparisons of pointers with NULL are nonsense
-  prePatch = ''
-    substituteInPlace lib/wx/c_src/wxe_impl.cpp --replace 'temp > NULL' 'temp != NULL'
-  '';
-
-  patchPhase = '' sed -i "s@/bin/rm@rm@" lib/odbc/configure.in erts/configure.in '';
-
-  postPatch = ''
-    patchSheBangs make
-  '';
-
   preConfigure = ''
     export HOME=$PWD/../
     export LANG=C
     export ERL_TOP=$(pwd)
     sed -e s@/bin/pwd@pwd@g -i otp_build
-    sed -e s@"/usr/bin/env escript"@${erlang}/bin/escript@g -i lib/diameter/bin/diameterc
-  '';
+    sed -e s@"/usr/bin/env escript"@$(pwd)/bootstrap/bin/escript@g -i lib/diameter/bin/diameterc
 
-  configureFlags= [
-    "--with-ssl=${openssl.dev}"
-    "--enable-smp-support"
-    "--enable-threads"
-    "--enable-kernel-poll"
-    "--disable-hipe"
-    "${optionalString odbcSupport "--with-odbc=${unixODBC}"}"
-    "${optionalString stdenv.isDarwin "--enable-darwin-64bit"}"
-    "${optionalString stdenv.isLinux "--enable-m64-build"}"
-  ];
-
-  buildPhase = ''
     ./otp_build autoconf
-    ./otp_build setup -a --prefix=$out $configureFlags
   '';
 
+  enableHipe = false;
+
+  # Do not install docs, instead use prebuilt versions.
+  installTargets = "install";
   postInstall = let
-    manpages = fetchurl {
+    manpages = pkgs.fetchurl {
       url = "http://www.erlang.org/download/otp_doc_man_R${version}.tar.gz";
       sha256 = "12apxjmmd591y9g9bhr97z5jbd1jarqg7wj0y2sqhl21hc1yp75p";
     };
   in ''
-    ln -s $out/lib/erlang/lib/erl_interface*/bin/erl_call $out/bin/erl_call
+    sed -e s@$(pwd)/bootstrap/bin/escript@$out/bin/escript@g -i $out/lib/erlang/lib/diameter-1.4.3/bin/diameterc
+
     tar xf "${manpages}" -C "$out/lib/erlang"
     for i in "$out"/lib/erlang/man/man[0-9]/*.[0-9]; do
       prefix="''${i%/*}"
@@ -79,14 +41,6 @@ stdenv.mkDerivation rec {
     done
   '';
 
-  # Some erlang bin/ scripts run sed and awk
-  postFixup = ''
-    wrapProgram $out/lib/erlang/bin/erl --prefix PATH ":" "${gnused}/bin/"
-    wrapProgram $out/lib/erlang/bin/start_erl --prefix PATH ":" "${gnused}/bin/:${gawk}/bin"
-  '';
-
-  setupHook = ./setup-hook.sh;
-
   meta = {
     homepage = "https://github.com/basho/otp/";
     description = "Programming language used for massively scalable soft real-time systems, Basho fork";
@@ -103,7 +57,7 @@ stdenv.mkDerivation rec {
     '';
 
     platforms = ["x86_64-linux" "x86_64-darwin"];
-    license = stdenv.lib.licenses.asl20;
-    maintainers = with maintainers; [ mdaiter ];
+    license = pkgs.stdenv.lib.licenses.asl20;
+    maintainers = with pkgs.stdenv.lib.maintainers; [ mdaiter ];
   };
 }
diff --git a/pkgs/development/interpreters/erlang/R17.nix b/pkgs/development/interpreters/erlang/R17.nix
index 3d78c6ee242a..02d7513331eb 100644
--- a/pkgs/development/interpreters/erlang/R17.nix
+++ b/pkgs/development/interpreters/erlang/R17.nix
@@ -25,7 +25,6 @@ mkDerivation rec {
       sha256 = "1hspm285bl7i9a0d4r6j6lm5yk4sb5d9xzpia3simh0z06hv5cc5";
     };
   in ''
-    ln -s $out/lib/erlang/lib/erl_interface*/bin/erl_call $out/bin/erl_call
     tar xf "${manpages}" -C "$out/lib/erlang"
     for i in "$out"/lib/erlang/man/man[0-9]/*.[0-9]; do
       prefix="''${i%/*}"
diff --git a/pkgs/development/interpreters/erlang/generic-builder.nix b/pkgs/development/interpreters/erlang/generic-builder.nix
index 0127bb933c4a..3434603f3028 100644
--- a/pkgs/development/interpreters/erlang/generic-builder.nix
+++ b/pkgs/development/interpreters/erlang/generic-builder.nix
@@ -1,16 +1,20 @@
-{ pkgs, stdenv, fetchurl, fetchFromGitHub, makeWrapper, autoconf, gawk, gnum4, gnused
-, libxml2, libxslt, ncurses, openssl, perl
+{ pkgs, stdenv, fetchurl, fetchFromGitHub, makeWrapper, gawk, gnum4, gnused
+, libxml2, libxslt, ncurses, openssl, perl, gcc, autoreconfHook
 , openjdk ? null # javacSupport
 , unixODBC ? null # odbcSupport
 , mesa ? null, wxGTK ? null, wxmac ? null, xorg ? null # wxSupport
 }:
 
-{ version
+{ baseName ? "erlang"
+, version
 , sha256 ? null
 , rev ? "OTP-${version}"
 , src ? fetchFromGitHub { inherit rev sha256; owner = "erlang"; repo = "otp"; }
 , enableHipe ? true
 , enableDebugInfo ? false
+, enableThreads ? true
+, enableSmpSupport ? true
+, enableKernelPoll ? true
 , javacSupport ? false, javacPackages ? [ openjdk ]
 , odbcSupport ? false, odbcPackages ? [ unixODBC ]
 , wxSupport ? true, wxPackages ? [ mesa wxGTK xorg.libX11 ]
@@ -22,6 +26,7 @@
 , installTargets ? "install install-docs"
 , checkPhase ? "", preCheck ? "", postCheck ? ""
 , fixupPhase ? "", preFixup ? "", postFixup ? ""
+, meta ? null
 }:
 
 assert wxSupport -> (if stdenv.isDarwin
@@ -36,13 +41,15 @@ let
   wxPackages2 = if stdenv.isDarwin then [ wxmac ] else wxPackages;
 
 in stdenv.mkDerivation ({
-  name = "erlang-${version}"
+  name = "${baseName}-${version}"
     + optionalString javacSupport "-javac"
     + optionalString odbcSupport "-odbc";
 
   inherit src version;
 
-  buildInputs = [ perl gnum4 ncurses openssl autoconf libxslt libxml2 makeWrapper ]
+  buildInputs =
+   [ perl gnum4 ncurses openssl autoreconfHook libxslt libxml2 makeWrapper gcc
+   ]
     ++ optionals wxSupport wxPackages2
     ++ optionals odbcSupport odbcPackages
     ++ optionals javacSupport javacPackages
@@ -58,9 +65,9 @@ in stdenv.mkDerivation ({
   '';
 
   postPatch = ''
-    patchShebangs make
-
     ${postPatch}
+
+    patchShebangs make
   '';
 
   preConfigure = ''
@@ -68,6 +75,9 @@ in stdenv.mkDerivation ({
   '';
 
   configureFlags = [ "--with-ssl=${openssl.dev}" ]
+    ++ optional enableThreads "--enable-threads"
+    ++ optional enableSmpSupport "--enable-smp-support"
+    ++ optional enableKernelPoll "--enable-kernel-poll"
     ++ optional enableHipe "--enable-hipe"
     ++ optional javacSupport "--with-javac"
     ++ optional odbcSupport "--with-odbc=${unixODBC}"
@@ -78,6 +88,8 @@ in stdenv.mkDerivation ({
   # (PDFs are generated only when fop is available).
 
   postInstall = ''
+    ${postInstall}
+
     ln -s $out/lib/erlang/lib/erl_interface*/bin/erl_call $out/bin/erl_call
   '';
 
@@ -125,8 +137,8 @@ in stdenv.mkDerivation ({
 // optionalAttrs (installPhase != "")   { inherit installPhase; }
 // optionalAttrs (installTargets != "") { inherit installTargets; }
 // optionalAttrs (preInstall != "")     { inherit preInstall; }
-// optionalAttrs (postInstall != "")    { inherit postInstall; }
 // optionalAttrs (fixupPhase != "")     { inherit fixupPhase; }
 // optionalAttrs (preFixup != "")       { inherit preFixup; }
 // optionalAttrs (postFixup != "")      { inherit postFixup; }
+// optionalAttrs (meta != null)         { inherit meta; }
 )
diff --git a/pkgs/top-level/beam-packages.nix b/pkgs/top-level/beam-packages.nix
index 547e650a636d..3451816c0c5b 100644
--- a/pkgs/top-level/beam-packages.nix
+++ b/pkgs/top-level/beam-packages.nix
@@ -38,11 +38,9 @@ rec {
     };
 
     # Bash fork, using custom builder.
-    erlang_basho_R16B02 = callPackage ../development/interpreters/erlang/R16B02-8-basho.nix {
-      inherit (darwin.apple_sdk.frameworks) Carbon Cocoa;
+    erlang_basho_R16B02 = lib.callErlang ../development/interpreters/erlang/R16B02-8-basho.nix {
     };
-    erlang_basho_R16B02_odbc = callPackage ../development/interpreters/erlang/R16B02-8-basho.nix {
-      inherit (darwin.apple_sdk.frameworks) Carbon Cocoa;
+    erlang_basho_R16B02_odbc = erlang_basho_R16B02.override {
       odbcSupport = true;
     };