From bcc4ca029adfbb0e21803cfcf50c8ee8000c422d Mon Sep 17 00:00:00 2001 From: Gleb Peregud Date: Sun, 6 Dec 2015 20:36:05 +0100 Subject: [PATCH 01/17] Add rebar3 package --- lib/maintainers.nix | 1 + .../tools/build-managers/rebar3/default.nix | 41 +++++++++++++++++++ pkgs/top-level/all-packages.nix | 1 + 3 files changed, 43 insertions(+) create mode 100644 pkgs/development/tools/build-managers/rebar3/default.nix diff --git a/lib/maintainers.nix b/lib/maintainers.nix index 596b8a49a10..2776f5837f3 100644 --- a/lib/maintainers.nix +++ b/lib/maintainers.nix @@ -119,6 +119,7 @@ gebner = "Gabriel Ebner "; gfxmonk = "Tim Cuthbertson "; giogadi = "Luis G. Torres "; + gleber = "Gleb Peregud "; globin = "Robin Gloster "; goibhniu = "Cillian de RĂ³iste "; gridaphobe = "Eric Seidel "; diff --git a/pkgs/development/tools/build-managers/rebar3/default.nix b/pkgs/development/tools/build-managers/rebar3/default.nix new file mode 100644 index 00000000000..2e75a12bbfc --- /dev/null +++ b/pkgs/development/tools/build-managers/rebar3/default.nix @@ -0,0 +1,41 @@ +{ stdenv, fetchurl, erlang }: + + +let + version = "3.0.0-beta.4"; +in +stdenv.mkDerivation { + name = "rebar3-${version}"; + + src = fetchurl { + url = "https://github.com/rebar/rebar3/archive/${version}.tar.gz"; + sha256 = "0px66scjdia9aaa5z36qzxb848r56m0k98g0bxw065a2narsh4xy"; + }; + + buildInputs = [ erlang ]; + + buildPhase = '' + HOME=. escript bootstrap + ''; + installPhase = '' + mkdir -p $out/bin + cp rebar3 $out/bin/rebar3 + ''; + + meta = { + homepage = "https://github.com/rebar/rebar3"; + description = "rebar 3.0 is an Erlang build tool that makes it easy to compile and test Erlang applications, port drivers and releases."; + + longDescription = '' + rebar is a self-contained Erlang script, so it's easy to distribute or + even embed directly in a project. Where possible, rebar uses standard + Erlang/OTP conventions for project structures, thus minimizing the amount + of build configuration work. rebar also provides dependency management, + enabling application writers to easily re-use common libraries from a + variety of locations (hex.pm, git, hg, and so on). + ''; + + platforms = stdenv.lib.platforms.unix; + maintainers = [ stdenv.lib.maintainers.gleber ]; + }; +} diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix index a88ed84b3fc..23dcf0c3b24 100644 --- a/pkgs/top-level/all-packages.nix +++ b/pkgs/top-level/all-packages.nix @@ -5019,6 +5019,7 @@ let erlang_odbc_javac = erlangR18_odbc_javac; rebar = callPackage ../development/tools/build-managers/rebar { }; + rebar3 = callPackage ../development/tools/build-managers/rebar3 { }; elixir = callPackage ../development/interpreters/elixir { }; From a05e2dbe6507820439ea647f4079790dae32f8d5 Mon Sep 17 00:00:00 2001 From: Gleb Peregud Date: Thu, 10 Dec 2015 00:12:37 +0100 Subject: [PATCH 02/17] Add few erlang modules --- .../erlang-modules/build-erlang.nix | 60 ++++++++++++++ pkgs/development/erlang-modules/build-hex.nix | 79 +++++++++++++++++++ pkgs/development/erlang-modules/default.nix | 38 +++++++++ .../erlang-modules/hex/goldrush.nix | 11 +++ .../erlang-modules/hex/ibrowse.nix | 10 +++ pkgs/development/erlang-modules/hex/jiffy.nix | 10 +++ pkgs/development/erlang-modules/hex/lager.nix | 12 +++ pkgs/development/erlang-modules/hex/meck.nix | 10 +++ pkgs/top-level/all-packages.nix | 2 + 9 files changed, 232 insertions(+) create mode 100644 pkgs/development/erlang-modules/build-erlang.nix create mode 100644 pkgs/development/erlang-modules/build-hex.nix create mode 100644 pkgs/development/erlang-modules/default.nix create mode 100644 pkgs/development/erlang-modules/hex/goldrush.nix create mode 100644 pkgs/development/erlang-modules/hex/ibrowse.nix create mode 100644 pkgs/development/erlang-modules/hex/jiffy.nix create mode 100644 pkgs/development/erlang-modules/hex/lager.nix create mode 100644 pkgs/development/erlang-modules/hex/meck.nix diff --git a/pkgs/development/erlang-modules/build-erlang.nix b/pkgs/development/erlang-modules/build-erlang.nix new file mode 100644 index 00000000000..fcb22a40193 --- /dev/null +++ b/pkgs/development/erlang-modules/build-erlang.nix @@ -0,0 +1,60 @@ +{ stdenv, erlang, rebar, openssl, libyaml }: + +{ name, version +, buildInputs ? [], erlangDeps ? [] +, postPatch ? "" +, ... }@attrs: + +with stdenv.lib; + +stdenv.mkDerivation (attrs // { + name = "${name}-${version}"; + + buildInputs = buildInputs ++ [ erlang rebar openssl libyaml ]; + + postPatch = '' + rm -f rebar + if [ -e "src/${name}.app.src" ]; then + sed -i -e 's/{ *vsn *,[^}]*}/{vsn, "${version}"}/' "src/${name}.app.src" + fi + ${postPatch} + ''; + + configurePhase = let + getDeps = drv: [drv] ++ (map getDeps drv.erlangDeps); + recursiveDeps = uniqList { + inputList = flatten (map getDeps erlangDeps); + }; + in '' + runHook preConfigure + ${concatMapStrings (dep: '' + header "linking erlang dependency ${dep}" + mkdir deps + ln -s "${dep}" "deps/${dep.packageName}" + stopNest + '') recursiveDeps} + runHook postConfigure + ''; + + buildPhase = '' + runHook preBuild + rebar compile + runHook postBuild + ''; + + installPhase = '' + runHook preInstall + for reldir in src ebin priv include; do + [ -e "$reldir" ] || continue + mkdir "$out" + cp -rt "$out" "$reldir" + success=1 + done + runHook postInstall + ''; + + passthru = { + packageName = name; + inherit erlangDeps; + }; +}) diff --git a/pkgs/development/erlang-modules/build-hex.nix b/pkgs/development/erlang-modules/build-hex.nix new file mode 100644 index 00000000000..03edaaf481c --- /dev/null +++ b/pkgs/development/erlang-modules/build-hex.nix @@ -0,0 +1,79 @@ +{ stdenv, erlang, rebar3, openssl, libyaml }: + +{ name, version +, buildInputs ? [], erlangDeps ? [] +, postPatch ? "" +, ... }@attrs: + +with stdenv.lib; + +stdenv.mkDerivation (attrs // { + name = "${name}-${version}"; + + buildInputs = buildInputs ++ [ erlang rebar3 openssl libyaml ]; + + postPatch = '' + rm -f rebar rebar3 + if [ -e "src/${name}.app.src" ]; then + sed -i -e 's/{ *vsn *,[^}]*}/{vsn, "${version}"}/' "src/${name}.app.src" + fi + ${postPatch} + ''; + + # unpackCmd = "(mkdir cron && cd cron && sh $curSrc)"; + unpackCmd = '' + tar -xf $curSrc contents.tar.gz + mkdir contents + tar -C contents -xzf contents.tar.gz + # rm -rf CHECKSUM contents.tar.gz metadata.config VERSION + ''; + + configurePhase = let + getDeps = drv: [drv] ++ (map getDeps drv.erlangDeps); + recursiveDeps = uniqList { + inputList = flatten (map getDeps erlangDeps); + }; + in '' + runHook preConfigure + mkdir -p _build/default/lib/ + ${concatMapStrings (dep: '' + header "linking erlang dependency ${dep}" + ln -s "${dep}" "_build/default/lib/${dep.packageName}" + stopNest + '') recursiveDeps} + ls -laR + cat rebar.config || true + cat rebar.lock || true + runHook postConfigure + ''; + + buildPhase = '' + runHook preBuild + DEBUG=1 HOME=. rebar3 update + DEBUG=1 HOME=. rebar3 compile + runHook postBuild + ''; + + installPhase = '' + ls -laR + runHook preInstall + mkdir "$out" + for reldir in src ebin priv include; do + fd="_build/default/lib/${name}/$reldir" + [ -d "$fd" ] || continue + cp -Hrt "$out" "$fd" + success=1 + done + runHook postInstall + ''; + + # src = fetchurl { + # url = "https://s3.amazonaws.com/s3.hex.pm/tarballs/${name}-${version}.tar"; + # sha256 = "1zjgbarclhh10cpgvfxikn9p2ay63rajq96q1sbz9r9w6v6p8jm9"; + # }; + + passthru = { + packageName = name; + inherit erlangDeps; + }; +}) diff --git a/pkgs/development/erlang-modules/default.nix b/pkgs/development/erlang-modules/default.nix new file mode 100644 index 00000000000..0dfe2472c38 --- /dev/null +++ b/pkgs/development/erlang-modules/default.nix @@ -0,0 +1,38 @@ +{ pkgs }: #? import {} }: + +let + callPackage = pkgs.lib.callPackageWith (pkgs // self); + + self = rec { + buildErlang = callPackage ./build-erlang.nix {}; + buildHex = callPackage ./build-hex.nix {}; + + # dependencies for ejabberd + p1_utils = callPackage ./hex/p1_utils.nix {}; + cache_tab = callPackage ./hex/cache_tab.nix {}; + stringprep = callPackage ./hex/stringprep.nix {}; + p1_xml = callPackage ./hex/p1_xml.nix {}; + p1_tls = callPackage ./hex/p1_tls.nix {}; + p1_stun = callPackage ./hex/p1_stun.nix {}; + esip = callPackage ./hex/esip.nix {}; + p1_yaml = callPackage ./hex/p1_yaml.nix {}; + xmlrpc = callPackage ./hex/xmlrpc.nix {}; + jiffy = callPackage ./hex/jiffy.nix {}; + sync = callPackage ./hex/sync.nix {}; + erlang-katana = callPackage ./hex/erlang-katana.nix {}; + eper = callPackage ./hex/eper.nix {}; + + goldrush = callPackage ./hex/goldrush.nix {}; + lager = callPackage ./hex/lager.nix {}; + getopt = callPackage ./hex/getopt.nix {}; + meck = callPackage ./hex/meck.nix {}; + ibrowse = callPackage ./hex/ibrowse.nix {}; + aleppo = callPackage ./hex/aleppo.nix {}; + zipper = callPackage ./hex/zipper.nix {}; + erlang-github = callPackage ./hex/erlang-github.nix {}; + + elvis = callPackage ./hex/elvis.nix {}; + apns = callPackage ./hex/apns.nix {}; + appmon = callPackage ./hex/appmon.nix {}; + }; +in self diff --git a/pkgs/development/erlang-modules/hex/goldrush.nix b/pkgs/development/erlang-modules/hex/goldrush.nix new file mode 100644 index 00000000000..ff4c5892ee9 --- /dev/null +++ b/pkgs/development/erlang-modules/hex/goldrush.nix @@ -0,0 +1,11 @@ +{ buildHex, fetchurl }: + +buildHex { + name = "goldrush"; + version = "0.1.7"; + src = fetchurl { + url = "https://s3.amazonaws.com/s3.hex.pm/tarballs/goldrush-0.1.7.tar"; + sha256 = "1zjgbarclhh10cpgvfxikn9p2ay63rajq96q1sbz9r9w6v6p8jm9"; + }; + +} diff --git a/pkgs/development/erlang-modules/hex/ibrowse.nix b/pkgs/development/erlang-modules/hex/ibrowse.nix new file mode 100644 index 00000000000..d742a8904ce --- /dev/null +++ b/pkgs/development/erlang-modules/hex/ibrowse.nix @@ -0,0 +1,10 @@ +{ buildErlang, fetchgit }: + +buildErlang { + name = "ibrowse"; + version = "0.1"; + src = fetchgit { + url = "git://github.com/cmullaparthi/ibrowse.git"; + sha256 = "1qvz4bmh307avjsxmhhdf35dd5wzmii0cbf6jyvvlhhkq4y0nmnj"; + }; +} \ No newline at end of file diff --git a/pkgs/development/erlang-modules/hex/jiffy.nix b/pkgs/development/erlang-modules/hex/jiffy.nix new file mode 100644 index 00000000000..762086da23f --- /dev/null +++ b/pkgs/development/erlang-modules/hex/jiffy.nix @@ -0,0 +1,10 @@ +{ buildErlang, fetchgit }: + +buildErlang { + name = "jiffy"; + version = "0.1"; + src = fetchgit { + url = "git://github.com/davisp/jiffy.git"; + sha256 = "02qb8m4s2p51m5f882ifsaph9fwx0bih37q5q90ba8cvsak65isx"; + }; +} \ No newline at end of file diff --git a/pkgs/development/erlang-modules/hex/lager.nix b/pkgs/development/erlang-modules/hex/lager.nix new file mode 100644 index 00000000000..c46c759b948 --- /dev/null +++ b/pkgs/development/erlang-modules/hex/lager.nix @@ -0,0 +1,12 @@ +{ buildHex, fetchurl, goldrush }: + +buildHex { + name = "lager"; + version = "3.0.2"; + src = fetchurl { + url = "https://s3.amazonaws.com/s3.hex.pm/tarballs/lager-3.0.2.tar"; + sha256 = "0051zj6wfmmvxjn9q0nw8wic13nhbrkyy50cg1lcpdh17qiknzsj"; + }; + + erlangDeps = [ goldrush ]; +} diff --git a/pkgs/development/erlang-modules/hex/meck.nix b/pkgs/development/erlang-modules/hex/meck.nix new file mode 100644 index 00000000000..a361147aab4 --- /dev/null +++ b/pkgs/development/erlang-modules/hex/meck.nix @@ -0,0 +1,10 @@ +{ buildErlang, fetchgit }: + +buildErlang { + name = "meck"; + version = "0.1"; + src = fetchgit { + url = "git://github.com/eproxus/meck.git"; + sha256 = "077p3v81mspy69247bz4apln3gp567m4xpmzxmdjd6pyh6m5ahpk"; + }; +} \ No newline at end of file diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix index 23dcf0c3b24..4f24112cf54 100644 --- a/pkgs/top-level/all-packages.nix +++ b/pkgs/top-level/all-packages.nix @@ -5021,6 +5021,8 @@ let rebar = callPackage ../development/tools/build-managers/rebar { }; rebar3 = callPackage ../development/tools/build-managers/rebar3 { }; + erlangPackages = callPackage ../development/erlang-modules { }; + elixir = callPackage ../development/interpreters/elixir { }; groovy = callPackage ../development/interpreters/groovy { }; From 6dcbe059e15c7d17da9f57e67c9fddc74b836230 Mon Sep 17 00:00:00 2001 From: Gleb Peregud Date: Thu, 10 Dec 2015 21:21:05 +0100 Subject: [PATCH 03/17] Automagically download files from hex.pm tarball S3 repo --- pkgs/development/erlang-modules/build-hex.nix | 18 ++++++------------ .../erlang-modules/hex/goldrush.nix | 6 +----- pkgs/development/erlang-modules/hex/lager.nix | 8 ++------ 3 files changed, 9 insertions(+), 23 deletions(-) diff --git a/pkgs/development/erlang-modules/build-hex.nix b/pkgs/development/erlang-modules/build-hex.nix index 03edaaf481c..f7fc4d8836d 100644 --- a/pkgs/development/erlang-modules/build-hex.nix +++ b/pkgs/development/erlang-modules/build-hex.nix @@ -1,6 +1,6 @@ -{ stdenv, erlang, rebar3, openssl, libyaml }: +{ stdenv, erlang, rebar3, openssl, libyaml, fetchurl }: -{ name, version +{ name, version, sha256 , buildInputs ? [], erlangDeps ? [] , postPatch ? "" , ... }@attrs: @@ -20,12 +20,10 @@ stdenv.mkDerivation (attrs // { ${postPatch} ''; - # unpackCmd = "(mkdir cron && cd cron && sh $curSrc)"; unpackCmd = '' tar -xf $curSrc contents.tar.gz mkdir contents tar -C contents -xzf contents.tar.gz - # rm -rf CHECKSUM contents.tar.gz metadata.config VERSION ''; configurePhase = let @@ -41,9 +39,6 @@ stdenv.mkDerivation (attrs // { ln -s "${dep}" "_build/default/lib/${dep.packageName}" stopNest '') recursiveDeps} - ls -laR - cat rebar.config || true - cat rebar.lock || true runHook postConfigure ''; @@ -55,7 +50,6 @@ stdenv.mkDerivation (attrs // { ''; installPhase = '' - ls -laR runHook preInstall mkdir "$out" for reldir in src ebin priv include; do @@ -67,10 +61,10 @@ stdenv.mkDerivation (attrs // { runHook postInstall ''; - # src = fetchurl { - # url = "https://s3.amazonaws.com/s3.hex.pm/tarballs/${name}-${version}.tar"; - # sha256 = "1zjgbarclhh10cpgvfxikn9p2ay63rajq96q1sbz9r9w6v6p8jm9"; - # }; + src = fetchurl { + url = "https://s3.amazonaws.com/s3.hex.pm/tarballs/${name}-${version}.tar"; + sha256 = sha256; + }; passthru = { packageName = name; diff --git a/pkgs/development/erlang-modules/hex/goldrush.nix b/pkgs/development/erlang-modules/hex/goldrush.nix index ff4c5892ee9..ddff7f6cc56 100644 --- a/pkgs/development/erlang-modules/hex/goldrush.nix +++ b/pkgs/development/erlang-modules/hex/goldrush.nix @@ -3,9 +3,5 @@ buildHex { name = "goldrush"; version = "0.1.7"; - src = fetchurl { - url = "https://s3.amazonaws.com/s3.hex.pm/tarballs/goldrush-0.1.7.tar"; - sha256 = "1zjgbarclhh10cpgvfxikn9p2ay63rajq96q1sbz9r9w6v6p8jm9"; - }; - + sha256 = "1zjgbarclhh10cpgvfxikn9p2ay63rajq96q1sbz9r9w6v6p8jm9"; } diff --git a/pkgs/development/erlang-modules/hex/lager.nix b/pkgs/development/erlang-modules/hex/lager.nix index c46c759b948..acfefd5757c 100644 --- a/pkgs/development/erlang-modules/hex/lager.nix +++ b/pkgs/development/erlang-modules/hex/lager.nix @@ -1,12 +1,8 @@ -{ buildHex, fetchurl, goldrush }: +{ buildHex, goldrush }: buildHex { name = "lager"; version = "3.0.2"; - src = fetchurl { - url = "https://s3.amazonaws.com/s3.hex.pm/tarballs/lager-3.0.2.tar"; - sha256 = "0051zj6wfmmvxjn9q0nw8wic13nhbrkyy50cg1lcpdh17qiknzsj"; - }; - + sha256 = "0051zj6wfmmvxjn9q0nw8wic13nhbrkyy50cg1lcpdh17qiknzsj"; erlangDeps = [ goldrush ]; } From 2251a942fce820b77ee03bdfd659e03c5711f578 Mon Sep 17 00:00:00 2001 From: Gleb Peregud Date: Thu, 10 Dec 2015 21:39:13 +0100 Subject: [PATCH 04/17] Add support for Hex package name There are some packages on Hex which have custom hex-specific names, but inside there's a base project name. Remove most packages andadd ibrowse, meck, jiffy --- pkgs/development/erlang-modules/build-hex.nix | 7 +++-- pkgs/development/erlang-modules/default.nix | 28 ++----------------- .../erlang-modules/hex/ibrowse.nix | 14 ++++------ pkgs/development/erlang-modules/hex/jiffy.nix | 14 ++++------ pkgs/development/erlang-modules/hex/meck.nix | 13 ++++----- 5 files changed, 24 insertions(+), 52 deletions(-) diff --git a/pkgs/development/erlang-modules/build-hex.nix b/pkgs/development/erlang-modules/build-hex.nix index f7fc4d8836d..d9191baeb81 100644 --- a/pkgs/development/erlang-modules/build-hex.nix +++ b/pkgs/development/erlang-modules/build-hex.nix @@ -1,6 +1,7 @@ { stdenv, erlang, rebar3, openssl, libyaml, fetchurl }: { name, version, sha256 +, hexPkg ? name , buildInputs ? [], erlangDeps ? [] , postPatch ? "" , ... }@attrs: @@ -44,8 +45,8 @@ stdenv.mkDerivation (attrs // { buildPhase = '' runHook preBuild - DEBUG=1 HOME=. rebar3 update - DEBUG=1 HOME=. rebar3 compile + HOME=. rebar3 update + HOME=. rebar3 compile runHook postBuild ''; @@ -62,7 +63,7 @@ stdenv.mkDerivation (attrs // { ''; src = fetchurl { - url = "https://s3.amazonaws.com/s3.hex.pm/tarballs/${name}-${version}.tar"; + url = "https://s3.amazonaws.com/s3.hex.pm/tarballs/${hexPkg}-${version}.tar"; sha256 = sha256; }; diff --git a/pkgs/development/erlang-modules/default.nix b/pkgs/development/erlang-modules/default.nix index 0dfe2472c38..87447220bb7 100644 --- a/pkgs/development/erlang-modules/default.nix +++ b/pkgs/development/erlang-modules/default.nix @@ -7,32 +7,10 @@ let buildErlang = callPackage ./build-erlang.nix {}; buildHex = callPackage ./build-hex.nix {}; - # dependencies for ejabberd - p1_utils = callPackage ./hex/p1_utils.nix {}; - cache_tab = callPackage ./hex/cache_tab.nix {}; - stringprep = callPackage ./hex/stringprep.nix {}; - p1_xml = callPackage ./hex/p1_xml.nix {}; - p1_tls = callPackage ./hex/p1_tls.nix {}; - p1_stun = callPackage ./hex/p1_stun.nix {}; - esip = callPackage ./hex/esip.nix {}; - p1_yaml = callPackage ./hex/p1_yaml.nix {}; - xmlrpc = callPackage ./hex/xmlrpc.nix {}; - jiffy = callPackage ./hex/jiffy.nix {}; - sync = callPackage ./hex/sync.nix {}; - erlang-katana = callPackage ./hex/erlang-katana.nix {}; - eper = callPackage ./hex/eper.nix {}; - goldrush = callPackage ./hex/goldrush.nix {}; - lager = callPackage ./hex/lager.nix {}; - getopt = callPackage ./hex/getopt.nix {}; - meck = callPackage ./hex/meck.nix {}; ibrowse = callPackage ./hex/ibrowse.nix {}; - aleppo = callPackage ./hex/aleppo.nix {}; - zipper = callPackage ./hex/zipper.nix {}; - erlang-github = callPackage ./hex/erlang-github.nix {}; - - elvis = callPackage ./hex/elvis.nix {}; - apns = callPackage ./hex/apns.nix {}; - appmon = callPackage ./hex/appmon.nix {}; + jiffy = callPackage ./hex/jiffy.nix {}; + lager = callPackage ./hex/lager.nix {}; + meck = callPackage ./hex/meck.nix {}; }; in self diff --git a/pkgs/development/erlang-modules/hex/ibrowse.nix b/pkgs/development/erlang-modules/hex/ibrowse.nix index d742a8904ce..6ed189eb39d 100644 --- a/pkgs/development/erlang-modules/hex/ibrowse.nix +++ b/pkgs/development/erlang-modules/hex/ibrowse.nix @@ -1,10 +1,8 @@ -{ buildErlang, fetchgit }: +{ buildHex }: -buildErlang { +buildHex { name = "ibrowse"; - version = "0.1"; - src = fetchgit { - url = "git://github.com/cmullaparthi/ibrowse.git"; - sha256 = "1qvz4bmh307avjsxmhhdf35dd5wzmii0cbf6jyvvlhhkq4y0nmnj"; - }; -} \ No newline at end of file + version = "4.2.2"; + sha256 = "1bn0645n95j5zypdsns1w4kgd3q9lz8fj898hg355j5w89scn05q"; +} + diff --git a/pkgs/development/erlang-modules/hex/jiffy.nix b/pkgs/development/erlang-modules/hex/jiffy.nix index 762086da23f..b9f92c888a4 100644 --- a/pkgs/development/erlang-modules/hex/jiffy.nix +++ b/pkgs/development/erlang-modules/hex/jiffy.nix @@ -1,10 +1,8 @@ -{ buildErlang, fetchgit }: +{ buildHex }: -buildErlang { +buildHex { name = "jiffy"; - version = "0.1"; - src = fetchgit { - url = "git://github.com/davisp/jiffy.git"; - sha256 = "02qb8m4s2p51m5f882ifsaph9fwx0bih37q5q90ba8cvsak65isx"; - }; -} \ No newline at end of file + version = "0.14.5"; + hexPkg = "barrel_jiffy"; + sha256 = "0iqz8bp0f672c5rfy5dpw9agv2708wzldd00ngbsffglpinlr1wa"; +} diff --git a/pkgs/development/erlang-modules/hex/meck.nix b/pkgs/development/erlang-modules/hex/meck.nix index a361147aab4..f0a4da5392c 100644 --- a/pkgs/development/erlang-modules/hex/meck.nix +++ b/pkgs/development/erlang-modules/hex/meck.nix @@ -1,10 +1,7 @@ -{ buildErlang, fetchgit }: +{ buildHex }: -buildErlang { +buildHex { name = "meck"; - version = "0.1"; - src = fetchgit { - url = "git://github.com/eproxus/meck.git"; - sha256 = "077p3v81mspy69247bz4apln3gp567m4xpmzxmdjd6pyh6m5ahpk"; - }; -} \ No newline at end of file + version = "0.8.3"; + sha256 = "1dh2rhks1xly4f49x89vbhsk8fgwkx5zqp0n98mnng8rs1rkigak"; +} From 406b974420a4faec0b2fb819b1be8344c02b76c8 Mon Sep 17 00:00:00 2001 From: Gleb Peregud Date: Thu, 10 Dec 2015 22:39:42 +0100 Subject: [PATCH 05/17] Add "compilePorts" enabling rebar3 "pc" plugin If compilePorts is enabled plugin "pc" is added to the rebar.config during postPatch. This makes rebar3 compile download the plugin, hence added TODO. --- pkgs/development/erlang-modules/build-hex.nix | 13 +++++++++++++ pkgs/development/erlang-modules/default.nix | 1 + pkgs/development/erlang-modules/hex/esqlite.nix | 8 ++++++++ 3 files changed, 22 insertions(+) create mode 100644 pkgs/development/erlang-modules/hex/esqlite.nix diff --git a/pkgs/development/erlang-modules/build-hex.nix b/pkgs/development/erlang-modules/build-hex.nix index d9191baeb81..d5c71f882ff 100644 --- a/pkgs/development/erlang-modules/build-hex.nix +++ b/pkgs/development/erlang-modules/build-hex.nix @@ -4,6 +4,7 @@ , hexPkg ? name , buildInputs ? [], erlangDeps ? [] , postPatch ? "" +, compilePorts ? false , ... }@attrs: with stdenv.lib; @@ -18,6 +19,16 @@ stdenv.mkDerivation (attrs // { if [ -e "src/${name}.app.src" ]; then sed -i -e 's/{ *vsn *,[^}]*}/{vsn, "${version}"}/' "src/${name}.app.src" fi + + # TODO: figure out how to provide 'pc' plugin hermetically + ${if compilePorts then '' + echo "{plugins, [pc]}. + {provider_hooks, + [{post, + [{compile, {pc, compile}}, + {clean, {pc, clean}}]}]}." >> rebar.config + '' else ''''} + ${postPatch} ''; @@ -43,6 +54,8 @@ stdenv.mkDerivation (attrs // { runHook postConfigure ''; + # TODO: figure out how to provide rebar3 a static registry snapshot to make + # this hermetic buildPhase = '' runHook preBuild HOME=. rebar3 update diff --git a/pkgs/development/erlang-modules/default.nix b/pkgs/development/erlang-modules/default.nix index 87447220bb7..8bcf0ddb6a1 100644 --- a/pkgs/development/erlang-modules/default.nix +++ b/pkgs/development/erlang-modules/default.nix @@ -7,6 +7,7 @@ let buildErlang = callPackage ./build-erlang.nix {}; buildHex = callPackage ./build-hex.nix {}; + esqlite = callPackage ./hex/esqlite.nix {}; goldrush = callPackage ./hex/goldrush.nix {}; ibrowse = callPackage ./hex/ibrowse.nix {}; jiffy = callPackage ./hex/jiffy.nix {}; diff --git a/pkgs/development/erlang-modules/hex/esqlite.nix b/pkgs/development/erlang-modules/hex/esqlite.nix new file mode 100644 index 00000000000..af7a1266712 --- /dev/null +++ b/pkgs/development/erlang-modules/hex/esqlite.nix @@ -0,0 +1,8 @@ +{ buildHex }: + +buildHex { + name = "esqlite"; + version = "0.2.1"; + sha256 = "1296fn1lz4lz4zqzn4dwc3flgkh0i6n4sydg501faabfbv8d3wkr"; + compilePorts = true; +} From eac25eaf69b8df9da28b1f94cb009320671ce32a Mon Sep 17 00:00:00 2001 From: Gleb Peregud Date: Thu, 10 Dec 2015 22:50:19 +0100 Subject: [PATCH 06/17] Simplify patch and move pc compile call into buildPhase --- pkgs/development/erlang-modules/build-hex.nix | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/pkgs/development/erlang-modules/build-hex.nix b/pkgs/development/erlang-modules/build-hex.nix index d5c71f882ff..f6b873f433a 100644 --- a/pkgs/development/erlang-modules/build-hex.nix +++ b/pkgs/development/erlang-modules/build-hex.nix @@ -22,11 +22,7 @@ stdenv.mkDerivation (attrs // { # TODO: figure out how to provide 'pc' plugin hermetically ${if compilePorts then '' - echo "{plugins, [pc]}. - {provider_hooks, - [{post, - [{compile, {pc, compile}}, - {clean, {pc, clean}}]}]}." >> rebar.config + echo "{plugins, [pc]}." >> rebar.config '' else ''''} ${postPatch} @@ -58,8 +54,8 @@ stdenv.mkDerivation (attrs // { # this hermetic buildPhase = '' runHook preBuild - HOME=. rebar3 update - HOME=. rebar3 compile + HOME=. rebar3 do update, compile + HOME=. rebar3 pc compile runHook postBuild ''; From 3a9110b15ccd0ab33e07147f443a63ac567a7681 Mon Sep 17 00:00:00 2001 From: Gleb Peregud Date: Thu, 10 Dec 2015 23:11:25 +0100 Subject: [PATCH 07/17] Add support for rebar3 plugins to buildHex. Allow specifying pluginDeps for buildHex listing rebar3 plugins which are required for given package to be built by rebar3. --- pkgs/development/erlang-modules/build-hex.nix | 14 ++++++++++++-- pkgs/development/erlang-modules/default.nix | 1 + pkgs/development/erlang-modules/hex/esqlite.nix | 3 ++- pkgs/development/erlang-modules/hex/rebar3-pc.nix | 7 +++++++ 4 files changed, 22 insertions(+), 3 deletions(-) create mode 100644 pkgs/development/erlang-modules/hex/rebar3-pc.nix diff --git a/pkgs/development/erlang-modules/build-hex.nix b/pkgs/development/erlang-modules/build-hex.nix index f6b873f433a..e664d357d85 100644 --- a/pkgs/development/erlang-modules/build-hex.nix +++ b/pkgs/development/erlang-modules/build-hex.nix @@ -2,7 +2,7 @@ { name, version, sha256 , hexPkg ? name -, buildInputs ? [], erlangDeps ? [] +, buildInputs ? [], erlangDeps ? [], pluginDeps ? [] , postPatch ? "" , compilePorts ? false , ... }@attrs: @@ -39,14 +39,22 @@ stdenv.mkDerivation (attrs // { recursiveDeps = uniqList { inputList = flatten (map getDeps erlangDeps); }; + recursivePluginsDeps = uniqList { + inputList = flatten (map getDeps pluginDeps); + }; in '' runHook preConfigure - mkdir -p _build/default/lib/ + mkdir -p _build/default/{lib,plugins}/ ${concatMapStrings (dep: '' header "linking erlang dependency ${dep}" ln -s "${dep}" "_build/default/lib/${dep.packageName}" stopNest '') recursiveDeps} + ${concatMapStrings (dep: '' + header "linking rebar3 plugins ${dep}" + ln -s "${dep}" "_build/default/plugins/${dep.packageName}" + stopNest + '') recursivePluginsDeps} runHook postConfigure ''; @@ -55,7 +63,9 @@ stdenv.mkDerivation (attrs // { buildPhase = '' runHook preBuild HOME=. rebar3 do update, compile + ${if compilePorts then '' HOME=. rebar3 pc compile + '' else ''''} runHook postBuild ''; diff --git a/pkgs/development/erlang-modules/default.nix b/pkgs/development/erlang-modules/default.nix index 8bcf0ddb6a1..84590e12a1c 100644 --- a/pkgs/development/erlang-modules/default.nix +++ b/pkgs/development/erlang-modules/default.nix @@ -7,6 +7,7 @@ let buildErlang = callPackage ./build-erlang.nix {}; buildHex = callPackage ./build-hex.nix {}; + rebar3-pc = callPackage ./hex/rebar3-pc.nix {}; esqlite = callPackage ./hex/esqlite.nix {}; goldrush = callPackage ./hex/goldrush.nix {}; ibrowse = callPackage ./hex/ibrowse.nix {}; diff --git a/pkgs/development/erlang-modules/hex/esqlite.nix b/pkgs/development/erlang-modules/hex/esqlite.nix index af7a1266712..7bcd69c0555 100644 --- a/pkgs/development/erlang-modules/hex/esqlite.nix +++ b/pkgs/development/erlang-modules/hex/esqlite.nix @@ -1,8 +1,9 @@ -{ buildHex }: +{ buildHex, rebar3-pc }: buildHex { name = "esqlite"; version = "0.2.1"; sha256 = "1296fn1lz4lz4zqzn4dwc3flgkh0i6n4sydg501faabfbv8d3wkr"; compilePorts = true; + pluginDeps = [ rebar3-pc ]; } diff --git a/pkgs/development/erlang-modules/hex/rebar3-pc.nix b/pkgs/development/erlang-modules/hex/rebar3-pc.nix new file mode 100644 index 00000000000..5bc45d3e3ab --- /dev/null +++ b/pkgs/development/erlang-modules/hex/rebar3-pc.nix @@ -0,0 +1,7 @@ +{ buildHex, goldrush }: + +buildHex { + name = "pc"; + version = "1.1.0"; + sha256 = "1br5xfl4b2z70b6a2ccxppn64jvkqgpmy4y9v81kxzb91z0ss9ma"; +} From 5d3680d26516b35a04cd02b6e95122c46bd243a5 Mon Sep 17 00:00:00 2001 From: Gleb Peregud Date: Fri, 11 Dec 2015 00:00:33 +0100 Subject: [PATCH 08/17] Fetch hex.pm registry snapshot with external github repo. This allows to avoid fetching registry file from S3 at build time, making the build hermetic and much faster. Automatic tools will be used to update said external repo content when Hex packages are imported/update. --- pkgs/development/erlang-modules/build-hex.nix | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/pkgs/development/erlang-modules/build-hex.nix b/pkgs/development/erlang-modules/build-hex.nix index e664d357d85..efeda1c6373 100644 --- a/pkgs/development/erlang-modules/build-hex.nix +++ b/pkgs/development/erlang-modules/build-hex.nix @@ -1,4 +1,4 @@ -{ stdenv, erlang, rebar3, openssl, libyaml, fetchurl }: +{ stdenv, erlang, rebar3, openssl, libyaml, fetchurl, fetchFromGitHub }: { name, version, sha256 , hexPkg ? name @@ -14,7 +14,14 @@ stdenv.mkDerivation (attrs // { buildInputs = buildInputs ++ [ erlang rebar3 openssl libyaml ]; - postPatch = '' + postPatch = let + registrySnapshot = fetchFromGitHub { + owner = "gleber"; + repo = "hex-pm-registry-snapshots"; + rev = "48147b0"; + sha256 = "0ibfnhrhbka4n6wkhs99fpy3sjab54ip37jgvx2hcfhfr4pxhbxw"; + }; + in '' rm -f rebar rebar3 if [ -e "src/${name}.app.src" ]; then sed -i -e 's/{ *vsn *,[^}]*}/{vsn, "${version}"}/' "src/${name}.app.src" @@ -25,6 +32,9 @@ stdenv.mkDerivation (attrs // { echo "{plugins, [pc]}." >> rebar.config '' else ''''} + mkdir -p _build/default/{lib,plugins}/ ./.cache/rebar3/hex/default/ + zcat ${registrySnapshot}/registry.ets.gz > .cache/rebar3/hex/default/registry + ${postPatch} ''; @@ -44,7 +54,6 @@ stdenv.mkDerivation (attrs // { }; in '' runHook preConfigure - mkdir -p _build/default/{lib,plugins}/ ${concatMapStrings (dep: '' header "linking erlang dependency ${dep}" ln -s "${dep}" "_build/default/lib/${dep.packageName}" @@ -62,7 +71,7 @@ stdenv.mkDerivation (attrs // { # this hermetic buildPhase = '' runHook preBuild - HOME=. rebar3 do update, compile + HOME=. rebar3 compile ${if compilePorts then '' HOME=. rebar3 pc compile '' else ''''} From 13a1ab440c6a1d6b16dd927339f305d3a53139fe Mon Sep 17 00:00:00 2001 From: Gleb Peregud Date: Sat, 12 Dec 2015 08:23:33 +0100 Subject: [PATCH 09/17] Replace deprecated uniqList with unique function --- pkgs/development/erlang-modules/build-hex.nix | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/pkgs/development/erlang-modules/build-hex.nix b/pkgs/development/erlang-modules/build-hex.nix index efeda1c6373..777a5c5047f 100644 --- a/pkgs/development/erlang-modules/build-hex.nix +++ b/pkgs/development/erlang-modules/build-hex.nix @@ -46,12 +46,8 @@ stdenv.mkDerivation (attrs // { configurePhase = let getDeps = drv: [drv] ++ (map getDeps drv.erlangDeps); - recursiveDeps = uniqList { - inputList = flatten (map getDeps erlangDeps); - }; - recursivePluginsDeps = uniqList { - inputList = flatten (map getDeps pluginDeps); - }; + recursiveDeps = unique (flatten (map getDeps erlangDeps)); + recursivePluginsDeps = unique (flatten (map getDeps pluginDeps)); in '' runHook preConfigure ${concatMapStrings (dep: '' From 7e57b20abc0f23c27eb7b315cb4bf0596160ab67 Mon Sep 17 00:00:00 2001 From: Gleb Peregud Date: Sat, 12 Dec 2015 08:54:57 +0100 Subject: [PATCH 10/17] Add rebar3-pc to plugin deps automatically if compilePorts is enabled --- pkgs/development/erlang-modules/build-hex.nix | 6 ++++-- pkgs/development/erlang-modules/hex/esqlite.nix | 1 - 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/pkgs/development/erlang-modules/build-hex.nix b/pkgs/development/erlang-modules/build-hex.nix index 777a5c5047f..6a1f4172bbd 100644 --- a/pkgs/development/erlang-modules/build-hex.nix +++ b/pkgs/development/erlang-modules/build-hex.nix @@ -1,4 +1,5 @@ -{ stdenv, erlang, rebar3, openssl, libyaml, fetchurl, fetchFromGitHub }: +{ stdenv, erlang, rebar3, openssl, libyaml, fetchurl, fetchFromGitHub, + rebar3-pc }: { name, version, sha256 , hexPkg ? name @@ -45,9 +46,10 @@ stdenv.mkDerivation (attrs // { ''; configurePhase = let + plugins = pluginDeps ++ (if compilePorts then [rebar3-pc] else []); getDeps = drv: [drv] ++ (map getDeps drv.erlangDeps); recursiveDeps = unique (flatten (map getDeps erlangDeps)); - recursivePluginsDeps = unique (flatten (map getDeps pluginDeps)); + recursivePluginsDeps = unique (flatten (map getDeps plugins)); in '' runHook preConfigure ${concatMapStrings (dep: '' diff --git a/pkgs/development/erlang-modules/hex/esqlite.nix b/pkgs/development/erlang-modules/hex/esqlite.nix index 7bcd69c0555..1fc3a2e91dc 100644 --- a/pkgs/development/erlang-modules/hex/esqlite.nix +++ b/pkgs/development/erlang-modules/hex/esqlite.nix @@ -5,5 +5,4 @@ buildHex { version = "0.2.1"; sha256 = "1296fn1lz4lz4zqzn4dwc3flgkh0i6n4sydg501faabfbv8d3wkr"; compilePorts = true; - pluginDeps = [ rebar3-pc ]; } From 2a7e77cac5497450eaf1712d906a2ac0a15c2d9b Mon Sep 17 00:00:00 2001 From: Gleb Peregud Date: Sat, 12 Dec 2015 14:36:45 +0100 Subject: [PATCH 11/17] Move registrySnapshot into it's own file for easier automation. --- pkgs/development/erlang-modules/build-hex.nix | 7 +------ pkgs/development/erlang-modules/registrySnapshot.nix | 8 ++++++++ 2 files changed, 9 insertions(+), 6 deletions(-) create mode 100644 pkgs/development/erlang-modules/registrySnapshot.nix diff --git a/pkgs/development/erlang-modules/build-hex.nix b/pkgs/development/erlang-modules/build-hex.nix index 6a1f4172bbd..6fd8983d411 100644 --- a/pkgs/development/erlang-modules/build-hex.nix +++ b/pkgs/development/erlang-modules/build-hex.nix @@ -16,12 +16,7 @@ stdenv.mkDerivation (attrs // { buildInputs = buildInputs ++ [ erlang rebar3 openssl libyaml ]; postPatch = let - registrySnapshot = fetchFromGitHub { - owner = "gleber"; - repo = "hex-pm-registry-snapshots"; - rev = "48147b0"; - sha256 = "0ibfnhrhbka4n6wkhs99fpy3sjab54ip37jgvx2hcfhfr4pxhbxw"; - }; + registrySnapshot = import ./registrySnapshot.nix { inherit fetchFromGitHub; }; in '' rm -f rebar rebar3 if [ -e "src/${name}.app.src" ]; then diff --git a/pkgs/development/erlang-modules/registrySnapshot.nix b/pkgs/development/erlang-modules/registrySnapshot.nix new file mode 100644 index 00000000000..cca3dd0c56b --- /dev/null +++ b/pkgs/development/erlang-modules/registrySnapshot.nix @@ -0,0 +1,8 @@ +{ fetchFromGitHub }: + +fetchFromGitHub { + owner = "gleber"; + repo = "hex-pm-registry-snapshots"; + rev = "48147b0"; + sha256 = "0ibfnhrhbka4n6wkhs99fpy3sjab54ip37jgvx2hcfhfr4pxhbxw"; +} From acaf2c179ee5884f330ad6acd5362377319cce87 Mon Sep 17 00:00:00 2001 From: Gleb Peregud Date: Sun, 13 Dec 2015 00:03:42 +0100 Subject: [PATCH 12/17] Allow specifying meta for buildHex and buildErlang. Adds "meta" for meck package as a test. --- pkgs/development/erlang-modules/build-erlang.nix | 5 +++++ pkgs/development/erlang-modules/build-hex.nix | 5 +++++ pkgs/development/erlang-modules/hex/meck.nix | 8 +++++++- 3 files changed, 17 insertions(+), 1 deletion(-) diff --git a/pkgs/development/erlang-modules/build-erlang.nix b/pkgs/development/erlang-modules/build-erlang.nix index fcb22a40193..19320f0394c 100644 --- a/pkgs/development/erlang-modules/build-erlang.nix +++ b/pkgs/development/erlang-modules/build-erlang.nix @@ -3,6 +3,7 @@ { name, version , buildInputs ? [], erlangDeps ? [] , postPatch ? "" +, meta ? {} , ... }@attrs: with stdenv.lib; @@ -53,6 +54,10 @@ stdenv.mkDerivation (attrs // { runHook postInstall ''; + meta = { + inherit (erlang.meta) platforms; + } // meta; + passthru = { packageName = name; inherit erlangDeps; diff --git a/pkgs/development/erlang-modules/build-hex.nix b/pkgs/development/erlang-modules/build-hex.nix index 6fd8983d411..a14cd3add55 100644 --- a/pkgs/development/erlang-modules/build-hex.nix +++ b/pkgs/development/erlang-modules/build-hex.nix @@ -6,6 +6,7 @@ , buildInputs ? [], erlangDeps ? [], pluginDeps ? [] , postPatch ? "" , compilePorts ? false +, meta ? {} , ... }@attrs: with stdenv.lib; @@ -88,6 +89,10 @@ stdenv.mkDerivation (attrs // { sha256 = sha256; }; + meta = { + inherit (erlang.meta) platforms; + } // meta; + passthru = { packageName = name; inherit erlangDeps; diff --git a/pkgs/development/erlang-modules/hex/meck.nix b/pkgs/development/erlang-modules/hex/meck.nix index f0a4da5392c..5af8a15a908 100644 --- a/pkgs/development/erlang-modules/hex/meck.nix +++ b/pkgs/development/erlang-modules/hex/meck.nix @@ -1,7 +1,13 @@ -{ buildHex }: +{ stdenv, buildHex }: buildHex { name = "meck"; version = "0.8.3"; sha256 = "1dh2rhks1xly4f49x89vbhsk8fgwkx5zqp0n98mnng8rs1rkigak"; + + meta = { + description = "A mocking framework for Erlang"; + homepage = "https://github.com/eproxus/meck"; + license = stdenv.lib.licenses.apsl20; + }; } From 033902d2694f957fee66b16c815869b187969e91 Mon Sep 17 00:00:00 2001 From: Gleb Peregud Date: Sun, 13 Dec 2015 23:12:08 +0100 Subject: [PATCH 13/17] Refactor fetchHex out of buildHex. This will allow to reuse this code to fetch rebar3's dependencies to ensure it's hermetic build. --- pkgs/development/erlang-modules/build-hex.nix | 19 ++++------- .../tools/build-managers/rebar3/fetch-hex.nix | 34 +++++++++++++++++++ pkgs/top-level/all-packages.nix | 1 + 3 files changed, 42 insertions(+), 12 deletions(-) create mode 100644 pkgs/development/tools/build-managers/rebar3/fetch-hex.nix diff --git a/pkgs/development/erlang-modules/build-hex.nix b/pkgs/development/erlang-modules/build-hex.nix index a14cd3add55..bb01c3fb505 100644 --- a/pkgs/development/erlang-modules/build-hex.nix +++ b/pkgs/development/erlang-modules/build-hex.nix @@ -1,4 +1,4 @@ -{ stdenv, erlang, rebar3, openssl, libyaml, fetchurl, fetchFromGitHub, +{ stdenv, erlang, rebar3, openssl, libyaml, fetchHex, fetchFromGitHub, rebar3-pc }: { name, version, sha256 @@ -16,6 +16,12 @@ stdenv.mkDerivation (attrs // { buildInputs = buildInputs ++ [ erlang rebar3 openssl libyaml ]; + src = fetchHex { + pkg = hexPkg; + inherit version; + inherit sha256; + }; + postPatch = let registrySnapshot = import ./registrySnapshot.nix { inherit fetchFromGitHub; }; in '' @@ -35,12 +41,6 @@ stdenv.mkDerivation (attrs // { ${postPatch} ''; - unpackCmd = '' - tar -xf $curSrc contents.tar.gz - mkdir contents - tar -C contents -xzf contents.tar.gz - ''; - configurePhase = let plugins = pluginDeps ++ (if compilePorts then [rebar3-pc] else []); getDeps = drv: [drv] ++ (map getDeps drv.erlangDeps); @@ -84,11 +84,6 @@ stdenv.mkDerivation (attrs // { runHook postInstall ''; - src = fetchurl { - url = "https://s3.amazonaws.com/s3.hex.pm/tarballs/${hexPkg}-${version}.tar"; - sha256 = sha256; - }; - meta = { inherit (erlang.meta) platforms; } // meta; diff --git a/pkgs/development/tools/build-managers/rebar3/fetch-hex.nix b/pkgs/development/tools/build-managers/rebar3/fetch-hex.nix new file mode 100644 index 00000000000..1b1378c10cb --- /dev/null +++ b/pkgs/development/tools/build-managers/rebar3/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://s3.amazonaws.com/s3.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/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix index 4f24112cf54..82a148bedcf 100644 --- a/pkgs/top-level/all-packages.nix +++ b/pkgs/top-level/all-packages.nix @@ -5020,6 +5020,7 @@ let rebar = callPackage ../development/tools/build-managers/rebar { }; rebar3 = callPackage ../development/tools/build-managers/rebar3 { }; + fetchHex = callPackage ../development/tools/build-managers/rebar3/fetch-hex.nix { }; erlangPackages = callPackage ../development/erlang-modules { }; From 4ba1a51b7ff8162a92f624e3ddc7ada21bd8289e Mon Sep 17 00:00:00 2001 From: Gleb Peregud Date: Sun, 13 Dec 2015 14:06:35 +0100 Subject: [PATCH 14/17] Move registry to rebar3, since it needs it itself to be bootstrapped. This makes rebar3 build a bit more hermetic. Next stage is to pull in rebar3 plugins dependencies for bootstrap to pick up. --- pkgs/development/erlang-modules/build-hex.nix | 10 ++-------- .../tools/build-managers/rebar3/default.nix | 10 +++++++++- .../build-managers/rebar3}/registrySnapshot.nix | 0 3 files changed, 11 insertions(+), 9 deletions(-) rename pkgs/development/{erlang-modules => tools/build-managers/rebar3}/registrySnapshot.nix (100%) diff --git a/pkgs/development/erlang-modules/build-hex.nix b/pkgs/development/erlang-modules/build-hex.nix index bb01c3fb505..041a7db48a9 100644 --- a/pkgs/development/erlang-modules/build-hex.nix +++ b/pkgs/development/erlang-modules/build-hex.nix @@ -22,21 +22,17 @@ stdenv.mkDerivation (attrs // { inherit sha256; }; - postPatch = let - registrySnapshot = import ./registrySnapshot.nix { inherit fetchFromGitHub; }; - in '' + postPatch = '' rm -f rebar rebar3 if [ -e "src/${name}.app.src" ]; then sed -i -e 's/{ *vsn *,[^}]*}/{vsn, "${version}"}/' "src/${name}.app.src" fi - # TODO: figure out how to provide 'pc' plugin hermetically ${if compilePorts then '' echo "{plugins, [pc]}." >> rebar.config '' else ''''} - mkdir -p _build/default/{lib,plugins}/ ./.cache/rebar3/hex/default/ - zcat ${registrySnapshot}/registry.ets.gz > .cache/rebar3/hex/default/registry + ${rebar3.setupRegistry} ${postPatch} ''; @@ -61,8 +57,6 @@ stdenv.mkDerivation (attrs // { runHook postConfigure ''; - # TODO: figure out how to provide rebar3 a static registry snapshot to make - # this hermetic buildPhase = '' runHook preBuild HOME=. rebar3 compile diff --git a/pkgs/development/tools/build-managers/rebar3/default.nix b/pkgs/development/tools/build-managers/rebar3/default.nix index 2e75a12bbfc..f905622413a 100644 --- a/pkgs/development/tools/build-managers/rebar3/default.nix +++ b/pkgs/development/tools/build-managers/rebar3/default.nix @@ -1,8 +1,13 @@ -{ stdenv, fetchurl, erlang }: +{ stdenv, fetchurl, erlang, tree, fetchFromGitHub }: let version = "3.0.0-beta.4"; + registrySnapshot = import ./registrySnapshot.nix { inherit fetchFromGitHub; }; + setupRegistry = '' + mkdir -p _build/default/{lib,plugins,packages}/ ./.cache/rebar3/hex/default/ + zcat ${registrySnapshot}/registry.ets.gz > .cache/rebar3/hex/default/registry + ''; in stdenv.mkDerivation { name = "rebar3-${version}"; @@ -13,8 +18,11 @@ stdenv.mkDerivation { }; buildInputs = [ erlang ]; + inherit setupRegistry; + buildPhase = '' + ${setupRegistry} HOME=. escript bootstrap ''; installPhase = '' diff --git a/pkgs/development/erlang-modules/registrySnapshot.nix b/pkgs/development/tools/build-managers/rebar3/registrySnapshot.nix similarity index 100% rename from pkgs/development/erlang-modules/registrySnapshot.nix rename to pkgs/development/tools/build-managers/rebar3/registrySnapshot.nix From 108f3cf67fee2a7c8fd52710b65f386f773499e0 Mon Sep 17 00:00:00 2001 From: Gleb Peregud Date: Sun, 13 Dec 2015 14:07:53 +0100 Subject: [PATCH 15/17] Add patch which makes rebar compilation hermetic --- .../tools/build-managers/rebar3/default.nix | 2 + .../rebar3/hermetic-bootstrap.patch | 78 +++++++++++++++++++ 2 files changed, 80 insertions(+) create mode 100644 pkgs/development/tools/build-managers/rebar3/hermetic-bootstrap.patch diff --git a/pkgs/development/tools/build-managers/rebar3/default.nix b/pkgs/development/tools/build-managers/rebar3/default.nix index f905622413a..841e0b71f42 100644 --- a/pkgs/development/tools/build-managers/rebar3/default.nix +++ b/pkgs/development/tools/build-managers/rebar3/default.nix @@ -17,6 +17,8 @@ stdenv.mkDerivation { sha256 = "0px66scjdia9aaa5z36qzxb848r56m0k98g0bxw065a2narsh4xy"; }; + patches = [ ./hermetic-bootstrap.patch ]; + buildInputs = [ erlang ]; inherit setupRegistry; diff --git a/pkgs/development/tools/build-managers/rebar3/hermetic-bootstrap.patch b/pkgs/development/tools/build-managers/rebar3/hermetic-bootstrap.patch new file mode 100644 index 00000000000..13d60fdcc91 --- /dev/null +++ b/pkgs/development/tools/build-managers/rebar3/hermetic-bootstrap.patch @@ -0,0 +1,78 @@ +diff --git a/bootstrap b/bootstrap +index 25bd658..b2a986b 100755 +--- a/bootstrap ++++ b/bootstrap +@@ -8,9 +8,6 @@ main(_Args) -> + application:start(asn1), + application:start(public_key), + application:start(ssl), +- inets:start(), +- inets:start(httpc, [{profile, rebar}]), +- set_httpc_options(), + + %% Fetch and build deps required to build rebar3 + BaseDeps = [{providers, []} +@@ -33,7 +30,6 @@ main(_Args) -> + + setup_env(), + os:putenv("REBAR_PROFILE", "bootstrap"), +- rebar3:run(["update"]), + {ok, State} = rebar3:run(["compile"]), + reset_env(), + os:putenv("REBAR_PROFILE", ""), +@@ -71,33 +67,7 @@ fetch_and_compile({Name, ErlFirstFiles}, Deps) -> + compile(Name, ErlFirstFiles). + + fetch({pkg, Name, Vsn}, App) -> +- Dir = filename:join([filename:absname("_build/default/lib/"), App]), +- CDN = "https://s3.amazonaws.com/s3.hex.pm/tarballs", +- Package = binary_to_list(<>), +- Url = string:join([CDN, Package], "/"), +- case request(Url) of +- {ok, Binary} -> +- {ok, Contents} = extract(Binary), +- ok = erl_tar:extract({binary, Contents}, [{cwd, Dir}, compressed]); +- _ -> +- io:format("Error: Unable to fetch package ~p ~p~n", [Name, Vsn]) +- end. +- +-extract(Binary) -> +- {ok, Files} = erl_tar:extract({binary, Binary}, [memory]), +- {"contents.tar.gz", Contents} = lists:keyfind("contents.tar.gz", 1, Files), +- {ok, Contents}. +- +-request(Url) -> +- case httpc:request(get, {Url, []}, +- [{relaxed, true}], +- [{body_format, binary}], +- rebar) of +- {ok, {{_Version, 200, _Reason}, _Headers, Body}} -> +- {ok, Body}; +- Error -> +- Error +- end. ++ ok. + + get_rebar_config() -> + {ok, [[Home]]} = init:get_argument(home), +@@ -109,20 +79,6 @@ get_rebar_config() -> + [] + end. + +-get_http_vars(Scheme) -> +- proplists:get_value(Scheme, get_rebar_config(), []). +- +-set_httpc_options() -> +- set_httpc_options(https_proxy, get_http_vars(https_proxy)), +- set_httpc_options(proxy, get_http_vars(http_proxy)). +- +-set_httpc_options(_, []) -> +- ok; +- +-set_httpc_options(Scheme, Proxy) -> +- {ok, {_, _, Host, Port, _, _}} = http_uri:parse(Proxy), +- httpc:set_options([{Scheme, {{Host, Port}, []}}], rebar). +- + compile(App, FirstFiles) -> + Dir = filename:join(filename:absname("_build/default/lib/"), App), + filelib:ensure_dir(filename:join([Dir, "ebin", "dummy.beam"])), From 474da3bf244603d3ad51fb460a9cd07cdbd53b46 Mon Sep 17 00:00:00 2001 From: Gleb Peregud Date: Tue, 15 Dec 2015 00:03:05 +0100 Subject: [PATCH 16/17] Add sources of specific rebar bootstrap deps via new fetchHex derivation. --- .../tools/build-managers/rebar3/default.nix | 84 ++++++++++++++++++- 1 file changed, 81 insertions(+), 3 deletions(-) diff --git a/pkgs/development/tools/build-managers/rebar3/default.nix b/pkgs/development/tools/build-managers/rebar3/default.nix index 841e0b71f42..c4e256d5873 100644 --- a/pkgs/development/tools/build-managers/rebar3/default.nix +++ b/pkgs/development/tools/build-managers/rebar3/default.nix @@ -1,4 +1,4 @@ -{ stdenv, fetchurl, erlang, tree, fetchFromGitHub }: +{ stdenv, fetchurl, fetchHex, erlang, tree, fetchFromGitHub }: let @@ -8,6 +8,68 @@ let mkdir -p _build/default/{lib,plugins,packages}/ ./.cache/rebar3/hex/default/ zcat ${registrySnapshot}/registry.ets.gz > .cache/rebar3/hex/default/registry ''; + # TODO: all these below probably should go into nixpkgs.erlangModules.sources.* + # {erlware_commons, "0.16.0"}, + erlware_commons = fetchHex { + pkg = "erlware_commons"; + version = "0.16.0"; + sha256 = "0kh24d0001390wfx28d0xa874vrsfvjgj41g315vg4hac632krxx"; + }; + # {ssl_verify_hostname, "1.0.5"}, + ssl_verify_hostname = fetchHex { + pkg = "ssl_verify_hostname"; + version = "1.0.5"; + sha256 = "1gzavzqzljywx4l59gvhkjbr1dip4kxzjjz1s4wsn42f2kk13jzj"; + }; + # {certifi, "0.1.1"}, + certifi = fetchHex { + pkg = "certifi"; + version = "0.1.1"; + sha256 = "0afylwqg74gprbg116asz0my2nipmki0512c8mdiq6xdiyjdvlg6"; + }; + # {providers, "1.5.0"}, + providers = fetchHex { + pkg = "providers"; + version = "1.5.0"; + sha256 = "1hc8sp2l1mmx9dfpmh1f8j9hayfg7541rmx05wb9cmvxvih7zyvf"; + }; + # {getopt, "0.8.2"}, + getopt = fetchHex { + pkg = "getopt"; + version = "0.8.2"; + sha256 = "1xw30h59zbw957cyjd8n50hf9y09jnv9dyry6x3avfwzcyrnsvkk"; + }; + # {bbmustache, "1.0.4"}, + bbmustache = fetchHex { + pkg = "bbmustache"; + version = "1.0.4"; + sha256 = "04lvwm7f78x8bys0js33higswjkyimbygp4n72cxz1kfnryx9c03"; + }; + # {relx, "3.8.0"}, + relx = fetchHex { + pkg = "relx"; + version = "3.8.0"; + sha256 = "0y89iirjz3kc1rzkdvc6p3ssmwcm2hqgkklhgm4pkbc14fcz57hq"; + }; + # {cf, "0.2.1"}, + cf = fetchHex { + pkg = "cf"; + version = "0.2.1"; + sha256 = "19d0yvg8wwa57cqhn3vqfvw978nafw8j2rvb92s3ryidxjkrmvms"; + }; + # {cth_readable, "1.1.0"}, + cth_readable = fetchHex { + pkg = "cth_readable"; + version = "1.0.1"; + sha256 = "1cnc4fbypckqllfi5h73rdb24dz576k3177gzvp1kbymwkp1xcz1"; + }; + # {eunit_formatters, "0.2.0"} + eunit_formatters = fetchHex { + pkg = "eunit_formatters"; + version = "0.2.0"; + sha256 = "03kiszlbgzscfd2ns7na6bzbfzmcqdb5cx3p6qy3657jk2fai332"; + }; + in stdenv.mkDerivation { name = "rebar3-${version}"; @@ -19,12 +81,28 @@ stdenv.mkDerivation { patches = [ ./hermetic-bootstrap.patch ]; - buildInputs = [ erlang ]; + buildInputs = [ erlang + tree + ]; inherit setupRegistry; + postPatch = '' + echo postPatch + ${setupRegistry} + mkdir -p _build/default/lib/ + cp --no-preserve=mode -R ${erlware_commons} _build/default/lib/erlware_commons + cp --no-preserve=mode -R ${providers} _build/default/lib/providers + cp --no-preserve=mode -R ${getopt} _build/default/lib/getopt + cp --no-preserve=mode -R ${bbmustache} _build/default/lib/bbmustache + cp --no-preserve=mode -R ${certifi} _build/default/lib/certifi + cp --no-preserve=mode -R ${cf} _build/default/lib/cf + cp --no-preserve=mode -R ${cth_readable} _build/default/lib/cth_readable + cp --no-preserve=mode -R ${eunit_formatters} _build/default/lib/eunit_formatters + cp --no-preserve=mode -R ${relx} _build/default/lib/relx + cp --no-preserve=mode -R ${ssl_verify_hostname} _build/default/lib/ssl_verify_hostname + ''; buildPhase = '' - ${setupRegistry} HOME=. escript bootstrap ''; installPhase = '' From bb1b5c71948e32c8cd64bfa5ca6d497602dce516 Mon Sep 17 00:00:00 2001 From: Gleb Peregud Date: Tue, 15 Dec 2015 00:53:41 +0100 Subject: [PATCH 17/17] Update hex.pm registry --- .../tools/build-managers/rebar3/registrySnapshot.nix | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkgs/development/tools/build-managers/rebar3/registrySnapshot.nix b/pkgs/development/tools/build-managers/rebar3/registrySnapshot.nix index cca3dd0c56b..8e9c2a292fd 100644 --- a/pkgs/development/tools/build-managers/rebar3/registrySnapshot.nix +++ b/pkgs/development/tools/build-managers/rebar3/registrySnapshot.nix @@ -3,6 +3,6 @@ fetchFromGitHub { owner = "gleber"; repo = "hex-pm-registry-snapshots"; - rev = "48147b0"; - sha256 = "0ibfnhrhbka4n6wkhs99fpy3sjab54ip37jgvx2hcfhfr4pxhbxw"; + rev = "329ae2b"; + sha256 = "1rs3z8psfvy10mzlfvkdzbflgikcnq08r38kfi0f8p5wvi8f8hmh"; }