2019-08-21 06:10:15 +01:00
|
|
|
{ stdenv, fetchurl, ocaml, findlib, dune
|
2018-06-24 07:18:35 +01:00
|
|
|
, lambdaTerm, cppo, makeWrapper
|
2014-07-20 17:23:42 +01:00
|
|
|
}:
|
|
|
|
|
2019-02-22 17:00:57 +00:00
|
|
|
if !stdenv.lib.versionAtLeast ocaml.version "4.03"
|
2017-07-02 13:22:53 +01:00
|
|
|
then throw "utop is not available for OCaml ${ocaml.version}"
|
|
|
|
else
|
|
|
|
|
2014-07-20 17:23:42 +01:00
|
|
|
stdenv.mkDerivation rec {
|
2019-08-15 13:41:18 +01:00
|
|
|
pname = "utop";
|
2019-08-21 06:10:15 +01:00
|
|
|
version = "2.4.1";
|
2014-07-20 17:23:42 +01:00
|
|
|
|
|
|
|
src = fetchurl {
|
2015-07-28 16:31:44 +01:00
|
|
|
url = "https://github.com/diml/utop/archive/${version}.tar.gz";
|
2019-08-21 06:10:15 +01:00
|
|
|
sha256 = "0kbg7sfn7jaic7xcy7dm543yzsywirxbgpiv2rzwnp9ny2510f9g";
|
2014-07-20 17:23:42 +01:00
|
|
|
};
|
|
|
|
|
2017-05-03 14:48:21 +01:00
|
|
|
nativeBuildInputs = [ makeWrapper ];
|
2019-08-21 06:10:15 +01:00
|
|
|
buildInputs = [ ocaml findlib cppo dune ];
|
2014-07-20 17:23:42 +01:00
|
|
|
|
2018-06-24 07:18:35 +01:00
|
|
|
propagatedBuildInputs = [ lambdaTerm ];
|
2014-07-20 17:23:42 +01:00
|
|
|
|
2018-09-05 17:11:47 +01:00
|
|
|
inherit (dune) installPhase;
|
2017-04-01 06:39:13 +01:00
|
|
|
|
2014-07-20 17:23:42 +01:00
|
|
|
postFixup =
|
2017-04-22 20:01:05 +01:00
|
|
|
let
|
|
|
|
path = "etc/utop/env";
|
|
|
|
|
|
|
|
# derivation of just runtime deps so env vars created by
|
|
|
|
# setup-hooks can be saved for use at runtime
|
2019-08-13 22:52:01 +01:00
|
|
|
runtime = stdenv.mkDerivation {
|
2019-08-13 22:52:01 +01:00
|
|
|
pname = "utop-runtime-env";
|
|
|
|
inherit version;
|
2017-04-22 20:01:05 +01:00
|
|
|
|
|
|
|
buildInputs = [ findlib ] ++ propagatedBuildInputs;
|
|
|
|
|
|
|
|
phases = [ "installPhase" ];
|
|
|
|
|
|
|
|
installPhase = ''
|
|
|
|
mkdir -p "$out"/${path}
|
|
|
|
for e in OCAMLPATH CAML_LD_LIBRARY_PATH; do
|
|
|
|
printf %s "''${!e}" > "$out"/${path}/$e
|
|
|
|
done
|
|
|
|
'';
|
|
|
|
};
|
|
|
|
|
|
|
|
get = key: ''$(cat "${runtime}/${path}/${key}")'';
|
|
|
|
in ''
|
|
|
|
for prog in "$out"/bin/*
|
2015-01-27 06:51:30 +00:00
|
|
|
do
|
2017-05-01 13:38:18 +01:00
|
|
|
|
2017-04-22 20:01:05 +01:00
|
|
|
# Note: wrapProgram by default calls 'exec -a $0 ...', but this
|
|
|
|
# breaks utop on Linux with OCaml 4.04, and is disabled with
|
|
|
|
# '--argv0 ""' flag. See https://github.com/NixOS/nixpkgs/issues/24496
|
2017-05-01 13:38:18 +01:00
|
|
|
wrapProgram "$prog" \
|
2017-04-22 20:01:05 +01:00
|
|
|
--argv0 "" \
|
|
|
|
--prefix CAML_LD_LIBRARY_PATH ":" "${get "CAML_LD_LIBRARY_PATH"}" \
|
|
|
|
--prefix OCAMLPATH ":" "${get "OCAMLPATH"}" \
|
2017-06-15 15:15:24 +01:00
|
|
|
--prefix OCAMLPATH ":" $(unset OCAMLPATH; addOCamlPath "$out"; printf %s "$OCAMLPATH") \
|
|
|
|
--add-flags "-I ${findlib}/lib/ocaml/${stdenv.lib.getVersion ocaml}/site-lib"
|
2015-01-27 06:51:30 +00:00
|
|
|
done
|
|
|
|
'';
|
2014-07-20 17:23:42 +01:00
|
|
|
|
|
|
|
meta = {
|
|
|
|
description = "Universal toplevel for OCaml";
|
|
|
|
longDescription = ''
|
|
|
|
utop is an improved toplevel for OCaml. It can run in a terminal or in Emacs. It supports line edition, history, real-time and context sensitive completion, colors, and more.
|
|
|
|
|
|
|
|
It integrates with the tuareg mode in Emacs.
|
|
|
|
'';
|
|
|
|
homepage = https://github.com/diml/utop;
|
|
|
|
license = stdenv.lib.licenses.bsd3;
|
2015-12-24 17:49:07 +00:00
|
|
|
platforms = ocaml.meta.platforms or [];
|
2014-07-20 17:23:42 +01:00
|
|
|
maintainers = [
|
|
|
|
stdenv.lib.maintainers.gal_bolle
|
|
|
|
];
|
|
|
|
};
|
|
|
|
}
|