mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2024-11-30 17:21:10 +00:00
3fd081f71e
Fix for #71941
1153 lines
47 KiB
ReStructuredText
1153 lines
47 KiB
ReStructuredText
========================
|
|
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.20.0 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.
|
|
|
|
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_ADDITIONAL_BUILD_TYPES**:LIST
|
|
Adding a semicolon separated list of additional build types to this flag
|
|
allows for them to be specified as values in CMAKE_BUILD_TYPE without
|
|
encountering a fatal error during the configuration process.
|
|
|
|
**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_FORCE_VC_REVISION**:STRING
|
|
Force a specific Git revision id rather than calling to git to determine it.
|
|
This is useful in environments where git is not available or non-functional
|
|
but the VC revision is available through other means.
|
|
|
|
**LLVM_FORCE_VC_REPOSITORY**:STRING
|
|
Set the git repository to include in version info rather than calling git to
|
|
determine it.
|
|
|
|
**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_INDIVIDUAL_TEST_COVERAGE**:BOOL
|
|
Enable individual test case coverage. When set to ON, code coverage data for
|
|
each test case will be generated and stored in a separate directory under the
|
|
config.test_exec_root path. This feature allows code coverage analysis of each
|
|
individual test case. Defaults to OFF.
|
|
|
|
**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_<target>_LINKER_FLAGS**:STRING
|
|
Defines the set of linker flags that should be applied to a <target>.
|
|
|
|
**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_HTTPLIB**:BOOL
|
|
Enables the optional cpp-httplib dependency which is used by llvm-debuginfod
|
|
to serve debug info over HTTP. `cpp-httplib <https://github.com/yhirose/cpp-httplib>`_
|
|
must be installed, or `httplib_ROOT` must be set. 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_LLVM_LIBC**: BOOL
|
|
If the LLVM libc overlay is installed in a location where the host linker
|
|
can access it, all built executables will be linked against the LLVM libc
|
|
overlay before linking against the system libc. 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**:STRING
|
|
Used to decide if LLVM tools should support compression/decompression with
|
|
zlib. Allowed values are ``OFF``, ``ON`` (default, enable if zlib is found),
|
|
and ``FORCE_ON`` (error if zlib is not found).
|
|
|
|
**LLVM_ENABLE_ZSTD**:STRING
|
|
Used to decide if LLVM tools should support compression/decompression with
|
|
zstd. Allowed values are ``OFF``, ``ON`` (default, enable if zstd is found),
|
|
and ``FORCE_ON`` (error if zstd is not found).
|
|
|
|
**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 -DCMAKE_MSVC_RUNTIME_LIBRARY=MultiThreaded.
|
|
|
|
**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_NO_INSTALL_NAME_DIR_FOR_BUILD_TREE**:BOOL
|
|
Defaults to ``OFF``. If set to ``ON``, CMake's default logic for library IDs
|
|
on Darwin in the build tree will be used. Otherwise the install-time library
|
|
IDs will be used in the build tree as well. Mainly useful when other CMake
|
|
library ID control variables (e.g., ``CMAKE_INSTALL_NAME_DIR``) are being
|
|
set to non-standard values.
|
|
|
|
**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_RAM_PER_COMPILE_JOB**:STRING
|
|
Calculates the amount of Ninja compile jobs according to available resources.
|
|
Value has to be in MB, overwrites LLVM_PARALLEL_COMPILE_JOBS. Compile jobs
|
|
will be between one and amount of logical cores.
|
|
|
|
**LLVM_RAM_PER_LINK_JOB**:STRING
|
|
Calculates the amount of Ninja link jobs according to available resources.
|
|
Value has to be in MB, overwrites LLVM_PARALLEL_LINK_JOBS. Link jobs will
|
|
be between one and amount of logical cores. Link jobs will not run
|
|
exclusively therefore you should add an offset of one or two compile jobs
|
|
to be sure its not terminated in your memory restricted environment. On ELF
|
|
platforms also consider ``LLVM_USE_SPLIT_DWARF`` in Debug build.
|
|
|
|
**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 March 2023, is:
|
|
``AArch64;AMDGPU;ARM;AVR;BPF;Hexagon;Lanai;LoongArch;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_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.20.0)
|
|
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/Transforms`` directory.
|
|
|
|
#. Adding ``add_subdirectory(<pass name>)`` line into
|
|
``<LLVM root>/lib/Transforms/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`.
|