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.
