mte/unikernel/duniverse/dune_/doc/explanation/bootstrap.rst
2025-11-11 02:07:51 +01:00

53 lines
2.2 KiB
ReStructuredText

How Dune Uses Dune to Build Dune
================================
Dune's build system is itself Dune. This works thanks to a bootstrap process.
This document explains how this works.
``boot/bootstrap.ml``
---------------------
``boot/bootstrap.ml`` is an OCaml script (it is interpreted, not compiled) that
is a mini-build system tailored to Dune itself. It computes dependencies
between the various modules by calling ``ocamldep``, and it will generate build
and link commands. It knows how to execute these commands in parallel. It does
not read any ``dune`` file. However, the project structure and its system
dependencies are encoded in ``boot/libs.ml``.
This step produces ``_boot/dune.exe``.
Completing the Opam Installation
--------------------------------
``_boot/dune.exe`` is the bootstrap Dune. Since it has been built from
the Dune sources, it will act like Dune: it can read ``dune`` files, etc.
This is actually the ``dune`` executable that will get installed. This is the
same executable as the one obtained by running ``opam install dune``. At this
stage of the process, Opam does not know about this: it expects a
``dune.install`` file that explains what files to install.
The next command run by the Opam instruction is the following:
.. code:: console
$ ./_boot/dune.exe build dune.install --release --profile dune-bootstrap
By using the ``dune-bootstrap`` :term:`build profile`, it does not run a full
build, but only copy ``_boot/dune.exe`` to its install location (as the `dune`
binary), and generate ``dune.install``.
``make dev``: Everything Else for Local Development
---------------------------------------------------
The above describes how Dune itself is built through Opam, but that's not all
there is it to it: the Dune repository contains other libraries that need to be
built. In fact, executing the ``boot/bootstrap.ml`` script did not generate
files useful for editor integration.
So the main ``Makefile`` has a ``make dev`` target that will run
``_boot/dune.exe build @install``: this will rebuild the project using Dune
itself.
As a special rule, this build will regenerate ``boot/libs.ml`` using the
locations of the internal libraries used to build Dune.