Loading Documentation/kbuild/index.rst +1 −0 Original line number Diff line number Diff line Loading @@ -19,6 +19,7 @@ Kernel Build System issues reproducible-builds llvm .. only:: subproject and html Loading Documentation/kbuild/kbuild.rst +5 −0 Original line number Diff line number Diff line Loading @@ -262,3 +262,8 @@ KBUILD_BUILD_USER, KBUILD_BUILD_HOST These two variables allow to override the user@host string displayed during boot and in /proc/version. The default value is the output of the commands whoami and host, respectively. LLVM ---- If this variable is set to 1, Kbuild will use Clang and LLVM utilities instead of GCC and GNU binutils to build the kernel. Documentation/kbuild/llvm.rst 0 → 100644 +87 −0 Original line number Diff line number Diff line ============================== 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>`_, and `OpenMandriva <https://www.openmandriva.org/>`_ use Clang built kernels. `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." Clang ----- The compiler used can be swapped out via `CC=` command line argument to `make`. `CC=` should be set when selecting a config and during a build. make CC=clang defconfig make CC=clang Cross Compiling --------------- A single Clang compiler binary will typically contain all supported backends, which can help simplify cross compiling. ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- make CC=clang `CROSS_COMPILE` is not used to prefix the Clang compiler binary, instead `CROSS_COMPILE` is used to set a command line flag: `--target <triple>`. For example: clang --target aarch64-linux-gnu foo.c LLVM Utilities -------------- LLVM has substitutes for GNU binutils utilities. Kbuild supports `LLVM=1` to enable them. make LLVM=1 They can be enabled individually. The full list of the parameters: make CC=clang LD=ld.lld AR=llvm-ar NM=llvm-nm STRIP=llvm-strip \\ OBJCOPY=llvm-objcopy OBJDUMP=llvm-objdump OBJSIZE=llvm-size \\ READELF=llvm-readelf HOSTCC=clang HOSTCXX=clang++ HOSTAR=llvm-ar \\ HOSTLD=ld.lld Currently, the integrated assembler is disabled by default. You can pass `LLVM_IAS=1` to enable it. Getting Help ------------ - `Website <https://clangbuiltlinux.github.io/>`_ - `Mailing List <https://groups.google.com/forum/#!forum/clang-built-linux>`_: <clang-built-linux@googlegroups.com> - `Issue Tracker <https://github.com/ClangBuiltLinux/linux/issues>`_ - IRC: #clangbuiltlinux on chat.freenode.net - `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 ------------- - http://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/ MAINTAINERS +1 −0 Original line number Diff line number Diff line Loading @@ -4028,6 +4028,7 @@ B: https://github.com/ClangBuiltLinux/linux/issues C: irc://chat.freenode.net/clangbuiltlinux S: Supported K: \b(?i:clang|llvm)\b F: Documentation/kbuild/llvm.rst CLEANCACHE API M: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> Loading Makefile +28 −12 Original line number Diff line number Diff line # SPDX-License-Identifier: GPL-2.0 VERSION = 5 PATCHLEVEL = 4 SUBLEVEL = 60 SUBLEVEL = 61 EXTRAVERSION = NAME = Kleptomaniac Octopus Loading Loading @@ -394,8 +394,13 @@ HOST_LFS_CFLAGS := $(shell getconf LFS_CFLAGS 2>/dev/null) HOST_LFS_LDFLAGS := $(shell getconf LFS_LDFLAGS 2>/dev/null) HOST_LFS_LIBS := $(shell getconf LFS_LIBS 2>/dev/null) ifneq ($(LLVM),) HOSTCC = clang HOSTCXX = clang++ else HOSTCC = gcc HOSTCXX = g++ endif KBUILD_HOSTCFLAGS := -Wall -Wmissing-prototypes -Wstrict-prototypes -O2 \ -fomit-frame-pointer -std=gnu89 $(HOST_LFS_CFLAGS) \ $(HOSTCFLAGS) Loading @@ -404,16 +409,28 @@ KBUILD_HOSTLDFLAGS := $(HOST_LFS_LDFLAGS) $(HOSTLDFLAGS) KBUILD_HOSTLDLIBS := $(HOST_LFS_LIBS) $(HOSTLDLIBS) # Make variables (CC, etc...) AS = $(CROSS_COMPILE)as LD = $(CROSS_COMPILE)ld REAL_CC = $(CROSS_COMPILE)gcc CPP = $(CC) -E ifneq ($(LLVM),) REAL_CC = clang LD = ld.lld AR = llvm-ar NM = llvm-nm OBJCOPY = llvm-objcopy OBJDUMP = llvm-objdump READELF = llvm-readelf OBJSIZE = llvm-size STRIP = llvm-strip else REAL_CC = $(CROSS_COMPILE)gcc LD = $(CROSS_COMPILE)ld AR = $(CROSS_COMPILE)ar NM = $(CROSS_COMPILE)nm STRIP = $(CROSS_COMPILE)strip OBJCOPY = $(CROSS_COMPILE)objcopy OBJDUMP = $(CROSS_COMPILE)objdump READELF = $(CROSS_COMPILE)readelf OBJSIZE = $(CROSS_COMPILE)size STRIP = $(CROSS_COMPILE)strip endif PAHOLE = pahole LEX = flex YACC = bison Loading @@ -422,7 +439,6 @@ INSTALLKERNEL := installkernel DEPMOD = /sbin/depmod PERL = perl PYTHON = python PYTHON2 = python2 PYTHON3 = python3 CHECK = sparse BASH = bash Loading Loading @@ -479,9 +495,9 @@ KBUILD_LDFLAGS := GCC_PLUGINS_CFLAGS := CLANG_FLAGS := export ARCH SRCARCH CONFIG_SHELL BASH HOSTCC KBUILD_HOSTCFLAGS CROSS_COMPILE AS LD CC export CPP AR NM STRIP OBJCOPY OBJDUMP OBJSIZE PAHOLE LEX YACC AWK INSTALLKERNEL export PERL PYTHON PYTHON2 PYTHON3 CHECK CHECKFLAGS MAKE UTS_MACHINE HOSTCXX export ARCH SRCARCH CONFIG_SHELL BASH HOSTCC KBUILD_HOSTCFLAGS CROSS_COMPILE LD CC export CPP AR NM STRIP OBJCOPY OBJDUMP OBJSIZE READELF PAHOLE LEX YACC AWK INSTALLKERNEL export PERL PYTHON PYTHON3 CHECK CHECKFLAGS MAKE UTS_MACHINE HOSTCXX export KBUILD_HOSTCXXFLAGS KBUILD_HOSTLDFLAGS KBUILD_HOSTLDLIBS LDFLAGS_MODULE export KBUILD_CPPFLAGS NOSTDINC_FLAGS LINUXINCLUDE OBJCOPYFLAGS KBUILD_LDFLAGS Loading Loading @@ -548,7 +564,7 @@ endif ifneq ($(GCC_TOOLCHAIN),) CLANG_FLAGS += --gcc-toolchain=$(GCC_TOOLCHAIN) endif ifeq ($(shell $(AS) --version 2>&1 | head -n 1 | grep clang),) ifneq ($(LLVM_IAS),1) CLANG_FLAGS += -no-integrated-as endif CLANG_FLAGS += -Werror=unknown-warning-option Loading Loading
Documentation/kbuild/index.rst +1 −0 Original line number Diff line number Diff line Loading @@ -19,6 +19,7 @@ Kernel Build System issues reproducible-builds llvm .. only:: subproject and html Loading
Documentation/kbuild/kbuild.rst +5 −0 Original line number Diff line number Diff line Loading @@ -262,3 +262,8 @@ KBUILD_BUILD_USER, KBUILD_BUILD_HOST These two variables allow to override the user@host string displayed during boot and in /proc/version. The default value is the output of the commands whoami and host, respectively. LLVM ---- If this variable is set to 1, Kbuild will use Clang and LLVM utilities instead of GCC and GNU binutils to build the kernel.
Documentation/kbuild/llvm.rst 0 → 100644 +87 −0 Original line number Diff line number Diff line ============================== 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>`_, and `OpenMandriva <https://www.openmandriva.org/>`_ use Clang built kernels. `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." Clang ----- The compiler used can be swapped out via `CC=` command line argument to `make`. `CC=` should be set when selecting a config and during a build. make CC=clang defconfig make CC=clang Cross Compiling --------------- A single Clang compiler binary will typically contain all supported backends, which can help simplify cross compiling. ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- make CC=clang `CROSS_COMPILE` is not used to prefix the Clang compiler binary, instead `CROSS_COMPILE` is used to set a command line flag: `--target <triple>`. For example: clang --target aarch64-linux-gnu foo.c LLVM Utilities -------------- LLVM has substitutes for GNU binutils utilities. Kbuild supports `LLVM=1` to enable them. make LLVM=1 They can be enabled individually. The full list of the parameters: make CC=clang LD=ld.lld AR=llvm-ar NM=llvm-nm STRIP=llvm-strip \\ OBJCOPY=llvm-objcopy OBJDUMP=llvm-objdump OBJSIZE=llvm-size \\ READELF=llvm-readelf HOSTCC=clang HOSTCXX=clang++ HOSTAR=llvm-ar \\ HOSTLD=ld.lld Currently, the integrated assembler is disabled by default. You can pass `LLVM_IAS=1` to enable it. Getting Help ------------ - `Website <https://clangbuiltlinux.github.io/>`_ - `Mailing List <https://groups.google.com/forum/#!forum/clang-built-linux>`_: <clang-built-linux@googlegroups.com> - `Issue Tracker <https://github.com/ClangBuiltLinux/linux/issues>`_ - IRC: #clangbuiltlinux on chat.freenode.net - `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 ------------- - http://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/
MAINTAINERS +1 −0 Original line number Diff line number Diff line Loading @@ -4028,6 +4028,7 @@ B: https://github.com/ClangBuiltLinux/linux/issues C: irc://chat.freenode.net/clangbuiltlinux S: Supported K: \b(?i:clang|llvm)\b F: Documentation/kbuild/llvm.rst CLEANCACHE API M: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> Loading
Makefile +28 −12 Original line number Diff line number Diff line # SPDX-License-Identifier: GPL-2.0 VERSION = 5 PATCHLEVEL = 4 SUBLEVEL = 60 SUBLEVEL = 61 EXTRAVERSION = NAME = Kleptomaniac Octopus Loading Loading @@ -394,8 +394,13 @@ HOST_LFS_CFLAGS := $(shell getconf LFS_CFLAGS 2>/dev/null) HOST_LFS_LDFLAGS := $(shell getconf LFS_LDFLAGS 2>/dev/null) HOST_LFS_LIBS := $(shell getconf LFS_LIBS 2>/dev/null) ifneq ($(LLVM),) HOSTCC = clang HOSTCXX = clang++ else HOSTCC = gcc HOSTCXX = g++ endif KBUILD_HOSTCFLAGS := -Wall -Wmissing-prototypes -Wstrict-prototypes -O2 \ -fomit-frame-pointer -std=gnu89 $(HOST_LFS_CFLAGS) \ $(HOSTCFLAGS) Loading @@ -404,16 +409,28 @@ KBUILD_HOSTLDFLAGS := $(HOST_LFS_LDFLAGS) $(HOSTLDFLAGS) KBUILD_HOSTLDLIBS := $(HOST_LFS_LIBS) $(HOSTLDLIBS) # Make variables (CC, etc...) AS = $(CROSS_COMPILE)as LD = $(CROSS_COMPILE)ld REAL_CC = $(CROSS_COMPILE)gcc CPP = $(CC) -E ifneq ($(LLVM),) REAL_CC = clang LD = ld.lld AR = llvm-ar NM = llvm-nm OBJCOPY = llvm-objcopy OBJDUMP = llvm-objdump READELF = llvm-readelf OBJSIZE = llvm-size STRIP = llvm-strip else REAL_CC = $(CROSS_COMPILE)gcc LD = $(CROSS_COMPILE)ld AR = $(CROSS_COMPILE)ar NM = $(CROSS_COMPILE)nm STRIP = $(CROSS_COMPILE)strip OBJCOPY = $(CROSS_COMPILE)objcopy OBJDUMP = $(CROSS_COMPILE)objdump READELF = $(CROSS_COMPILE)readelf OBJSIZE = $(CROSS_COMPILE)size STRIP = $(CROSS_COMPILE)strip endif PAHOLE = pahole LEX = flex YACC = bison Loading @@ -422,7 +439,6 @@ INSTALLKERNEL := installkernel DEPMOD = /sbin/depmod PERL = perl PYTHON = python PYTHON2 = python2 PYTHON3 = python3 CHECK = sparse BASH = bash Loading Loading @@ -479,9 +495,9 @@ KBUILD_LDFLAGS := GCC_PLUGINS_CFLAGS := CLANG_FLAGS := export ARCH SRCARCH CONFIG_SHELL BASH HOSTCC KBUILD_HOSTCFLAGS CROSS_COMPILE AS LD CC export CPP AR NM STRIP OBJCOPY OBJDUMP OBJSIZE PAHOLE LEX YACC AWK INSTALLKERNEL export PERL PYTHON PYTHON2 PYTHON3 CHECK CHECKFLAGS MAKE UTS_MACHINE HOSTCXX export ARCH SRCARCH CONFIG_SHELL BASH HOSTCC KBUILD_HOSTCFLAGS CROSS_COMPILE LD CC export CPP AR NM STRIP OBJCOPY OBJDUMP OBJSIZE READELF PAHOLE LEX YACC AWK INSTALLKERNEL export PERL PYTHON PYTHON3 CHECK CHECKFLAGS MAKE UTS_MACHINE HOSTCXX export KBUILD_HOSTCXXFLAGS KBUILD_HOSTLDFLAGS KBUILD_HOSTLDLIBS LDFLAGS_MODULE export KBUILD_CPPFLAGS NOSTDINC_FLAGS LINUXINCLUDE OBJCOPYFLAGS KBUILD_LDFLAGS Loading Loading @@ -548,7 +564,7 @@ endif ifneq ($(GCC_TOOLCHAIN),) CLANG_FLAGS += --gcc-toolchain=$(GCC_TOOLCHAIN) endif ifeq ($(shell $(AS) --version 2>&1 | head -n 1 | grep clang),) ifneq ($(LLVM_IAS),1) CLANG_FLAGS += -no-integrated-as endif CLANG_FLAGS += -Werror=unknown-warning-option Loading