@@ -25,50 +25,38 @@ objects <https://www.aosabook.org/en/llvm.html>`_. Clang is a front-end to LLVM
25
25
that supports C and the GNU C extensions required by the kernel, and is
26
26
pronounced "klang," not "see-lang."
27
27
28
- Clang
29
- -----
30
-
31
- The compiler used can be swapped out via ``CC= `` command line argument to ``make ``.
32
- ``CC= `` should be set when selecting a config and during a build. ::
33
-
34
- make CC=clang defconfig
35
-
36
- make CC=clang
28
+ Building with LLVM
29
+ ------------------
37
30
38
- Cross Compiling
39
- ---------------
31
+ Invoke ``make `` via::
40
32
41
- A single Clang compiler binary will typically contain all supported backends,
42
- which can help simplify cross compiling. ::
43
-
44
- make ARCH=arm64 CC=clang CROSS_COMPILE=aarch64-linux-gnu-
33
+ make LLVM=1
45
34
46
- ``CROSS_COMPILE `` is not used to prefix the Clang compiler binary, instead
47
- ``CROSS_COMPILE `` is used to set a command line flag: ``--target=<triple> ``. For
48
- example: ::
35
+ to compile for the host target. For cross compiling::
49
36
50
- clang --target=aarch64-linux-gnu foo.c
37
+ make LLVM=1 ARCH=arm64
51
38
52
- LLVM Utilities
53
- --------------
39
+ The LLVM= argument
40
+ ------------------
54
41
55
- LLVM has substitutes for GNU binutils utilities. They can be enabled individually.
56
- The full list of supported make variables::
42
+ LLVM has substitutes for GNU binutils utilities. They can be enabled
43
+ individually. The full list of supported make variables::
57
44
58
45
make CC=clang LD=ld.lld AR=llvm-ar NM=llvm-nm STRIP=llvm-strip \
59
46
OBJCOPY=llvm-objcopy OBJDUMP=llvm-objdump READELF=llvm-readelf \
60
47
HOSTCC=clang HOSTCXX=clang++ HOSTAR=llvm-ar HOSTLD=ld.lld
61
48
62
- To simplify the above command, Kbuild supports the ``LLVM `` variable::
63
-
64
- make LLVM=1
49
+ ``LLVM=1 `` expands to the above.
65
50
66
51
If your LLVM tools are not available in your PATH, you can supply their
67
52
location using the LLVM variable with a trailing slash::
68
53
69
54
make LLVM=/path/to/llvm/
70
55
71
- which will use ``/path/to/llvm/clang ``, ``/path/to/llvm/ld.lld ``, etc.
56
+ which will use ``/path/to/llvm/clang ``, ``/path/to/llvm/ld.lld ``, etc. The
57
+ following may also be used::
58
+
59
+ PATH=/path/to/llvm:$PATH make LLVM=1
72
60
73
61
If your LLVM tools have a version suffix and you want to test with that
74
62
explicit version rather than the unsuffixed executables like ``LLVM=1 ``, you
@@ -78,31 +66,72 @@ can pass the suffix using the ``LLVM`` variable::
78
66
79
67
which will use ``clang-14 ``, ``ld.lld-14 ``, etc.
80
68
69
+ To support combinations of out of tree paths with version suffixes, we
70
+ recommend::
71
+
72
+ PATH=/path/to/llvm/:$PATH make LLVM=-14
73
+
81
74
``LLVM=0 `` is not the same as omitting ``LLVM `` altogether, it will behave like
82
- ``LLVM=1 ``. If you only wish to use certain LLVM utilities, use their respective
83
- make variables.
75
+ ``LLVM=1 ``. If you only wish to use certain LLVM utilities, use their
76
+ respective make variables.
77
+
78
+ The same value used for ``LLVM= `` should be set for each invocation of ``make ``
79
+ if configuring and building via distinct commands. ``LLVM= `` should also be set
80
+ as an environment variable when running scripts that will eventually run
81
+ ``make ``.
84
82
85
- The integrated assembler is enabled by default. You can pass `` LLVM_IAS=0 `` to
86
- disable it.
83
+ Cross Compiling
84
+ ---------------
87
85
88
- Omitting CROSS_COMPILE
86
+ A single Clang compiler binary (and corresponding LLVM utilities) will
87
+ typically contain all supported back ends, which can help simplify cross
88
+ compiling especially when ``LLVM=1 `` is used. If you use only LLVM tools,
89
+ ``CROSS_COMPILE `` or target-triple-prefixes become unnecessary. Example::
90
+
91
+ make LLVM=1 ARCH=arm64
92
+
93
+ As an example of mixing LLVM and GNU utilities, for a target like ``ARCH=s390 ``
94
+ which does not yet have ``ld.lld `` or ``llvm-objcopy `` support, you could
95
+ invoke ``make `` via::
96
+
97
+ make LLVM=1 ARCH=s390 LD=s390x-linux-gnu-ld.bfd \
98
+ OBJCOPY=s390x-linux-gnu-objcopy
99
+
100
+ This example will invoke ``s390x-linux-gnu-ld.bfd `` as the linker and
101
+ ``s390x-linux-gnu-objcopy ``, so ensure those are reachable in your ``$PATH ``.
102
+
103
+ ``CROSS_COMPILE `` is not used to prefix the Clang compiler binary (or
104
+ corresponding LLVM utilities) as is the case for GNU utilities when ``LLVM=1 ``
105
+ is not set.
106
+
107
+ The LLVM_IAS= argument
89
108
----------------------
90
109
91
- As explained above, ``CROSS_COMPILE `` is used to set ``--target=<triple> ``.
110
+ Clang can assemble assembler code. You can pass ``LLVM_IAS=0 `` to disable this
111
+ behavior and have Clang invoke the corresponding non-integrated assembler
112
+ instead. Example::
113
+
114
+ make LLVM=1 LLVM_IAS=0
115
+
116
+ ``CROSS_COMPILE `` is necessary when cross compiling and ``LLVM_IAS=0 ``
117
+ is used in order to set ``--prefix= `` for the compiler to find the
118
+ corresponding non-integrated assembler (typically, you don't want to use the
119
+ system assembler when targeting another architecture). Example::
92
120
93
- If ``CROSS_COMPILE `` is not specified, the ``--target=<triple> `` is inferred
94
- from ``ARCH ``.
121
+ make LLVM=1 ARCH=arm LLVM_IAS=0 CROSS_COMPILE=arm-linux-gnueabi-
95
122
96
- That means if you use only LLVM tools, ``CROSS_COMPILE `` becomes unnecessary.
97
123
98
- For example, to cross-compile the arm64 kernel::
124
+ Ccache
125
+ ------
99
126
100
- make ARCH=arm64 LLVM=1
127
+ ``ccache `` can be used with ``clang `` to improve subsequent builds, (though
128
+ KBUILD_BUILD_TIMESTAMP _ should be set to a deterministic value between builds
129
+ in order to avoid 100% cache misses, see Reproducible_builds _ for more info):
101
130
102
- If ``LLVM_IAS=0 `` is specified, ``CROSS_COMPILE `` is also used to derive
103
- ``--prefix=<path> `` to search for the GNU assembler and linker. ::
131
+ KBUILD_BUILD_TIMESTAMP='' make LLVM=1 CC="ccache clang"
104
132
105
- make ARCH=arm64 LLVM=1 LLVM_IAS=0 CROSS_COMPILE=aarch64-linux-gnu-
133
+ .. _KBUILD_BUILD_TIMESTAMP : kbuild.html#kbuild-build-timestamp
134
+ .. _Reproducible_builds : reproducible-builds.html#timestamps
106
135
107
136
Supported Architectures
108
137
-----------------------
@@ -135,14 +164,17 @@ yet. Bug reports are always welcome at the issue tracker below!
135
164
* - hexagon
136
165
- Maintained
137
166
- ``LLVM=1 ``
167
+ * - loongarch
168
+ - Maintained
169
+ - ``LLVM=1 ``
138
170
* - mips
139
171
- Maintained
140
172
- ``LLVM=1 ``
141
173
* - powerpc
142
174
- Maintained
143
- - ``CC=clang ``
175
+ - ``LLVM=1 ``
144
176
* - riscv
145
- - Maintained
177
+ - Supported
146
178
- ``LLVM=1 ``
147
179
* - s390
148
180
- Maintained
@@ -171,7 +203,11 @@ Getting Help
171
203
Getting LLVM
172
204
-------------
173
205
174
- We provide prebuilt stable versions of LLVM on `kernel.org <https://kernel.org/pub/tools/llvm/ >`_.
206
+ We provide prebuilt stable versions of LLVM on `kernel.org
207
+ <https://kernel.org/pub/tools/llvm/> `_. These have been optimized with profile
208
+ data for building Linux kernels, which should improve kernel build times
209
+ relative to other distributions of LLVM.
210
+
175
211
Below are links that may be useful for building LLVM from source or procuring
176
212
it through a distribution's package manager.
177
213
0 commit comments