Elm: automate packaging with elm2nix
- rewrite documentation - automate whole process into update.sh - remove all legacy snippets
This commit is contained in:
parent
24d1d6cf9d
commit
6da4584acf
9 changed files with 104 additions and 140 deletions
|
@ -307,23 +307,19 @@ packageOverrides = pkgs: {
|
|||
</screen>
|
||||
</para>
|
||||
</section>
|
||||
|
||||
<section xml:id="sec-elm">
|
||||
<title>Elm</title>
|
||||
|
||||
<para>
|
||||
The Nix expressions for Elm reside in
|
||||
<filename>pkgs/development/compilers/elm</filename>. They are generated
|
||||
automatically by <command>update-elm.rb</command> script. One should specify
|
||||
versions of Elm packages inside the script, clear the
|
||||
<filename>packages</filename> directory and run the script from inside it.
|
||||
<literal>elm-reactor</literal> is special because it also has Elm package
|
||||
dependencies. The process is not automated very much for now -- you should
|
||||
get the <literal>elm-reactor</literal> source tree (e.g. with
|
||||
<command>nix-shell</command>) and run <command>elm2nix.rb</command> inside
|
||||
it. Place the resulting <filename>package.nix</filename> file into
|
||||
<filename>packages/elm-reactor-elm.nix</filename>.
|
||||
To update Elm compiler, see <filename>nixpkgs/pkgs/development/compilers/elm/README.md</filename>.
|
||||
</para>
|
||||
|
||||
<para>
|
||||
To package Elm applications, <link xlink:href="https://github.com/hercules-ci/elm2nix#elm2nix">read about elm2nix</link>.
|
||||
</para>
|
||||
</section>
|
||||
|
||||
<section xml:id="sec-shell-helpers">
|
||||
<title>Interactive shell helpers</title>
|
||||
|
||||
|
|
24
pkgs/development/compilers/elm/README.md
Normal file
24
pkgs/development/compilers/elm/README.md
Normal file
|
@ -0,0 +1,24 @@
|
|||
# To update Elm:
|
||||
|
||||
Modify revision in ./update.sh and run it
|
||||
|
||||
# Notes about the build process:
|
||||
|
||||
The elm binary embeds a piece of pre-compiled elm code, used by 'elm
|
||||
reactor'. This means that the build process for 'elm' effectively
|
||||
executes 'elm make'. that in turn expects to retrieve the elm
|
||||
dependencies of that code (elm/core, etc.) from
|
||||
package.elm-lang.org, as well as a cached bit of metadata
|
||||
(versions.dat).
|
||||
|
||||
The makeDotElm function lets us retrieve these dependencies in the
|
||||
standard nix way. we have to copy them in (rather than symlink) and
|
||||
make them writable because the elm compiler writes other .dat files
|
||||
alongside the source code. versions.dat was produced during an
|
||||
impure build of this same code; the build complains that it can't
|
||||
update this cache, but continues past that warning.
|
||||
|
||||
Finally, we set ELM_HOME to point to these pre-fetched artifacts so
|
||||
that the default of ~/.elm isn't used.
|
||||
|
||||
More: https://blog.hercules-ci.com/elm/2019/01/03/elm2nix-0.1/
|
|
@ -2,54 +2,6 @@
|
|||
, haskell, nodejs
|
||||
, fetchurl, fetchpatch, makeWrapper, git }:
|
||||
|
||||
# To update:
|
||||
|
||||
# 1) Modify ./update.sh and run it
|
||||
|
||||
# 2) to generate versions.dat:
|
||||
# 2.1) git clone https://github.com/elm/compiler.git
|
||||
# 2.2) cd compiler
|
||||
# 2.3) cabal2nix --shell . | sed 's/"default",/"ghc822",/' > shell.nix
|
||||
# 2.4) nix-shell
|
||||
# 2.5) mkdir .elm
|
||||
# 2.6) export ELM_HOME=$(pwd)/.elm
|
||||
# 2.7) cabal build
|
||||
# 2.8) cp .elm/0.19.0/package/versions.dat ...
|
||||
|
||||
# 3) generate a template for elm-elm.nix with:
|
||||
# (
|
||||
# echo "{";
|
||||
# jq '.dependencies | .direct, .indirect | to_entries | .[] | { (.key) : { version : .value, sha256: "" } } ' \
|
||||
# < ui/browser/elm.json \
|
||||
# | sed 's/:/ =/' \
|
||||
# | sed 's/^[{}]//' \
|
||||
# | sed -E 's/(["}]),?$/\1;/' \
|
||||
# | sed -E 's/"(version|sha256)"/\1/' \
|
||||
# | grep -v '^$';
|
||||
# echo "}"
|
||||
# )
|
||||
#
|
||||
# ... then fill in the sha256s
|
||||
|
||||
# Notes:
|
||||
|
||||
# the elm binary embeds a piece of pre-compiled elm code, used by 'elm
|
||||
# reactor'. this means that the build process for 'elm' effectively
|
||||
# executes 'elm make'. that in turn expects to retrieve the elm
|
||||
# dependencies of that code (elm/core, etc.) from
|
||||
# package.elm-lang.org, as well as a cached bit of metadata
|
||||
# (versions.dat).
|
||||
|
||||
# the makeDotElm function lets us retrieve these dependencies in the
|
||||
# standard nix way. we have to copy them in (rather than symlink) and
|
||||
# make them writable because the elm compiler writes other .dat files
|
||||
# alongside the source code. versions.dat was produced during an
|
||||
# impure build of this same code; the build complains that it can't
|
||||
# update this cache, but continues past that warning.
|
||||
|
||||
# finally, we set ELM_HOME to point to these pre-fetched artifacts so
|
||||
# that the default of ~/.elm isn't used.
|
||||
|
||||
let
|
||||
fetchElmDeps = import ./fetchElmDeps.nix { inherit stdenv lib fetchurl; };
|
||||
hsPkgs = haskell.packages.ghc822.override {
|
||||
|
@ -58,8 +10,8 @@ let
|
|||
elm = overrideCabal (self.callPackage ./packages/elm.nix { }) (drv: {
|
||||
# sadly with parallelism most of the time breaks compilation
|
||||
enableParallelBuilding = false;
|
||||
preConfigure = fetchElmDeps {
|
||||
elmPackages = (import ./packages/elm-elm.nix);
|
||||
preConfigure = self.fetchElmDeps {
|
||||
elmPackages = (import ./packages/elm-srcs.nix);
|
||||
versionsDat = ./versions.dat;
|
||||
};
|
||||
buildTools = drv.buildTools or [] ++ [ makeWrapper ];
|
||||
|
@ -75,8 +27,6 @@ let
|
|||
'';
|
||||
});
|
||||
|
||||
|
||||
|
||||
/*
|
||||
The elm-format expression is updated via a script in the https://github.com/avh4/elm-format repo:
|
||||
`pacakge/nix/build.sh`
|
||||
|
|
|
@ -1,26 +0,0 @@
|
|||
#!/usr/bin/env ruby
|
||||
|
||||
require 'json'
|
||||
|
||||
system("elm-package install -y")
|
||||
depsSrc = JSON.parse(File.read("elm-stuff/exact-dependencies.json"))
|
||||
deps = Hash[ depsSrc.map { |pkg, ver|
|
||||
url = "https://github.com/#{pkg}/archive/#{ver}.tar.gz"
|
||||
sha256 = `nix-prefetch-url #{url}`
|
||||
|
||||
[ pkg, { version: ver,
|
||||
sha256: sha256.strip
|
||||
}
|
||||
]
|
||||
} ]
|
||||
|
||||
File.open("package.nix", 'w') do |file|
|
||||
file.puts "{"
|
||||
for pkg, info in deps
|
||||
file.puts " \"#{pkg}\" = {"
|
||||
file.puts " version = \"#{info[:version]}\";"
|
||||
file.puts " sha256 = \"#{info[:sha256]}\";"
|
||||
file.puts " };"
|
||||
end
|
||||
file.puts "}"
|
||||
end
|
|
@ -1,50 +0,0 @@
|
|||
{
|
||||
"elm/browser" = {
|
||||
version = "1.0.0";
|
||||
sha256 = "1apmvyax93nvmagwj00y16zx10kfv640cxpi64xgqbgy7d2wphy4";
|
||||
};
|
||||
"elm/core" = {
|
||||
version = "1.0.0";
|
||||
sha256 = "10kr86h4v5h4p0586q406a5wbl8xvr1jyrf6097zp2wb8sv21ylw";
|
||||
};
|
||||
"elm/html" = {
|
||||
version = "1.0.0";
|
||||
sha256 = "1n3gpzmpqqdsldys4ipgyl1zacn0kbpc3g4v3hdpiyfjlgh8bf3k";
|
||||
};
|
||||
"elm/http" = {
|
||||
version = "1.0.0";
|
||||
sha256 = "1igmm89ialzrjib1j8xagkxalq1x2gj4l0hfxcd66mpwmvg7psl8";
|
||||
};
|
||||
"elm/json" = {
|
||||
version = "1.0.0";
|
||||
sha256 = "1g0hafkqf2q633r7ir9wxpb1lnlzskhpsyi0h5bkzj0gl072zfnb";
|
||||
};
|
||||
"elm/project-metadata-utils" = {
|
||||
version = "1.0.0";
|
||||
sha256 = "1d4rd4grrnbdvj9gf00h7dr6hbkjzawgkzpizfrkp1z1pyr3mvq9";
|
||||
};
|
||||
"elm/svg" = {
|
||||
version = "1.0.0";
|
||||
sha256 = "08x0v8p9wm699jjmsnbq69pxv3jh60j4f6fg7y6hyr7xxj85y390";
|
||||
};
|
||||
"elm-explorations/markdown" = {
|
||||
version = "1.0.0";
|
||||
sha256 = "0k3110ixa4wwf3vkkdplagwah9ypr965qxr1y147rnsc1xsxmr6y";
|
||||
};
|
||||
"elm/parser" = {
|
||||
version = "1.0.0";
|
||||
sha256 = "0k4zlq30lrvawqvzwbvsl0hrmwf9s832mb41z7fdspm4549dj7wc";
|
||||
};
|
||||
"elm/time" = {
|
||||
version = "1.0.0";
|
||||
sha256 = "0vch7i86vn0x8b850w1p69vplll1bnbkp8s383z7pinyg94cm2z1";
|
||||
};
|
||||
"elm/url" = {
|
||||
version = "1.0.0";
|
||||
sha256 = "0av8x5syid40sgpl5vd7pry2rq0q4pga28b4yykn9gd9v12rs3l4";
|
||||
};
|
||||
"elm/virtual-dom" = {
|
||||
version = "1.0.0";
|
||||
sha256 = "0hm8g92h7z39km325dlnhk8n00nlyjkqp3r3jppr37k2k13md6aq";
|
||||
};
|
||||
}
|
62
pkgs/development/compilers/elm/packages/elm-srcs.nix
Normal file
62
pkgs/development/compilers/elm/packages/elm-srcs.nix
Normal file
|
@ -0,0 +1,62 @@
|
|||
{
|
||||
|
||||
"elm-explorations/markdown" = {
|
||||
sha256 = "0k3110ixa4wwf3vkkdplagwah9ypr965qxr1y147rnsc1xsxmr6y";
|
||||
version = "1.0.0";
|
||||
};
|
||||
|
||||
"elm/json" = {
|
||||
sha256 = "1g0hafkqf2q633r7ir9wxpb1lnlzskhpsyi0h5bkzj0gl072zfnb";
|
||||
version = "1.0.0";
|
||||
};
|
||||
|
||||
"elm/html" = {
|
||||
sha256 = "1n3gpzmpqqdsldys4ipgyl1zacn0kbpc3g4v3hdpiyfjlgh8bf3k";
|
||||
version = "1.0.0";
|
||||
};
|
||||
|
||||
"elm/svg" = {
|
||||
sha256 = "08x0v8p9wm699jjmsnbq69pxv3jh60j4f6fg7y6hyr7xxj85y390";
|
||||
version = "1.0.0";
|
||||
};
|
||||
|
||||
"elm/project-metadata-utils" = {
|
||||
sha256 = "1d4rd4grrnbdvj9gf00h7dr6hbkjzawgkzpizfrkp1z1pyr3mvq9";
|
||||
version = "1.0.0";
|
||||
};
|
||||
|
||||
"elm/browser" = {
|
||||
sha256 = "1apmvyax93nvmagwj00y16zx10kfv640cxpi64xgqbgy7d2wphy4";
|
||||
version = "1.0.0";
|
||||
};
|
||||
|
||||
"elm/core" = {
|
||||
sha256 = "10kr86h4v5h4p0586q406a5wbl8xvr1jyrf6097zp2wb8sv21ylw";
|
||||
version = "1.0.0";
|
||||
};
|
||||
|
||||
"elm/http" = {
|
||||
sha256 = "1igmm89ialzrjib1j8xagkxalq1x2gj4l0hfxcd66mpwmvg7psl8";
|
||||
version = "1.0.0";
|
||||
};
|
||||
|
||||
"elm/parser" = {
|
||||
sha256 = "0k4zlq30lrvawqvzwbvsl0hrmwf9s832mb41z7fdspm4549dj7wc";
|
||||
version = "1.0.0";
|
||||
};
|
||||
|
||||
"elm/url" = {
|
||||
sha256 = "0av8x5syid40sgpl5vd7pry2rq0q4pga28b4yykn9gd9v12rs3l4";
|
||||
version = "1.0.0";
|
||||
};
|
||||
|
||||
"elm/time" = {
|
||||
sha256 = "0vch7i86vn0x8b850w1p69vplll1bnbkp8s383z7pinyg94cm2z1";
|
||||
version = "1.0.0";
|
||||
};
|
||||
|
||||
"elm/virtual-dom" = {
|
||||
sha256 = "0hm8g92h7z39km325dlnhk8n00nlyjkqp3r3jppr37k2k13md6aq";
|
||||
version = "1.0.0";
|
||||
};
|
||||
}
|
|
@ -13,6 +13,7 @@ mkDerivation {
|
|||
url = "https://github.com/elm/compiler";
|
||||
sha256 = "13jks6c6i80z71mjjfg46ri570g5ini0k3xw3857v6z66zcl56x4";
|
||||
rev = "d5cbc41aac23da463236bbc250933d037da4055a";
|
||||
fetchSubmodules = true;
|
||||
};
|
||||
isLibrary = false;
|
||||
isExecutable = true;
|
||||
|
|
|
@ -1 +1,8 @@
|
|||
cabal2nix https://github.com/elm/compiler --revision 32059a289d27e303fa1665e9ada0a52eb688f302 > packages/elm.nix
|
||||
#!/usr/bin/env nix-shell
|
||||
#!nix-shell -p cabal2nix elm2nix -i bash ../../..
|
||||
|
||||
cabal2nix https://github.com/elm/compiler --revision d5cbc41aac23da463236bbc250933d037da4055a > packages/elm.nix
|
||||
elm2nix snapshot > versions.dat
|
||||
pushd "$(nix-build -A elmPackages.elm.src --no-out-link ../../../..)/ui/browser"
|
||||
elm2nix convert > $OLDPWD/packages/elm-srcs.nix
|
||||
popd
|
||||
|
|
Binary file not shown.
Loading…
Reference in a new issue