1 .. _kbuild_llvm: 1 .. _kbuild_llvm: 2 2 3 ============================== 3 ============================== 4 Building Linux with Clang/LLVM 4 Building Linux with Clang/LLVM 5 ============================== 5 ============================== 6 6 7 This document covers how to build the Linux ke 7 This document covers how to build the Linux kernel with Clang and LLVM 8 utilities. 8 utilities. 9 9 10 About 10 About 11 ----- 11 ----- 12 12 13 The Linux kernel has always traditionally been 13 The Linux kernel has always traditionally been compiled with GNU toolchains 14 such as GCC and binutils. Ongoing work has all 14 such as GCC and binutils. Ongoing work has allowed for `Clang 15 <https://clang.llvm.org/>`_ and `LLVM <https:/ 15 <https://clang.llvm.org/>`_ and `LLVM <https://llvm.org/>`_ utilities to be 16 used as viable substitutes. Distributions such 16 used as viable substitutes. Distributions such as `Android 17 <https://www.android.com/>`_, `ChromeOS 17 <https://www.android.com/>`_, `ChromeOS 18 <https://www.chromium.org/chromium-os>`_, `Ope !! 18 <https://www.chromium.org/chromium-os>`_, and `OpenMandriva 19 <https://www.openmandriva.org/>`_, and `Chimer !! 19 <https://www.openmandriva.org/>`_ use Clang built kernels. `LLVM is a 20 <https://chimera-linux.org/>`_ use Clang built !! 20 collection of toolchain components implemented in terms of C++ objects 21 datacenter fleets also run kernels built with !! 21 <https://www.aosabook.org/en/llvm.html>`_. Clang is a front-end to LLVM that 22 !! 22 supports C and the GNU C extensions required by the kernel, and is pronounced 23 `LLVM is a collection of toolchain components !! 23 "klang," not "see-lang." 24 objects <https://www.aosabook.org/en/llvm.html !! 24 25 that supports C and the GNU C extensions requi !! 25 Clang 26 pronounced "klang," not "see-lang." !! 26 ----- 27 27 28 Building with LLVM !! 28 The compiler used can be swapped out via ``CC=`` command line argument to ``make``. 29 ------------------ !! 29 ``CC=`` should be set when selecting a config and during a build. :: 30 30 31 Invoke ``make`` via:: !! 31 make CC=clang defconfig 32 32 33 make LLVM=1 !! 33 make CC=clang >> 34 >> 35 Cross Compiling >> 36 --------------- 34 37 35 to compile for the host target. For cross comp !! 38 A single Clang compiler binary will typically contain all supported backends, >> 39 which can help simplify cross compiling. :: 36 40 37 make LLVM=1 ARCH=arm64 !! 41 make ARCH=arm64 CC=clang CROSS_COMPILE=aarch64-linux-gnu- 38 42 39 The LLVM= argument !! 43 ``CROSS_COMPILE`` is not used to prefix the Clang compiler binary, instead 40 ------------------ !! 44 ``CROSS_COMPILE`` is used to set a command line flag: ``--target=<triple>``. For >> 45 example: :: 41 46 42 LLVM has substitutes for GNU binutils utilitie !! 47 clang --target=aarch64-linux-gnu foo.c 43 individually. The full list of supported make !! 48 >> 49 LLVM Utilities >> 50 -------------- >> 51 >> 52 LLVM has substitutes for GNU binutils utilities. They can be enabled individually. >> 53 The full list of supported make variables:: 44 54 45 make CC=clang LD=ld.lld AR=llvm-ar NM= 55 make CC=clang LD=ld.lld AR=llvm-ar NM=llvm-nm STRIP=llvm-strip \ 46 OBJCOPY=llvm-objcopy OBJDUMP=llvm-ob 56 OBJCOPY=llvm-objcopy OBJDUMP=llvm-objdump READELF=llvm-readelf \ 47 HOSTCC=clang HOSTCXX=clang++ HOSTAR= 57 HOSTCC=clang HOSTCXX=clang++ HOSTAR=llvm-ar HOSTLD=ld.lld 48 58 49 ``LLVM=1`` expands to the above. !! 59 To simplify the above command, Kbuild supports the ``LLVM`` variable:: >> 60 >> 61 make LLVM=1 50 62 51 If your LLVM tools are not available in your P 63 If your LLVM tools are not available in your PATH, you can supply their 52 location using the LLVM variable with a traili 64 location using the LLVM variable with a trailing slash:: 53 65 54 make LLVM=/path/to/llvm/ 66 make LLVM=/path/to/llvm/ 55 67 56 which will use ``/path/to/llvm/clang``, ``/pat !! 68 which will use ``/path/to/llvm/clang``, ``/path/to/llvm/ld.lld``, etc. 57 following may also be used:: << 58 << 59 PATH=/path/to/llvm:$PATH make LLVM=1 << 60 69 61 If your LLVM tools have a version suffix and y 70 If your LLVM tools have a version suffix and you want to test with that 62 explicit version rather than the unsuffixed ex 71 explicit version rather than the unsuffixed executables like ``LLVM=1``, you 63 can pass the suffix using the ``LLVM`` variabl 72 can pass the suffix using the ``LLVM`` variable:: 64 73 65 make LLVM=-14 74 make LLVM=-14 66 75 67 which will use ``clang-14``, ``ld.lld-14``, et 76 which will use ``clang-14``, ``ld.lld-14``, etc. 68 77 69 To support combinations of out of tree paths w << 70 recommend:: << 71 << 72 PATH=/path/to/llvm/:$PATH make LLVM=-1 << 73 << 74 ``LLVM=0`` is not the same as omitting ``LLVM` 78 ``LLVM=0`` is not the same as omitting ``LLVM`` altogether, it will behave like 75 ``LLVM=1``. If you only wish to use certain LL !! 79 ``LLVM=1``. If you only wish to use certain LLVM utilities, use their respective 76 respective make variables. !! 80 make variables. 77 << 78 The same value used for ``LLVM=`` should be se << 79 if configuring and building via distinct comma << 80 as an environment variable when running script << 81 ``make``. << 82 << 83 Cross Compiling << 84 --------------- << 85 81 86 A single Clang compiler binary (and correspond !! 82 The integrated assembler is enabled by default. You can pass ``LLVM_IAS=0`` to 87 typically contain all supported back ends, whi !! 83 disable it. 88 compiling especially when ``LLVM=1`` is used. << 89 ``CROSS_COMPILE`` or target-triple-prefixes be << 90 84 91 make LLVM=1 ARCH=arm64 !! 85 Omitting CROSS_COMPILE 92 << 93 As an example of mixing LLVM and GNU utilities << 94 which does not yet have ``ld.lld`` or ``llvm-o << 95 invoke ``make`` via:: << 96 << 97 make LLVM=1 ARCH=s390 LD=s390x-linux-g << 98 OBJCOPY=s390x-linux-gnu-objcopy << 99 << 100 This example will invoke ``s390x-linux-gnu-ld. << 101 ``s390x-linux-gnu-objcopy``, so ensure those a << 102 << 103 ``CROSS_COMPILE`` is not used to prefix the Cl << 104 corresponding LLVM utilities) as is the case f << 105 is not set. << 106 << 107 The LLVM_IAS= argument << 108 ---------------------- 86 ---------------------- 109 87 110 Clang can assemble assembler code. You can pas !! 88 As explained above, ``CROSS_COMPILE`` is used to set ``--target=<triple>``. 111 behavior and have Clang invoke the correspondi << 112 instead. Example:: << 113 << 114 make LLVM=1 LLVM_IAS=0 << 115 << 116 ``CROSS_COMPILE`` is necessary when cross comp << 117 is used in order to set ``--prefix=`` for the << 118 corresponding non-integrated assembler (typica << 119 system assembler when targeting another archit << 120 89 121 make LLVM=1 ARCH=arm LLVM_IAS=0 CROSS_ !! 90 If ``CROSS_COMPILE`` is not specified, the ``--target=<triple>`` is inferred >> 91 from ``ARCH``. 122 92 >> 93 That means if you use only LLVM tools, ``CROSS_COMPILE`` becomes unnecessary. 123 94 124 Ccache !! 95 For example, to cross-compile the arm64 kernel:: 125 ------ << 126 96 127 ``ccache`` can be used with ``clang`` to impro !! 97 make ARCH=arm64 LLVM=1 128 KBUILD_BUILD_TIMESTAMP_ should be set to a det << 129 in order to avoid 100% cache misses, see Repro << 130 98 131 KBUILD_BUILD_TIMESTAMP='' make LLVM=1 !! 99 If ``LLVM_IAS=0`` is specified, ``CROSS_COMPILE`` is also used to derive >> 100 ``--prefix=<path>`` to search for the GNU assembler and linker. :: 132 101 133 .. _KBUILD_BUILD_TIMESTAMP: kbuild.html#kbuild !! 102 make ARCH=arm64 LLVM=1 LLVM_IAS=0 CROSS_COMPILE=aarch64-linux-gnu- 134 .. _Reproducible_builds: reproducible-builds.h << 135 103 136 Supported Architectures 104 Supported Architectures 137 ----------------------- 105 ----------------------- 138 106 139 LLVM does not target all of the architectures 107 LLVM does not target all of the architectures that Linux supports and 140 just because a target is supported in LLVM doe 108 just because a target is supported in LLVM does not mean that the kernel 141 will build or work without any issues. Below i 109 will build or work without any issues. Below is a general summary of 142 architectures that currently work with ``CC=cl 110 architectures that currently work with ``CC=clang`` or ``LLVM=1``. Level 143 of support corresponds to "S" values in the MA 111 of support corresponds to "S" values in the MAINTAINERS files. If an 144 architecture is not present, it either means t 112 architecture is not present, it either means that LLVM does not target 145 it or there are known issues. Using the latest 113 it or there are known issues. Using the latest stable version of LLVM or 146 even the development tree will generally yield 114 even the development tree will generally yield the best results. 147 An architecture's ``defconfig`` is generally e 115 An architecture's ``defconfig`` is generally expected to work well, 148 certain configurations may have problems that 116 certain configurations may have problems that have not been uncovered 149 yet. Bug reports are always welcome at the iss 117 yet. Bug reports are always welcome at the issue tracker below! 150 118 151 .. list-table:: 119 .. list-table:: 152 :widths: 10 10 10 120 :widths: 10 10 10 153 :header-rows: 1 121 :header-rows: 1 154 122 155 * - Architecture 123 * - Architecture 156 - Level of support 124 - Level of support 157 - ``make`` command 125 - ``make`` command 158 * - arm 126 * - arm 159 - Supported 127 - Supported 160 - ``LLVM=1`` 128 - ``LLVM=1`` 161 * - arm64 129 * - arm64 162 - Supported 130 - Supported 163 - ``LLVM=1`` 131 - ``LLVM=1`` 164 * - hexagon 132 * - hexagon 165 - Maintained 133 - Maintained 166 - ``LLVM=1`` 134 - ``LLVM=1`` 167 * - loongarch << 168 - Maintained << 169 - ``LLVM=1`` << 170 * - mips 135 * - mips 171 - Maintained 136 - Maintained 172 - ``LLVM=1`` 137 - ``LLVM=1`` 173 * - powerpc 138 * - powerpc 174 - Maintained 139 - Maintained 175 - ``LLVM=1`` !! 140 - ``CC=clang`` 176 * - riscv 141 * - riscv 177 - Supported !! 142 - Maintained 178 - ``LLVM=1`` 143 - ``LLVM=1`` 179 * - s390 144 * - s390 180 - Maintained 145 - Maintained 181 - ``LLVM=1`` (LLVM >= 18.1.0), ``CC=clang !! 146 - ``CC=clang`` 182 * - um (User Mode) 147 * - um (User Mode) 183 - Maintained 148 - Maintained 184 - ``LLVM=1`` 149 - ``LLVM=1`` 185 * - x86 150 * - x86 186 - Supported 151 - Supported 187 - ``LLVM=1`` 152 - ``LLVM=1`` 188 153 189 Getting Help 154 Getting Help 190 ------------ 155 ------------ 191 156 192 - `Website <https://clangbuiltlinux.github.io/ 157 - `Website <https://clangbuiltlinux.github.io/>`_ 193 - `Mailing List <https://lore.kernel.org/llvm/> 158 - `Mailing List <https://lore.kernel.org/llvm/>`_: <llvm@lists.linux.dev">https://lore.kernel.org/llvm/>`_: <llvm@lists.linux.dev> 194 - `Old Mailing List Archives <https://groups.g 159 - `Old Mailing List Archives <https://groups.google.com/g/clang-built-linux>`_ 195 - `Issue Tracker <https://github.com/ClangBuil 160 - `Issue Tracker <https://github.com/ClangBuiltLinux/linux/issues>`_ 196 - IRC: #clangbuiltlinux on irc.libera.chat 161 - IRC: #clangbuiltlinux on irc.libera.chat 197 - `Telegram <https://t.me/ClangBuiltLinux>`_: 162 - `Telegram <https://t.me/ClangBuiltLinux>`_: @ClangBuiltLinux 198 - `Wiki <https://github.com/ClangBuiltLinux/li 163 - `Wiki <https://github.com/ClangBuiltLinux/linux/wiki>`_ 199 - `Beginner Bugs <https://github.com/ClangBuil 164 - `Beginner Bugs <https://github.com/ClangBuiltLinux/linux/issues?q=is%3Aopen+is%3Aissue+label%3A%22good+first+issue%22>`_ 200 165 201 .. _getting_llvm: 166 .. _getting_llvm: 202 167 203 Getting LLVM 168 Getting LLVM 204 ------------- 169 ------------- 205 << 206 We provide prebuilt stable versions of LLVM on << 207 <https://kernel.org/pub/tools/llvm/>`_. These << 208 data for building Linux kernels, which should << 209 relative to other distributions of LLVM. << 210 << 211 Below are links that may be useful for buildin << 212 it through a distribution's package manager. << 213 170 214 - https://releases.llvm.org/download.html 171 - https://releases.llvm.org/download.html 215 - https://github.com/llvm/llvm-project 172 - https://github.com/llvm/llvm-project 216 - https://llvm.org/docs/GettingStarted.html 173 - https://llvm.org/docs/GettingStarted.html 217 - https://llvm.org/docs/CMake.html 174 - https://llvm.org/docs/CMake.html 218 - https://apt.llvm.org/ 175 - https://apt.llvm.org/ 219 - https://www.archlinux.org/packages/extra/x86 176 - https://www.archlinux.org/packages/extra/x86_64/llvm/ 220 - https://github.com/ClangBuiltLinux/tc-build 177 - https://github.com/ClangBuiltLinux/tc-build 221 - https://github.com/ClangBuiltLinux/linux/wik 178 - https://github.com/ClangBuiltLinux/linux/wiki/Building-Clang-from-source 222 - https://android.googlesource.com/platform/pr 179 - https://android.googlesource.com/platform/prebuilts/clang/host/linux-x86/
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.