<section xmlns="http://docbook.org/ns/docbook"
         xmlns:xlink="http://www.w3.org/1999/xlink"
         xml:id="sec-language-coq">
 <title>Coq</title>

 <para>
  Coq libraries should be installed in
  <literal>$(out)/lib/coq/${coq.coq-version}/user-contrib/</literal>. Such
  directories are automatically added to the <literal>$COQPATH</literal>
  environment variable by the hook defined in the Coq derivation.
 </para>

 <para>
  Some extensions (plugins) might require OCaml and sometimes other OCaml
  packages. The <literal>coq.ocamlPackages</literal> attribute can be used to
  depend on the same package set Coq was built against.
 </para>

 <para>
  Coq libraries may be compatible with some specific versions of Coq only. The
  <literal>compatibleCoqVersions</literal> attribute is used to precisely
  select those versions of Coq that are compatible with this derivation.
 </para>

 <para>
  Here is a simple package example. It is a pure Coq library, thus it depends
  on Coq. It builds on the Mathematical Components library, thus it also takes
  <literal>mathcomp</literal> as <literal>buildInputs</literal>. Its
  <literal>Makefile</literal> has been generated using
  <literal>coq_makefile</literal> so we only have to set the
  <literal>$COQLIB</literal> variable at install time.
 </para>

<programlisting>
{ stdenv, fetchFromGitHub, coq, mathcomp }:

stdenv.mkDerivation rec {
  name = "coq${coq.coq-version}-multinomials-${version}";
  version = "1.0";
  src = fetchFromGitHub {
    owner = "math-comp";
    repo = "multinomials";
    rev = version;
    sha256 = "1qmbxp1h81cy3imh627pznmng0kvv37k4hrwi2faa101s6bcx55m";
  };

  buildInputs = [ coq ];
  propagatedBuildInputs = [ mathcomp ];

  installFlags = "COQLIB=$(out)/lib/coq/${coq.coq-version}/";

  meta = {
    description = "A Coq/SSReflect Library for Monoidal Rings and Multinomials";
    inherit (src.meta) homepage;
    license = stdenv.lib.licenses.cecill-b;
    inherit (coq.meta) platforms;
  };

  passthru = {
    compatibleCoqVersions = v: builtins.elem v [ "8.5" "8.6" "8.7" ];
  };
}
</programlisting>
</section>
