about summary refs log tree commit diff
path: root/nixpkgs/pkgs/development/beam-modules
diff options
context:
space:
mode:
Diffstat (limited to 'nixpkgs/pkgs/development/beam-modules')
-rw-r--r--nixpkgs/pkgs/development/beam-modules/build-erlang-mk.nix102
-rw-r--r--nixpkgs/pkgs/development/beam-modules/build-hex.nix20
-rw-r--r--nixpkgs/pkgs/development/beam-modules/build-mix.nix100
-rw-r--r--nixpkgs/pkgs/development/beam-modules/build-rebar3.nix94
-rw-r--r--nixpkgs/pkgs/development/beam-modules/default.nix82
-rw-r--r--nixpkgs/pkgs/development/beam-modules/fetch-hex.nix34
-rw-r--r--nixpkgs/pkgs/development/beam-modules/fetch-rebar-deps.nix33
-rw-r--r--nixpkgs/pkgs/development/beam-modules/hex/default.nix57
-rw-r--r--nixpkgs/pkgs/development/beam-modules/lib.nix79
-rwxr-xr-xnixpkgs/pkgs/development/beam-modules/mix-bootstrap108
-rw-r--r--nixpkgs/pkgs/development/beam-modules/pc/default.nix13
-rw-r--r--nixpkgs/pkgs/development/beam-modules/pgsql/default.nix34
-rw-r--r--nixpkgs/pkgs/development/beam-modules/rebar3-release.nix83
-rw-r--r--nixpkgs/pkgs/development/beam-modules/webdriver/default.nix40
14 files changed, 879 insertions, 0 deletions
diff --git a/nixpkgs/pkgs/development/beam-modules/build-erlang-mk.nix b/nixpkgs/pkgs/development/beam-modules/build-erlang-mk.nix
new file mode 100644
index 000000000000..c2d1ebabae27
--- /dev/null
+++ b/nixpkgs/pkgs/development/beam-modules/build-erlang-mk.nix
@@ -0,0 +1,102 @@
+{ stdenv, writeText, erlang, perl, which, gitMinimal, wget, lib }:
+
+{ name, version
+, src
+, setupHook ? null
+, buildInputs ? []
+, beamDeps ? []
+, postPatch ? ""
+, compilePorts ? false
+, installPhase ? null
+, buildPhase ? null
+, configurePhase ? null
+, meta ? {}
+, enableDebugInfo ? false
+, buildFlags ? []
+, ... }@attrs:
+
+with stdenv.lib;
+
+let
+  debugInfoFlag = lib.optionalString (enableDebugInfo || erlang.debugInfo) "+debug_info";
+
+  shell = drv: stdenv.mkDerivation {
+          name = "interactive-shell-${drv.name}";
+          buildInputs = [ drv ];
+    };
+
+  pkg = self: stdenv.mkDerivation ( attrs // {
+    app_name = name;
+    name = "${name}-${version}";
+    inherit version;
+
+    dontStrip = true;
+
+    inherit src;
+
+    setupHook = if setupHook == null
+    then writeText "setupHook.sh" ''
+       addToSearchPath ERL_LIBS "$1/lib/erlang/lib"
+    ''
+    else setupHook;
+
+    buildInputs = buildInputs ++ [ erlang perl which gitMinimal wget ];
+    propagatedBuildInputs = beamDeps;
+
+    buildFlags = [ "SKIP_DEPS=1" ]
+      ++ lib.optional (enableDebugInfo || erlang.debugInfo) ''ERL_OPTS="$ERL_OPTS +debug_info"''
+      ++ buildFlags;
+
+    configurePhase = if configurePhase == null
+    then ''
+      runHook preConfigure
+
+      # We shouldnt need to do this, but it seems at times there is a *.app in
+      # the repo/package. This ensures we start from a clean slate
+      make SKIP_DEPS=1 clean
+
+      runHook postConfigure
+    ''
+    else configurePhase;
+
+    buildPhase = if buildPhase == null
+    then ''
+        runHook preBuild
+
+        make $buildFlags "''${buildFlagsArray[@]}"
+
+        runHook postBuild
+    ''
+    else buildPhase;
+
+    installPhase =  if installPhase == null
+    then ''
+        runHook preInstall
+
+        mkdir -p $out/lib/erlang/lib/${name}
+        cp -r ebin $out/lib/erlang/lib/${name}/
+        cp -r src $out/lib/erlang/lib/${name}/
+
+        if [ -d include ]; then
+          cp -r include $out/lib/erlang/lib/${name}/
+        fi
+
+        if [ -d priv ]; then
+          cp -r priv $out/lib/erlang/lib/${name}/
+        fi
+
+        if [ -d doc ]; then
+          cp -r doc $out/lib/erlang/lib/${name}/
+        fi
+
+        runHook postInstall
+    ''
+    else installPhase;
+
+    passthru = {
+      packageName = name;
+      env = shell self;
+      inherit beamDeps;
+    };
+});
+in fix pkg
diff --git a/nixpkgs/pkgs/development/beam-modules/build-hex.nix b/nixpkgs/pkgs/development/beam-modules/build-hex.nix
new file mode 100644
index 000000000000..27ce64582f34
--- /dev/null
+++ b/nixpkgs/pkgs/development/beam-modules/build-hex.nix
@@ -0,0 +1,20 @@
+{ stdenv, buildRebar3, fetchHex }:
+
+{ name, version, sha256
+, builder ? buildRebar3
+, hexPkg ? name
+, ... }@attrs:
+
+with stdenv.lib;
+
+let
+  pkg = self: builder (attrs // {
+
+    src = fetchHex {
+      pkg = hexPkg;
+      inherit version;
+      inherit sha256;
+    };
+  });
+in
+  fix pkg
diff --git a/nixpkgs/pkgs/development/beam-modules/build-mix.nix b/nixpkgs/pkgs/development/beam-modules/build-mix.nix
new file mode 100644
index 000000000000..9aebad2dabf7
--- /dev/null
+++ b/nixpkgs/pkgs/development/beam-modules/build-mix.nix
@@ -0,0 +1,100 @@
+{ stdenv, writeText, elixir, erlang, hex, lib }:
+
+{ name
+, version
+, src
+, setupHook ? null
+, buildInputs ? []
+, beamDeps ? []
+, postPatch ? ""
+, compilePorts ? false
+, installPhase ? null
+, buildPhase ? null
+, configurePhase ? null
+, meta ? {}
+, enableDebugInfo ? false
+, ... }@attrs:
+
+with stdenv.lib;
+
+let
+
+  debugInfoFlag = lib.optionalString (enableDebugInfo || elixir.debugInfo) "--debug-info";
+
+  shell = drv: stdenv.mkDerivation {
+          name = "interactive-shell-${drv.name}";
+          buildInputs = [ drv ];
+    };
+
+  bootstrapper = ./mix-bootstrap;
+
+  pkg = self: stdenv.mkDerivation ( attrs // {
+    name = "${name}-${version}";
+    inherit version;
+
+    dontStrip = true;
+
+    inherit src;
+
+    setupHook = if setupHook == null
+    then writeText "setupHook.sh" ''
+       addToSearchPath ERL_LIBS "$1/lib/erlang/lib"
+    ''
+    else setupHook;
+
+    inherit buildInputs;
+    propagatedBuildInputs = [ hex elixir ] ++ beamDeps;
+
+    configurePhase = if configurePhase == null
+    then ''
+      runHook preConfigure
+      ${erlang}/bin/escript ${bootstrapper}
+      runHook postConfigure
+    ''
+    else configurePhase ;
+
+
+    buildPhase = if buildPhase == null
+    then ''
+        runHook preBuild
+
+        export HEX_OFFLINE=1
+        export HEX_HOME=`pwd`
+        export MIX_ENV=prod
+        export MIX_NO_DEPS=1
+
+        mix compile ${debugInfoFlag} --no-deps-check
+
+        runHook postBuild
+    ''
+    else buildPhase;
+
+    installPhase = if installPhase == null
+    then ''
+        runHook preInstall
+
+        MIXENV=prod
+
+        if [ -d "_build/shared" ]; then
+          MIXENV=shared
+        fi
+
+        mkdir -p "$out/lib/erlang/lib/${name}-${version}"
+        for reldir in src ebin priv include; do
+          fd="_build/$MIXENV/lib/${name}/$reldir"
+          [ -d "$fd" ] || continue
+          cp -Hrt "$out/lib/erlang/lib/${name}-${version}" "$fd"
+          success=1
+        done
+
+        runHook postInstall
+    ''
+    else installPhase;
+
+    passthru = {
+      packageName = name;
+      env = shell self;
+      inherit beamDeps;
+    };
+});
+in fix pkg
diff --git a/nixpkgs/pkgs/development/beam-modules/build-rebar3.nix b/nixpkgs/pkgs/development/beam-modules/build-rebar3.nix
new file mode 100644
index 000000000000..224d111026af
--- /dev/null
+++ b/nixpkgs/pkgs/development/beam-modules/build-rebar3.nix
@@ -0,0 +1,94 @@
+{ stdenv, writeText, erlang, rebar3, openssl, libyaml,
+  pc, lib }:
+
+{ name, version
+, src
+, setupHook ? null
+, buildInputs ? [], beamDeps ? [], buildPlugins ? []
+, postPatch ? ""
+, compilePorts ? false
+, installPhase ? null
+, buildPhase ? null
+, configurePhase ? null
+, meta ? {}
+, enableDebugInfo ? false
+, ... }@attrs:
+
+with stdenv.lib;
+
+let
+  debugInfoFlag = lib.optionalString (enableDebugInfo || erlang.debugInfo) "debug-info";
+
+  ownPlugins = buildPlugins ++ (if compilePorts then [pc] else []);
+
+  shell = drv: stdenv.mkDerivation {
+          name = "interactive-shell-${drv.name}";
+          buildInputs = [ drv ];
+    };
+
+  customPhases = filterAttrs
+    (_: v: v != null)
+    { inherit setupHook configurePhase buildPhase installPhase; };
+
+  pkg = self: stdenv.mkDerivation (attrs // {
+
+    name = "${name}-${version}";
+    inherit version;
+
+    buildInputs = buildInputs ++ [ erlang rebar3 openssl libyaml ];
+    propagatedBuildInputs = unique (beamDeps ++ ownPlugins);
+
+    dontStrip = true;
+    # The following are used by rebar3-nix-bootstrap
+    inherit compilePorts;
+    buildPlugins = ownPlugins;
+
+    inherit src;
+
+    setupHook = writeText "setupHook.sh" ''
+       addToSearchPath ERL_LIBS "$1/lib/erlang/lib/"
+    '';
+
+    postPatch = ''
+      rm -f rebar rebar3
+    '' + postPatch;
+
+    configurePhase = ''
+      runHook preConfigure
+      ${erlang}/bin/escript ${rebar3.bootstrapper} ${debugInfoFlag}
+      runHook postConfigure
+    '';
+
+    buildPhase = ''
+      runHook preBuild
+      HOME=. rebar3 compile
+      ${if compilePorts then ''
+        HOME=. rebar3 pc compile
+      '' else ''''}
+      runHook postBuild
+    '';
+
+    installPhase = ''
+      runHook preInstall
+      mkdir -p "$out/lib/erlang/lib/${name}-${version}"
+      for reldir in src ebin priv include; do
+        fd="_build/default/lib/${name}/$reldir"
+        [ -d "$fd" ] || continue
+        cp -Hrt "$out/lib/erlang/lib/${name}-${version}" "$fd"
+        success=1
+      done
+      runHook postInstall
+    '';
+
+    meta = {
+      inherit (erlang.meta) platforms;
+    } // meta;
+
+    passthru = {
+      packageName = name;
+      env = shell self;
+      inherit beamDeps;
+    };
+  } // customPhases);
+in
+  fix pkg
diff --git a/nixpkgs/pkgs/development/beam-modules/default.nix b/nixpkgs/pkgs/development/beam-modules/default.nix
new file mode 100644
index 000000000000..a5de4dfb3bba
--- /dev/null
+++ b/nixpkgs/pkgs/development/beam-modules/default.nix
@@ -0,0 +1,82 @@
+{ stdenv, pkgs, erlang }:
+
+let
+  inherit (stdenv.lib) makeExtensible;
+
+  lib = pkgs.callPackage ./lib.nix {};
+
+  # FIXME: add support for overrideScope
+  callPackageWithScope = scope: drv: args: stdenv.lib.callPackageWith scope drv args;
+  mkScope = scope: pkgs // scope;
+
+  packages = self:
+    let
+      defaultScope = mkScope self;
+      callPackage = drv: args: callPackageWithScope defaultScope drv args;
+    in
+      rec {
+        inherit callPackage erlang;
+        beamPackages = self;
+
+        rebar = callPackage ../tools/build-managers/rebar { };
+        rebar3 = callPackage ../tools/build-managers/rebar3 { };
+
+        # rebar3 port compiler plugin is required by buildRebar3
+        pc_1_6_0 = callPackage ./pc {};
+        pc = pc_1_6_0;
+
+        fetchHex = callPackage ./fetch-hex.nix { };
+
+        fetchRebar3Deps = callPackage ./fetch-rebar-deps.nix { };
+        rebar3Relx = callPackage ./rebar3-release.nix { };
+
+        buildRebar3 = callPackage ./build-rebar3.nix {};
+        buildHex = callPackage ./build-hex.nix {};
+        buildErlangMk = callPackage ./build-erlang-mk.nix {};
+        buildMix = callPackage ./build-mix.nix {};
+
+        # BEAM-based languages.
+        elixir = elixir_1_11;
+
+        elixir_1_11 = lib.callElixir ../interpreters/elixir/1.11.nix {
+          inherit erlang;
+          debugInfo = true;
+        };
+
+        elixir_1_10 = lib.callElixir ../interpreters/elixir/1.10.nix {
+          inherit erlang;
+          debugInfo = true;
+        };
+
+        elixir_1_9 = lib.callElixir ../interpreters/elixir/1.9.nix {
+          inherit erlang;
+          debugInfo = true;
+        };
+
+        elixir_1_8 = lib.callElixir ../interpreters/elixir/1.8.nix {
+          inherit erlang;
+          debugInfo = true;
+        };
+
+        elixir_1_7 = lib.callElixir ../interpreters/elixir/1.7.nix {
+          inherit erlang;
+          debugInfo = true;
+        };
+
+        # Remove old versions of elixir, when the supports fades out:
+        # https://hexdocs.pm/elixir/compatibility-and-deprecations.html
+
+        lfe = lfe_1_3;
+        lfe_1_2 = lib.callLFE ../interpreters/lfe/1.2.nix { inherit erlang buildRebar3 buildHex; };
+        lfe_1_3 = lib.callLFE ../interpreters/lfe/1.3.nix { inherit erlang buildRebar3 buildHex; };
+
+        # Non hex packages. Examples how to build Rebar/Mix packages with and
+        # without helper functions buildRebar3 and buildMix.
+        hex = callPackage ./hex {};
+        webdriver = callPackage ./webdriver {};
+        relxExe = callPackage ../tools/erlang/relx-exe {};
+
+        # An example of Erlang/C++ package.
+        cuter = callPackage ../tools/erlang/cuter {};
+      };
+in makeExtensible packages
diff --git a/nixpkgs/pkgs/development/beam-modules/fetch-hex.nix b/nixpkgs/pkgs/development/beam-modules/fetch-hex.nix
new file mode 100644
index 000000000000..c55a7a80ff39
--- /dev/null
+++ b/nixpkgs/pkgs/development/beam-modules/fetch-hex.nix
@@ -0,0 +1,34 @@
+{ stdenv, fetchurl }:
+
+{ pkg, version, sha256
+, meta ? {}
+}:
+
+with stdenv.lib;
+
+stdenv.mkDerivation ({
+  name = "hex-source-${pkg}-${version}";
+
+  src = fetchurl {
+    url = "https://repo.hex.pm/tarballs/${pkg}-${version}.tar";
+    inherit sha256;
+  };
+
+  phases = [ "unpackPhase" "installPhase" ];
+
+  unpackCmd = ''
+    tar -xf $curSrc contents.tar.gz
+    mkdir contents
+    tar -C contents -xzf contents.tar.gz
+  '';
+
+  installPhase = ''
+    runHook preInstall
+    mkdir "$out"
+    cp -Hrt "$out" .
+    success=1
+    runHook postInstall
+  '';
+
+  inherit meta;
+})
diff --git a/nixpkgs/pkgs/development/beam-modules/fetch-rebar-deps.nix b/nixpkgs/pkgs/development/beam-modules/fetch-rebar-deps.nix
new file mode 100644
index 000000000000..389e07beca6c
--- /dev/null
+++ b/nixpkgs/pkgs/development/beam-modules/fetch-rebar-deps.nix
@@ -0,0 +1,33 @@
+{ stdenv, rebar3 }:
+
+{ name, version, sha256, src
+, meta ? {}
+}:
+
+with stdenv.lib;
+
+stdenv.mkDerivation ({
+  name = "rebar-deps-${name}-${version}";
+
+  phases = [ "downloadPhase" "installPhase" ];
+
+  downloadPhase = ''
+    cp ${src} .
+    HOME='.' DEBUG=1 ${rebar3}/bin/rebar3 get-deps
+  '';
+
+  installPhase = ''
+    mkdir -p "$out/_checkouts"
+    for i in ./_build/default/lib/* ; do
+       echo "$i"
+       cp -R "$i" "$out/_checkouts"
+    done
+  '';
+
+  outputHashAlgo = "sha256";
+  outputHashMode = "recursive";
+  outputHash = sha256;
+
+  impureEnvVars = stdenv.lib.fetchers.proxyImpureEnvVars;
+  inherit meta;
+})
diff --git a/nixpkgs/pkgs/development/beam-modules/hex/default.nix b/nixpkgs/pkgs/development/beam-modules/hex/default.nix
new file mode 100644
index 000000000000..26070ce73bfa
--- /dev/null
+++ b/nixpkgs/pkgs/development/beam-modules/hex/default.nix
@@ -0,0 +1,57 @@
+{ stdenv, fetchFromGitHub, writeText, elixir }:
+
+let
+  shell = drv: stdenv.mkDerivation {
+    name = "interactive-shell-${drv.name}";
+    buildInputs = [ drv ];
+  };
+
+  pkg = self: stdenv.mkDerivation rec {
+    pname = "hex";
+    version = "0.20.5";
+
+    src = fetchFromGitHub {
+      owner = "hexpm";
+      repo = "hex";
+      rev = "v${version}";
+      sha256 = "1wz6n4qrmsb4kkww6lrdbs99xzwp4dyjjmr8m4drcwn3sd2k9ba6";
+    };
+
+    setupHook = writeText "setupHook.sh" ''
+       addToSearchPath ERL_LIBS "$1/lib/erlang/lib/"
+    '';
+
+    dontStrip = true;
+
+    buildInputs = [ elixir ];
+
+    buildPhase = ''
+      runHook preBuild
+      export HEX_OFFLINE=1
+      export HEX_HOME=./
+      export MIX_ENV=prod
+      mix compile
+      runHook postBuild
+    '';
+
+    installPhase = ''
+      runHook preInstall
+
+      mkdir -p $out/lib/erlang/lib
+      cp -r ./_build/prod/lib/hex $out/lib/erlang/lib/
+
+      runHook postInstall
+    '';
+
+    meta = {
+      description = "Package manager for the Erlang VM https://hex.pm";
+      license = stdenv.lib.licenses.mit;
+      homepage = "https://github.com/hexpm/hex";
+      maintainers = with stdenv.lib.maintainers; [ ericbmerritt ];
+    };
+
+    passthru = {
+      env = shell self;
+    };
+};
+in stdenv.lib.fix pkg
diff --git a/nixpkgs/pkgs/development/beam-modules/lib.nix b/nixpkgs/pkgs/development/beam-modules/lib.nix
new file mode 100644
index 000000000000..db40c47794fa
--- /dev/null
+++ b/nixpkgs/pkgs/development/beam-modules/lib.nix
@@ -0,0 +1,79 @@
+{ pkgs, stdenv }:
+
+rec {
+
+  /* Similar to callPackageWith/callPackage, but without makeOverridable
+  */
+  callPackageWith = autoArgs: fn: args:
+    let
+      f = if pkgs.lib.isFunction fn then fn else import fn;
+      auto = builtins.intersectAttrs (stdenv.lib.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;
+  args: arguments merged into version-specific args, used mostly to customize
+        dependencies;
+
+  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: args:
+    let
+      builder = callPackage ../../development/interpreters/erlang/generic-builder.nix args;
+    in
+      callPackage drv {
+        mkDerivation = pkgs.makeOverridable builder;
+      };
+
+  /* Uses generic-builder to evaluate provided drv containing Elixir version
+  specific data.
+
+  drv: package containing version-specific args;
+  builder: generic builder for all Erlang versions;
+  args: arguments merged into version-specific args, used mostly to customize
+        dependencies;
+
+  Arguments passed to the generic-builder are overridable.
+
+  Please note that "mkDerivation" defined here is the one called from 1.4.nix
+  and similar files.
+  */
+  callElixir = drv: args:
+    let
+      builder = callPackage ../interpreters/elixir/generic-builder.nix args;
+    in
+      callPackage drv {
+        mkDerivation = pkgs.makeOverridable builder;
+      };
+
+  /* Uses generic-builder to evaluate provided drv containing Elixir version
+  specific data.
+
+  drv: package containing version-specific args;
+  builder: generic builder for all Erlang versions;
+  args: arguments merged into version-specific args, used mostly to customize
+        dependencies;
+
+  Arguments passed to the generic-builder are overridable.
+
+  Please note that "mkDerivation" defined here is the one called from 1.2.nix
+  and similar files.
+  */
+  callLFE = drv: args:
+    let
+      builder = callPackage ../interpreters/lfe/generic-builder.nix args;
+    in
+      callPackage drv {
+        mkDerivation = pkgs.makeOverridable builder;
+      };
+
+}
diff --git a/nixpkgs/pkgs/development/beam-modules/mix-bootstrap b/nixpkgs/pkgs/development/beam-modules/mix-bootstrap
new file mode 100755
index 000000000000..7e31def71fa8
--- /dev/null
+++ b/nixpkgs/pkgs/development/beam-modules/mix-bootstrap
@@ -0,0 +1,108 @@
+#!/usr/bin/env escript
+%% -*- erlang-indent-level: 4;indent-tabs-mode: nil -*-
+%%! -smp enable
+%%% ---------------------------------------------------------------------------
+%%% @doc
+%%% The purpose of this command is to prepare a mix project so that mix
+%%% understands that the dependencies are all already installed. If you want a
+%%% hygienic build on nix then you must run this command before running mix. I
+%%% suggest that you add a `Makefile` to your project and have the bootstrap
+%%% command be a dependency of the build commands. See the nix documentation for
+%%% more information.
+%%%
+%%% This command designed to have as few dependencies as possible so that it can
+%%% be a dependency of root level packages like mix. To that end it does many
+%%% things in a fairly simplistic way. That is by design.
+%%%
+%%% ### Assumptions
+%%%
+%%% This command makes the following assumptions:
+%%%
+%%% * It is run in a nix-shell or nix-build environment
+%%% * that all dependencies have been added to the ERL_LIBS
+%%%   Environment Variable
+
+-record(data, {version
+              , erl_libs
+              , root
+              , name}).
+-define(LOCAL_HEX_REGISTRY, "registry.ets").
+
+main(Args) ->
+    {ok, RequiredData} = gather_required_data_from_the_environment(Args),
+    ok = bootstrap_libs(RequiredData).
+
+%% @doc
+%% This takes an app name in the standard OTP <name>-<version> format
+%% and returns just the app name. Why? Because rebar doesn't
+%% respect OTP conventions in some cases.
+-spec fixup_app_name(file:name()) -> string().
+fixup_app_name(Path) ->
+    BaseName = filename:basename(Path),
+    case string:split(BaseName, "-") of
+        [Name, _Version] -> Name;
+        Name -> Name
+    end.
+
+
+-spec gather_required_data_from_the_environment([string()]) -> {ok, #data{}}.
+gather_required_data_from_the_environment(_) ->
+    {ok, #data{ version = guard_env("version")
+              , erl_libs = os:getenv("ERL_LIBS", [])
+              , root = code:root_dir()
+              , name = guard_env("name")}}.
+
+-spec guard_env(string()) -> string().
+guard_env(Name) ->
+    case os:getenv(Name) of
+        false ->
+            stderr("Expected Environment variable ~s! Are you sure you are "
+                   "running in a Nix environment? Either a nix-build, "
+                   "nix-shell, etc?~n", [Name]),
+            erlang:halt(1);
+        Variable ->
+            Variable
+    end.
+
+-spec bootstrap_libs(#data{}) -> ok.
+bootstrap_libs(#data{erl_libs = ErlLibs}) ->
+    io:format("Bootstrapping dependent libraries~n"),
+    Target = "_build/prod/lib/",
+    Paths = string:tokens(ErlLibs, ":"),
+    CopiableFiles =
+        lists:foldl(fun(Path, Acc) ->
+                            gather_directory_contents(Path) ++ Acc
+                    end, [], Paths),
+    lists:foreach(fun (Path) ->
+                          ok = link_app(Path, Target)
+                  end, CopiableFiles).
+
+-spec gather_directory_contents(string()) -> [{string(), string()}].
+gather_directory_contents(Path) ->
+    {ok, Names} = file:list_dir(Path),
+    lists:map(fun(AppName) ->
+                 {filename:join(Path, AppName), fixup_app_name(AppName)}
+              end, Names).
+
+%% @doc
+%% Makes a symlink from the directory pointed at by Path to a
+%% directory of the same name in Target. So if we had a Path of
+%% {`foo/bar/baz/bash`, `baz`} and a Target of `faz/foo/foos`, the symlink
+%% would be `faz/foo/foos/baz`.
+-spec link_app({string(), string()}, string()) -> ok.
+link_app({Path, TargetFile}, TargetDir) ->
+    Target = filename:join(TargetDir, TargetFile),
+    ok = make_symlink(Path, Target).
+
+-spec make_symlink(string(), string()) -> ok.
+make_symlink(Path, TargetFile) ->
+    file:delete(TargetFile),
+    ok = filelib:ensure_dir(TargetFile),
+    io:format("Making symlink from ~s to ~s~n", [Path, TargetFile]),
+    ok = file:make_symlink(Path, TargetFile).
+
+%% @doc
+%% Write the result of the format string out to stderr.
+-spec stderr(string(), [term()]) -> ok.
+stderr(FormatStr, Args) ->
+    io:put_chars(standard_error, io_lib:format(FormatStr, Args)).
diff --git a/nixpkgs/pkgs/development/beam-modules/pc/default.nix b/nixpkgs/pkgs/development/beam-modules/pc/default.nix
new file mode 100644
index 000000000000..d30b0fbdbd28
--- /dev/null
+++ b/nixpkgs/pkgs/development/beam-modules/pc/default.nix
@@ -0,0 +1,13 @@
+{ stdenv, buildHex }:
+
+buildHex {
+  name = "pc";
+  version = "1.6.0";
+  sha256 = "0xq411ig5ny3iilkkkqa4vm3w3dgjc9cfzkqwk8pm13dw9mcm8h0";
+
+  meta = {
+    description = ''a rebar3 port compiler for native code'';
+    license = stdenv.lib.licenses.mit;
+    homepage = "https://github.com/blt/port_compiler";
+  };
+}
diff --git a/nixpkgs/pkgs/development/beam-modules/pgsql/default.nix b/nixpkgs/pkgs/development/beam-modules/pgsql/default.nix
new file mode 100644
index 000000000000..c7e7aee10019
--- /dev/null
+++ b/nixpkgs/pkgs/development/beam-modules/pgsql/default.nix
@@ -0,0 +1,34 @@
+{stdenv, fetchFromGitHub, buildRebar3 }:
+
+let
+  shell = drv: stdenv.mkDerivation {
+          name = "interactive-shell-${drv.name}";
+          buildInputs = [ drv ];
+    };
+
+  pkg = self: buildRebar3 {
+    name = "pgsql";
+    version = "25+beta.2";
+
+    src = fetchFromGitHub {
+        owner = "semiocast";
+        repo = "pgsql";
+        rev = "14f632bc89e464d82ce3ef12a67ed8c2adb5b60c";
+        sha256 = "17dcahiwlw61zhy8aq9rn46lwb35fb9q3372s4wmz01czm8c348w";
+    };
+
+    dontStrip = true;
+
+    meta = {
+      description = "Erlang PostgreSQL Driver";
+      license = stdenv.lib.licenses.mit;
+      homepage = "https://github.com/semiocast/pgsql";
+      maintainers = with stdenv.lib.maintainers; [ ericbmerritt ];
+    };
+
+    passthru = {
+      env = shell self;
+    };
+
+};
+in stdenv.lib.fix pkg
diff --git a/nixpkgs/pkgs/development/beam-modules/rebar3-release.nix b/nixpkgs/pkgs/development/beam-modules/rebar3-release.nix
new file mode 100644
index 000000000000..1ec9f244d6c1
--- /dev/null
+++ b/nixpkgs/pkgs/development/beam-modules/rebar3-release.nix
@@ -0,0 +1,83 @@
+{ stdenv, writeText, erlang, rebar3, openssl,
+  lib }:
+
+{ name, version
+, src
+, checkouts ? null
+, releaseType
+, buildInputs ? []
+, setupHook ? null
+, profile ? "default"
+, installPhase ? null
+, buildPhase ? null
+, configurePhase ? null
+, meta ? {}
+, enableDebugInfo ? false
+, ... }@attrs:
+
+with stdenv.lib;
+
+let
+  shell = drv: stdenv.mkDerivation {
+          name = "interactive-shell-${drv.name}";
+          buildInputs = [ drv ];
+    };
+
+  customPhases = filterAttrs
+    (_: v: v != null)
+    { inherit setupHook configurePhase buildPhase installPhase; };
+
+  pkg = self: stdenv.mkDerivation (attrs // {
+
+    name = "${name}-${version}";
+    inherit version;
+
+    buildInputs = buildInputs ++ [ erlang rebar3 openssl ];
+    propagatedBuildInputs = [checkouts];
+
+    dontStrip = true;
+
+    inherit src;
+
+    setupHook = writeText "setupHook.sh" ''
+       addToSearchPath ERL_LIBS "$1/lib/erlang/lib/"
+    '';
+
+    configurePhase = ''
+      runHook preConfigure
+      ${if checkouts != null then
+          ''cp --no-preserve=all -R ${checkouts}/_checkouts .''
+        else
+          ''''}
+      runHook postConfigure
+    '';
+
+    buildPhase = ''
+      runHook preBuild
+      HOME=. DEBUG=1 rebar3 as ${profile} ${if releaseType == "escript"
+                                            then '' escriptize''
+                                            else '' release''}
+      runHook postBuild
+    '';
+
+    installPhase = ''
+      runHook preInstall
+      dir=${if releaseType == "escript"
+            then ''bin''
+            else ''rel''}
+      mkdir -p "$out/$dir"
+      cp -R --preserve=mode "_build/${profile}/$dir" "$out"
+      runHook postInstall
+    '';
+
+    meta = {
+      inherit (erlang.meta) platforms;
+    } // meta;
+
+    passthru = {
+      packageName = name;
+      env = shell self;
+   };
+  } // customPhases);
+in
+  fix pkg
diff --git a/nixpkgs/pkgs/development/beam-modules/webdriver/default.nix b/nixpkgs/pkgs/development/beam-modules/webdriver/default.nix
new file mode 100644
index 000000000000..8f06f8ed7a85
--- /dev/null
+++ b/nixpkgs/pkgs/development/beam-modules/webdriver/default.nix
@@ -0,0 +1,40 @@
+{stdenv, fetchFromGitHub, writeText, erlang }:
+
+let
+  shell = drv: stdenv.mkDerivation {
+    name = "interactive-shell-${drv.name}";
+    buildInputs = [ drv ];
+  };
+
+  pkg = self: stdenv.mkDerivation {
+    name = "webdriver";
+    version = "0.0.0+build.18.7ceaf1f";
+
+    src = fetchFromGitHub {
+        owner = "Quviq";
+        repo = "webdrv";
+        rev = "7ceaf1f67d834e841ca0133b4bf899a9fa2db6bb";
+        sha256 = "1pq6pmlr6xb4hv2fvmlrvzd8c70kdcidlgjv4p8n9pwvkif0cb87";
+    };
+
+    setupHook = writeText "setupHook.sh" ''
+       addToSearchPath ERL_LIBS "$1/lib/erlang/lib/"
+    '';
+
+    buildInputs = [ erlang ];
+
+    installFlags = [ "PREFIX=$(out)/lib/erlang/lib" ];
+
+    meta = {
+      description = "WebDriver implementation in Erlang";
+      license = stdenv.lib.licenses.mit;
+      homepage = "https://github.com/Quviq/webdrv";
+      maintainers = with stdenv.lib.maintainers; [ ericbmerritt ];
+    };
+
+    passthru = {
+      env = shell self;
+    };
+
+};
+in stdenv.lib.fix pkg