| # Building LLVM with CMake | |
| ## 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](#quick-start) section. If you are a CMake novice, start with | |
| [Basic CMake usage](#basic-cmake-usage) and then go back to the [Quick | |
| start](#quick-start) section once you know what you are doing. The [Options and | |
| variables](#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. | |
| 1. [Download](http://www.cmake.org/cmake/resources/software.html) and install | |
| CMake. Version 3.20.0 is the minimum required. | |
| 2. Open a shell. Your development tools must be reachable from this shell | |
| through the `PATH` environment variable. | |
| 3. Create a build directory. Building LLVM in the source | |
| directory is not supported. `cd` to this directory: | |
| ``` console | |
| $ mkdir mybuilddir | |
| $ cd mybuilddir | |
| ``` | |
| 4. Execute this command in the shell replacing `path/to/llvm/source/root` with | |
| the path to the root of your LLVM source tree: | |
| ``` 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](#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](#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](#frequently-used-llvm-related-variables) below. | |
| 5. After CMake has finished running, use IDE project files, or start | |
| the build from the build directory: | |
| ``` 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. | |
| 6. After LLVM has finished building, install it from the build directory: | |
| ``` 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: | |
| ``` 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 for daily use. | |
| 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: | |
| ``` 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: | |
| ``` console | |
| $ cmake -G "Visual Studio 12" path/to/llvm/source/root | |
| ``` | |
| A given development platform can have 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 specify 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: | |
| ``` 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: | |
| ``` 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: | |
| ``` console | |
| $ cmake -DVARIABLE:TYPE=value path/to/llvm/source | |
| ``` | |
| (cmake_frequently_used_variables)= | |
| ### 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](#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 are | |
| 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, use the IDE | |
| settings to set the build type. | |
| Note: on Windows (building with MSVC or clang-cl), CMake's | |
| **RelWithDebInfo** setting does not enable the same optimizations as | |
| **Release**. Using the **Release** build type with {ref}`LLVM_ENABLE_PDB | |
| <llvm_enable_pdb>` set may be a better option. | |
| **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](#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 during | |
| 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 15 GB of RAM available on a 32 GB 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. 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_DOCDIR**:PATH | |
| : The path to install documentation, relative to the *CMAKE_INSTALL_PREFIX*. | |
| Defaults to "share/doc". | |
| **CMAKE_INSTALL_INCLUDEDIR**:PATH | |
| : The path to install header files, relative to the *CMAKE_INSTALL_PREFIX*. | |
| Defaults to "include". | |
| **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 its enabled | |
| sub-projects. Nearly all of these variable names begin with `LLVM_`. | |
| (LLVM-related variables BUILD_SHARED_LIBS)= | |
| **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_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_REPOSITORY**:STRING | |
| : Set the git repository to include in version info rather than calling git | |
| to determine it. | |
| **LLVM_FORCE_VC_REVISION**:STRING | |
| : Force a specific Git revision id rather than calling 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_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., Doxygen and Sphinx targets) | |
| as dependencies of the default build targets. This results in all of the | |
| (enabled) documentation targets being built 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 `LLVM_ENABLE_SPHINX` and `LLVM_ENABLE_DOXYGEN`. | |
| **LLVM_BUILD_EXAMPLES**:BOOL | |
| : Include LLVM examples in the 'all' build target and install them as part of | |
| the `install` target. Defaults to OFF. Targets for building examples are | |
| still generated, this is controlled by *LLVM_INCLUDE_EXAMPLES*. Note that | |
| some examples might still be built as dependencies for tests. | |
| **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 | |
| with 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_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_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_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](http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom-filters) | |
| 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. | |
| **LLVM_DOXYGEN_QHP_NAMESPACE**:STRING | |
| : Namespace under which the intermediate Qt Help Project file lives. See [Qt | |
| Help | |
| Project](http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom-filters) | |
| 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_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_CURL**: | |
| : Used to decide if LLVM tools, should support downloading information | |
| (particularly debug info from `llvm-debuginfod`) over HTTP. Allowed values | |
| are `OFF` (default), `ON`, and `FORCE_ON` (error if libcurl is not found). | |
| **LLVM_ENABLE_DEBUGLOC_COVERAGE_TRACKING**:STRING | |
| : Enhances Debugify's ability to detect line number errors by storing extra | |
| information inside Instructions, removing false positives from Debugify's | |
| results at the cost of performance. Allowed values are `DISABLED` | |
| (default), `COVERAGE`, and `COVERAGE_AND_ORIGIN`. `COVERAGE` tracks whether | |
| and why a line number was intentionally dropped or not generated for an | |
| instruction, allowing Debugify to avoid reporting these as errors; this | |
| comes with a small performance cost of \~0.1%. `COVERAGE_AND_ORIGIN` | |
| additionally stores a stacktrace of the point where each DebugLoc is | |
| unintentionally dropped, allowing for much easier bug triaging at the cost | |
| of a \~10x performance slowdown. `COVERAGE` and `COVERAGE_AND_ORIGIN` are | |
| ABI-breaking options. | |
| **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_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_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 support 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_LIBEDIT**:BOOL | |
| : Controls whether to enable libedit support for command-line editing and | |
| history in LLVM tools. When `ON`, forces libedit support to be enabled and | |
| will cause a CMake configuration error if libedit cannot be found. When | |
| `OFF`, disables libedit support entirely. If not specified, LLVM will | |
| auto-detect libedit availability. Defaults to auto-detection. | |
| **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_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_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_LZMA**:STRING | |
| : Used to decide if LLVM tools should support decompression of xz streams | |
| with liblzma. Allowed values are `OFF`, `ON` (default, enable if liblzma is | |
| found), and `FORCE_ON` (error if liblzma is not found). | |
| **LLVM_ENABLE_MODULES**:BOOL | |
| : Compile with [Clang Header | |
| Modules](https://clang.llvm.org/docs/Modules.html). | |
| (llvm_enable_pdb)= | |
| **LLVM_ENABLE_PDB**:BOOL | |
| : For Windows builds using MSVC or clang-cl, generate PDB files when | |
| {ref}`CMAKE_BUILD_TYPE <cmake_build_type>` is set to Release. | |
| **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 to llvm instead of nested in `llvm/tools`. This feature allows | |
| having one build for only LLVM and another for clang+llvm using the same | |
| source checkout. | |
| When Flang enables Clang and MLIR automatically as dependencies, they | |
| contribute only targets needed by Flang to the default build. Their test | |
| suites are disabled by default, and installation includes the libraries, | |
| headers, and resources needed by Flang's installed binaries and CMake | |
| package. Listing Clang or MLIR explicitly restores that project's complete | |
| default build, test, and install behavior. Clang also retains its normal | |
| behavior when LLDB or clang-tools-extra is enabled. | |
| Flang's dependency libraries and headers can be selected in distributions | |
| with `flang-dependencies` and `flang-dependency-headers`. Their CMake targets | |
| are included in Flang's usual exports; an SDK distribution also needs the | |
| corresponding LLVM libraries, headers, and CMake exports. Toolchain-only | |
| installations omit dependency SDK libraries and headers, but retain shared | |
| libraries, runtime tools, and compiler resource headers. | |
| The full list is: | |
| `bolt;clang;clang-tools-extra;compiler-rt;cross-project-tests;libc;libclc;lld;lldb;mlir;openmp;polly` | |
| :::{note} | |
| Some projects listed here can also go in `LLVM_ENABLE_RUNTIMES`. They should only appear in one of the two lists. If a project is a valid possibility for both, prefer putting it in `LLVM_ENABLE_RUNTIMES`. | |
| ::: | |
| **LLVM_ENABLE_RTTI**:BOOL | |
| : Build LLVM with run-time type information. Defaults to OFF. | |
| **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/VendorDocumentation.html). | |
| :::{note} | |
| The list should not have duplicates with `LLVM_ENABLE_PROJECTS`. | |
| ::: | |
| To list all possible runtimes, include an invalid name. For example | |
| `-DLLVM_ENABLE_RUNTIMES=notaruntime`. The resulting CMake error will list | |
| the possible runtime names. | |
| To enable all of the runtimes, use: | |
| `LLVM_ENABLE_RUNTIMES=all` | |
| **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_WARNING_SUPPRESSIONS**:BOOL | |
| : Suppress specific compiler warnings. When disabled, this prevents | |
| suppressing warnings with flags such as MSVC's `-wd` or GCC/Clang's | |
| `-Wno-...`. 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 must 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_PROJECTS**:STRING | |
| : Semicolon-separated list of additional external projects to build as part | |
| of llvm. For each project, `LLVM_EXTERNAL_<NAME>_SOURCE_DIR` has 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_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_EXTERNALIZE_DEBUGINFO**:BOOL | |
| : Generate dSYM files and strip executables and libraries (Darwin only). | |
| Defaults to OFF. | |
| **LLVM_ENABLE_EXPORTED_SYMBOLS_IN_EXECUTABLES**:BOOL | |
| : When building executables, preserve symbol exports. Defaults to ON. You can | |
| use this option to disable exported symbols from all executables (Darwin | |
| Only). | |
| **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_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_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 symlinks 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_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_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 mildly 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: | |
| ``` console | |
| $ D:\git> git clone https://github.com/mjansson/rpmalloc | |
| $ D:\llvm-project> cmake ... -DLLVM_INTEGRATED_CRT_ALLOC=D:\git\rpmalloc | |
| ``` | |
| This option needs to be used along with the static CRT, i.e., if building | |
| the Release target, add `-DCMAKE_MSVC_RUNTIME_LIBRARY=MultiThreaded`. Note | |
| that rpmalloc is also supported natively in-tree, see option below. | |
| **LLVM_ENABLE_RPMALLOC**:BOOL | |
| : Similar to LLVM_INTEGRATED_CRT_ALLOC, embeds the in-tree rpmalloc into the | |
| host toolchain as a C runtime allocator. The version currently used is | |
| rpmalloc 1.4.5. This option also implies linking with the static CRT, | |
| there's no need to provide CMAKE_MSVC_RUNTIME_LIBRARY. | |
| **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\_\<target\>\_LINKER_FLAGS**:STRING | |
| : Defines the set of linker flags that should be applied to a \<target\>. | |
| **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 the [Git for Windows](https://git-scm.com/) 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 Git for Windows is not in your `%PATH%`, then you can set this | |
| variable to the Git for Windows `usr/bin` sub-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_VERSIONED_DYLIB_NAME_ON_DARWIN**:BOOL | |
| : Defaults to `ON`. If set to `ON`, Darwin shared libraries built through | |
| LLVM's CMake helpers use versioned dylib filenames and install names, | |
| matching the behavior on other Unix platforms more closely. If set to | |
| `OFF`, Darwin keeps the legacy unversioned dylib install name, for | |
| compatibility with existing consumers that expect `@rpath/libLLVM.dylib`. | |
| **LLVM_UNVERSIONED\_{LIBLTO,LIBCLANG}\_ON_DARWIN**:BOOL | |
| : Default to `ON`. When `LLVM_VERSIONED_DYLIB_NAME_ON_DARWIN` is `ON`, these | |
| keep `libLTO` and `libclang`'s Darwin dylib identities unversioned. Set | |
| `LLVM_UNVERSIONED_LIBLTO_ON_DARWIN` to `OFF` to version `libLTO` using its | |
| Darwin `LTO_VERSION` policy instead. Set | |
| `LLVM_UNVERSIONED_LIBCLANG_ON_DARWIN` to `OFF` to version `libclang` using | |
| its existing ABI version policy instead. | |
| **LLVM_OPTIMIZED_TABLEGEN**:BOOL | |
| : If enabled and building a debug or assert 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,LINK,TABLEGEN,SPHINX}\_JOBS**:STRING | |
| : Limit the maximum number of concurrent compilation, link, tablegen, or | |
| `sphinx-build` invocations respectively. These limits are implemented with | |
| Ninja job pools and only take effect when using a Ninja generator. | |
| **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_RAM_PER\_{COMPILE,LINK,TABLEGEN}\_JOB**:STRING | |
| : Limit the number of concurrent compile, link or tablegen jobs respectively, | |
| depending on available physical memory. The value specified is in MB. The | |
| respective `LLVM_PARALLEL_{COMPILE,LINK,TABLEGEN}_JOBS` variable is | |
| overwritten by computing the memory size divided by the specified value. | |
| The largest memory user is linking, but remember that jobs in the other | |
| categories might run in parallel with the link jobs, and you need to | |
| consider their memory requirements when in a memory-limited environment. | |
| Using a `-DLLVM_RAM_PER_LINK_JOB=10000` is a good approximation. On ELF | |
| platforms debug builds can reduce link-time memory pressure by also using | |
| `LLVM_USE_SPLIT_DWARF`. | |
| **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_SPHINX_THREADS**:STRING | |
| : Controls `sphinx-build -j`, which is the internal Sphinx worker count. | |
| Defaults to half the number of logical cores, rounded up. The default is | |
| high because Sphinx is often on the critical path, and rarely uses all | |
| available cores. Set to an empty string to omit the Sphinx `-j` option. | |
| **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 August 2025, | |
| is: | |
| `AArch64;AMDGPU;ARM;AVR;BPF;Hexagon;Lanai;LoongArch;Mips;MSP430;NVPTX;PowerPC;RISCV;Sparc;SPIRV;SystemZ;VE;WebAssembly;X86;XCore` | |
| You can also specify `host` or `Native` to automatically detect and include | |
| the target corresponding to the host machine's architecture, or use `all` | |
| to include all available targets. For example, on an x86_64 machine, | |
| specifying `-DLLVM_TARGETS_TO_BUILD=host` will include the `X86` target. | |
| **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_UNREACHABLE_OPTIMIZE**:BOOL | |
| : This flag controls the behavior of `llvm_unreachable()` in a 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_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 values 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`, `HWAddress`, `Memory`, `MemoryWithOrigins`, `Undefined`, | |
| `Thread`, `DataFlow`, `Leaks`, 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_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". | |
| **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*. | |
| ## 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: | |
| ``` 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 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: | |
| ``` 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. The wiki page has | |
| 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](#llvm-related-variables) section for | |
| variables used when cross-compiling. | |
| ## Embedding LLVM in your project | |
| From LLVM 3.5 onward, 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`. | |
| ``` 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 an `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 | |
| You can 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. | |
| ``` none | |
| <project dir>/ | |
| | | |
| CMakeLists.txt | |
| <pass name>/ | |
| | | |
| CMakeLists.txt | |
| Pass.cpp | |
| ... | |
| ``` | |
| Contents of `<project dir>/CMakeLists.txt`: | |
| ``` 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`: | |
| ``` 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 ...)`): | |
| ``` cmake | |
| list(APPEND CMAKE_MODULE_PATH "${LLVM_CMAKE_DIR}") | |
| include(AddLLVM) | |
| ``` | |
| And then changing `<project dir>/<pass name>/CMakeLists.txt` to | |
| ``` 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: | |
| 1. Copying `<pass name>` folder into `<LLVM root>/lib/Transforms` directory. | |
| 2. 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, CMake may use `llvm-mt` as the Manifest Tool | |
| when available. `llvm-mt` is only present when libxml2 is found at | |
| build-time. To ensure using Microsoft's Manifest Tool set `CMAKE_MT=mt`. | |
| ### Apple/OSX | |
| **CMAKE_OSX_SYSROOT**:STRING | |
| : When compiling for OSX, in order for the test suite to find libSystem to | |
| link dylib tests you'll need to run CMake with `xcrun --show-sdk-path` | |
| as the string to pass in so that the testsuite can find your os | |
| libraries. | |
| This will show up as `ld: library not found for -lSystem` when | |
| running tests. |