Merge pull request #696 from rgrinberg/configurator-doc

Documentation for new configurator
This commit is contained in:
Rudi Grinberg 2018-04-16 19:22:28 +07:00 committed by GitHub
commit b8f2fa0465
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 116 additions and 2 deletions

114
doc/configurator.rst Normal file
View File

@ -0,0 +1,114 @@
************
Configurator
************
Configurator is a small library designed to query features available on the
system, in order to generate configuration for dune builds. Such generated
configuration is usually in the form of command line flags, generated headers,
stubs, but there are no limitations on this.
Configurator allows you to query for the following features:
* Variables defined in ``ocamlc - config``,
* pkg-config_ flags for packages,
* Test features by compiling C code,
* Extract compile time information such as ``#define`` variables.
Configurator is designed to be cross compilation friendly and avoids _running_
any compiled code to extract any of the information above.
Configurator started as an `independent library
<https://github.com/janestreet/configurator>`__, but now lives in dune. You do
not need to install anything to use configurator.
Usage
=====
We'll describe configurator with a simple example. Everything else can be easily
learned by studying `configurator's API
<https://github.com/ocaml/dune/blob/master/src/configurator/v1.mli>`__.
To use configurator, we write an executable that will query the system using
configurator's API and output a set of targets reflecting the results. For
example:
.. code-block:: ocaml
module C = Configurator.V1
let clock_gettime_code = {|
#include <time.h>
int main()
{
struct timespec ts;
clock_gettime(CLOCK_REALTIME, &ts);
return 0;
}
|}
let () =
C.main ~name:"foo" (fun c ->
let has_clock_gettime = C.c_test c clock_gettime_code ~link_flags:["-lrt"] in
C.C_define.gen_header_file c ~fname:"config.h"
[ "HAS_CKOCK_GETTIME", Switch has_ckock_gettime ]);
Usually, the module above would be named ``discover.ml``. The next step is to
invoke it as an executable and tell dune about the targets that it produces:
.. code-block:: lisp
(executable
((name discover)
(libraries (jbuilder.configurator))))
(rule
((targets (config.h))
(action (run ./discover.exe))))
Another common pattern is to produce a flags file with configurator and then use
this flag file using ``:include``:
.. code-block:: lisp
(library
((name mylib)
(c_names (foo))
(c_library_flags (:include (flags.sexp)))))
Upgrading from the old Configurator
===================================
The old configurator is the independent `configurator
<https://github.com/janestreet/configurator>`__ opam package. It is deprecated
and users are encouraged to migrate to dune's own configurator. The advantage of
the transition include:
* No extra dependencies,
* No need to manually pass ``-ocamlc`` flag,
* New configurator is cross compilation compatible.
The following steps must be taken to transition from the old configurator:
* Mentions of the ``configurator`` opam package should be removed.
* The library name ``configurator`` should be changed ``jbuilder.configurator``.
* The ``-ocamlc`` flag in rules that run configurator scripts should be removed.
This information is now passed automatically by dune.
* The new configurator API is versioned explicitly. The version that is
compatible with old configurator is under the ``V1`` module. Hence, to
transition one's code it's enough to add this module alias:
.. code-block:: ocaml
module Configurator = Configurator.V1
.. _pkg-config: https://www.freedesktop.org/wiki/Software/pkg-config/

View File

@ -18,5 +18,6 @@ Welcome to jbuilder's documentation!
documentation
usage
advanced-topics
configurator
faq
known-issues

View File

@ -1157,8 +1157,7 @@ automatically handled by Jbuilder.
The DSL is currently quite limited, so if you want to do something complicated
it is recommended to write a small OCaml program and use the DSL to invoke it.
You can use `shexp <https://github.com/janestreet/shexp>`__ to write portable
scripts or `configurator <https://github.com/janestreet/configurator>`__ for
configuration related tasks.
scripts or `Configurator`_ for configuration related tasks.
The following constructions are available: