.. SPDX-License-Identifier: GPL-2.0 .. include:: ../disclaimer-zh_CN.rst :Original: Documentation/kbuild/llvm.rst :Translator: 慕冬亮 Dongliang Mu <dzm91@hust.edu.cn> ========================== 使用 Clang/LLVM 构建 Linux ========================== 本文档介ç»å¦‚何使用 Clang å’Œ LLVM 工具构建 Linux å†…æ ¸ã€‚ 关于 ---- Linux å†…æ ¸ä¼ ç»Ÿä¸Šä¸€ç›´ä½¿ç”¨ GNU 工具链(如 GCC å’Œ binutils)进行编译。æŒç»çš„工作使得 `Clang <https://clang.llvm.org/>`_ å’Œ `LLVM <https://llvm.org/>`_ å·¥å…·å¯ ä½œä¸ºå¯è¡Œçš„替代å“。一些å‘行版,如 `Android <https://www.android.com/>`_〠`ChromeOS <https://www.chromium.org/chromium-os>`_ã€`OpenMandriva <https://www.openmandriva.org/>`_ å’Œ `Chimera Linux <https://chimera-linux.org/>`_ 使用 Clang ç¼–è¯‘çš„å†…æ ¸ã€‚è°·æŒå’Œ Meta çš„æ•°æ®ä¸å¿ƒ 集群也è¿è¡Œç”± Clang ç¼–è¯‘çš„å†…æ ¸ã€‚ `LLVM 是由 C++ å¯¹è±¡å®žçŽ°çš„å·¥å…·é“¾ç»„ä»¶é›†åˆ <https://www.aosabook.org/en/llvm.html>`_。 Clang 是 LLVM çš„å‰ç«¯ï¼Œæ”¯æŒ C è¯è¨€å’Œå†…æ ¸æ‰€éœ€çš„ GNU C 扩展,其å‘音为 "klang"ï¼Œè€Œéž "see-lang"。 使用 LLVM 构建 -------------- 通过以下命令调用 ``make``:: make LLVM=1 ä¸ºä¸»æœºç›®æ ‡è¿›è¡Œç¼–è¯‘ã€‚å¯¹äºŽäº¤å‰ç¼–译:: make LLVM=1 ARCH=arm64 LLVM= å‚æ•° ---------- LLVM 有 GNU binutils 工具的替代å“。这些工具å¯ä»¥å•ç‹¬å¯ç”¨ã€‚以下是支æŒçš„ make å˜é‡ 完整列表:: 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`` 扩展为上述命令。 å¦‚æžœä½ çš„ LLVM 工具ä¸åœ¨ PATH ä¸ï¼Œä½ å¯ä»¥ä½¿ç”¨ä»¥æ–œæ 结尾的 LLVM å˜é‡æ供它们的ä½ç½®:: make LLVM=/path/to/llvm/ 这将使用 ``/path/to/llvm/clang``ã€``/path/to/llvm/ld.lld`` ç‰å·¥å…·ã€‚也å¯ä»¥ 使用以下命令:: PATH=/path/to/llvm:$PATH make LLVM=1 å¦‚æžœä½ çš„ LLVM 工具带有版本åŽç¼€ï¼Œå¹¶ä¸”ä½ å¸Œæœ›æµ‹è¯•è¯¥ç‰¹å®šç‰ˆæœ¬è€Œéžæ— åŽç¼€çš„å¯æ‰§è¡Œæ–‡ä»¶ï¼Œ 类似于 ``LLVM=1``ï¼Œä½ å¯ä»¥ä½¿ç”¨ ``LLVM`` å˜é‡ä¼ 递该åŽç¼€:: make LLVM=-14 这将使用 ``clang-14``ã€``ld.lld-14`` ç‰å·¥å…·ã€‚为了支æŒå¸¦æœ‰ç‰ˆæœ¬åŽç¼€çš„æ ‘å¤–è·¯å¾„ç»„åˆï¼Œ 我们建议:: PATH=/path/to/llvm/:$PATH make LLVM=-14 ``LLVM=0`` 与çœç•¥ ``LLVM`` 完全ä¸åŒï¼Œå®ƒå°†è¡¨çŽ°å¾—åƒ ``LLVM=1``ã€‚å¦‚æžœä½ åªå¸Œæœ›ä½¿ç”¨ æŸäº› LLVM 工具,请使用它们å„自的 make å˜é‡ã€‚ 在通过ä¸åŒå‘½ä»¤é…置和构建时,应为æ¯æ¬¡è°ƒç”¨ ``make`` 设置相åŒçš„ ``LLVM=`` 值。如果 è¿è¡Œçš„脚本最终会调用 ``make``,则还应将 ``LLVM=`` 设置为环境å˜é‡ã€‚ 交å‰ç¼–译 -------- å•ä¸ª Clang 编译器二进制文件(åŠå…¶å¯¹åº”çš„ LLVM 工具)通常会包å«æ‰€æœ‰æ”¯æŒçš„åŽç«¯ï¼Œè¿™å¯ä»¥ 简化交å‰ç¼–译,尤其是使用 ``LLVM=1`` 时。如果仅使用 LLVM 工具,``CROSS_COMPILE`` æˆ–ç›®æ ‡ä¸‰å…ƒç»„å‰ç¼€å°±å˜å¾—ä¸å¿…è¦ã€‚示例:: make LLVM=1 ARCH=arm64 ä½œä¸ºæ··åˆ LLVM å’Œ GNU å·¥å…·çš„ç¤ºä¾‹ï¼Œå¯¹äºŽåƒ ``ARCH=s390`` è¿™æ ·ç›®å‰å°šä¸æ”¯æŒ ``ld.lld`` 或 ``llvm-objcopy`` çš„ç›®æ ‡ï¼Œä½ å¯ä»¥é€šè¿‡ä»¥ä¸‹æ–¹å¼è°ƒç”¨ ``make``:: make LLVM=1 ARCH=s390 LD=s390x-linux-gnu-ld.bfd \ OBJCOPY=s390x-linux-gnu-objcopy æ¤ç¤ºä¾‹å°†è°ƒç”¨ ``s390x-linux-gnu-ld.bfd`` 作为链接器和 ``s390x-linux-gnu-objcopy``ï¼Œå› æ¤è¯·ç¡®ä¿å®ƒä»¬åœ¨ä½ çš„ ``$PATH`` ä¸ã€‚ 当 ``LLVM=1`` 未设置时,``CROSS_COMPILE`` ä¸ä¼šç”¨äºŽç»™ Clang 编译器二进制文件 (或相应的 LLVM å·¥å…·ï¼‰æ·»åŠ å‰ç¼€ï¼Œè€Œ GNU 工具则需è¦è¿™æ ·åšã€‚ LLVM_IAS= å‚æ•° -------------- Clang å¯ä»¥ç¼–译汇编代ç ã€‚ä½ å¯ä»¥ä¼ 递 ``LLVM_IAS=0`` ç¦ç”¨æ¤è¡Œä¸ºï¼Œä½¿ Clang 调用 相应的éžé›†æˆæ±‡ç¼–器。示例:: make LLVM=1 LLVM_IAS=0 在交å‰ç¼–è¯‘æ—¶ï¼Œä½ éœ€è¦ä½¿ç”¨ ``CROSS_COMPILE`` 与 ``LLVM_IAS=0``,从而设置 ``--prefix=`` 使得编译器å¯ä»¥å¯¹åº”çš„éžé›†æˆæ±‡ç¼–器(通常,在é¢å‘å¦ä¸€ç§æž¶æž„时, ä½ ä¸æƒ³ä½¿ç”¨ç³»ç»Ÿæ±‡ç¼–器)。例如:: make LLVM=1 ARCH=arm LLVM_IAS=0 CROSS_COMPILE=arm-linux-gnueabi- Ccache ------ ``ccache`` å¯ä»¥ä¸Ž ``clang`` 一起使用,以改善åŽç»æž„建(尽管在ä¸åŒæž„建之间 KBUILD_BUILD_TIMESTAMP_ 应设置为åŒä¸€ç¡®å®šå€¼ï¼Œä»¥é¿å… 100% 的缓å˜æœªå‘½ä¸ï¼Œ è¯¦è§ Reproducible_builds_ 获å–更多信æ¯ï¼‰:: KBUILD_BUILD_TIMESTAMP='' make LLVM=1 CC="ccache clang" .. _KBUILD_BUILD_TIMESTAMP: kbuild.html#kbuild-build-timestamp .. _Reproducible_builds: reproducible-builds.html#timestamps 支æŒçš„架构 ---------- LLVM 并ä¸æ”¯æŒ Linux å†…æ ¸æ‰€æœ‰å¯æ”¯æŒçš„架构,åŒæ ·ï¼Œå³ä½¿ LLVM 支æŒæŸä¸€æž¶æž„,也并ä¸æ„味ç€åœ¨ è¯¥æž¶æž„ä¸‹å†…æ ¸å¯ä»¥æ£å¸¸æž„å»ºæˆ–å·¥ä½œã€‚ä»¥ä¸‹æ˜¯å½“å‰ ``CC=clang`` 或 ``LLVM=1`` 支æŒçš„架构总结。 支æŒçº§åˆ«å¯¹åº”于 MAINTAINERS 文件ä¸çš„ "S" 值。如果æŸä¸ªæž¶æž„未列出,则表示 LLVM ä¸æ”¯æŒå®ƒ 或å˜åœ¨å·²çŸ¥é—®é¢˜ã€‚使用最新的稳定版 LLVM 或甚至开å‘版本通常会得到最佳结果。一个架构的 ``defconfig`` 通常预期能够良好工作,但æŸäº›é…ç½®å¯èƒ½å˜åœ¨å°šæœªå‘现的问题。欢迎在以下 问题跟踪器ä¸æäº¤é”™è¯¯æŠ¥å‘Šï¼ .. list-table:: :widths: 10 10 10 :header-rows: 1 * - 架构 - 支æŒçº§åˆ« - ``make`` 命令 * - arm - æ”¯æŒ - ``LLVM=1`` * - arm64 - æ”¯æŒ - ``LLVM=1`` * - hexagon - 维护 - ``LLVM=1`` * - loongarch - 维护 - ``LLVM=1`` * - mips - 维护 - ``LLVM=1`` * - powerpc - 维护 - ``LLVM=1`` * - riscv - æ”¯æŒ - ``LLVM=1`` * - s390 - 维护 - ``LLVM=1`` (LLVM >= 18.1.0),``CC=clang`` (LLVM < 18.1.0) * - um (用户模å¼) - 维护 - ``LLVM=1`` * - x86 - æ”¯æŒ - ``LLVM=1`` 获å–帮助 -------- - `网站 <https://clangbuiltlinux.github.io/>`_ - `邮件列表 <https://lore.kernel.org/llvm/>`_: <llvm@lists.linux.dev> - `旧邮件列表档案 <https://groups.google.com/g/clang-built-linux>`_ - `问题跟踪器 <https://github.com/ClangBuiltLinux/linux/issues>`_ - IRC: #clangbuiltlinux 在 irc.libera.chat - `Telegram <https://t.me/ClangBuiltLinux>`_: @ClangBuiltLinux - `维基 <https://github.com/ClangBuiltLinux/linux/wiki>`_ - `åˆå¦è€…问题 <https://github.com/ClangBuiltLinux/linux/issues?q=is%3Aopen+is%3Aissue+label%3A%22good+first+issue%22>`_ .. _zh_cn_getting_llvm: èŽ·å– LLVM --------- 我们在 `kernel.org <https://kernel.org/pub/tools/llvm/>`_ æ供预编译的稳定版 LLVM。 这些版本已ç»é’ˆå¯¹ Linux å†…æ ¸æž„å»ºï¼Œä½¿ç”¨é…置文件数æ®è¿›è¡Œä¼˜åŒ–。相较于其他å‘行版ä¸çš„ LLVM,它们应该 能æé«˜å†…æ ¸æž„å»ºæ•ˆçŽ‡ã€‚ 以下是一些有助于从æºä»£ç 构建 LLVM 或通过å‘行版的包管ç†å™¨èŽ·å– LLVM 的链接。 - 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/