* [PATCH v2 1/2] kbuild: replace AS=clang with LLVM_IA=1 @ 2020-04-07 18:43 Masahiro Yamada 2020-04-07 18:43 ` [PATCH v2 2/2] kbuild: support LLVM=1 to switch the default tools to Clang/LLVM Masahiro Yamada ` (2 more replies) 0 siblings, 3 replies; 5+ messages in thread From: Masahiro Yamada @ 2020-04-07 18:43 UTC (permalink / raw) To: linux-kbuild Cc: clang-built-linux, Masahiro Yamada, Jonathan Corbet, Michal Marek, linux-doc, linux-kernel The 'AS' variable is unused for building the kernel. Only the remaining usage is to turn on the integrated assembler. A boolean flag is a better fit for this purpose. AS=clang was added for experts. So, I replaced it with LLVM_IA=1, breaking the backward compatibility. Suggested-by: Nick Desaulniers <ndesaulniers@google.com> Signed-off-by: Masahiro Yamada <masahiroy@kernel.org> --- Changes in v2: - new patch Documentation/kbuild/llvm.rst | 5 ++++- Makefile | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/Documentation/kbuild/llvm.rst b/Documentation/kbuild/llvm.rst index eefbdfa3e4d9..2b40afa58049 100644 --- a/Documentation/kbuild/llvm.rst +++ b/Documentation/kbuild/llvm.rst @@ -50,11 +50,14 @@ 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 \\ + 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_IA=1 to enable it. + Getting Help ------------ diff --git a/Makefile b/Makefile index 1b2691057cb5..f9beb696d6d3 100644 --- a/Makefile +++ b/Makefile @@ -538,7 +538,7 @@ endif ifneq ($(GCC_TOOLCHAIN),) CLANG_FLAGS += --gcc-toolchain=$(GCC_TOOLCHAIN) endif -ifeq ($(if $(AS),$(shell $(AS) --version 2>&1 | head -n 1 | grep clang)),) +ifneq ($(LLVM_IA),1) CLANG_FLAGS += -no-integrated-as endif CLANG_FLAGS += -Werror=unknown-warning-option -- 2.17.1 ^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH v2 2/2] kbuild: support LLVM=1 to switch the default tools to Clang/LLVM 2020-04-07 18:43 [PATCH v2 1/2] kbuild: replace AS=clang with LLVM_IA=1 Masahiro Yamada @ 2020-04-07 18:43 ` Masahiro Yamada 2020-04-07 20:39 ` Nick Desaulniers 2020-04-07 18:45 ` [PATCH v2 1/2] kbuild: replace AS=clang with LLVM_IA=1 Nathan Chancellor 2020-04-07 19:03 ` Nick Desaulniers 2 siblings, 1 reply; 5+ messages in thread From: Masahiro Yamada @ 2020-04-07 18:43 UTC (permalink / raw) To: linux-kbuild Cc: clang-built-linux, Masahiro Yamada, Jonathan Corbet, Josh Poimboeuf, Michal Marek, Peter Zijlstra, linux-doc, linux-kernel As Documentation/kbuild/llvm.rst implies, building the kernel with a full set of LLVM tools gets very verbose and unwieldy. Provide a single switch LLVM=1 to use Clang and LLVM tools instead of GCC and Binutils. You can pass it from the command line or as an environment variable. Please note LLVM=1 does not turn on the integrated assembler. You need to pass LLVM_IA=1 to use it. When the upstream kernel is ready for the integrated assembler, I think we can make it default. We discussed what we need, and we agreed to go with a simple boolean flag that switches both target and host tools: https://lkml.org/lkml/2020/3/28/494 https://lkml.org/lkml/2020/4/3/43 Some items discussed, but not adopted: - LLVM_DIR When multiple versions of LLVM are installed, I just thought supporting LLVM_DIR=/path/to/my/llvm/bin/ might be useful. CC = $(LLVM_DIR)clang LD = $(LLVM_DIR)ld.lld ... However, we can handle this by modifying PATH. So, we decided to not do this. - LLVM_SUFFIX Some distributions (e.g. Debian) package specific versions of LLVM with naming conventions that use the version as a suffix. CC = clang$(LLVM_SUFFIX) LD = ld.lld(LLVM_SUFFIX) ... will allow a user to pass LLVM_SUFFIX=-11 to use clang-11 etc., but the suffixed versions in /usr/bin/ are symlinks to binaries in /usr/lib/llvm-#/bin/, so this can also be handled by PATH. Signed-off-by: Masahiro Yamada <masahiroy@kernel.org> Reviewed-by: Nathan Chancellor <natechancellor@gmail.com> Tested-by: Nathan Chancellor <natechancellor@gmail.com> # build Tested-by: Nick Desaulniers <ndesaulniers@google.com> --- Changes in v2: - Switch host compilers as well as requested Documentation/kbuild/kbuild.rst | 5 +++++ Documentation/kbuild/llvm.rst | 8 ++++++-- Makefile | 29 +++++++++++++++++++++++------ tools/objtool/Makefile | 6 ++++++ 4 files changed, 40 insertions(+), 8 deletions(-) diff --git a/Documentation/kbuild/kbuild.rst b/Documentation/kbuild/kbuild.rst index 510f38d7e78a..2d1fc03d346e 100644 --- a/Documentation/kbuild/kbuild.rst +++ b/Documentation/kbuild/kbuild.rst @@ -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. diff --git a/Documentation/kbuild/llvm.rst b/Documentation/kbuild/llvm.rst index 2b40afa58049..81f915c02c4c 100644 --- a/Documentation/kbuild/llvm.rst +++ b/Documentation/kbuild/llvm.rst @@ -47,8 +47,12 @@ example: LLVM Utilities -------------- -LLVM has substitutes for GNU binutils utilities. These can be invoked as -additional parameters to `make`. +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 \\ diff --git a/Makefile b/Makefile index f9beb696d6d3..ffc1d2c618a7 100644 --- a/Makefile +++ b/Makefile @@ -399,8 +399,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) -HOSTCC = gcc -HOSTCXX = g++ +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) @@ -409,16 +414,28 @@ KBUILD_HOSTLDFLAGS := $(HOST_LFS_LDFLAGS) $(HOSTLDFLAGS) KBUILD_HOSTLDLIBS := $(HOST_LFS_LIBS) $(HOSTLDLIBS) # Make variables (CC, etc...) -LD = $(CROSS_COMPILE)ld -CC = $(CROSS_COMPILE)gcc CPP = $(CC) -E +ifneq ($(LLVM),) +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 +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 -OBJSIZE = $(CROSS_COMPILE)size READELF = $(CROSS_COMPILE)readelf +OBJSIZE = $(CROSS_COMPILE)size +STRIP = $(CROSS_COMPILE)strip +endif PAHOLE = pahole LEX = flex YACC = bison diff --git a/tools/objtool/Makefile b/tools/objtool/Makefile index ee08aeff30a1..f591c4d1b6fe 100644 --- a/tools/objtool/Makefile +++ b/tools/objtool/Makefile @@ -3,9 +3,15 @@ include ../scripts/Makefile.include include ../scripts/Makefile.arch # always use the host compiler +ifneq ($(LLVM),) +HOSTAR ?= llvm-ar +HOSTCC ?= clang +HOSTLD ?= ld.lld +else HOSTAR ?= ar HOSTCC ?= gcc HOSTLD ?= ld +endif AR = $(HOSTAR) CC = $(HOSTCC) LD = $(HOSTLD) -- 2.17.1 ^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH v2 2/2] kbuild: support LLVM=1 to switch the default tools to Clang/LLVM 2020-04-07 18:43 ` [PATCH v2 2/2] kbuild: support LLVM=1 to switch the default tools to Clang/LLVM Masahiro Yamada @ 2020-04-07 20:39 ` Nick Desaulniers 0 siblings, 0 replies; 5+ messages in thread From: Nick Desaulniers @ 2020-04-07 20:39 UTC (permalink / raw) To: Masahiro Yamada Cc: Linux Kbuild mailing list, clang-built-linux, Jonathan Corbet, Josh Poimboeuf, Michal Marek, Peter Zijlstra, Linux Doc Mailing List, LKML, Matthias Männich, Sandeep Patil On Tue, Apr 7, 2020 at 11:44 AM Masahiro Yamada <masahiroy@kernel.org> wrote: > > As Documentation/kbuild/llvm.rst implies, building the kernel with a > full set of LLVM tools gets very verbose and unwieldy. > > Provide a single switch LLVM=1 to use Clang and LLVM tools instead > of GCC and Binutils. You can pass it from the command line or as an > environment variable. > > Please note LLVM=1 does not turn on the integrated assembler. You need > to pass LLVM_IA=1 to use it. When the upstream kernel is ready for the > integrated assembler, I think we can make it default. > > We discussed what we need, and we agreed to go with a simple boolean > flag that switches both target and host tools: > > https://lkml.org/lkml/2020/3/28/494 > https://lkml.org/lkml/2020/4/3/43 > > Some items discussed, but not adopted: > > - LLVM_DIR > > When multiple versions of LLVM are installed, I just thought supporting > LLVM_DIR=/path/to/my/llvm/bin/ might be useful. > > CC = $(LLVM_DIR)clang > LD = $(LLVM_DIR)ld.lld > ... > > However, we can handle this by modifying PATH. So, we decided to not do > this. > > - LLVM_SUFFIX > > Some distributions (e.g. Debian) package specific versions of LLVM with > naming conventions that use the version as a suffix. > > CC = clang$(LLVM_SUFFIX) > LD = ld.lld(LLVM_SUFFIX) > ... > > will allow a user to pass LLVM_SUFFIX=-11 to use clang-11 etc., > but the suffixed versions in /usr/bin/ are symlinks to binaries in > /usr/lib/llvm-#/bin/, so this can also be handled by PATH. > > Signed-off-by: Masahiro Yamada <masahiroy@kernel.org> > Reviewed-by: Nathan Chancellor <natechancellor@gmail.com> > Tested-by: Nathan Chancellor <natechancellor@gmail.com> # build > Tested-by: Nick Desaulniers <ndesaulniers@google.com> Thanks for the series! Reviewed-by: Nick Desaulniers <ndesaulniers@google.com> > --- > > Changes in v2: > - Switch host compilers as well as requested > > Documentation/kbuild/kbuild.rst | 5 +++++ > Documentation/kbuild/llvm.rst | 8 ++++++-- > Makefile | 29 +++++++++++++++++++++++------ > tools/objtool/Makefile | 6 ++++++ > 4 files changed, 40 insertions(+), 8 deletions(-) > > diff --git a/Documentation/kbuild/kbuild.rst b/Documentation/kbuild/kbuild.rst > index 510f38d7e78a..2d1fc03d346e 100644 > --- a/Documentation/kbuild/kbuild.rst > +++ b/Documentation/kbuild/kbuild.rst > @@ -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. > diff --git a/Documentation/kbuild/llvm.rst b/Documentation/kbuild/llvm.rst > index 2b40afa58049..81f915c02c4c 100644 > --- a/Documentation/kbuild/llvm.rst > +++ b/Documentation/kbuild/llvm.rst > @@ -47,8 +47,12 @@ example: > LLVM Utilities > -------------- > > -LLVM has substitutes for GNU binutils utilities. These can be invoked as > -additional parameters to `make`. > +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 \\ > diff --git a/Makefile b/Makefile > index f9beb696d6d3..ffc1d2c618a7 100644 > --- a/Makefile > +++ b/Makefile > @@ -399,8 +399,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) > > -HOSTCC = gcc > -HOSTCXX = g++ > +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) > @@ -409,16 +414,28 @@ KBUILD_HOSTLDFLAGS := $(HOST_LFS_LDFLAGS) $(HOSTLDFLAGS) > KBUILD_HOSTLDLIBS := $(HOST_LFS_LIBS) $(HOSTLDLIBS) > > # Make variables (CC, etc...) > -LD = $(CROSS_COMPILE)ld > -CC = $(CROSS_COMPILE)gcc > CPP = $(CC) -E > +ifneq ($(LLVM),) > +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 > +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 > -OBJSIZE = $(CROSS_COMPILE)size > READELF = $(CROSS_COMPILE)readelf > +OBJSIZE = $(CROSS_COMPILE)size > +STRIP = $(CROSS_COMPILE)strip > +endif > PAHOLE = pahole > LEX = flex > YACC = bison > diff --git a/tools/objtool/Makefile b/tools/objtool/Makefile > index ee08aeff30a1..f591c4d1b6fe 100644 > --- a/tools/objtool/Makefile > +++ b/tools/objtool/Makefile > @@ -3,9 +3,15 @@ include ../scripts/Makefile.include > include ../scripts/Makefile.arch > > # always use the host compiler > +ifneq ($(LLVM),) > +HOSTAR ?= llvm-ar > +HOSTCC ?= clang > +HOSTLD ?= ld.lld > +else > HOSTAR ?= ar > HOSTCC ?= gcc > HOSTLD ?= ld > +endif > AR = $(HOSTAR) > CC = $(HOSTCC) > LD = $(HOSTLD) > -- -- Thanks, ~Nick Desaulniers ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH v2 1/2] kbuild: replace AS=clang with LLVM_IA=1 2020-04-07 18:43 [PATCH v2 1/2] kbuild: replace AS=clang with LLVM_IA=1 Masahiro Yamada 2020-04-07 18:43 ` [PATCH v2 2/2] kbuild: support LLVM=1 to switch the default tools to Clang/LLVM Masahiro Yamada @ 2020-04-07 18:45 ` Nathan Chancellor 2020-04-07 19:03 ` Nick Desaulniers 2 siblings, 0 replies; 5+ messages in thread From: Nathan Chancellor @ 2020-04-07 18:45 UTC (permalink / raw) To: Masahiro Yamada Cc: linux-kbuild, clang-built-linux, Jonathan Corbet, Michal Marek, linux-doc, linux-kernel On Wed, Apr 08, 2020 at 03:43:35AM +0900, Masahiro Yamada wrote: > The 'AS' variable is unused for building the kernel. Only the remaining > usage is to turn on the integrated assembler. A boolean flag is a better > fit for this purpose. > > AS=clang was added for experts. So, I replaced it with LLVM_IA=1, > breaking the backward compatibility. > > Suggested-by: Nick Desaulniers <ndesaulniers@google.com> > Signed-off-by: Masahiro Yamada <masahiroy@kernel.org> Reviewed-by: Nathan Chancellor <natechancellor@gmail.com> ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH v2 1/2] kbuild: replace AS=clang with LLVM_IA=1 2020-04-07 18:43 [PATCH v2 1/2] kbuild: replace AS=clang with LLVM_IA=1 Masahiro Yamada 2020-04-07 18:43 ` [PATCH v2 2/2] kbuild: support LLVM=1 to switch the default tools to Clang/LLVM Masahiro Yamada 2020-04-07 18:45 ` [PATCH v2 1/2] kbuild: replace AS=clang with LLVM_IA=1 Nathan Chancellor @ 2020-04-07 19:03 ` Nick Desaulniers 2 siblings, 0 replies; 5+ messages in thread From: Nick Desaulniers @ 2020-04-07 19:03 UTC (permalink / raw) To: Masahiro Yamada Cc: Linux Kbuild mailing list, clang-built-linux, Jonathan Corbet, Michal Marek, Linux Doc Mailing List, LKML On Tue, Apr 7, 2020 at 11:44 AM Masahiro Yamada <masahiroy@kernel.org> wrote: > > The 'AS' variable is unused for building the kernel. Only the remaining > usage is to turn on the integrated assembler. A boolean flag is a better > fit for this purpose. > > AS=clang was added for experts. So, I replaced it with LLVM_IA=1, > breaking the backward compatibility. > > Suggested-by: Nick Desaulniers <ndesaulniers@google.com> > Signed-off-by: Masahiro Yamada <masahiroy@kernel.org> Thank you for this series! Reviewed-by: Nick Desaulniers <ndesaulniers@google.com> > --- > > Changes in v2: > - new patch > > Documentation/kbuild/llvm.rst | 5 ++++- > Makefile | 2 +- > 2 files changed, 5 insertions(+), 2 deletions(-) > > diff --git a/Documentation/kbuild/llvm.rst b/Documentation/kbuild/llvm.rst > index eefbdfa3e4d9..2b40afa58049 100644 > --- a/Documentation/kbuild/llvm.rst > +++ b/Documentation/kbuild/llvm.rst > @@ -50,11 +50,14 @@ 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 \\ > + 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_IA=1 to enable it. > + > Getting Help > ------------ > > diff --git a/Makefile b/Makefile > index 1b2691057cb5..f9beb696d6d3 100644 > --- a/Makefile > +++ b/Makefile > @@ -538,7 +538,7 @@ endif > ifneq ($(GCC_TOOLCHAIN),) > CLANG_FLAGS += --gcc-toolchain=$(GCC_TOOLCHAIN) > endif > -ifeq ($(if $(AS),$(shell $(AS) --version 2>&1 | head -n 1 | grep clang)),) > +ifneq ($(LLVM_IA),1) > CLANG_FLAGS += -no-integrated-as > endif > CLANG_FLAGS += -Werror=unknown-warning-option > -- > 2.17.1 > > -- > You received this message because you are subscribed to the Google Groups "Clang Built Linux" group. > To unsubscribe from this group and stop receiving emails from it, send an email to clang-built-linux+unsubscribe@googlegroups.com. > To view this discussion on the web visit https://groups.google.com/d/msgid/clang-built-linux/20200407184336.14612-1-masahiroy%40kernel.org. -- Thanks, ~Nick Desaulniers ^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2020-04-07 20:45 UTC | newest] Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2020-04-07 18:43 [PATCH v2 1/2] kbuild: replace AS=clang with LLVM_IA=1 Masahiro Yamada 2020-04-07 18:43 ` [PATCH v2 2/2] kbuild: support LLVM=1 to switch the default tools to Clang/LLVM Masahiro Yamada 2020-04-07 20:39 ` Nick Desaulniers 2020-04-07 18:45 ` [PATCH v2 1/2] kbuild: replace AS=clang with LLVM_IA=1 Nathan Chancellor 2020-04-07 19:03 ` Nick Desaulniers
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).