========================
Building LLVM with CMake
========================

.. contents::
   :local:

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

`CMake <http://www.cmake.org/>`_ is a cross-platform build-generator tool. CMake
does not build the project, it generates the files needed by your build tool
(GNU make, Visual Studio, etc.) for building LLVM.

If **you are a new contributor**, please start with the :doc:`GettingStarted`
page.  This page is geared for existing contributors moving from the
legacy configure/make system.

If you are really anxious about getting a functional LLVM build, go to the
`Quick start`_ section. If you are a CMake novice, start with `Basic CMake usage`_
and then go back to the `Quick start`_ section once you know what you are doing. The
`Options and variables`_ section is a reference for customizing your build. If
you already have experience with CMake, this is the recommended starting point.

This page is geared towards users of the LLVM CMake build. If you're looking for
information about modifying the LLVM CMake build system you may want to see the
:doc:`CMakePrimer` page. It has a basic overview of the CMake language.

.. _Quick start:

Quick start
===========

We use here the command-line, non-interactive CMake interface.

#. `Download <http://www.cmake.org/cmake/resources/software.html>`_ and install
   CMake. Version 3.13.4 is the minimum required.

#. Open a shell. Your development tools must be reachable from this shell
   through the PATH environment variable.

#. Create a build directory. Building LLVM in the source
   directory is not supported. cd to this directory:

   .. code-block:: console

     $ mkdir mybuilddir
     $ cd mybuilddir

#. Execute this command in the shell replacing `path/to/llvm/source/root` with
   the path to the root of your LLVM source tree:

   .. code-block:: console

     $ cmake path/to/llvm/source/root

   CMake will detect your development environment, perform a series of tests, and
   generate the files required for building LLVM. CMake will use default values
   for all build parameters. See the `Options and variables`_ section for
   a list of build parameters that you can modify.

   This can fail if CMake can't detect your toolset, or if it thinks that the
   environment is not sane enough. In this case, make sure that the toolset that
   you intend to use is the only one reachable from the shell, and that the shell
   itself is the correct one for your development environment. CMake will refuse
   to build MinGW makefiles if you have a POSIX shell reachable through the PATH
   environment variable, for instance. You can force CMake to use a given build
   tool; for instructions, see the `Usage`_ section, below.  You may
   also wish to control which targets LLVM enables, or which LLVM
   components are built; see the `Frequently Used LLVM-related
   variables`_ below.

#. After CMake has finished running, proceed to use IDE project files, or start
   the build from the build directory:

   .. code-block:: console

     $ cmake --build .

   The ``--build`` option tells ``cmake`` to invoke the underlying build
   tool (``make``, ``ninja``, ``xcodebuild``, ``msbuild``, etc.)

   The underlying build tool can be invoked directly, of course, but
   the ``--build`` option is portable.

#. After LLVM has finished building, install it from the build directory:

   .. code-block:: console

     $ cmake --build . --target install

   The ``--target`` option with ``install`` parameter in addition to
   the ``--build`` option tells ``cmake`` to build the ``install`` target.

   It is possible to set a different install prefix at installation time
   by invoking the ``cmake_install.cmake`` script generated in the
   build directory:

   .. code-block:: console

     $ cmake -DCMAKE_INSTALL_PREFIX=/tmp/llvm -P cmake_install.cmake

.. _Basic CMake usage:
.. _Usage:

Basic CMake usage
=================

This section explains basic aspects of CMake
which you may need in your day-to-day usage.

CMake comes with extensive documentation, in the form of html files, and as
online help accessible via the ``cmake`` executable itself. Execute ``cmake
--help`` for further help options.

CMake allows you to specify a build tool (e.g., GNU make, Visual Studio,
or Xcode). If not specified on the command line, CMake tries to guess which
build tool to use, based on your environment. Once it has identified your
build tool, CMake uses the corresponding *Generator* to create files for your
build tool (e.g., Makefiles or Visual Studio or Xcode project files). You can
explicitly specify the generator with the command line option ``-G "Name of the
generator"``. To see a list of the available generators on your system, execute

.. code-block:: console

  $ cmake --help

This will list the generator names at the end of the help text.

Generators' names are case-sensitive, and may contain spaces. For this reason,
you should enter them exactly as they are listed in the ``cmake --help``
output, in quotes. For example, to generate project files specifically for
Visual Studio 12, you can execute:

.. code-block:: console

  $ cmake -G "Visual Studio 12" path/to/llvm/source/root

For a given development platform there can be more than one adequate
generator. If you use Visual Studio, "NMake Makefiles" is a generator you can use
for building with NMake. By default, CMake chooses the most specific generator
supported by your development environment. If you want an alternative generator,
you must tell this to CMake with the ``-G`` option.

.. todo::

  Explain variables and cache. Move explanation here from #options section.

.. _Options and variables:

Options and variables
=====================

Variables customize how the build will be generated. Options are boolean
variables, with possible values ON/OFF. Options and variables are defined on the
CMake command line like this:

.. code-block:: console

  $ cmake -DVARIABLE=value path/to/llvm/source

You can set a variable after the initial CMake invocation to change its
value. You can also undefine a variable:

.. code-block:: console

  $ cmake -UVARIABLE path/to/llvm/source

Variables are stored in the CMake cache. This is a file named ``CMakeCache.txt``
stored at the root of your build directory that is generated by ``cmake``.
Editing it yourself is not recommended.

Variables are listed in the CMake cache and later in this document with
the variable name and type separated by a colon. You can also specify the
variable and type on the CMake command line:

.. code-block:: console

  $ cmake -DVARIABLE:TYPE=value path/to/llvm/source

Frequently-used CMake variables
-------------------------------

Here are some of the CMake variables that are used often, along with a
brief explanation. For full documentation, consult the CMake manual,
or execute ``cmake --help-variable VARIABLE_NAME``.  See `Frequently
Used LLVM-related Variables`_ below for information about commonly
used variables that control features of LLVM and enabled subprojects.

.. _cmake_build_type:

**CMAKE_BUILD_TYPE**:STRING
  This configures the optimization level for ``make`` or ``ninja`` builds.
  The default ``CMAKE_BUILD_TYPE`` is set to ``Debug`` but you should
  carefully read the list below to figure out what configuration matches
  your use case the best.

  Possible values:

  =========================== ============= ========== ========== ==========================
  Build Type                  Optimizations Debug Info Assertions Best suited for
  =========================== ============= ========== ========== ==========================
  **Release**                 For Speed     No         No         Users of LLVM and Clang
  **Debug**                   None          Yes        Yes        Developers of LLVM
  **RelWithDebInfo**          For Speed     Yes        No         Users that also need Debug
  **MinSizeRel**              For Size      No         No         When disk space matters
  =========================== ============= ========== ========== ==========================

  * Optimizations make LLVM/Clang run faster, but can be an impediment for
    step-by-step debugging.
  * Builds with debug information can use a lot of RAM and disk space and is
    usually slower to run. You can improve RAM usage by using ``lld``, see
    the :ref:`LLVM_USE_LINKER <llvm_use_linker>` option.
  * Assertions are internal checks to help you find bugs. They typically slow
    down LLVM and Clang when enabled, but can be useful during development.
    You can manually set :ref:`LLVM_ENABLE_ASSERTIONS <llvm_enable_assertions>`
    to override the default from `CMAKE_BUILD_TYPE`.

  If you are using an IDE such as Visual Studio or Xcode, you should use
  the IDE settings to set the build type.

**CMAKE_INSTALL_PREFIX**:PATH
  Path where LLVM will be installed when the "install" target is built.

**CMAKE_{C,CXX}_FLAGS**:STRING
  Extra flags to use when compiling C and C++ source files respectively.

**CMAKE_{C,CXX}_COMPILER**:STRING
  Specify the C and C++ compilers to use. If you have multiple
  compilers installed, CMake might not default to the one you wish to
  use.

.. _Frequently Used LLVM-related variables:

Frequently Used LLVM-related variables
--------------------------------------

The default configuration may not match your requirements. Here are
LLVM variables that are frequently used to control that. The full
description is in `LLVM-related variables`_ below.

**LLVM_ENABLE_PROJECTS**:STRING
  Control which projects are enabled. For example you may want to work on clang
  or lldb by specifying ``-DLLVM_ENABLE_PROJECTS="clang;lldb"``.

**LLVM_ENABLE_RUNTIMES**:STRING
  Control which runtimes are enabled. For example you may want to work on
  libc++ or libc++abi by specifying ``-DLLVM_ENABLE_RUNTIMES="libcxx;libcxxabi"``.

**LLVM_LIBDIR_SUFFIX**:STRING
  Extra suffix to append to the directory where libraries are to be
  installed. On a 64-bit architecture, one could use ``-DLLVM_LIBDIR_SUFFIX=64``
  to install libraries to ``/usr/lib64``.

**LLVM_PARALLEL_{COMPILE,LINK}_JOBS**:STRING
  Building the llvm toolchain can use a lot of resources, particularly
  linking. These options, when you use the Ninja generator, allow you
  to restrict the parallelism. For example, to avoid OOMs or going
  into swap, permit only one link job per 15GB of RAM available on a
  32GB machine, specify ``-G Ninja -DLLVM_PARALLEL_LINK_JOBS=2``.

**LLVM_TARGETS_TO_BUILD**:STRING
  Control which targets are enabled. For example you may only need to enable
  your native target with, for example, ``-DLLVM_TARGETS_TO_BUILD=X86``.

.. _llvm_use_linker:

**LLVM_USE_LINKER**:STRING
  Override the system's default linker. For instance use ``lld`` with
  ``-DLLVM_USE_LINKER=lld``.

Rarely-used CMake variables
---------------------------

Here are some of the CMake variables that are rarely used, along with a brief
explanation and LLVM-related notes.  For full documentation, consult the CMake
manual, or execute ``cmake --help-variable VARIABLE_NAME``.

**CMAKE_CXX_STANDARD**:STRING
  Sets the C++ standard to conform to when building LLVM.  Possible values are
  17 and 20.  LLVM Requires C++ 17 or higher.  This defaults to 17.

**CMAKE_INSTALL_BINDIR**:PATH
  The path to install executables, relative to the *CMAKE_INSTALL_PREFIX*.
  Defaults to "bin".

**CMAKE_INSTALL_INCLUDEDIR**:PATH
  The path to install header files, relative to the *CMAKE_INSTALL_PREFIX*.
  Defaults to "include".

**CMAKE_INSTALL_DOCDIR**:PATH
  The path to install documentation, relative to the *CMAKE_INSTALL_PREFIX*.
  Defaults to "share/doc".

**CMAKE_INSTALL_MANDIR**:PATH
  The path to install manpage files, relative to the *CMAKE_INSTALL_PREFIX*.
  Defaults to "share/man".

.. _LLVM-related variables:

LLVM-related variables
-----------------------

These variables provide fine control over the build of LLVM and
enabled sub-projects. Nearly all of these variable names begin with
``LLVM_``.

**BUILD_SHARED_LIBS**:BOOL
  Flag indicating if each LLVM component (e.g. Support) is built as a shared
  library (ON) or as a static library (OFF). Its default value is OFF. On
  Windows, shared libraries may be used when building with MinGW, including
  mingw-w64, but not when building with the Microsoft toolchain.

  .. note:: BUILD_SHARED_LIBS is only recommended for use by LLVM developers.
            If you want to build LLVM as a shared library, you should use the
            ``LLVM_BUILD_LLVM_DYLIB`` option.

**LLVM_ABI_BREAKING_CHECKS**:STRING
  Used to decide if LLVM should be built with ABI breaking checks or
  not.  Allowed values are `WITH_ASSERTS` (default), `FORCE_ON` and
  `FORCE_OFF`.  `WITH_ASSERTS` turns on ABI breaking checks in an
  assertion enabled build.  `FORCE_ON` (`FORCE_OFF`) turns them on
  (off) irrespective of whether normal (`NDEBUG`-based) assertions are
  enabled or not.  A version of LLVM built with ABI breaking checks
  is not ABI compatible with a version built without it.

**LLVM_UNREACHABLE_OPTIMIZE**:BOOL
  This flag controls the behavior of `llvm_unreachable()` in release build
  (when assertions are disabled in general). When ON (default) then
  `llvm_unreachable()` is considered "undefined behavior" and optimized as
  such. When OFF it is instead replaced with a guaranteed "trap".

**LLVM_APPEND_VC_REV**:BOOL
  Embed version control revision info (Git revision id).
  The version info is provided by the ``LLVM_REVISION`` macro in
  ``llvm/include/llvm/Support/VCSRevision.h``. Developers using git who don't
  need revision info can disable this option to avoid re-linking most binaries
  after a branch switch. Defaults to ON.

**LLVM_BUILD_32_BITS**:BOOL
  Build 32-bit executables and libraries on 64-bit systems. This option is
  available only on some 64-bit Unix systems. Defaults to OFF.

**LLVM_BUILD_BENCHMARKS**:BOOL
  Adds benchmarks to the list of default targets. Defaults to OFF.

**LLVM_BUILD_DOCS**:BOOL
  Adds all *enabled* documentation targets (i.e. Doxgyen and Sphinx targets) as
  dependencies of the default build targets.  This results in all of the (enabled)
  documentation targets being as part of a normal build.  If the ``install``
  target is run then this also enables all built documentation targets to be
  installed. Defaults to OFF.  To enable a particular documentation target, see
  see LLVM_ENABLE_SPHINX and LLVM_ENABLE_DOXYGEN.

**LLVM_BUILD_EXAMPLES**:BOOL
  Build LLVM examples. Defaults to OFF. Targets for building each example are
  generated in any case. See documentation for *LLVM_BUILD_TOOLS* above for more
  details.

**LLVM_BUILD_INSTRUMENTED_COVERAGE**:BOOL
  If enabled, `source-based code coverage
  <https://clang.llvm.org/docs/SourceBasedCodeCoverage.html>`_ instrumentation
  is enabled while building llvm. If CMake can locate the code coverage
  scripts and the llvm-cov and llvm-profdata tools that pair to your compiler,
  the build will also generate the `generate-coverage-report` target to generate
  the code coverage report for LLVM, and the `clear-profile-data` utility target
  to delete captured profile data. See documentation for
  *LLVM_CODE_COVERAGE_TARGETS* and *LLVM_COVERAGE_SOURCE_DIRS* for more
  information on configuring code coverage reports.

**LLVM_CODE_COVERAGE_TARGETS**:STRING
  If set to a semicolon separated list of targets, those targets will be used
  to drive the code coverage reports. If unset, the target list will be
  constructed using the LLVM build's CMake export list.

**LLVM_COVERAGE_SOURCE_DIRS**:STRING
  If set to a semicolon separated list of directories, the coverage reports
  will limit code coverage summaries to just the listed directories. If unset,
  coverage reports will include all sources identified by the tooling.

**LLVM_BUILD_LLVM_DYLIB**:BOOL
  If enabled, the target for building the libLLVM shared library is added.
  This library contains all of LLVM's components in a single shared library.
  Defaults to OFF. This cannot be used in conjunction with BUILD_SHARED_LIBS.
  Tools will only be linked to the libLLVM shared library if LLVM_LINK_LLVM_DYLIB
  is also ON.
  The components in the library can be customised by setting LLVM_DYLIB_COMPONENTS
  to a list of the desired components.
  This option is not available on Windows.

**LLVM_BUILD_TESTS**:BOOL
  Include LLVM unit tests in the 'all' build target. Defaults to OFF. Targets
  for building each unit test are generated in any case. You can build a
  specific unit test using the targets defined under *unittests*, such as
  ADTTests, IRTests, SupportTests, etc. (Search for ``add_llvm_unittest`` in
  the subdirectories of *unittests* for a complete list of unit tests.) It is
  possible to build all unit tests with the target *UnitTests*.

**LLVM_BUILD_TOOLS**:BOOL
  Build LLVM tools. Defaults to ON. Targets for building each tool are generated
  in any case. You can build a tool separately by invoking its target. For
  example, you can build *llvm-as* with a Makefile-based system by executing *make
  llvm-as* at the root of your build directory.

**LLVM_CCACHE_BUILD**:BOOL
  If enabled and the ``ccache`` program is available, then LLVM will be
  built using ``ccache`` to speed up rebuilds of LLVM and its components.
  Defaults to OFF.  The size and location of the cache maintained
  by ``ccache`` can be adjusted via the LLVM_CCACHE_MAXSIZE and LLVM_CCACHE_DIR
  options, which are passed to the CCACHE_MAXSIZE and CCACHE_DIR environment
  variables, respectively.

**LLVM_CREATE_XCODE_TOOLCHAIN**:BOOL
  macOS Only: If enabled CMake will generate a target named
  'install-xcode-toolchain'. This target will create a directory at
  $CMAKE_INSTALL_PREFIX/Toolchains containing an xctoolchain directory which can
  be used to override the default system tools.

**LLVM_DEFAULT_TARGET_TRIPLE**:STRING
  LLVM target to use for code generation when no target is explicitly specified.
  It defaults to "host", meaning that it shall pick the architecture
  of the machine where LLVM is being built. If you are building a cross-compiler,
  set it to the target triple of your desired architecture.

**LLVM_DOXYGEN_QCH_FILENAME**:STRING
  The filename of the Qt Compressed Help file that will be generated when
  ``-DLLVM_ENABLE_DOXYGEN=ON`` and
  ``-DLLVM_ENABLE_DOXYGEN_QT_HELP=ON`` are given. Defaults to
  ``org.llvm.qch``.
  This option is only useful in combination with
  ``-DLLVM_ENABLE_DOXYGEN_QT_HELP=ON``;
  otherwise it has no effect.

**LLVM_DOXYGEN_QHELPGENERATOR_PATH**:STRING
  The path to the ``qhelpgenerator`` executable. Defaults to whatever CMake's
  ``find_program()`` can find. This option is only useful in combination with
  ``-DLLVM_ENABLE_DOXYGEN_QT_HELP=ON``; otherwise it has no
  effect.

**LLVM_DOXYGEN_QHP_CUST_FILTER_NAME**:STRING
  See `Qt Help Project`_ for
  more information. Defaults to the CMake variable ``${PACKAGE_STRING}`` which
  is a combination of the package name and version string. This filter can then
  be used in Qt Creator to select only documentation from LLVM when browsing
  through all the help files that you might have loaded. This option is only
  useful in combination with ``-DLLVM_ENABLE_DOXYGEN_QT_HELP=ON``;
  otherwise it has no effect.

.. _Qt Help Project: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom-filters

**LLVM_DOXYGEN_QHP_NAMESPACE**:STRING
  Namespace under which the intermediate Qt Help Project file lives. See `Qt
  Help Project`_
  for more information. Defaults to "org.llvm". This option is only useful in
  combination with ``-DLLVM_ENABLE_DOXYGEN_QT_HELP=ON``; otherwise
  it has no effect.

**LLVM_DOXYGEN_SVG**:BOOL
  Uses .svg files instead of .png files for graphs in the Doxygen output.
  Defaults to OFF.

.. _llvm_enable_assertions:

**LLVM_ENABLE_ASSERTIONS**:BOOL
  Enables code assertions. Defaults to ON if and only if ``CMAKE_BUILD_TYPE``
  is *Debug*.

**LLVM_ENABLE_BINDINGS**:BOOL
  If disabled, do not try to build the OCaml bindings.

**LLVM_ENABLE_DIA_SDK**:BOOL
  Enable building with MSVC DIA SDK for PDB debugging support. Available
  only with MSVC. Defaults to ON.

**LLVM_ENABLE_DOXYGEN**:BOOL
  Enables the generation of browsable HTML documentation using doxygen.
  Defaults to OFF.

**LLVM_ENABLE_DOXYGEN_QT_HELP**:BOOL
  Enables the generation of a Qt Compressed Help file. Defaults to OFF.
  This affects the make target ``doxygen-llvm``. When enabled, apart from
  the normal HTML output generated by doxygen, this will produce a QCH file
  named ``org.llvm.qch``. You can then load this file into Qt Creator.
  This option is only useful in combination with ``-DLLVM_ENABLE_DOXYGEN=ON``;
  otherwise this has no effect.

**LLVM_ENABLE_EH**:BOOL
  Build LLVM with exception-handling support. This is necessary if you wish to
  link against LLVM libraries and make use of C++ exceptions in your own code
  that need to propagate through LLVM code. Defaults to OFF.

**LLVM_ENABLE_EXPENSIVE_CHECKS**:BOOL
  Enable additional time/memory expensive checking. Defaults to OFF.

**LLVM_ENABLE_FFI**:BOOL
  Indicates whether the LLVM Interpreter will be linked with the Foreign Function
  Interface library (libffi) in order to enable calling external functions.
  If the library or its headers are installed in a custom
  location, you can also set the variables FFI_INCLUDE_DIR and
  FFI_LIBRARY_DIR to the directories where ffi.h and libffi.so can be found,
  respectively. Defaults to OFF.

**LLVM_ENABLE_IDE**:BOOL
  Tell the build system that an IDE is being used. This in turn disables the
  creation of certain convenience build system targets, such as the various
  ``install-*`` and ``check-*`` targets, since IDEs don't always deal well with
  a large number of targets. This is usually autodetected, but it can be
  configured manually to explicitly control the generation of those targets.

**LLVM_ENABLE_LIBCXX**:BOOL
  If the host compiler and linker supports the stdlib flag, -stdlib=libc++ is
  passed to invocations of both so that the project is built using libc++
  instead of stdlibc++. Defaults to OFF.

**LLVM_ENABLE_LIBPFM**:BOOL
  Enable building with libpfm to support hardware counter measurements in LLVM
  tools.
  Defaults to ON.

**LLVM_ENABLE_LLD**:BOOL
  This option is equivalent to `-DLLVM_USE_LINKER=lld`, except during a 2-stage
  build where a dependency is added from the first stage to the second ensuring
  that lld is built before stage2 begins.

**LLVM_ENABLE_LTO**:STRING
  Add ``-flto`` or ``-flto=`` flags to the compile and link command
  lines, enabling link-time optimization. Possible values are ``Off``,
  ``On``, ``Thin`` and ``Full``. Defaults to OFF.

**LLVM_ENABLE_MODULES**:BOOL
  Compile with `Clang Header Modules
  <https://clang.llvm.org/docs/Modules.html>`_.

**LLVM_ENABLE_PEDANTIC**:BOOL
  Enable pedantic mode. This disables compiler-specific extensions, if
  possible. Defaults to ON.

**LLVM_ENABLE_PIC**:BOOL
  Add the ``-fPIC`` flag to the compiler command-line, if the compiler supports
  this flag. Some systems, like Windows, do not need this flag. Defaults to ON.

**LLVM_ENABLE_PROJECTS**:STRING
  Semicolon-separated list of projects to build, or *all* for building all
  (clang, lldb, lld, polly, etc) projects. This flag assumes that projects
  are checked out side-by-side and not nested, i.e. clang needs to be in
  parallel of llvm instead of nested in `llvm/tools`. This feature allows
  to have one build for only LLVM and another for clang+llvm using the same
  source checkout.
  The full list is:
  ``clang;clang-tools-extra;cross-project-tests;libc;libclc;lld;lldb;openmp;polly;pstl``

**LLVM_ENABLE_RUNTIMES**:STRING
  Build libc++, libc++abi, libunwind or compiler-rt using the just-built compiler.
  This is the correct way to build runtimes when putting together a toolchain.
  It will build the builtins separately from the other runtimes to preserve
  correct dependency ordering. If you want to build the runtimes using a system
  compiler, see the `libc++ documentation <https://libcxx.llvm.org/BuildingLibcxx.html>`_.
  Note: the list should not have duplicates with `LLVM_ENABLE_PROJECTS`.
  The full list is:
  ``compiler-rt;libc;libcxx;libcxxabi;libunwind;openmp``
  To enable all of them, use:
  ``LLVM_ENABLE_RUNTIMES=all``


**LLVM_ENABLE_RTTI**:BOOL
  Build LLVM with run-time type information. Defaults to OFF.

**LLVM_ENABLE_SPHINX**:BOOL
  If specified, CMake will search for the ``sphinx-build`` executable and will make
  the ``SPHINX_OUTPUT_HTML`` and ``SPHINX_OUTPUT_MAN`` CMake options available.
  Defaults to OFF.

**LLVM_ENABLE_THREADS**:BOOL
  Build with threads support, if available. Defaults to ON.

**LLVM_ENABLE_UNWIND_TABLES**:BOOL
  Enable unwind tables in the binary.  Disabling unwind tables can reduce the
  size of the libraries.  Defaults to ON.

**LLVM_ENABLE_WARNINGS**:BOOL
  Enable all compiler warnings. Defaults to ON.

**LLVM_ENABLE_WERROR**:BOOL
  Stop and fail the build, if a compiler warning is triggered. Defaults to OFF.

**LLVM_ENABLE_Z3_SOLVER**:BOOL
  If enabled, the Z3 constraint solver is activated for the Clang static analyzer.
  A recent version of the z3 library needs to be available on the system.

**LLVM_ENABLE_ZLIB**:BOOL
  Enable building with zlib to support compression/uncompression in LLVM tools.
  Defaults to ON.

**LLVM_EXPERIMENTAL_TARGETS_TO_BUILD**:STRING
  Semicolon-separated list of experimental targets to build and linked into
  llvm. This will build the experimental target without needing it to add to the
  list of all the targets available in the LLVM's main CMakeLists.txt.

**LLVM_EXTERNAL_{CLANG,LLD,POLLY}_SOURCE_DIR**:PATH
  These variables specify the path to the source directory for the external
  LLVM projects Clang, lld, and Polly, respectively, relative to the top-level
  source directory.  If the in-tree subdirectory for an external project
  exists (e.g., llvm/tools/clang for Clang), then the corresponding variable
  will not be used.  If the variable for an external project does not point
  to a valid path, then that project will not be built.

**LLVM_EXTERNAL_PROJECTS**:STRING
  Semicolon-separated list of additional external projects to build as part of
  llvm. For each project LLVM_EXTERNAL_<NAME>_SOURCE_DIR have to be specified
  with the path for the source code of the project. Example:
  ``-DLLVM_EXTERNAL_PROJECTS="Foo;Bar"
  -DLLVM_EXTERNAL_FOO_SOURCE_DIR=/src/foo
  -DLLVM_EXTERNAL_BAR_SOURCE_DIR=/src/bar``.

**LLVM_EXTERNALIZE_DEBUGINFO**:BOOL
  Generate dSYM files and strip executables and libraries (Darwin Only).
  Defaults to OFF.

**LLVM_FORCE_USE_OLD_TOOLCHAIN**:BOOL
  If enabled, the compiler and standard library versions won't be checked. LLVM
  may not compile at all, or might fail at runtime due to known bugs in these
  toolchains.

**LLVM_INCLUDE_BENCHMARKS**:BOOL
  Generate build targets for the LLVM benchmarks. Defaults to ON.

**LLVM_INCLUDE_EXAMPLES**:BOOL
  Generate build targets for the LLVM examples. Defaults to ON. You can use this
  option to disable the generation of build targets for the LLVM examples.

**LLVM_INCLUDE_TESTS**:BOOL
  Generate build targets for the LLVM unit tests. Defaults to ON. You can use
  this option to disable the generation of build targets for the LLVM unit
  tests.

**LLVM_INCLUDE_TOOLS**:BOOL
  Generate build targets for the LLVM tools. Defaults to ON. You can use this
  option to disable the generation of build targets for the LLVM tools.

**LLVM_INSTALL_BINUTILS_SYMLINKS**:BOOL
  Install symlinks from the binutils tool names to the corresponding LLVM tools.
  For example, ar will be symlinked to llvm-ar.

**LLVM_INSTALL_CCTOOLS_SYMLINKS**:BOOL
  Install symliks from the cctools tool names to the corresponding LLVM tools.
  For example, lipo will be symlinked to llvm-lipo.

**LLVM_INSTALL_OCAMLDOC_HTML_DIR**:STRING
  The path to install OCamldoc-generated HTML documentation to. This path can
  either be absolute or relative to the CMAKE_INSTALL_PREFIX. Defaults to
  ``${CMAKE_INSTALL_DOCDIR}/llvm/ocaml-html``.

**LLVM_INSTALL_SPHINX_HTML_DIR**:STRING
  The path to install Sphinx-generated HTML documentation to. This path can
  either be absolute or relative to the CMAKE_INSTALL_PREFIX. Defaults to
  ``${CMAKE_INSTALL_DOCDIR}/llvm/html``.

**LLVM_INSTALL_UTILS**:BOOL
  If enabled, utility binaries like ``FileCheck`` and ``not`` will be installed
  to CMAKE_INSTALL_PREFIX.

**LLVM_INTEGRATED_CRT_ALLOC**:PATH
  On Windows, allows embedding a different C runtime allocator into the LLVM
  tools and libraries. Using a lock-free allocator such as the ones listed below
  greatly decreases ThinLTO link time by about an order of magnitude. It also
  midly improves Clang build times, by about 5-10%. At the moment, rpmalloc,
  snmalloc and mimalloc are supported. Use the path to `git clone` to select
  the respective allocator, for example:

  .. code-block:: console

    $ D:\git> git clone https://github.com/mjansson/rpmalloc
    $ D:\llvm-project> cmake ... -DLLVM_INTEGRATED_CRT_ALLOC=D:\git\rpmalloc

  This flag needs to be used along with the static CRT, ie. if building the
  Release target, add -DLLVM_USE_CRT_RELEASE=MT.

**LLVM_INSTALL_DOXYGEN_HTML_DIR**:STRING
  The path to install Doxygen-generated HTML documentation to. This path can
  either be absolute or relative to the *CMAKE_INSTALL_PREFIX*. Defaults to
  ``${CMAKE_INSTALL_DOCDIR}/llvm/doxygen-html``.

**LLVM_LINK_LLVM_DYLIB**:BOOL
  If enabled, tools will be linked with the libLLVM shared library. Defaults
  to OFF. Setting LLVM_LINK_LLVM_DYLIB to ON also sets LLVM_BUILD_LLVM_DYLIB
  to ON.
  This option is not available on Windows.

**LLVM_LIT_ARGS**:STRING
  Arguments given to lit.  ``make check`` and ``make clang-test`` are affected.
  By default, ``'-sv --no-progress-bar'`` on Visual C++ and Xcode, ``'-sv'`` on
  others.

**LLVM_LIT_TOOLS_DIR**:PATH
  The path to GnuWin32 tools for tests. Valid on Windows host.  Defaults to
  the empty string, in which case lit will look for tools needed for tests
  (e.g. ``grep``, ``sort``, etc.) in your %PATH%. If GnuWin32 is not in your
  %PATH%, then you can set this variable to the GnuWin32 directory so that
  lit can find tools needed for tests in that directory.

**LLVM_NATIVE_TOOL_DIR**:STRING
  Full path to a directory containing executables for the build host
  (containing binaries such as ``llvm-tblgen`` and ``clang-tblgen``). This is
  intended for cross-compiling: if the user sets this variable and the
  directory contains executables with the expected names, no separate
  native versions of those executables will be built.

**LLVM_OPTIMIZED_TABLEGEN**:BOOL
  If enabled and building a debug or asserts build the CMake build system will
  generate a Release build tree to build a fully optimized tablegen for use
  during the build. Enabling this option can significantly speed up build times
  especially when building LLVM in Debug configurations.

**LLVM_PARALLEL_COMPILE_JOBS**:STRING
  Define the maximum number of concurrent compilation jobs.

**LLVM_PARALLEL_LINK_JOBS**:STRING
  Define the maximum number of concurrent link jobs.

**LLVM_PROFDATA_FILE**:PATH
  Path to a profdata file to pass into clang's -fprofile-instr-use flag. This
  can only be specified if you're building with clang.

**LLVM_REVERSE_ITERATION**:BOOL
  If enabled, all supported unordered llvm containers would be iterated in
  reverse order. This is useful for uncovering non-determinism caused by
  iteration of unordered containers.

**LLVM_STATIC_LINK_CXX_STDLIB**:BOOL
  Statically link to the C++ standard library if possible. This uses the flag
  "-static-libstdc++", but a Clang host compiler will statically link to libc++
  if used in conjunction with the **LLVM_ENABLE_LIBCXX** flag. Defaults to OFF.

**LLVM_TABLEGEN**:STRING
  Full path to a native TableGen executable (usually named ``llvm-tblgen``). This is
  intended for cross-compiling: if the user sets this variable, no native
  TableGen will be created.

**LLVM_TARGET_ARCH**:STRING
  LLVM target to use for native code generation. This is required for JIT
  generation. It defaults to "host", meaning that it shall pick the architecture
  of the machine where LLVM is being built. If you are cross-compiling, set it
  to the target architecture name.

**LLVM_TARGETS_TO_BUILD**:STRING
  Semicolon-separated list of targets to build, or *all* for building all
  targets. Case-sensitive. Defaults to *all*. Example:
  ``-DLLVM_TARGETS_TO_BUILD="X86;PowerPC"``.
  The full list, as of October 2022, is:
  ``AArch64;AMDGPU;ARM;AVR;BPF;Hexagon;Lanai;Mips;MSP430;NVPTX;PowerPC;RISCV;Sparc;SystemZ;VE;WebAssembly;X86;XCore``

**LLVM_TEMPORARILY_ALLOW_OLD_TOOLCHAIN**:BOOL
  If enabled, the compiler version check will only warn when using a toolchain
  which is about to be deprecated, instead of emitting an error.

**LLVM_UBSAN_FLAGS**:STRING
  Defines the set of compile flags used to enable UBSan. Only used if
  ``LLVM_USE_SANITIZER`` contains ``Undefined``. This can be used to override
  the default set of UBSan flags.

**LLVM_USE_CRT_{target}**:STRING
  On Windows, tells which version of the C runtime library (CRT) should be used.
  For example, -DLLVM_USE_CRT_RELEASE=MT would statically link the CRT into the
  LLVM tools and library.

**LLVM_USE_INTEL_JITEVENTS**:BOOL
  Enable building support for Intel JIT Events API. Defaults to OFF.

**LLVM_USE_LINKER**:STRING
  Add ``-fuse-ld={name}`` to the link invocation. The possible value depend on
  your compiler, for clang the value can be an absolute path to your custom
  linker, otherwise clang will prefix the name with ``ld.`` and apply its usual
  search. For example to link LLVM with the Gold linker, cmake can be invoked
  with ``-DLLVM_USE_LINKER=gold``.

**LLVM_USE_OPROFILE**:BOOL
  Enable building OProfile JIT support. Defaults to OFF.

**LLVM_USE_PERF**:BOOL
  Enable building support for Perf (linux profiling tool) JIT support. Defaults to OFF.

**LLVM_USE_RELATIVE_PATHS_IN_FILES**:BOOL
  Rewrite absolute source paths in sources and debug info to relative ones. The
  source prefix can be adjusted via the LLVM_SOURCE_PREFIX variable.

**LLVM_USE_RELATIVE_PATHS_IN_DEBUG_INFO**:BOOL
  Rewrite absolute source paths in debug info to relative ones. The source prefix
  can be adjusted via the LLVM_SOURCE_PREFIX variable.

**LLVM_USE_SANITIZER**:STRING
  Define the sanitizer used to build LLVM binaries and tests. Possible values
  are ``Address``, ``Memory``, ``MemoryWithOrigins``, ``Undefined``, ``Thread``,
  ``DataFlow``, and ``Address;Undefined``. Defaults to empty string.

**LLVM_USE_SPLIT_DWARF**:BOOL
  If enabled CMake will pass ``-gsplit-dwarf`` to the compiler. This option
  reduces link-time memory usage by reducing the amount of debug information that
  the linker needs to resolve. It is recommended for platforms using the ELF object
  format, like Linux systems when linker memory usage is too high.

**SPHINX_EXECUTABLE**:STRING
  The path to the ``sphinx-build`` executable detected by CMake.
  For installation instructions, see
  https://www.sphinx-doc.org/en/master/usage/installation.html

**SPHINX_OUTPUT_HTML**:BOOL
  If enabled (and ``LLVM_ENABLE_SPHINX`` is enabled) then the targets for
  building the documentation as html are added (but not built by default unless
  ``LLVM_BUILD_DOCS`` is enabled). There is a target for each project in the
  source tree that uses sphinx (e.g.  ``docs-llvm-html``, ``docs-clang-html``
  and ``docs-lld-html``). Defaults to ON.

**SPHINX_OUTPUT_MAN**:BOOL
  If enabled (and ``LLVM_ENABLE_SPHINX`` is enabled) the targets for building
  the man pages are added (but not built by default unless ``LLVM_BUILD_DOCS``
  is enabled). Currently the only target added is ``docs-llvm-man``. Defaults
  to ON.

**SPHINX_WARNINGS_AS_ERRORS**:BOOL
  If enabled then sphinx documentation warnings will be treated as
  errors. Defaults to ON.

Advanced variables
~~~~~~~~~~~~~~~~~~

These are niche, and changing them from their defaults is more likely to cause
things to go wrong.  They are also unstable across LLVM versions.

**LLVM_TOOLS_INSTALL_DIR**:STRING
  The path to install the main LLVM tools, relative to the *CMAKE_INSTALL_PREFIX*.
  Defaults to *CMAKE_INSTALL_BINDIR*.

**LLVM_UTILS_INSTALL_DIR**:STRING
  The path to install auxiliary LLVM utilities, relative to the *CMAKE_INSTALL_PREFIX*.
  Only matters if *LLVM_INSTALL_UTILS* is enabled.
  Defaults to *LLVM_TOOLS_INSTALL_DIR*.

**LLVM_EXAMPLES_INSTALL_DIR**:STRING
  The path for examples of using LLVM, relative to the *CMAKE_INSTALL_PREFIX*.
  Only matters if *LLVM_BUILD_EXAMPLES* is enabled.
  Defaults to "examples".

CMake Caches
============

Recently LLVM and Clang have been adding some more complicated build system
features. Utilizing these new features often involves a complicated chain of
CMake variables passed on the command line. Clang provides a collection of CMake
cache scripts to make these features more approachable.

CMake cache files are utilized using CMake's -C flag:

.. code-block:: console

  $ cmake -C <path to cache file> <path to sources>

CMake cache scripts are processed in an isolated scope, only cached variables
remain set when the main configuration runs. CMake cached variables do not reset
variables that are already set unless the FORCE option is specified.

A few notes about CMake Caches:

- Order of command line arguments is important

  - -D arguments specified before -C are set before the cache is processed and
    can be read inside the cache file
  - -D arguments specified after -C are set after the cache is processed and
    are unset inside the cache file

- All -D arguments will override cache file settings
- CMAKE_TOOLCHAIN_FILE is evaluated after both the cache file and the command
  line arguments
- It is recommended that all -D options should be specified *before* -C

For more information about some of the advanced build configurations supported
via Cache files see :doc:`AdvancedBuilds`.

Executing the Tests
===================

Testing is performed when the *check-all* target is built. For instance, if you are
using Makefiles, execute this command in the root of your build directory:

.. code-block:: console

  $ make check-all

On Visual Studio, you may run tests by building the project "check-all".
For more information about testing, see the :doc:`TestingGuide`.

Cross compiling
===============

See `this wiki page <https://gitlab.kitware.com/cmake/community/wikis/doc/cmake/CrossCompiling>`_ for
generic instructions on how to cross-compile with CMake. It goes into detailed
explanations and may seem daunting, but it is not. On the wiki page there are
several examples including toolchain files. Go directly to the
``Information how to set up various cross compiling toolchains`` section
for a quick solution.

Also see the `LLVM-related variables`_ section for variables used when
cross-compiling.

Embedding LLVM in your project
==============================

From LLVM 3.5 onwards the CMake build system exports LLVM libraries as
importable CMake targets. This means that clients of LLVM can now reliably use
CMake to develop their own LLVM-based projects against an installed version of
LLVM regardless of how it was built.

Here is a simple example of a CMakeLists.txt file that imports the LLVM libraries
and uses them to build a simple application ``simple-tool``.

.. code-block:: cmake

  cmake_minimum_required(VERSION 3.13.4)
  project(SimpleProject)

  find_package(LLVM REQUIRED CONFIG)

  message(STATUS "Found LLVM ${LLVM_PACKAGE_VERSION}")
  message(STATUS "Using LLVMConfig.cmake in: ${LLVM_DIR}")

  # Set your project compile flags.
  # E.g. if using the C++ header files
  # you will need to enable C++11 support
  # for your compiler.

  include_directories(${LLVM_INCLUDE_DIRS})
  separate_arguments(LLVM_DEFINITIONS_LIST NATIVE_COMMAND ${LLVM_DEFINITIONS})
  add_definitions(${LLVM_DEFINITIONS_LIST})

  # Now build our tools
  add_executable(simple-tool tool.cpp)

  # Find the libraries that correspond to the LLVM components
  # that we wish to use
  llvm_map_components_to_libnames(llvm_libs support core irreader)

  # Link against LLVM libraries
  target_link_libraries(simple-tool ${llvm_libs})

The ``find_package(...)`` directive when used in CONFIG mode (as in the above
example) will look for the ``LLVMConfig.cmake`` file in various locations (see
cmake manual for details).  It creates a ``LLVM_DIR`` cache entry to save the
directory where ``LLVMConfig.cmake`` is found or allows the user to specify the
directory (e.g. by passing ``-DLLVM_DIR=/usr/lib/cmake/llvm`` to
the ``cmake`` command or by setting it directly in ``ccmake`` or ``cmake-gui``).

This file is available in two different locations.

* ``<LLVM_INSTALL_PACKAGE_DIR>/LLVMConfig.cmake`` where
  ``<LLVM_INSTALL_PACKAGE_DIR>`` is the location where LLVM CMake modules are
  installed as part of an installed version of LLVM. This is typically
  ``cmake/llvm/`` within the lib directory. On Linux, this is typically
  ``/usr/lib/cmake/llvm/LLVMConfig.cmake``.

* ``<LLVM_BUILD_ROOT>/lib/cmake/llvm/LLVMConfig.cmake`` where
  ``<LLVM_BUILD_ROOT>`` is the root of the LLVM build tree. **Note: this is only
  available when building LLVM with CMake.**

If LLVM is installed in your operating system's normal installation prefix (e.g.
on Linux this is usually ``/usr/``) ``find_package(LLVM ...)`` will
automatically find LLVM if it is installed correctly. If LLVM is not installed
or you wish to build directly against the LLVM build tree you can use
``LLVM_DIR`` as previously mentioned.

The ``LLVMConfig.cmake`` file sets various useful variables. Notable variables
include

``LLVM_CMAKE_DIR``
  The path to the LLVM CMake directory (i.e. the directory containing
  LLVMConfig.cmake).

``LLVM_DEFINITIONS``
  A list of preprocessor defines that should be used when building against LLVM.

``LLVM_ENABLE_ASSERTIONS``
  This is set to ON if LLVM was built with assertions, otherwise OFF.

``LLVM_ENABLE_EH``
  This is set to ON if LLVM was built with exception handling (EH) enabled,
  otherwise OFF.

``LLVM_ENABLE_RTTI``
  This is set to ON if LLVM was built with run time type information (RTTI),
  otherwise OFF.

``LLVM_INCLUDE_DIRS``
  A list of include paths to directories containing LLVM header files.

``LLVM_PACKAGE_VERSION``
  The LLVM version. This string can be used with CMake conditionals, e.g., ``if
  (${LLVM_PACKAGE_VERSION} VERSION_LESS "3.5")``.

``LLVM_TOOLS_BINARY_DIR``
  The path to the directory containing the LLVM tools (e.g. ``llvm-as``).

Notice that in the above example we link ``simple-tool`` against several LLVM
libraries. The list of libraries is determined by using the
``llvm_map_components_to_libnames()`` CMake function. For a list of available
components look at the output of running ``llvm-config --components``.

Note that for LLVM < 3.5 ``llvm_map_components_to_libraries()`` was
used instead of ``llvm_map_components_to_libnames()``. This is now deprecated
and will be removed in a future version of LLVM.

.. _cmake-out-of-source-pass:

Developing LLVM passes out of source
------------------------------------

It is possible to develop LLVM passes out of LLVM's source tree (i.e. against an
installed or built LLVM). An example of a project layout is provided below.

.. code-block:: none

  <project dir>/
      |
      CMakeLists.txt
      <pass name>/
          |
          CMakeLists.txt
          Pass.cpp
          ...

Contents of ``<project dir>/CMakeLists.txt``:

.. code-block:: cmake

  find_package(LLVM REQUIRED CONFIG)

  separate_arguments(LLVM_DEFINITIONS_LIST NATIVE_COMMAND ${LLVM_DEFINITIONS})
  add_definitions(${LLVM_DEFINITIONS_LIST})
  include_directories(${LLVM_INCLUDE_DIRS})

  add_subdirectory(<pass name>)

Contents of ``<project dir>/<pass name>/CMakeLists.txt``:

.. code-block:: cmake

  add_library(LLVMPassname MODULE Pass.cpp)

Note if you intend for this pass to be merged into the LLVM source tree at some
point in the future it might make more sense to use LLVM's internal
``add_llvm_library`` function with the MODULE argument instead by...


Adding the following to ``<project dir>/CMakeLists.txt`` (after
``find_package(LLVM ...)``)

.. code-block:: cmake

  list(APPEND CMAKE_MODULE_PATH "${LLVM_CMAKE_DIR}")
  include(AddLLVM)

And then changing ``<project dir>/<pass name>/CMakeLists.txt`` to

.. code-block:: cmake

  add_llvm_library(LLVMPassname MODULE
    Pass.cpp
    )

When you are done developing your pass, you may wish to integrate it
into the LLVM source tree. You can achieve it in two easy steps:

#. Copying ``<pass name>`` folder into ``<LLVM root>/lib/Transform`` directory.

#. Adding ``add_subdirectory(<pass name>)`` line into
   ``<LLVM root>/lib/Transform/CMakeLists.txt``.

Compiler/Platform-specific topics
=================================

Notes for specific compilers and/or platforms.

Windows
-------

**LLVM_COMPILER_JOBS**:STRING
  Specifies the maximum number of parallel compiler jobs to use per project
  when building with msbuild or Visual Studio. Only supported for the Visual
  Studio 2010 CMake generator. 0 means use all processors. Default is 0.

**CMAKE_MT**:STRING
  When compiling with clang-cl, recent CMake versions will default to selecting
  `llvm-mt` as the Manifest Tool instead of Microsoft's `mt.exe`. This will
  often cause errors like:

  .. code-block:: console

    -- Check for working C compiler: [...]clang-cl.exe - broken
    [...]
        MT: command [...] failed (exit code 0x1) with the following output:
        llvm-mt: error: no libxml2
        ninja: build stopped: subcommand failed.

  To work around this error, set `CMAKE_MT=mt`.
