13519c4d6SNick Desaulniers.. _kbuild_llvm: 23519c4d6SNick Desaulniers 3fcf1b6a3SNick Desaulniers============================== 4fcf1b6a3SNick DesaulniersBuilding Linux with Clang/LLVM 5fcf1b6a3SNick Desaulniers============================== 6fcf1b6a3SNick Desaulniers 7fcf1b6a3SNick DesaulniersThis document covers how to build the Linux kernel with Clang and LLVM 8fcf1b6a3SNick Desaulniersutilities. 9fcf1b6a3SNick Desaulniers 10fcf1b6a3SNick DesaulniersAbout 11fcf1b6a3SNick Desaulniers----- 12fcf1b6a3SNick Desaulniers 13fcf1b6a3SNick DesaulniersThe Linux kernel has always traditionally been compiled with GNU toolchains 14fcf1b6a3SNick Desaulnierssuch as GCC and binutils. Ongoing work has allowed for `Clang 15fcf1b6a3SNick Desaulniers<https://clang.llvm.org/>`_ and `LLVM <https://llvm.org/>`_ utilities to be 16fcf1b6a3SNick Desaulniersused as viable substitutes. Distributions such as `Android 17fcf1b6a3SNick Desaulniers<https://www.android.com/>`_, `ChromeOS 180aee6becSNick Desaulniers<https://www.chromium.org/chromium-os>`_, `OpenMandriva 190aee6becSNick Desaulniers<https://www.openmandriva.org/>`_, and `Chimera Linux 200aee6becSNick Desaulniers<https://chimera-linux.org/>`_ use Clang built kernels. Google's and Meta's 210aee6becSNick Desaulniersdatacenter fleets also run kernels built with Clang. 220aee6becSNick Desaulniers 230aee6becSNick Desaulniers`LLVM is a collection of toolchain components implemented in terms of C++ 240aee6becSNick Desaulniersobjects <https://www.aosabook.org/en/llvm.html>`_. Clang is a front-end to LLVM 250aee6becSNick Desaulniersthat supports C and the GNU C extensions required by the kernel, and is 260aee6becSNick Desaulnierspronounced "klang," not "see-lang." 27fcf1b6a3SNick Desaulniers 28*a3c6bfbaSNick DesaulniersBuilding with LLVM 29*a3c6bfbaSNick Desaulniers------------------ 30fcf1b6a3SNick Desaulniers 31*a3c6bfbaSNick DesaulniersInvoke ``make`` via:: 32fcf1b6a3SNick Desaulniers 33*a3c6bfbaSNick Desaulniers make LLVM=1 34fcf1b6a3SNick Desaulniers 35*a3c6bfbaSNick Desaulniersto compile for the host target. For cross compiling:: 36fcf1b6a3SNick Desaulniers 37*a3c6bfbaSNick Desaulniers make LLVM=1 ARCH=arm64 38fcf1b6a3SNick Desaulniers 39*a3c6bfbaSNick DesaulniersThe LLVM= argument 40*a3c6bfbaSNick Desaulniers------------------ 41fcf1b6a3SNick Desaulniers 42*a3c6bfbaSNick DesaulniersLLVM has substitutes for GNU binutils utilities. They can be enabled 43*a3c6bfbaSNick Desaulniersindividually. The full list of supported make variables:: 44fcf1b6a3SNick Desaulniers 4591a9d502SNathan Chancellor make CC=clang LD=ld.lld AR=llvm-ar NM=llvm-nm STRIP=llvm-strip \ 46d9b5665fSVasily Gorbik OBJCOPY=llvm-objcopy OBJDUMP=llvm-objdump READELF=llvm-readelf \ 47d9b5665fSVasily Gorbik HOSTCC=clang HOSTCXX=clang++ HOSTAR=llvm-ar HOSTLD=ld.lld 48fcf1b6a3SNick Desaulniers 49*a3c6bfbaSNick Desaulniers``LLVM=1`` expands to the above. 50e9c28192SNathan Chancellor 51e9c28192SNathan ChancellorIf your LLVM tools are not available in your PATH, you can supply their 52e9c28192SNathan Chancellorlocation using the LLVM variable with a trailing slash:: 53e9c28192SNathan Chancellor 54e9c28192SNathan Chancellor make LLVM=/path/to/llvm/ 55e9c28192SNathan Chancellor 56*a3c6bfbaSNick Desaulnierswhich will use ``/path/to/llvm/clang``, ``/path/to/llvm/ld.lld``, etc. The 57*a3c6bfbaSNick Desaulniersfollowing may also be used:: 58*a3c6bfbaSNick Desaulniers 59*a3c6bfbaSNick Desaulniers PATH=/path/to/llvm:$PATH make LLVM=1 60e9c28192SNathan Chancellor 61e9c28192SNathan ChancellorIf your LLVM tools have a version suffix and you want to test with that 62e9c28192SNathan Chancellorexplicit version rather than the unsuffixed executables like ``LLVM=1``, you 63e9c28192SNathan Chancellorcan pass the suffix using the ``LLVM`` variable:: 64e9c28192SNathan Chancellor 65e9c28192SNathan Chancellor make LLVM=-14 66e9c28192SNathan Chancellor 67e9c28192SNathan Chancellorwhich will use ``clang-14``, ``ld.lld-14``, etc. 68e9c28192SNathan Chancellor 69*a3c6bfbaSNick DesaulniersTo support combinations of out of tree paths with version suffixes, we 70*a3c6bfbaSNick Desaulniersrecommend:: 71*a3c6bfbaSNick Desaulniers 72*a3c6bfbaSNick Desaulniers PATH=/path/to/llvm/:$PATH make LLVM=-14 73*a3c6bfbaSNick Desaulniers 74e9c28192SNathan Chancellor``LLVM=0`` is not the same as omitting ``LLVM`` altogether, it will behave like 75*a3c6bfbaSNick Desaulniers``LLVM=1``. If you only wish to use certain LLVM utilities, use their 76*a3c6bfbaSNick Desaulniersrespective make variables. 77e9c28192SNathan Chancellor 78*a3c6bfbaSNick DesaulniersThe same value used for ``LLVM=`` should be set for each invocation of ``make`` 79*a3c6bfbaSNick Desaulniersif configuring and building via distinct commands. ``LLVM=`` should also be set 80*a3c6bfbaSNick Desaulniersas an environment variable when running scripts that will eventually run 81*a3c6bfbaSNick Desaulniers``make``. 827e20e47cSMasahiro Yamada 83*a3c6bfbaSNick DesaulniersCross Compiling 84*a3c6bfbaSNick Desaulniers--------------- 85*a3c6bfbaSNick Desaulniers 86*a3c6bfbaSNick DesaulniersA single Clang compiler binary (and corresponding LLVM utilities) will 87*a3c6bfbaSNick Desaulnierstypically contain all supported back ends, which can help simplify cross 88*a3c6bfbaSNick Desaulnierscompiling especially when ``LLVM=1`` is used. If you use only LLVM tools, 89*a3c6bfbaSNick Desaulniers``CROSS_COMPILE`` or target-triple-prefixes become unnecessary. Example:: 90*a3c6bfbaSNick Desaulniers 91*a3c6bfbaSNick Desaulniers make LLVM=1 ARCH=arm64 92*a3c6bfbaSNick Desaulniers 93*a3c6bfbaSNick DesaulniersAs an example of mixing LLVM and GNU utilities, for a target like ``ARCH=s390`` 94*a3c6bfbaSNick Desaulnierswhich does not yet have ``ld.lld`` or ``llvm-objcopy`` support, you could 95*a3c6bfbaSNick Desaulniersinvoke ``make`` via:: 96*a3c6bfbaSNick Desaulniers 97*a3c6bfbaSNick Desaulniers make LLVM=1 ARCH=s390 LD=s390x-linux-gnu-ld.bfd \ 98*a3c6bfbaSNick Desaulniers OBJCOPY=s390x-linux-gnu-objcopy 99*a3c6bfbaSNick Desaulniers 100*a3c6bfbaSNick DesaulniersThis example will invoke ``s390x-linux-gnu-ld.bfd`` as the linker and 101*a3c6bfbaSNick Desaulniers``s390x-linux-gnu-objcopy``, so ensure those are reachable in your ``$PATH``. 102*a3c6bfbaSNick Desaulniers 103*a3c6bfbaSNick Desaulniers``CROSS_COMPILE`` is not used to prefix the Clang compiler binary (or 104*a3c6bfbaSNick Desaulnierscorresponding LLVM utilities) as is the case for GNU utilities when ``LLVM=1`` 105*a3c6bfbaSNick Desaulniersis not set. 106*a3c6bfbaSNick Desaulniers 107*a3c6bfbaSNick DesaulniersThe LLVM_IAS= argument 108e08831baSNick Desaulniers---------------------- 109e08831baSNick Desaulniers 110*a3c6bfbaSNick DesaulniersClang can assemble assembler code. You can pass ``LLVM_IAS=0`` to disable this 111*a3c6bfbaSNick Desaulniersbehavior and have Clang invoke the corresponding non-integrated assembler 112*a3c6bfbaSNick Desaulniersinstead. Example:: 113e08831baSNick Desaulniers 114*a3c6bfbaSNick Desaulniers make LLVM=1 LLVM_IAS=0 115e08831baSNick Desaulniers 116*a3c6bfbaSNick Desaulniers``CROSS_COMPILE`` is necessary when cross compiling and ``LLVM_IAS=0`` 117*a3c6bfbaSNick Desaulniersis used in order to set ``--prefix=`` for the compiler to find the 118*a3c6bfbaSNick Desaulnierscorresponding non-integrated assembler (typically, you don't want to use the 119*a3c6bfbaSNick Desaulnierssystem assembler when targeting another architecture). Example:: 120e08831baSNick Desaulniers 121*a3c6bfbaSNick Desaulniers make LLVM=1 ARCH=arm LLVM_IAS=0 CROSS_COMPILE=arm-linux-gnueabi- 122e08831baSNick Desaulniers 123f12b034aSNick Desaulniers 124*a3c6bfbaSNick DesaulniersCcache 125*a3c6bfbaSNick Desaulniers------ 126f12b034aSNick Desaulniers 127*a3c6bfbaSNick Desaulniers``ccache`` can be used with ``clang`` to improve subsequent builds, (though 128*a3c6bfbaSNick DesaulniersKBUILD_BUILD_TIMESTAMP_ should be set to a deterministic value between builds 129*a3c6bfbaSNick Desaulniersin order to avoid 100% cache misses, see Reproducible_builds_ for more info): 130*a3c6bfbaSNick Desaulniers 131*a3c6bfbaSNick Desaulniers KBUILD_BUILD_TIMESTAMP='' make LLVM=1 CC="ccache clang" 132*a3c6bfbaSNick Desaulniers 133*a3c6bfbaSNick Desaulniers.. _KBUILD_BUILD_TIMESTAMP: kbuild.html#kbuild-build-timestamp 134*a3c6bfbaSNick Desaulniers.. _Reproducible_builds: reproducible-builds.html#timestamps 135e08831baSNick Desaulniers 136ed4e9e61SNathan ChancellorSupported Architectures 137ed4e9e61SNathan Chancellor----------------------- 138ed4e9e61SNathan Chancellor 139ed4e9e61SNathan ChancellorLLVM does not target all of the architectures that Linux supports and 140ed4e9e61SNathan Chancellorjust because a target is supported in LLVM does not mean that the kernel 141ed4e9e61SNathan Chancellorwill build or work without any issues. Below is a general summary of 142ed4e9e61SNathan Chancellorarchitectures that currently work with ``CC=clang`` or ``LLVM=1``. Level 143ed4e9e61SNathan Chancellorof support corresponds to "S" values in the MAINTAINERS files. If an 144ed4e9e61SNathan Chancellorarchitecture is not present, it either means that LLVM does not target 145ed4e9e61SNathan Chancellorit or there are known issues. Using the latest stable version of LLVM or 146ed4e9e61SNathan Chancelloreven the development tree will generally yield the best results. 147ed4e9e61SNathan ChancellorAn architecture's ``defconfig`` is generally expected to work well, 148ed4e9e61SNathan Chancellorcertain configurations may have problems that have not been uncovered 149ed4e9e61SNathan Chancelloryet. Bug reports are always welcome at the issue tracker below! 150ed4e9e61SNathan Chancellor 151ed4e9e61SNathan Chancellor.. list-table:: 152ed4e9e61SNathan Chancellor :widths: 10 10 10 153ed4e9e61SNathan Chancellor :header-rows: 1 154ed4e9e61SNathan Chancellor 155ed4e9e61SNathan Chancellor * - Architecture 156ed4e9e61SNathan Chancellor - Level of support 157ed4e9e61SNathan Chancellor - ``make`` command 158ed4e9e61SNathan Chancellor * - arm 159ed4e9e61SNathan Chancellor - Supported 160ed4e9e61SNathan Chancellor - ``LLVM=1`` 161ed4e9e61SNathan Chancellor * - arm64 162ed4e9e61SNathan Chancellor - Supported 163ed4e9e61SNathan Chancellor - ``LLVM=1`` 164291810beSNick Desaulniers * - hexagon 165291810beSNick Desaulniers - Maintained 166291810beSNick Desaulniers - ``LLVM=1`` 167*a3c6bfbaSNick Desaulniers * - loongarch 168*a3c6bfbaSNick Desaulniers - Maintained 169*a3c6bfbaSNick Desaulniers - ``LLVM=1`` 170ed4e9e61SNathan Chancellor * - mips 171ed4e9e61SNathan Chancellor - Maintained 172291810beSNick Desaulniers - ``LLVM=1`` 173ed4e9e61SNathan Chancellor * - powerpc 174ed4e9e61SNathan Chancellor - Maintained 175*a3c6bfbaSNick Desaulniers - ``LLVM=1`` 176ed4e9e61SNathan Chancellor * - riscv 177*a3c6bfbaSNick Desaulniers - Supported 178291810beSNick Desaulniers - ``LLVM=1`` 179ed4e9e61SNathan Chancellor * - s390 180ed4e9e61SNathan Chancellor - Maintained 181ed4e9e61SNathan Chancellor - ``CC=clang`` 182291810beSNick Desaulniers * - um (User Mode) 183291810beSNick Desaulniers - Maintained 184291810beSNick Desaulniers - ``LLVM=1`` 185ed4e9e61SNathan Chancellor * - x86 186ed4e9e61SNathan Chancellor - Supported 187ed4e9e61SNathan Chancellor - ``LLVM=1`` 188ed4e9e61SNathan Chancellor 189fcf1b6a3SNick DesaulniersGetting Help 190fcf1b6a3SNick Desaulniers------------ 191fcf1b6a3SNick Desaulniers 192fcf1b6a3SNick Desaulniers- `Website <https://clangbuiltlinux.github.io/>`_ 19328f8fc19SNathan Chancellor- `Mailing List <https://lore.kernel.org/llvm/>`_: <llvm@lists.linux.dev> 19428f8fc19SNathan Chancellor- `Old Mailing List Archives <https://groups.google.com/g/clang-built-linux>`_ 195fcf1b6a3SNick Desaulniers- `Issue Tracker <https://github.com/ClangBuiltLinux/linux/issues>`_ 1961c3493bbSNathan Chancellor- IRC: #clangbuiltlinux on irc.libera.chat 197fcf1b6a3SNick Desaulniers- `Telegram <https://t.me/ClangBuiltLinux>`_: @ClangBuiltLinux 198fcf1b6a3SNick Desaulniers- `Wiki <https://github.com/ClangBuiltLinux/linux/wiki>`_ 199fcf1b6a3SNick Desaulniers- `Beginner Bugs <https://github.com/ClangBuiltLinux/linux/issues?q=is%3Aopen+is%3Aissue+label%3A%22good+first+issue%22>`_ 200fcf1b6a3SNick Desaulniers 2013519c4d6SNick Desaulniers.. _getting_llvm: 2023519c4d6SNick Desaulniers 203fcf1b6a3SNick DesaulniersGetting LLVM 204fcf1b6a3SNick Desaulniers------------- 205fcf1b6a3SNick Desaulniers 206*a3c6bfbaSNick DesaulniersWe provide prebuilt stable versions of LLVM on `kernel.org 207*a3c6bfbaSNick Desaulniers<https://kernel.org/pub/tools/llvm/>`_. These have been optimized with profile 208*a3c6bfbaSNick Desaulniersdata for building Linux kernels, which should improve kernel build times 209*a3c6bfbaSNick Desaulniersrelative to other distributions of LLVM. 210*a3c6bfbaSNick Desaulniers 211dcc11ac9SNathan ChancellorBelow are links that may be useful for building LLVM from source or procuring 212dcc11ac9SNathan Chancellorit through a distribution's package manager. 213dcc11ac9SNathan Chancellor 21416a122c7SAlexander A. Klimov- https://releases.llvm.org/download.html 215fcf1b6a3SNick Desaulniers- https://github.com/llvm/llvm-project 216fcf1b6a3SNick Desaulniers- https://llvm.org/docs/GettingStarted.html 217fcf1b6a3SNick Desaulniers- https://llvm.org/docs/CMake.html 218fcf1b6a3SNick Desaulniers- https://apt.llvm.org/ 219fcf1b6a3SNick Desaulniers- https://www.archlinux.org/packages/extra/x86_64/llvm/ 220fcf1b6a3SNick Desaulniers- https://github.com/ClangBuiltLinux/tc-build 221fcf1b6a3SNick Desaulniers- https://github.com/ClangBuiltLinux/linux/wiki/Building-Clang-from-source 222fcf1b6a3SNick Desaulniers- https://android.googlesource.com/platform/prebuilts/clang/host/linux-x86/ 223