===============================
Building a Distribution of LLVM
===============================

.. contents::
   :local:

Introduction
============

This document is geared toward people who want to build and package LLVM and any
combination of its sub-project tools for distribution. This document covers
useful features of the LLVM build system as well as best practices and general
information about packaging LLVM.

If you are new to CMake, you may find the :doc:`CMake` or :doc:`CMakePrimer`
documentation useful. This document covers some of the inner
workings of the builds described in the :doc:`AdvancedBuilds` document.

General Distribution Guidance
=============================

When building a distribution of a compiler, it is generally advised to perform a
bootstrap build of the compiler. That means building a "stage 1" compiler with
your host toolchain, then building the "stage 2" compiler using the "stage 1"
compiler. This is done so that the compiler you distribute benefits from all the
bug fixes, performance optimizations and general improvements provided by the
new compiler.

In deciding how to build your distribution, there are a few trade-offs that you
will need to evaluate. The big two are:

#. Compile time of the distribution against performance of the built compiler

#. Binary size of the distribution against performance of the built compiler

The guidance for maximizing performance of the generated compiler is to use LTO,
PGO, and statically link everything. This will result in an overall larger
distribution, and it will take longer to generate, but it provides the most
opportunity for the compiler to optimize.

The guidance for minimizing distribution size is to dynamically link LLVM and
Clang libraries into the tools to reduce code duplication. This will come at a
substantial performance penalty to the generated binary, both because it reduces
optimization opportunities and because dynamic linking requires resolving symbols
at process launch time, which can be very slow for C++ code.

.. _shared_libs:

.. warning::
  One very important note: Distributions should never be built using the
  *BUILD_SHARED_LIBS* CMake option. That option exists for optimizing developer
  workflow only. Due to design and implementation decisions, LLVM relies on
  global data which can end up being duplicated across shared libraries
  resulting in bugs. As such this is not a safe way to distribute LLVM or
  LLVM-based tools.

The simplest example of building a distribution with reasonable performance is
captured in the DistributionExample CMake cache file located at
``clang/cmake/caches/DistributionExample.cmake``. The following commands will perform
and install the distribution build:

.. code-block:: console

  $ cmake -G Ninja -C <path to clang>/cmake/caches/DistributionExample.cmake <path to LLVM source>
  $ ninja stage2-distribution
  $ ninja stage2-install-distribution

Difference between ``install`` and ``install-distribution``
-----------------------------------------------------------

One subtle but important difference to note is between the ``install``
and ``install-distribution`` targets. The ``install`` target is expected to
install every part of LLVM that your build is configured to generate except the
LLVM testing tools. Alternatively the ``install-distribution`` target, which is
recommended for building distributions, only installs specific parts of LLVM as
specified at configuration time by *LLVM_DISTRIBUTION_COMPONENTS*.

Additionally, by default, the ``install`` target will install the LLVM testing
tools as the public tools. This can be changed well by setting
*LLVM_INSTALL_TOOLCHAIN_ONLY* to ``On``. The LLVM tools are intended for
development and testing of LLVM, and should only be included in distributions
that support LLVM development.

When building with *LLVM_DISTRIBUTION_COMPONENTS* the build system also
generates a ``distribution`` target which builds all the components specified in
the list. This is a convenience build target to allow building just the
distributed pieces without needing to build all configured targets.

.. _Multi-distribution configurations:

Multi-distribution configurations
---------------------------------

The ``install-distribution`` target described above is for building a single
distribution. LLVM's build system also supports building multiple distributions,
which can be used to e.g. have one distribution containing just tools and
another for libraries (to enable development). These are configured by setting
the *LLVM_DISTRIBUTIONS* variable to hold a list of all distribution names
(which conventionally start with an uppercase letter, e.g. "Development"), and
then setting the *LLVM_<distribution>_DISTRIBUTION_COMPONENTS* variable to the
list of targets for that distribution. For each distribution, the build system
generates an ``install-${distribution}-distribution`` target, where
``${distribution}`` is the name of the distribution in lowercase, to install
that distribution.

Each distribution creates its own set of CMake exports, and the target to
install the CMake exports for a particular distribution for a project is named
``${project}-${distribution}-cmake-exports``, where ``${project}`` is the name
of the project in lowercase and ``${distribution}`` is the name of the
distribution in lowercase, unless the project is LLVM, in which case the target
is just named ``${distribution}-cmake-exports``. These targets need to be
explicitly included in the *LLVM_<distribution>_DISTRIBUTION_COMPONENTS*
variable in order to be included as part of the distribution.

Unlike with the single distribution setup, when building multiple distributions,
any components specified in *LLVM_RUNTIME_DISTRIBUTION_COMPONENTS* are not
automatically added to any distribution. Instead, you must include the targets
explicitly in some *LLVM_<distribution>_DISTRIBUTION_COMPONENTS* list.

By default, each target can appear in multiple distributions; a target will be
installed as part of all distributions it appears in, and it'll be exported by
the last distribution it appears in (the order of distributions is the order
they appear in *LLVM_DISTRIBUTIONS*). We also define some umbrella targets (e.g.
``llvm-libraries`` to install all LLVM libraries); a target can appear in a
different distribution than its umbrella, in which case the target will be
exported by the distribution it appears in (and not the distribution its
umbrella appears in). Set *LLVM_STRICT_DISTRIBUTIONS* to ``On`` if you want to
enforce a target appearing in only one distribution and umbrella distributions
being consistent with target distributions.

We strongly encourage looking at ``clang/cmake/caches/MultiDistributionExample.cmake``
as an example of configuring multiple distributions.

Special Notes for Library-only Distributions
--------------------------------------------

One of the most powerful features of LLVM is its library-first design mentality
and the way you can compose a wide variety of tools using different portions of
LLVM. Even in this situation, using *BUILD_SHARED_LIBS* is not supported. If you
want to distribute LLVM as a shared library for use in a tool, the recommended
method is using *LLVM_BUILD_LLVM_DYLIB*, and you can use *LLVM_DYLIB_COMPONENTS*
to configure which LLVM components are part of libLLVM.
Note: *LLVM_BUILD_LLVM_DYLIB* is not available on Windows.

Options for Optimizing LLVM
===========================

There are four main build optimizations that our CMake build system supports.
When performing a bootstrap build, it is not beneficial to do anything other than
setting *CMAKE_BUILD_TYPE* to ``Release`` for the stage-1 compiler. This is
because the more intensive optimizations are expensive to perform and the
stage-1 compiler is thrown away. All of the further options described should be
set on the stage-2 compiler either using a CMake cache file, or by prefixing the
option with *BOOTSTRAP_*.

The first and simplest to use is the compiler optimization level by setting the
*CMAKE_BUILD_TYPE* option. The main values of interest are ``Release`` or
``RelWithDebInfo``. By default the ``Release`` option uses the ``-O3``
optimization level, and ``RelWithDebInfo`` uses ``-O2``. If you want to generate
debug information and use ``-O3`` you can override the
*CMAKE_<LANG>_FLAGS_RELWITHDEBINFO* option for C and CXX.
DistributionExample.cmake does this.

Another easy-to-use option is Link-Time-Optimization. You can set the
*LLVM_ENABLE_LTO* option on your stage-2 build to ``Thin`` or ``Full`` to enable
building LLVM with LTO. These options will significantly increase link time of
the binaries in the distribution, but it will create much faster binaries. This
option should not be used if your distribution includes static archives, as the
objects inside the archive will be LLVM bitcode, which is not portable.

The :doc:`AdvancedBuilds` documentation describes the built-in tooling for
generating LLVM profiling information to drive Profile-Guided-Optimization. The
in-tree profiling tests are very limited, and generating the profile takes a
significant amount of time, but it can result in a significant improvement in
the performance of the generated binaries.

In addition to PGO profiling, we also have limited in-tree support for generating
linker order files. These files provide the linker with a suggested ordering for
functions in the final binary layout. This can measurably speed up clang by
physically grouping functions that are called temporally close to each other.
The current tooling is only available on Darwin systems with ``dtrace(1)``. It
is worth noting that dtrace is non-deterministic, and so the order file
generation using dtrace is also non-deterministic.

Options for Reducing Size
=========================

.. warning::
  Any steps taken to reduce binary size will come at the cost of runtime
  performance in the generated binaries.

The simplest and least significant way to reduce binary size is to set the
*CMAKE_BUILD_TYPE* variable to ``MinSizeRel``, which will set the compiler
optimization level to ``-Os`` which optimizes for binary size. This will have
both the least benefit to size and the least impact on performance.

The most impactful way to reduce binary size is to dynamically link LLVM into
all the tools. This reduces code size by decreasing duplication of common code
among the LLVM-based tools. This can be done by setting the following two
CMake options to ``On``: *LLVM_BUILD_LLVM_DYLIB* and *LLVM_LINK_LLVM_DYLIB*.

.. warning::
  Distributions should never be built using the *BUILD_SHARED_LIBS* CMake
  option. (:ref:`See the warning above for more explanation <shared_libs>`.).

Relevant CMake Options
======================

This section provides documentation of the CMake options that are intended to
help construct distributions. This is not an exhaustive list, and many
additional options are documented in the :doc:`CMake` page. Some key options
that are already documented include: *LLVM_TARGETS_TO_BUILD*, *LLVM_ENABLE_PROJECTS*,
*LLVM_ENABLE_RUNTIMES*, *LLVM_BUILD_LLVM_DYLIB*, and *LLVM_LINK_LLVM_DYLIB*.

**LLVM_ENABLE_RUNTIMES**:STRING
  When building a distribution that includes LLVM runtime projects (i.e., libcxx,
  compiler-rt, libcxxabi, libunwind...), it is important to build those projects
  with the just-built compiler.

**LLVM_DISTRIBUTION_COMPONENTS**:STRING
  This variable can be set to a semicolon-separated list of LLVM build system
  components to install. All LLVM-based tools are components, as well as most
  of the libraries and runtimes. Component names match the names of the build
  system targets.

**LLVM_DISTRIBUTIONS**:STRING
  This variable can be set to a semicolon-separated list of distributions. See
  the :ref:`Multi-distribution configurations` section above for details on this
  and other CMake variables to configure multiple distributions.

**LLVM_RUNTIME_DISTRIBUTION_COMPONENTS**:STRING
  This variable can be set to a semicolon-separated list of runtime library
  components. This is used in conjunction with *LLVM_ENABLE_RUNTIMES* to specify
  components of runtime libraries that you want to include in your distribution.
  Just like with *LLVM_DISTRIBUTION_COMPONENTS*, component names match the names
  of the build system targets.

**LLVM_DYLIB_COMPONENTS**:STRING
  This variable can be set to a semicolon-separated name of LLVM library
  components. LLVM library components are either library names with the LLVM
  prefix removed (i.e., Support, Demangle...), LLVM target names, or special
  purpose component names. The special purpose component names are:

  #. ``all`` - All available LLVM component libraries
  #. ``Native`` - The LLVM target for the Native system
  #. ``AllTargetsAsmParsers`` - All the included target ASM parsers libraries
  #. ``AllTargetsDescs`` - All the included target descriptions libraries
  #. ``AllTargetsDisassemblers`` - All the included target dissassemblers libraries
  #. ``AllTargetsInfos`` - All the included target info libraries

**LLVM_INSTALL_TOOLCHAIN_ONLY**:BOOL
  This option defaults to ``Off``: when set to ``On`` it removes many of the
  LLVM development and testing tools as well as component libraries from the
  default ``install`` target. Including the development tools is not recommended
  for distributions as many of the LLVM tools are only intended for development
  and testing use.
