| .. _libc_uefi_building: |
| |
| ====================== |
| Building libc for UEFI |
| ====================== |
| |
| .. contents:: Table of Contents |
| :depth: 4 |
| :local: |
| |
| Building LLVM libc for UEFI |
| =========================== |
| |
| This document will present recipes to build the LLVM C library for UEFI. |
| UEFI builds use the same :ref:`cross build<full_cross_build>` support as |
| the other targets. However, the UEFI target has the restriction that it *must* |
| be built with an up-to-date ``clang`` compiler. This is because UEFI support |
| in ``clang`` is still an experimental feature. |
| |
| Currently, it is only possible to build LLVM libc for UEFI for ``x86_64`` |
| CPUs. This is due to the target not being enabled for ``aarch64`` and |
| ``riscv64``. |
| |
| Once you have finished building, refer to :ref:`libc_uefi_usage` to get started |
| with the newly built C library. |
| |
| Standard runtimes build |
| ----------------------- |
| |
| The simplest way to build for UEFI is to use the existing LLVM runtimes |
| support. This will automatically handle bootstrapping an up-to-date ``clang`` |
| compiler and use it to build the C library. The following CMake invocation |
| will instruct it to build the ``libc`` runtime targeting ``x86_64`` CPUs. |
| |
| .. code-block:: sh |
| |
| $> cd llvm-project # The llvm-project checkout |
| $> mkdir build |
| $> cd build |
| $> cmake ../llvm -G Ninja \ |
| -DLLVM_ENABLE_PROJECTS="clang;lld" \ |
| -DCMAKE_BUILD_TYPE=<Debug|Release> \ # Select build type |
| -DCMAKE_INSTALL_PREFIX=<PATH> \ # Where the libraries will live |
| -DLLVM_DEFAULT_TARGET_TRIPLE=x86_64-unknown-uefi-llvm \ |
| -DLLVM_RUNTIME_TARGETS=x86_64-unknown-uefi-llvm \ |
| -DRUNTIMES_x86_64-unknown-uefi-llvm_LLVM_ENABLE_RUNTIMES=libc \ |
| -DRUNTIMES_x86_64-unknown-uefi-llvm_LLVM_LIBC_FULL_BUILD=true \ |
| $> ninja install |
| |
| We need ``clang`` to build the UEFI C library and ``lld`` to link UEFI PE |
| executables, so we enable them in ``LLVM_ENABLE_PROJECTS``. We then set |
| ``RUNTIMES_<triple>_LLVM_ENABLE_RUNTIMES`` to enable ``libc`` for the UEFI |
| targets. |