요약·해설과 원문, 전문 번역을 서로 분리했습니다. API 이름, symbol, source path는 원문 표기를 사용합니다.
1. 요약·해설
원문의 핵심 논리와 kernel programming 관점의 보충 설명입니다. 아래의 전문 번역과는 별도로 작성했습니다.
2. 영어 원문 전체
번역 기준이 된 Linux v6.18.37 원문입니다. 줄 번호는 이 버전의 파일 좌표입니다.
원문 전체 펼치기
.. _kbuild_llvm:
==============================
Building Linux with Clang/LLVM
==============================
This document covers how to build the Linux kernel with Clang and LLVM
utilities.
About
-----
The Linux kernel has always traditionally been compiled with GNU toolchains
such as GCC and binutils. Ongoing work has allowed for `Clang
<https://clang.llvm.org/>`_ and `LLVM <https://llvm.org/>`_ utilities to be
used as viable substitutes. Distributions such as `Android
<https://www.android.com/>`_, `ChromeOS
<https://www.chromium.org/chromium-os>`_, `OpenMandriva
<https://www.openmandriva.org/>`_, and `Chimera Linux
<https://chimera-linux.org/>`_ use Clang built kernels. Google's and Meta's
datacenter fleets also run kernels built with Clang.
`LLVM is a collection of toolchain components implemented in terms of C++
objects <https://www.aosabook.org/en/llvm.html>`_. Clang is a front-end to LLVM
that supports C and the GNU C extensions required by the kernel, and is
pronounced "klang," not "see-lang."
Building with LLVM
------------------
Invoke ``make`` via::
make LLVM=1
to compile for the host target. For cross compiling::
make LLVM=1 ARCH=arm64
The LLVM= argument
------------------
LLVM has substitutes for GNU binutils utilities. They can be enabled
individually. The full list of supported make variables::
make CC=clang LD=ld.lld AR=llvm-ar NM=llvm-nm STRIP=llvm-strip \
OBJCOPY=llvm-objcopy OBJDUMP=llvm-objdump READELF=llvm-readelf \
HOSTCC=clang HOSTCXX=clang++ HOSTAR=llvm-ar HOSTLD=ld.lld
``LLVM=1`` expands to the above.
If your LLVM tools are not available in your PATH, you can supply their
location using the LLVM variable with a trailing slash::
make LLVM=/path/to/llvm/
which will use ``/path/to/llvm/clang``, ``/path/to/llvm/ld.lld``, etc. The
following may also be used::
PATH=/path/to/llvm:$PATH make LLVM=1
If your LLVM tools have a version suffix and you want to test with that
explicit version rather than the unsuffixed executables like ``LLVM=1``, you
can pass the suffix using the ``LLVM`` variable::
make LLVM=-14
which will use ``clang-14``, ``ld.lld-14``, etc.
To support combinations of out of tree paths with version suffixes, we
recommend::
PATH=/path/to/llvm/:$PATH make LLVM=-14
``LLVM=0`` is not the same as omitting ``LLVM`` altogether, it will behave like
``LLVM=1``. If you only wish to use certain LLVM utilities, use their
respective make variables.
The same value used for ``LLVM=`` should be set for each invocation of ``make``
if configuring and building via distinct commands. ``LLVM=`` should also be set
as an environment variable when running scripts that will eventually run
``make``.
Cross Compiling
---------------
A single Clang compiler binary (and corresponding LLVM utilities) will
typically contain all supported back ends, which can help simplify cross
compiling especially when ``LLVM=1`` is used. If you use only LLVM tools,
``CROSS_COMPILE`` or target-triple-prefixes become unnecessary. Example::
make LLVM=1 ARCH=arm64
As an example of mixing LLVM and GNU utilities, for a target like ``ARCH=s390``
which does not yet have ``ld.lld`` or ``llvm-objcopy`` support, you could
invoke ``make`` via::
make LLVM=1 ARCH=s390 LD=s390x-linux-gnu-ld.bfd \
OBJCOPY=s390x-linux-gnu-objcopy
This example will invoke ``s390x-linux-gnu-ld.bfd`` as the linker and
``s390x-linux-gnu-objcopy``, so ensure those are reachable in your ``$PATH``.
``CROSS_COMPILE`` is not used to prefix the Clang compiler binary (or
corresponding LLVM utilities) as is the case for GNU utilities when ``LLVM=1``
is not set.
The LLVM_IAS= argument
----------------------
Clang can assemble assembler code. You can pass ``LLVM_IAS=0`` to disable this
behavior and have Clang invoke the corresponding non-integrated assembler
instead. Example::
make LLVM=1 LLVM_IAS=0
``CROSS_COMPILE`` is necessary when cross compiling and ``LLVM_IAS=0``
is used in order to set ``--prefix=`` for the compiler to find the
corresponding non-integrated assembler (typically, you don't want to use the
system assembler when targeting another architecture). Example::
make LLVM=1 ARCH=arm LLVM_IAS=0 CROSS_COMPILE=arm-linux-gnueabi-
Ccache
------
``ccache`` can be used with ``clang`` to improve subsequent builds, (though
KBUILD_BUILD_TIMESTAMP_ should be set to a deterministic value between builds
in order to avoid 100% cache misses, see Reproducible_builds_ for more info)::
KBUILD_BUILD_TIMESTAMP='' make LLVM=1 CC="ccache clang"
.. _KBUILD_BUILD_TIMESTAMP: kbuild.html#kbuild-build-timestamp
.. _Reproducible_builds: reproducible-builds.html#timestamps
Supported Architectures
-----------------------
LLVM does not target all of the architectures that Linux supports and
just because a target is supported in LLVM does not mean that the kernel
will build or work without any issues. Below is a general summary of
architectures that currently work with ``CC=clang`` or ``LLVM=1``. Level
of support corresponds to "S" values in the MAINTAINERS files. If an
architecture is not present, it either means that LLVM does not target
it or there are known issues. Using the latest stable version of LLVM or
even the development tree will generally yield the best results.
An architecture's ``defconfig`` is generally expected to work well,
certain configurations may have problems that have not been uncovered
yet. Bug reports are always welcome at the issue tracker below!
.. list-table::
:widths: 10 10 10
:header-rows: 1
* - Architecture
- Level of support
- ``make`` command
* - arm
- Supported
- ``LLVM=1``
* - arm64
- Supported
- ``LLVM=1``
* - hexagon
- Maintained
- ``LLVM=1``
* - loongarch
- Maintained
- ``LLVM=1``
* - mips
- Maintained
- ``LLVM=1``
* - powerpc
- Maintained
- ``LLVM=1``
* - riscv
- Supported
- ``LLVM=1``
* - s390
- Maintained
- ``LLVM=1`` (LLVM >= 18.1.0), ``CC=clang`` (LLVM < 18.1.0)
* - sparc (sparc64 only)
- Maintained
- ``CC=clang LLVM_IAS=0`` (LLVM >= 20)
* - um (User Mode)
- Maintained
- ``LLVM=1``
* - x86
- Supported
- ``LLVM=1``
Getting Help
------------
- `Website <https://clangbuiltlinux.github.io/>`_
- `Mailing List <https://lore.kernel.org/llvm/>`_: <llvm@lists.linux.dev>
- `Old Mailing List Archives <https://groups.google.com/g/clang-built-linux>`_
- `Issue Tracker <https://github.com/ClangBuiltLinux/linux/issues>`_
- IRC: #clangbuiltlinux on irc.libera.chat
- `Telegram <https://t.me/ClangBuiltLinux>`_: @ClangBuiltLinux
- `Wiki <https://github.com/ClangBuiltLinux/linux/wiki>`_
- `Beginner Bugs <https://github.com/ClangBuiltLinux/linux/issues?q=is%3Aopen+is%3Aissue+label%3A%22good+first+issue%22>`_
.. _getting_llvm:
Getting LLVM
-------------
We provide prebuilt stable versions of LLVM on `kernel.org
<https://kernel.org/pub/tools/llvm/>`_. These have been optimized with profile
data for building Linux kernels, which should improve kernel build times
relative to other distributions of LLVM.
Below are links that may be useful for building LLVM from source or procuring
it through a distribution's package manager.
- https://releases.llvm.org/download.html
- https://github.com/llvm/llvm-project
- https://llvm.org/docs/GettingStarted.html
- https://llvm.org/docs/CMake.html
- https://apt.llvm.org/
- https://www.archlinux.org/packages/extra/x86_64/llvm/
- https://github.com/ClangBuiltLinux/tc-build
- https://github.com/ClangBuiltLinux/linux/wiki/Building-Clang-from-source
- https://android.googlesource.com/platform/prebuilts/clang/host/linux-x86/
3. 한국어 전문 번역
영어 원문의 문단 순서와 의미를 유지한 전체 번역입니다. 코드, 함수명, symbol과 URL은 원문 표기를 유지합니다.
Clang/LLVM kernel build 개요
1-27이 문서는 Clang compiler와 LLVM utility로 Linux kernel을 build하는 방법을 설명합니다.
Linux kernel은 전통적으로 GCC와 binutils 같은 GNU toolchain으로 compile해 왔습니다. 지속적인 개발을 통해 Clang과 LLVM utility도 실용적인 대체재가 되었습니다.
Android, ChromeOS, OpenMandriva, Chimera Linux 배포판은 Clang으로 build한 kernel을 사용합니다. Google과 Meta의 datacenter fleet도 Clang build kernel을 실행합니다.
원문에 명시된 distribution과 fleet입니다.
LLVM은 C++ object를 기반으로 구현된 toolchain component 모음입니다. Clang은 LLVM의 front-end이며 C와 kernel에 필요한 GNU C extension을 지원합니다. 발음은 "see-lang"이 아니라 "klang"입니다.
.. _kbuild_llvm:
==============================
Building Linux with Clang/LLVM
==============================
This document covers how to build the Linux kernel with Clang and LLVM
utilities.
About
-----
The Linux kernel has always traditionally been compiled with GNU toolchains
such as GCC and binutils. Ongoing work has allowed for `Clang
<https://clang.llvm.org/>`_ and `LLVM <https://llvm.org/>`_ utilities to be
used as viable substitutes. Distributions such as `Android
<https://www.android.com/>`_, `ChromeOS
<https://www.chromium.org/chromium-os>`_, `OpenMandriva
<https://www.openmandriva.org/>`_, and `Chimera Linux
<https://chimera-linux.org/>`_ use Clang built kernels. Google's and Meta's
datacenter fleets also run kernels built with Clang.
`LLVM is a collection of toolchain components implemented in terms of C++
objects <https://www.aosabook.org/en/llvm.html>`_. Clang is a front-end to LLVM
that supports C and the GNU C extensions required by the kernel, and is
pronounced "klang," not "see-lang."
`LLVM=` 인자와 tool 선택
28-82Host target용 kernel은 `make LLVM=1`로 compile합니다. Cross compile은 target architecture를 더해 `make LLVM=1 ARCH=arm64`처럼 실행합니다.
LLVM에는 GNU binutils utility를 대체하는 도구가 있으며 각각 따로 enable할 수도 있습니다. 지원되는 make variable 전체는 다음과 같습니다.
make CC=clang LD=ld.lld AR=llvm-ar NM=llvm-nm STRIP=llvm-strip \
OBJCOPY=llvm-objcopy OBJDUMP=llvm-objdump READELF=llvm-readelf \
HOSTCC=clang HOSTCXX=clang++ HOSTAR=llvm-ar HOSTLD=ld.lld
`LLVM=1`은 위 variable 지정 전체로 확장됩니다.
GNU 역할을 담당하는 LLVM executable입니다.
LLVM tool이 `PATH`에 없다면 뒤에 slash를 붙인 위치를 `LLVM` variable에 넘길 수 있습니다. `make LLVM=/path/to/llvm/`는 `/path/to/llvm/clang`, `/path/to/llvm/ld.lld` 등을 사용합니다. `PATH=/path/to/llvm:$PATH make LLVM=1`도 가능합니다.
Tool 이름에 version suffix가 있고 suffix 없는 `LLVM=1` 대신 특정 version을 시험하려면 `make LLVM=-14`를 사용합니다. 그러면 `clang-14`, `ld.lld-14` 등을 선택합니다.
Out-of-tree path와 version suffix를 함께 쓸 때는 `PATH=/path/to/llvm/:$PATH make LLVM=-14` 형태를 권장합니다.
`LLVM=0`은 `LLVM`을 생략하는 것과 다르며 `LLVM=1`처럼 동작합니다. 일부 LLVM utility만 사용하려면 각 make variable을 직접 지정해야 합니다.
Configuration과 build를 별도 command로 실행한다면 모든 `make` 호출에서 같은 `LLVM=` 값을 사용해야 합니다. 나중에 `make`를 실행하는 script를 돌릴 때도 `LLVM=`을 environment variable로 설정해야 합니다.
설치 형태와 필요한 tool 범위에 따라 한 방식을 고릅니다.
Building with LLVM
------------------
Invoke ``make`` via::
make LLVM=1
to compile for the host target. For cross compiling::
make LLVM=1 ARCH=arm64
The LLVM= argument
------------------
LLVM has substitutes for GNU binutils utilities. They can be enabled
individually. The full list of supported make variables::
make CC=clang LD=ld.lld AR=llvm-ar NM=llvm-nm STRIP=llvm-strip \
OBJCOPY=llvm-objcopy OBJDUMP=llvm-objdump READELF=llvm-readelf \
HOSTCC=clang HOSTCXX=clang++ HOSTAR=llvm-ar HOSTLD=ld.lld
``LLVM=1`` expands to the above.
If your LLVM tools are not available in your PATH, you can supply their
location using the LLVM variable with a trailing slash::
make LLVM=/path/to/llvm/
which will use ``/path/to/llvm/clang``, ``/path/to/llvm/ld.lld``, etc. The
following may also be used::
PATH=/path/to/llvm:$PATH make LLVM=1
If your LLVM tools have a version suffix and you want to test with that
explicit version rather than the unsuffixed executables like ``LLVM=1``, you
can pass the suffix using the ``LLVM`` variable::
make LLVM=-14
which will use ``clang-14``, ``ld.lld-14``, etc.
To support combinations of out of tree paths with version suffixes, we
recommend::
PATH=/path/to/llvm/:$PATH make LLVM=-14
``LLVM=0`` is not the same as omitting ``LLVM`` altogether, it will behave like
``LLVM=1``. If you only wish to use certain LLVM utilities, use their
respective make variables.
The same value used for ``LLVM=`` should be set for each invocation of ``make``
if configuring and building via distinct commands. ``LLVM=`` should also be set
as an environment variable when running scripts that will eventually run
``make``.
Cross compile과 integrated assembler
83-123Clang compiler binary 하나와 대응 LLVM utility에는 보통 지원되는 backend가 모두 들어 있습니다. 특히 `LLVM=1`을 쓰면 cross compile 구성이 단순해집니다. LLVM tool만 사용한다면 `CROSS_COMPILE`이나 target-triple prefix가 필요 없으며 `make LLVM=1 ARCH=arm64`로 충분합니다.
LLVM과 GNU utility를 섞을 수도 있습니다. 아직 `ld.lld`나 `llvm-objcopy` 지원이 없는 `ARCH=s390` 같은 target은 GNU linker와 objcopy를 명시합니다.
make LLVM=1 ARCH=s390 LD=s390x-linux-gnu-ld.bfd \
OBJCOPY=s390x-linux-gnu-objcopy
이 command는 linker로 `s390x-linux-gnu-ld.bfd`, objcopy로 `s390x-linux-gnu-objcopy`를 실행하므로 두 executable이 `$PATH`에 있어야 합니다.
`LLVM=1`일 때 `CROSS_COMPILE`은 GNU utility에서처럼 Clang compiler binary나 대응 LLVM utility 이름 앞에 붙지 않습니다.
Clang은 assembler code를 직접 assemble할 수 있습니다. `LLVM_IAS=0`을 넘기면 이 integrated assembler 동작을 끄고 Clang이 대응하는 non-integrated assembler를 호출하게 합니다.
make LLVM=1 LLVM_IAS=0
Cross compile에서 `LLVM_IAS=0`을 사용하면 compiler가 `--prefix=`를 통해 target용 non-integrated assembler를 찾도록 `CROSS_COMPILE`이 필요합니다. 다른 architecture를 target으로 할 때 system assembler를 쓰면 안 되는 것이 일반적입니다.
make LLVM=1 ARCH=arm LLVM_IAS=0 CROSS_COMPILE=arm-linux-gnueabi-
LLVM utility 사용 범위에 따른 추가 설정입니다.
Cross Compiling
---------------
A single Clang compiler binary (and corresponding LLVM utilities) will
typically contain all supported back ends, which can help simplify cross
compiling especially when ``LLVM=1`` is used. If you use only LLVM tools,
``CROSS_COMPILE`` or target-triple-prefixes become unnecessary. Example::
make LLVM=1 ARCH=arm64
As an example of mixing LLVM and GNU utilities, for a target like ``ARCH=s390``
which does not yet have ``ld.lld`` or ``llvm-objcopy`` support, you could
invoke ``make`` via::
make LLVM=1 ARCH=s390 LD=s390x-linux-gnu-ld.bfd \
OBJCOPY=s390x-linux-gnu-objcopy
This example will invoke ``s390x-linux-gnu-ld.bfd`` as the linker and
``s390x-linux-gnu-objcopy``, so ensure those are reachable in your ``$PATH``.
``CROSS_COMPILE`` is not used to prefix the Clang compiler binary (or
corresponding LLVM utilities) as is the case for GNU utilities when ``LLVM=1``
is not set.
The LLVM_IAS= argument
----------------------
Clang can assemble assembler code. You can pass ``LLVM_IAS=0`` to disable this
behavior and have Clang invoke the corresponding non-integrated assembler
instead. Example::
make LLVM=1 LLVM_IAS=0
``CROSS_COMPILE`` is necessary when cross compiling and ``LLVM_IAS=0``
is used in order to set ``--prefix=`` for the compiler to find the
corresponding non-integrated assembler (typically, you don't want to use the
system assembler when targeting another architecture). Example::
make LLVM=1 ARCH=arm LLVM_IAS=0 CROSS_COMPILE=arm-linux-gnueabi-
ccache와 지원 architecture
124-191`ccache`를 `clang`과 함께 사용하면 이후 build를 빠르게 할 수 있습니다. 다만 build 사이 cache miss가 100% 발생하지 않도록 `KBUILD_BUILD_TIMESTAMP`를 deterministic value로 설정해야 합니다. 자세한 내용은 `Reproducible_builds`를 참고합니다.
KBUILD_BUILD_TIMESTAMP='' make LLVM=1 CC="ccache clang"
관련 anchor는 `kbuild.html#kbuild-build-timestamp`와 `reproducible-builds.html#timestamps`입니다.
LLVM은 Linux가 지원하는 모든 architecture를 target으로 삼지 않습니다. LLVM 자체가 target을 지원하더라도 kernel이 문제없이 build되거나 동작한다는 뜻은 아닙니다. 아래 표의 support level은 MAINTAINERS file의 `S` 값에 대응합니다.
표에 없는 architecture는 LLVM target이 없거나 알려진 문제가 있다는 뜻입니다. 최신 stable LLVM 또는 development tree가 일반적으로 가장 좋은 결과를 냅니다. 각 architecture의 `defconfig`는 대체로 잘 동작할 것으로 기대하지만 아직 발견되지 않은 문제가 특정 구성에 남아 있을 수 있으므로 issue tracker에 bug report를 보내는 것을 환영합니다.
원문 표의 support level과 build command입니다.
Ccache
------
``ccache`` can be used with ``clang`` to improve subsequent builds, (though
KBUILD_BUILD_TIMESTAMP_ should be set to a deterministic value between builds
in order to avoid 100% cache misses, see Reproducible_builds_ for more info)::
KBUILD_BUILD_TIMESTAMP='' make LLVM=1 CC="ccache clang"
.. _KBUILD_BUILD_TIMESTAMP: kbuild.html#kbuild-build-timestamp
.. _Reproducible_builds: reproducible-builds.html#timestamps
Supported Architectures
-----------------------
LLVM does not target all of the architectures that Linux supports and
just because a target is supported in LLVM does not mean that the kernel
will build or work without any issues. Below is a general summary of
architectures that currently work with ``CC=clang`` or ``LLVM=1``. Level
of support corresponds to "S" values in the MAINTAINERS files. If an
architecture is not present, it either means that LLVM does not target
it or there are known issues. Using the latest stable version of LLVM or
even the development tree will generally yield the best results.
An architecture's ``defconfig`` is generally expected to work well,
certain configurations may have problems that have not been uncovered
yet. Bug reports are always welcome at the issue tracker below!
.. list-table::
:widths: 10 10 10
:header-rows: 1
* - Architecture
- Level of support
- ``make`` command
* - arm
- Supported
- ``LLVM=1``
* - arm64
- Supported
- ``LLVM=1``
* - hexagon
- Maintained
- ``LLVM=1``
* - loongarch
- Maintained
- ``LLVM=1``
* - mips
- Maintained
- ``LLVM=1``
* - powerpc
- Maintained
- ``LLVM=1``
* - riscv
- Supported
- ``LLVM=1``
* - s390
- Maintained
- ``LLVM=1`` (LLVM >= 18.1.0), ``CC=clang`` (LLVM < 18.1.0)
* - sparc (sparc64 only)
- Maintained
- ``CC=clang LLVM_IAS=0`` (LLVM >= 20)
* - um (User Mode)
- Maintained
- ``LLVM=1``
* - x86
- Supported
- ``LLVM=1``
지원 채널과 LLVM 설치
192-225도움은 ClangBuiltLinux website, 현재 mailing list `<llvm@lists.linux.dev>`, 이전 mailing list archive, GitHub issue tracker, Libera Chat의 `#clangbuiltlinux`, Telegram `@ClangBuiltLinux`, wiki와 `good first issue` 목록에서 받을 수 있습니다.
원문에 제공된 project communication 경로입니다.
Kernel.org는 LLVM의 prebuilt stable version을 `https://kernel.org/pub/tools/llvm/`에서 제공합니다. 이 build는 Linux kernel compile용 profile data로 optimize되어 다른 LLVM distribution보다 kernel build time을 줄일 수 있습니다.
LLVM을 source에서 build하거나 distribution package manager로 설치할 때는 공식 release download, llvm-project GitHub, Getting Started, CMake 문서, apt.llvm.org, Arch Linux package, ClangBuiltLinux `tc-build`, source build wiki와 Android prebuilt 저장소 link를 참고합니다.
원문 마지막의 설치 및 source build 자료입니다.
Getting Help
------------
- `Website <https://clangbuiltlinux.github.io/>`_
- `Mailing List <https://lore.kernel.org/llvm/>`_: <llvm@lists.linux.dev>
- `Old Mailing List Archives <https://groups.google.com/g/clang-built-linux>`_
- `Issue Tracker <https://github.com/ClangBuiltLinux/linux/issues>`_
- IRC: #clangbuiltlinux on irc.libera.chat
- `Telegram <https://t.me/ClangBuiltLinux>`_: @ClangBuiltLinux
- `Wiki <https://github.com/ClangBuiltLinux/linux/wiki>`_
- `Beginner Bugs <https://github.com/ClangBuiltLinux/linux/issues?q=is%3Aopen+is%3Aissue+label%3A%22good+first+issue%22>`_
.. _getting_llvm:
Getting LLVM
-------------
We provide prebuilt stable versions of LLVM on `kernel.org
<https://kernel.org/pub/tools/llvm/>`_. These have been optimized with profile
data for building Linux kernels, which should improve kernel build times
relative to other distributions of LLVM.
Below are links that may be useful for building LLVM from source or procuring
it through a distribution's package manager.
- https://releases.llvm.org/download.html
- https://github.com/llvm/llvm-project
- https://llvm.org/docs/GettingStarted.html
- https://llvm.org/docs/CMake.html
- https://apt.llvm.org/
- https://www.archlinux.org/packages/extra/x86_64/llvm/
- https://github.com/ClangBuiltLinux/tc-build
- https://github.com/ClangBuiltLinux/linux/wiki/Building-Clang-from-source
- https://android.googlesource.com/platform/prebuilts/clang/host/linux-x86/
요약·해설
llvm.rst:1-225전체 LLVM toolchain은 `LLVM=1`로 선택하며 path 또는 version suffix도 `LLVM=` 값으로 지정합니다. Configuration과 build의 모든 `make` 호출에서 같은 값을 유지해야 합니다.
LLVM backend만 쓰는 cross build는 대개 `CROSS_COMPILE` 없이 `ARCH`만 지정할 수 있습니다. GNU tool을 섞거나 `LLVM_IAS=0`으로 외부 assembler를 쓸 때는 target tool 이름과 prefix가 필요합니다.
지원 표는 architecture별 현재 상태를 나타내며, LLVM이 target을 지원한다는 사실만으로 모든 kernel configuration의 build·runtime 성공이 보장되지는 않습니다.
Build 환경에 맞는 최소 인자를 선택합니다.