mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-27 15:06:05 +00:00
219 lines
7.8 KiB
ReStructuredText
219 lines
7.8 KiB
ReStructuredText
.. _full_host_build:
|
|
|
|
===============
|
|
Full Host Build
|
|
===============
|
|
|
|
.. contents:: Table of Contents
|
|
:depth: 1
|
|
:local:
|
|
|
|
.. note::
|
|
Fullbuild requires running headergen, which is a python program that depends on
|
|
pyyaml. The minimum versions are listed on the :ref:`header_generation`
|
|
page, as well as additional information.
|
|
|
|
In this document, we will present a recipe to build the full libc for the host.
|
|
When we say *build the libc for the host*, the goal is to build the libc for
|
|
the same system on which the libc is being built. First, we will explain how to
|
|
build for developing LLVM-libc, then we will explain how to build LLVM-libc as
|
|
part of a complete toolchain.
|
|
|
|
Configure the build for development
|
|
===================================
|
|
|
|
|
|
Below is the list of commands for a simple recipe to build LLVM-libc for
|
|
development. In this we've set the Ninja generator, set the build type to
|
|
"Debug", and enabled the Scudo allocator. This build also enables generating the
|
|
documentation and verbose cmake logging, which are useful development features.
|
|
|
|
.. note::
|
|
if your build fails with an error saying the compiler can't find
|
|
``<asm/unistd.h>`` or similar then you're probably missing the symlink from
|
|
``/usr/include/asm`` to ``/usr/include/<HOST TRIPLE>/asm``. Installing the
|
|
``gcc-multilib`` package creates this symlink, or you can do it manually with
|
|
this command:
|
|
``sudo ln -s /usr/include/<HOST TRIPLE>/asm /usr/include/asm``
|
|
(your host triple will probably be similar to ``x86_64-linux-gnu``)
|
|
|
|
.. code-block:: sh
|
|
|
|
$> cd llvm-project # The llvm-project checkout
|
|
$> mkdir build
|
|
$> cd build
|
|
$> cmake ../runtimes \
|
|
-G Ninja \
|
|
-DCMAKE_C_COMPILER=clang \
|
|
-DCMAKE_CXX_COMPILER=clang++ \
|
|
-DLLVM_ENABLE_RUNTIMES="libc;compiler-rt" \
|
|
-DLLVM_LIBC_FULL_BUILD=ON \
|
|
-DCMAKE_BUILD_TYPE=Debug \
|
|
-DLLVM_LIBC_INCLUDE_SCUDO=ON \
|
|
-DCOMPILER_RT_BUILD_SCUDO_STANDALONE_WITH_LLVM_LIBC=ON \
|
|
-DCOMPILER_RT_BUILD_GWP_ASAN=OFF \
|
|
-DCOMPILER_RT_SCUDO_STANDALONE_BUILD_SHARED=OFF \
|
|
-DCMAKE_EXPORT_COMPILE_COMMANDS=ON \
|
|
-DLLVM_ENABLE_SPHINX=ON -DLIBC_INCLUDE_DOCS=ON \
|
|
-DLIBC_CMAKE_VERBOSE_LOGGING=ON
|
|
|
|
Build and test
|
|
==============
|
|
|
|
After configuring the build with the above ``cmake`` command, one can build test
|
|
libc with the following command:
|
|
|
|
.. code-block:: sh
|
|
|
|
$> ninja libc libm check-libc
|
|
|
|
To build the docs run this command:
|
|
|
|
|
|
.. code-block:: sh
|
|
|
|
$> ninja docs-libc-html
|
|
|
|
To run a specific test, use the following:
|
|
|
|
.. code-block:: sh
|
|
|
|
$> ninja libc.test.src.<HEADER>.<FUNCTION>_test.__unit__
|
|
$> ninja libc.test.src.ctype.isalpha_test.__unit__ # EXAMPLE
|
|
|
|
Configure the complete toolchain build
|
|
======================================
|
|
|
|
For a complete toolchain we recommend creating a *sysroot* (see the documentation
|
|
of the ``--sysroot`` option here:
|
|
`<https://gcc.gnu.org/onlinedocs/gcc/Directory-Options.html>`_) which includes
|
|
not only the components of LLVM's libc, but also a full LLVM only toolchain
|
|
consisting of the `clang <https://clang.llvm.org/>`_ compiler, the
|
|
`lld <https://lld.llvm.org/>`_ linker and the
|
|
`compiler-rt <https://compiler-rt.llvm.org/>`_ runtime libraries. LLVM-libc is
|
|
not quite complete enough to allow using and linking a C++ application against
|
|
a C++ standard library (like libc++). Hence, we do not include
|
|
`libc++ <https://libcxx.llvm.org/>`_ in the sysroot.
|
|
|
|
.. note:: When the libc is complete enough, we should be able to include
|
|
`libc++ <https://libcxx.llvm.org/>`_, libcxx-abi and libunwind in the
|
|
LLVM only toolchain and use them to build and link C++ applications.
|
|
|
|
Below is the cmake command for a bootstrapping build of LLVM. This will build
|
|
clang and lld with the current system's toolchain, then build compiler-rt and
|
|
LLVM-libc with that freshly built clang. This ensures that LLVM-libc can take
|
|
advantage of the latest clang features and optimizations.
|
|
|
|
This build also uses Ninja as cmake's generator, and sets lld and compiler-rt as
|
|
the default for the fresh clang. Those settings are recommended, but the build
|
|
should still work without them. The compiler-rt options are required for
|
|
building `Scudo <https://llvm.org/docs/ScudoHardenedAllocator.html>`_ as the
|
|
allocator for LLVM-libc.
|
|
|
|
.. note::
|
|
if your build fails with an error saying the compiler can't find
|
|
``<asm/unistd.h>`` or similar then you're probably missing the symlink from
|
|
``/usr/include/asm`` to ``/usr/include/<TARGET TRIPLE>/asm``. Installing the
|
|
``gcc-multilib`` package creates this symlink, or you can do it manually with
|
|
this command:
|
|
``sudo ln -s /usr/include/<TARGET TRIPLE>/asm /usr/include/asm``
|
|
|
|
.. code-block:: sh
|
|
|
|
$> cd llvm-project # The llvm-project checkout
|
|
$> mkdir build
|
|
$> cd build
|
|
$> SYSROOT=/path/to/sysroot # Remember to set this!
|
|
$> cmake ../llvm \
|
|
-G Ninja \
|
|
-DLLVM_ENABLE_PROJECTS="clang;lld" \
|
|
-DLLVM_ENABLE_RUNTIMES="libc;compiler-rt" \
|
|
-DCMAKE_BUILD_TYPE=Release \
|
|
-DCMAKE_C_COMPILER=clang \
|
|
-DCMAKE_CXX_COMPILER=clang++ \
|
|
-DLLVM_LIBC_FULL_BUILD=ON \
|
|
-DLLVM_LIBC_INCLUDE_SCUDO=ON \
|
|
-DCOMPILER_RT_BUILD_SCUDO_STANDALONE_WITH_LLVM_LIBC=ON \
|
|
-DCOMPILER_RT_BUILD_GWP_ASAN=OFF \
|
|
-DCOMPILER_RT_SCUDO_STANDALONE_BUILD_SHARED=OFF \
|
|
-DCLANG_DEFAULT_LINKER=lld \
|
|
-DCLANG_DEFAULT_RTLIB=compiler-rt \
|
|
-DCMAKE_INSTALL_PREFIX=$SYSROOT
|
|
|
|
Build and install
|
|
=================
|
|
|
|
.. TODO: add this warning to the cmake
|
|
.. warning::
|
|
Running these install commands without setting a ``$SYSROOT`` will install
|
|
them into your system include path, which may break your system. If you're
|
|
just trying to develop libc, then just run ``ninja check-libc`` to build the
|
|
libc and run the tests. If you've already accidentally installed the headers,
|
|
you may need to delete them from ``/usr/local/include``.
|
|
|
|
After configuring the build with the above ``cmake`` command, one can build and
|
|
install the toolchain with
|
|
|
|
.. code-block:: sh
|
|
|
|
$> ninja install-clang install-builtins install-compiler-rt \
|
|
install-core-resource-headers install-libc install-lld
|
|
|
|
or
|
|
|
|
.. code-block:: sh
|
|
|
|
$> ninja install
|
|
|
|
Once the above command completes successfully, the ``$SYSROOT`` directory you
|
|
have specified with the CMake configure step above will contain a full LLVM-only
|
|
toolchain with which you can build practical/real-world C applications. See
|
|
`<https://github.com/llvm/llvm-project/tree/main/libc/examples>`_ for examples
|
|
of how to start using this new toolchain.
|
|
|
|
Linux Headers
|
|
=============
|
|
|
|
If you are using the full libc on Linux, then you will also need to install
|
|
Linux headers in your sysroot. Let's build them from source.
|
|
|
|
.. code-block:: sh
|
|
|
|
$> git clone --depth=1 git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git /tmp/linux
|
|
$> make LLVM=1 INSTALL_HDR_PATH=/path/to/sysroot -C /tmp/linux headers_install
|
|
|
|
The headers can be built to target non-host architectures by adding the
|
|
``ARCH={arm|arm64|i386}`` to the above invocation of ``make``.
|
|
|
|
Using your newly built libc
|
|
===========================
|
|
|
|
You can now use your newly built libc nearly like you would use any compiler
|
|
invocation:
|
|
|
|
.. code-block:: sh
|
|
|
|
$> /path/to/sysroot/bin/clang -static main.c
|
|
|
|
.. warning::
|
|
Because the libc does not yet support dynamic linking, the -static parameter
|
|
must be added to all clang invocations.
|
|
|
|
|
|
You can make sure you're using the newly built toolchain by trying out features
|
|
that aren't yet supported by the system toolchain, such as fixed point. The
|
|
following is an example program that demonstrates the difference:
|
|
|
|
.. code-block:: C
|
|
|
|
// $ $SYSROOT/bin/clang example.c -static -ffixed-point --sysroot=$SYSROOT
|
|
|
|
#include <stdio.h>
|
|
int main() {
|
|
printf("Hello, World!\n%.9f\n%.9lK\n",
|
|
4294967295.000000001,
|
|
4294967295.000000001ulK);
|
|
return 0;
|
|
}
|
|
|