diff options
| author | Théo Zimmermann | 2020-03-27 14:10:16 +0100 |
|---|---|---|
| committer | Théo Zimmermann | 2020-03-27 14:10:16 +0100 |
| commit | 455445d05c5ae962af61a7a69fc4a9907fb37c06 (patch) | |
| tree | 3c5a1b93e134056f6a80a5af807aba4ff650854c | |
| parent | 5f5f9520ccf0f107d381e5874a3743f47e37c409 (diff) | |
Prepare split of section about coqdoc.
| -rw-r--r-- | doc/sphinx/practical-tools/utilities.rst | 665 |
1 files changed, 0 insertions, 665 deletions
diff --git a/doc/sphinx/practical-tools/utilities.rst b/doc/sphinx/practical-tools/utilities.rst index e5ff26520a..cada680895 100644 --- a/doc/sphinx/practical-tools/utilities.rst +++ b/doc/sphinx/practical-tools/utilities.rst @@ -1,642 +1,3 @@ -.. _utilities: - ---------------------- - Utilities ---------------------- - -The distribution provides utilities to simplify some tedious works -beside proof development, tactics writing or documentation. - - -Using Coq as a library ----------------------- - -In previous versions, ``coqmktop`` was used to build custom -toplevels - for example for better debugging or custom static -linking. Nowadays, the preferred method is to use ``ocamlfind``. - -The most basic custom toplevel is built using: - -:: - - % ocamlfind ocamlopt -thread -rectypes -linkall -linkpkg \ - -package coq.toplevel \ - topbin/coqtop_bin.ml -o my_toplevel.native - - -For example, to statically link |Ltac|, you can just do: - -:: - - % ocamlfind ocamlopt -thread -rectypes -linkall -linkpkg \ - -package coq.toplevel,coq.plugins.ltac \ - topbin/coqtop_bin.ml -o my_toplevel.native - -and similarly for other plugins. - -Building a |Coq| project ------------------------- - -As of today it is possible to build Coq projects using two tools: - -- coq_makefile, which is distributed by Coq and is based on generating a makefile, -- Dune, the standard OCaml build tool, which, since version 1.9, supports building Coq libraries. - -Building a |Coq| project with coq_makefile -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -The majority of |Coq| projects are very similar: a collection of ``.v`` -files and eventually some ``.ml`` ones (a |Coq| plugin). The main piece of -metadata needed in order to build the project are the command line -options to ``coqc`` (e.g. ``-R``, ``Q``, ``-I``, see :ref:`command -line options <command-line-options>`). Collecting the list of files -and options is the job of the ``_CoqProject`` file. - -A simple example of a ``_CoqProject`` file follows: - -:: - - -R theories/ MyCode - -arg -w - -arg all - theories/foo.v - theories/bar.v - -I src/ - src/baz.mlg - src/bazaux.ml - src/qux_plugin.mlpack - -where options ``-R``, ``-Q`` and ``-I`` are natively recognized, as well as -file names. The lines of the form ``-arg foo`` are used in order to tell -to literally pass an argument ``foo`` to ``coqc``: in the -example, this allows to pass the two-word option ``-w all`` (see -:ref:`command line options <command-line-options>`). - -Currently, both |CoqIDE| and Proof-General (version ≥ ``4.3pre``) -understand ``_CoqProject`` files and invoke |Coq| with the desired options. - -The ``coq_makefile`` utility can be used to set up a build infrastructure -for the |Coq| project based on makefiles. The recommended way of -invoking ``coq_makefile`` is the following one: - -:: - - coq_makefile -f _CoqProject -o CoqMakefile - - -Such command generates the following files: - -CoqMakefile - is a generic makefile for ``GNU Make`` that provides - targets to build the project (both ``.v`` and ``.ml*`` files), to install it - system-wide in the ``coq-contrib`` directory (i.e. where |Coq| is installed) - as well as to invoke coqdoc to generate HTML documentation. - -CoqMakefile.conf - contains make variables assignments that reflect - the contents of the ``_CoqProject`` file as well as the path relevant to - |Coq|. - - -An optional file ``CoqMakefile.local`` can be provided by the user in order to -extend ``CoqMakefile``. In particular one can declare custom actions to be -performed before or after the build process. Similarly one can customize the -install target or even provide new targets. Extension points are documented in -paragraph :ref:`coqmakefilelocal`. - -The extensions of the files listed in ``_CoqProject`` is used in order to -decide how to build them. In particular: - - -+ |Coq| files must use the ``.v`` extension -+ |OCaml| files must use the ``.ml`` or ``.mli`` extension -+ |OCaml| files that require pre processing for syntax - extensions (like ``VERNAC EXTEND``) must use the ``.mlg`` extension -+ In order to generate a plugin one has to list all |OCaml| - modules (i.e. ``Baz`` for ``baz.ml``) in a ``.mlpack`` file (or ``.mllib`` - file). - - -The use of ``.mlpack`` files has to be preferred over ``.mllib`` files, -since it results in a “packed” plugin: All auxiliary modules (as -``Baz`` and ``Bazaux``) are hidden inside the plugin’s "namespace" -(``Qux_plugin``). This reduces the chances of begin unable to load two -distinct plugins because of a clash in their auxiliary module names. - -.. _coqmakefilelocal: - -CoqMakefile.local -+++++++++++++++++ - -The optional file ``CoqMakefile.local`` is included by the generated -file ``CoqMakefile``. It can contain two kinds of directives. - -**Variable assignment** - -The variable must belong to the variables listed in the ``Parameters`` -section of the generated makefile. -Here we describe only few of them. - -:CAMLPKGS: - can be used to specify third party findlib packages, and is - passed to the OCaml compiler on building or linking of modules. Eg: - ``-package yojson``. -:CAMLFLAGS: - can be used to specify additional flags to the |OCaml| - compiler, like ``-bin-annot`` or ``-w``.... -:OCAMLWARN: - it contains a default of ``-warn-error +a-3``, useful to modify - this setting; beware this is not recommended for projects in - Coq's CI. -:COQC, COQDEP, COQDOC: - can be set in order to use alternative binaries - (e.g. wrappers) -:COQ_SRC_SUBDIRS: - can be extended by including other paths in which ``*.cm*`` files - are searched. For example ``COQ_SRC_SUBDIRS+=user-contrib/Unicoq`` - lets you build a plugin containing OCaml code that depends on the - OCaml code of ``Unicoq`` -:COQFLAGS: - override the flags passed to ``coqc``. By default ``-q``. -:COQEXTRAFLAGS: - extend the flags passed to ``coqc`` -:COQCHKFLAGS: - override the flags passed to ``coqchk``. By default ``-silent -o``. -:COQCHKEXTRAFLAGS: - extend the flags passed to ``coqchk`` -:COQDOCFLAGS: - override the flags passed to ``coqdoc``. By default ``-interpolate -utf8``. -:COQDOCEXTRAFLAGS: - extend the flags passed to ``coqdoc`` - -**Rule extension** - -The following makefile rules can be extended. - -.. example:: - - :: - - pre-all:: - echo "This line is print before making the all target" - install-extra:: - cp ThisExtraFile /there/it/goes - -``pre-all::`` - run before the ``all`` target. One can use this to configure - the project, or initialize sub modules or check dependencies are met. - -``post-all::`` - run after the ``all`` target. One can use this to run a test - suite, or compile extracted code. - -``install-extra::`` - run after ``install``. One can use this to install extra files. - -``install-doc::`` - One can use this to install extra doc. - -``uninstall::`` - \ - -``uninstall-doc::`` - \ - -``clean::`` - \ - -``cleanall::`` - \ - -``archclean::`` - \ - -``merlin-hook::`` - One can append lines to the generated ``.merlin`` file extending this - target. - -Timing targets and performance testing -++++++++++++++++++++++++++++++++++++++ - -The generated ``Makefile`` supports the generation of two kinds of timing -data: per-file build-times, and per-line times for an individual file. - -The following targets and Makefile variables allow collection of per- -file timing data: - - -+ ``TIMED=1`` - passing this variable will cause ``make`` to emit a line - describing the user-space build-time and peak memory usage for each - file built. - - .. note:: - On ``Mac OS``, this works best if you’ve installed ``gnu-time``. - - .. example:: - - For example, the output of ``make TIMED=1`` may look like - this: - - :: - - COQDEP Fast.v - COQDEP Slow.v - COQC Slow.v - Slow (user: 0.34 mem: 395448 ko) - COQC Fast.v - Fast (user: 0.01 mem: 45184 ko) - -+ ``pretty-timed`` - this target stores the output of ``make TIMED=1`` into - ``time-of-build.log``, and displays a table of the times, sorted from - slowest to fastest, which is also stored in ``time-of-build-pretty.log``. - If you want to construct the ``log`` for targets other than the default - one, you can pass them via the variable ``TGTS``, e.g., ``make pretty-timed - TGTS="a.vo b.vo"``. - - .. note:: - This target requires ``python`` to build the table. - - .. note:: - This target will *append* to the timing log; if you want a - fresh start, you must remove the file ``time-of-build.log`` or - ``run make cleanall``. - - .. note:: - By default the table displays user times. If the build log - contains real times (which it does by default), passing - ``TIMING_REAL=1`` to ``make pretty-timed`` will use real times - rather than user times in the table. - - .. example:: - - For example, the output of ``make pretty-timed`` may look like this: - - :: - - COQDEP Fast.v - COQDEP Slow.v - COQC Slow.v - Slow (user: 0.36 mem: 393912 ko) - COQC Fast.v - Fast (user: 0.05 mem: 45992 ko) - Time | File Name - -------------------- - 0m00.41s | Total - -------------------- - 0m00.36s | Slow - 0m00.05s | Fast - - -+ ``print-pretty-timed-diff`` - this target builds a table of timing changes between two compilations; run - ``make make-pretty-timed-before`` to build the log of the “before” times, - and run ``make make-pretty-timed-after`` to build the log of the “after” - times. The table is printed on the command line, and stored in - ``time-of-build-both.log``. This target is most useful for profiling the - difference between two commits in a repository. - - .. note:: - This target requires ``python`` to build the table. - - .. note:: - The ``make-pretty-timed-before`` and ``make-pretty-timed-after`` targets will - *append* to the timing log; if you want a fresh start, you must remove - the files ``time-of-build-before.log`` and ``time-of-build-after.log`` or run - ``make cleanall`` *before* building either the “before” or “after” - targets. - - .. note:: - The table will be sorted first by absolute time - differences rounded towards zero to a whole-number of seconds, then by - times in the “after” column, and finally lexicographically by file - name. This will put the biggest changes in either direction first, and - will prefer sorting by build-time over subsecond changes in build time - (which are frequently noise); lexicographic sorting forces an order on - files which take effectively no time to compile. - - If you prefer a different sorting order, you can pass - ``TIMING_SORT_BY=absolute`` to sort by the total time taken, or - ``TIMING_SORT_BY=diff`` to sort by the signed difference in - time. - - .. note:: - Just like ``pretty-timed``, this table defaults to using user - times. Pass ``TIMING_REAL=1`` to ``make`` on the command line to show real times instead. - - .. example:: - - For example, the output table from - ``make print-pretty-timed-diff`` may look like this: - - :: - - After | File Name | Before || Change | % Change - -------------------------------------------------------- - 0m00.39s | Total | 0m00.35s || +0m00.03s | +11.42% - -------------------------------------------------------- - 0m00.37s | Slow | 0m00.01s || +0m00.36s | +3600.00% - 0m00.02s | Fast | 0m00.34s || -0m00.32s | -94.11% - - -The following targets and ``Makefile`` variables allow collection of per- -line timing data: - - -+ ``TIMING=1`` - passing this variable will cause ``make`` to use ``coqc -time`` to - write to a ``.v.timing`` file for each ``.v`` file compiled, which contains - line-by-line timing information. - - .. example:: - - For example, running ``make all TIMING=1`` may result in a file like this: - - :: - - Chars 0 - 26 [Require~Coq.ZArith.BinInt.] 0.157 secs (0.128u,0.028s) - Chars 27 - 68 [Declare~Reduction~comp~:=~vm_c...] 0. secs (0.u,0.s) - Chars 69 - 162 [Definition~foo0~:=~Eval~comp~i...] 0.153 secs (0.136u,0.019s) - Chars 163 - 208 [Definition~foo1~:=~Eval~comp~i...] 0.239 secs (0.236u,0.s) - -+ ``print-pretty-single-time-diff`` - - :: - - print-pretty-single-time-diff AFTER=path/to/file.v.after-timing BEFORE=path/to/file.v.before-timing - - this target will make a sorted table of the per-line timing differences - between the timing logs in the ``BEFORE`` and ``AFTER`` files, display it, and - save it to the file specified by the ``TIME_OF_PRETTY_BUILD_FILE`` variable, - which defaults to ``time-of-build-pretty.log``. - To generate the ``.v.before-timing`` or ``.v.after-timing`` files, you should - pass ``TIMING=before`` or ``TIMING=after`` rather than ``TIMING=1``. - - .. note:: - The sorting used here is the same as in the ``print-pretty-timed-diff`` target. - - .. note:: - This target requires python to build the table. - - .. note:: - This target follows the same sorting order as the - ``print-pretty-timed-diff`` target, and supports the same - options for the ``TIMING_SORT_BY`` variable. - - .. note:: - By default, two lines are only considered the same if the - character offsets and initial code strings are identical. Passing - ``TIMING_FUZZ=N`` relaxes this constraint by allowing the - character locations to differ by up to ``N``, as long - as the total number of characters and initial code strings - continue to match. This is useful when there are small changes - to a file, and you want to match later lines that have not - changed even though the character offsets have changed. - - .. note:: - By default the table picks up real times, under the assumption - that when comparing line-by-line, the real time is a more - accurate representation as it includes disk time and time spent - in the native compiler. Passing ``TIMING_REAL=0`` to ``make`` - will use user times rather than real times in the table. - - .. example:: - - For example, running ``print-pretty-single-time-diff`` might give a table like this: - - :: - - After | Code | Before || Change | % Change - --------------------------------------------------------------------------------------------------- - 0m00.50s | Total | 0m04.17s || -0m03.66s | -87.96% - --------------------------------------------------------------------------------------------------- - 0m00.145s | Chars 069 - 162 [Definition~foo0~:=~Eval~comp~i...] | 0m00.192s || -0m00.04s | -24.47% - 0m00.126s | Chars 000 - 026 [Require~Coq.ZArith.BinInt.] | 0m00.143s || -0m00.01s | -11.88% - N/A | Chars 027 - 068 [Declare~Reduction~comp~:=~nati...] | 0m00.s || +0m00.00s | N/A - 0m00.s | Chars 027 - 068 [Declare~Reduction~comp~:=~vm_c...] | N/A || +0m00.00s | N/A - 0m00.231s | Chars 163 - 208 [Definition~foo1~:=~Eval~comp~i...] | 0m03.836s || -0m03.60s | -93.97% - - -+ ``all.timing.diff``, ``path/to/file.v.timing.diff`` - The ``path/to/file.v.timing.diff`` target will make a ``.v.timing.diff`` file for - the corresponding ``.v`` file, with a table as would be generated by - the ``print-pretty-single-time-diff`` target; it depends on having already - made the corresponding ``.v.before-timing`` and ``.v.after-timing`` files, - which can be made by passing ``TIMING=before`` and ``TIMING=after``. - The ``all.timing.diff`` target will make such timing difference files for - all of the ``.v`` files that the ``Makefile`` knows about. It will fail if - some ``.v.before-timing`` or ``.v.after-timing`` files don’t exist. - - .. note:: - This target requires python to build the table. - - -Reusing/extending the generated Makefile -++++++++++++++++++++++++++++++++++++++++ - -Including the generated makefile with an include directive is -discouraged. The contents of this file, including variable names and -status of rules shall change in the future. Users are advised to -include ``Makefile.conf`` or call a target of the generated Makefile as in -``make -f Makefile target`` from another Makefile. - -One way to get access to all targets of the generated ``CoqMakefile`` is to -have a generic target for invoking unknown targets. - -.. example:: - - :: - - # KNOWNTARGETS will not be passed along to CoqMakefile - KNOWNTARGETS := CoqMakefile extra-stuff extra-stuff2 - # KNOWNFILES will not get implicit targets from the final rule, and so - # depending on them won't invoke the submake - # Warning: These files get declared as PHONY, so any targets depending - # on them always get rebuilt - KNOWNFILES := Makefile _CoqProject - - .DEFAULT_GOAL := invoke-coqmakefile - - CoqMakefile: Makefile _CoqProject - $(COQBIN)coq_makefile -f _CoqProject -o CoqMakefile - - invoke-coqmakefile: CoqMakefile - $(MAKE) --no-print-directory -f CoqMakefile $(filter-out $(KNOWNTARGETS),$(MAKECMDGOALS)) - - .PHONY: invoke-coqmakefile $(KNOWNFILES) - - #################################################################### - ## Your targets here ## - #################################################################### - - # This should be the last rule, to handle any targets not declared above - %: invoke-coqmakefile - @true - - - -Building a subset of the targets with ``-j`` -++++++++++++++++++++++++++++++++++++++++++++ - -To build, say, two targets foo.vo and bar.vo in parallel one can use -``make only TGTS="foo.vo bar.vo" -j``. - -.. note:: - - ``make foo.vo bar.vo -j`` has a different meaning for the make - utility, in particular it may build a shared prerequisite twice. - - -.. note:: - - For users of coq_makefile with version < 8.7 - - + Support for "subdirectory" is deprecated. To perform actions before - or after the build (like invoking ``make`` on a subdirectory) one can hook - in pre-all and post-all extension points. - + ``-extra-phony`` and ``-extra`` are deprecated. To provide additional target - (``.PHONY`` or not) please use ``CoqMakefile.local``. - - -Precompiling for ``native_compute`` -+++++++++++++++++++++++++++++++++++ - -To compile files for ``native_compute``, one can use the -``-native-compiler yes`` option of |Coq|, for instance by putting the -following in a :ref:`coqmakefilelocal` file: - -:: - - COQEXTRAFLAGS += -native-compiler yes - -The generated ``CoqMakefile`` installation target will then take care -of installing the extra ``.coq-native`` directories. - -.. note:: - - As an alternative to modifying any file, one can set the - environment variable when calling ``make``: - - :: - - COQEXTRAFLAGS="-native-compiler yes" make - - This can be useful when files cannot be modified, for instance when - installing via OPAM a package built with ``coq_makefile``: - - :: - - COQEXTRAFLAGS="-native-compiler yes" opam install coq-package - -.. note:: - - This requires all dependencies to be themselves compiled with - ``-native-compiler yes``. - -Building a |Coq| project with Dune -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -.. note:: - - Dune's Coq support is still experimental; we strongly recommend - using Dune 2.3 or later. - -.. note:: - - The canonical documentation for the Coq Dune extension is - maintained upstream; please refer to the `Dune manual - <https://dune.readthedocs.io/>`_ for up-to-date information. This - documentation is up to date for Dune 2.3. - -Building a Coq project with Dune requires setting up a Dune project -for your files. This involves adding a ``dune-project`` and -``pkg.opam`` file to the root (``pkg.opam`` can be empty or generated -by Dune itself), and then providing ``dune`` files in the directories -your ``.v`` files are placed. For the experimental version "0.1" of -the Coq Dune language, |Coq| library stanzas look like: - -.. code:: scheme - - (coq.theory - (name <module_prefix>) - (package <opam_package>) - (synopsis <text>) - (modules <ordered_set_lang>) - (libraries <ocaml_libraries>) - (flags <coq_flags>)) - -This stanza will build all `.v` files in the given directory, wrapping -the library under ``<module_prefix>``. If you declare an -``<opam_package>``, an ``.install`` file for the library will be -generated; the optional ``(modules <ordered_set_lang>)`` field allows -you to filter the list of modules, and ``(libraries -<ocaml_libraries>)`` allows the Coq theory depend on ML plugins. For -the moment, Dune relies on Coq's standard mechanisms (such as -``COQPATH``) to locate installed Coq libraries. - -By default Dune will skip ``.v`` files present in subdirectories. In -order to enable the usual recursive organization of Coq projects add - -.. code:: scheme - - (include_subdirs qualified) - -to you ``dune`` file. - -Once your project is set up, `dune build` will generate the -`pkg.install` files and all the files necessary for the installation -of your project. - -.. example:: - - A typical stanza for a Coq plugin is split into two parts. An OCaml build directive, which is standard Dune: - - .. code:: scheme - - (library - (name equations_plugin) - (public_name equations.plugin) - (flags :standard -warn-error -3-9-27-32-33-50) - (libraries coq.plugins.cc coq.plugins.extraction)) - - (coq.pp (modules g_equations)) - - And a Coq-specific part that depends on it via the ``libraries`` field: - - .. code:: scheme - - (coq.theory - (name Equations) ; -R flag - (package equations) - (synopsis "Equations Plugin") - (libraries coq.plugins.extraction equations.plugin) - (modules :standard \ IdDec NoCycle)) ; exclude some modules that don't build - - (include_subdirs qualified) - -.. _coqdep: - -Computing Module dependencies ------------------------------ - -In order to compute module dependencies (to be used by ``make`` or -``dune``), |Coq| provides the ``coqdep`` tool. - -``coqdep`` computes inter-module dependencies for |Coq| -programs, and prints the dependencies on the standard output in a -format readable by make. When a directory is given as argument, it is -recursively looked at. - -Dependencies of |Coq| modules are computed by looking at ``Require`` -commands (``Require``, ``Require Export``, ``Require Import``), but also at the -command ``Declare ML Module``. - -See the man page of ``coqdep`` for more details and options. - -Both Dune and ``coq_makefile`` use ``coqdep`` to compute the -dependencies among the files part of a Coq project. - .. _coqdoc: Documenting |Coq| files with coqdoc @@ -1100,29 +461,3 @@ macros: \newcommand{\coqdocmodule}[1]{\section*{Module #1}} and you may redefine it using ``\renewcommand``. - -Embedded Coq phrases inside |Latex| documents ---------------------------------------------- - -When writing documentation about a proof development, one may want -to insert |Coq| phrases inside a |Latex| document, possibly together -with the corresponding answers of the system. We provide a mechanical -way to process such |Coq| phrases embedded in |Latex| files: the ``coq-tex`` -filter. This filter extracts |Coq| phrases embedded in |Latex| files, -evaluates them, and insert the outcome of the evaluation after each -phrase. - -Starting with a file ``file.tex`` containing |Coq| phrases, the ``coq-tex`` -filter produces a file named ``file.v.tex`` with the Coq outcome. - -There are options to produce the |Coq| parts in smaller font, italic, -between horizontal rules, etc. See the man page of ``coq-tex`` for more -details. - - -Man pages ---------- - -There are man pages for the commands ``coqdep`` and ``coq-tex``. Man -pages are installed at installation time (see installation -instructions in file ``INSTALL``, step 6). |
