Building libc for UEFI¶
Building LLVM libc for UEFI¶
This document will present recipes to build the LLVM C library for UEFI.
UEFI builds use the same 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 Using libc for UEFI 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.
$> 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.