From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-pg1-f196.google.com ([209.85.215.196]:45050 "EHLO mail-pg1-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728776AbgBYEI3 (ORCPT ); Mon, 24 Feb 2020 23:08:29 -0500 Received: by mail-pg1-f196.google.com with SMTP id a14so5826001pgb.11 for ; Mon, 24 Feb 2020 20:08:28 -0800 (PST) Date: Mon, 24 Feb 2020 20:08:26 -0800 From: Kees Cook Subject: Re: [PATCH] Documentation/llvm: add documentation on building w/ Clang/LLVM Message-ID: <202002242003.870E5F80@keescook> References: <20200224174129.2664-1-ndesaulniers@google.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20200224174129.2664-1-ndesaulniers@google.com> Sender: linux-kbuild-owner@vger.kernel.org List-ID: To: Nick Desaulniers Cc: corbet@lwn.net, masahiroy@kernel.org, Nathan Chancellor , Michal Marek , linux-kbuild@vger.kernel.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, clang-built-linux@googlegroups.com On Mon, Feb 24, 2020 at 09:41:28AM -0800, Nick Desaulniers wrote: > Added to kbuild documentation. Provides more official info on building > kernels with Clang and LLVM than our wiki. > > Suggested-by: Kees Cook > Reviewed-by: Nathan Chancellor > Signed-off-by: Nick Desaulniers > --- > Documentation/kbuild/index.rst | 1 + > Documentation/kbuild/llvm.rst | 80 ++++++++++++++++++++++++++++++++++ > 2 files changed, 81 insertions(+) > create mode 100644 Documentation/kbuild/llvm.rst > > diff --git a/Documentation/kbuild/index.rst b/Documentation/kbuild/index.rst > index 0f144fad99a6..3882bd5f7728 100644 > --- a/Documentation/kbuild/index.rst > +++ b/Documentation/kbuild/index.rst > @@ -19,6 +19,7 @@ Kernel Build System > > issues > reproducible-builds > + llvm > > .. only:: subproject and html > > diff --git a/Documentation/kbuild/llvm.rst b/Documentation/kbuild/llvm.rst > new file mode 100644 > index 000000000000..68ae022aebc0 > --- /dev/null > +++ b/Documentation/kbuild/llvm.rst > @@ -0,0 +1,80 @@ > +============================== > +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. On going work has allowed for `Clang > +`_ and `LLVM `_ utilities to be > +used as viable substitutes. Distributions such as `Android > +`_, `ChromeOS > +`_, and `OpenMandriva > +`_ use Clang built kernels. `LLVM is a > +collection of toolchain components implemented in terms of C++ objects > +`_. 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 suffix the Clang compiler binary, instead s/suffix/prefix/ > +`CROSS_COMPILE` is used to set a command line flag: `--target `. For > +example: > + > + clang --target aarch64-linux-gnu foo.c > + > +LLVM Utilities > +-------------- > + > +LLVM has substitutes for GNU binutils utilities. These can be invoked as > +additional parameters to `make`. > + > + make CC=clang AS=clang LD=ld.lld AR=llvm-ar NM=llvm-nm STRIP=llvm-strip \\ > + OBJCOPY=llvm-objcopy OBJDUMP=llvm-objdump OBJSIZE=llvm-objsize \\ > + READELF=llvm-readelf HOSTCC=clang HOSTCXX=clang++ HOSTAR=llvm-ar \\ > + HOSTLD=ld.lld > + > +Getting Help > +------------ > + > +- `Website `_ > +- `Mailing List `_: > +- `Issue Tracker `_ > +- IRC: #clangbuiltlinux on chat.freenode.net > +- `Telegram `_: @ClangBuiltLinux > +- `Wiki `_ > +- `Beginner Bugs `_ > + > +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/ Should this also include an update to Documentation/process/changes.rst with the minimum version required? (I would expect this to be "9" for Clang, and "11" for ld.lld.) Otherwise, yes, with Randy and Masahiro's suggestions, please consider it: Reviewed-by: Kees Cook -- Kees Cook