3
0
Fork 0
forked from mirrors/nixpkgs
nixpkgs/pkgs/development/tools/ocaml/utop/default.nix
Patrick Mahoney 1a7586ce24 ocamlPackages.utop: fix environment variables
In the wrapper scripts, both OCAMLPATH and CAML_LD_LIBRARY_PATH where
being created with a trailing literal $OCAMLPATH, rather than the
expanded version. Thus if, for example, ocamlPackages.core was present
in OCAMLPATH prior to running utop, the wrapper script would set the
variable to $utop_dependencies:'$OCAMLPATH', and when using utop to
open Core.Std, the following error was reported:

    findlib: [WARNING] cannot read directory $OCAMLPATH: No such file
    or directory

This patch fixes the quoting issue, and further refactors the build to
use standard wrapProgram helper, and uses an "inner derivation" to
re-use the setupHook machinery of buildOCaml and findlib instead of
manually specifying the OCAMLPATH required for utop along with
transitive dependencies.
2017-04-24 00:12:46 -05:00

81 lines
2.4 KiB
Nix

{ stdenv, fetchurl, ocaml, findlib, ocamlbuild, camlp4, ocaml_react
, lambdaTerm, ocaml_lwt, makeWrapper, camomile, zed, cppo, ppx_tools
}:
stdenv.mkDerivation rec {
version = "1.19.3";
name = "utop-${version}";
src = fetchurl {
url = "https://github.com/diml/utop/archive/${version}.tar.gz";
sha256 = "16z02vp9n97iax4fqpbi7v86r75vbabxvnd1rirh8w2miixs1g4x";
};
buildInputs = [ ocaml findlib ocamlbuild makeWrapper cppo camlp4 ppx_tools ];
propagatedBuildInputs = [ lambdaTerm ocaml_lwt ];
createFindlibDestdir = true;
configureFlags = [ "--enable-camlp4" ]
++ stdenv.lib.optional (ppx_tools != null && !stdenv.lib.versionAtLeast ocaml.version "4.04") "--enable-interact";
buildPhase = ''
make
make doc
'';
dontStrip = true;
postFixup =
let
path = "etc/utop/env";
# derivation of just runtime deps so env vars created by
# setup-hooks can be saved for use at runtime
runtime = stdenv.mkDerivation rec {
name = "utop-runtime-env-${version}";
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/*
do
# 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
wrapProgram $prog \
--argv0 "" \
--prefix CAML_LD_LIBRARY_PATH ":" "${get "CAML_LD_LIBRARY_PATH"}" \
--prefix OCAMLPATH ":" "${get "OCAMLPATH"}" \
--prefix OCAMLPATH ":" $(unset OCAMLPATH; addOCamlPath "$out"; printf %s "$OCAMLPATH")
done
'';
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;
platforms = ocaml.meta.platforms or [];
maintainers = [
stdenv.lib.maintainers.gal_bolle
];
};
}