kbuild: Make $(LLVM) more flexible
The LLVM make variable allows a developer to quickly switch between the GNU and LLVM tools. However, it does not handle versioned binaries, such as the ones shipped by Debian, as LLVM=1 just defines the tool variables with the unversioned binaries. There was some discussion during the review of the patch that introduces LLVM=1 around versioned binaries, ultimately coming to the conclusion that developers can just add the folder that contains the unversioned binaries to their PATH, as Debian's versioned suffixed binaries are really just symlinks to the unversioned binaries in /usr/lib/llvm-#/bin: $ realpath /usr/bin/clang-14 /usr/lib/llvm-14/bin/clang $ PATH=/usr/lib/llvm-14/bin:$PATH make ... LLVM=1 However, that can be cumbersome to developers who are constantly testing series with different toolchains and versions. It is simple enough to support these versioned binaries directly in the Kbuild system by allowing the developer to specify the version suffix with LLVM=, which is shorter than the above suggestion: $ make ... LLVM=-14 It does not change the meaning of LLVM=1 (which will continue to use unversioned binaries) and it does not add too much additional complexity to the existing $(LLVM) code, while allowing developers to quickly test their series with different versions of the whole LLVM suite of tools. Some developers may build LLVM from source but not add the binaries to their PATH, as they may not want to use that toolchain systemwide. Support those developers by allowing them to supply the directory that the LLVM tools are available in, as it is no more complex to support than the version suffix change above. $ make ... LLVM=/path/to/llvm/ Update and reorder the documentation to reflect these new additions. At the same time, notate that LLVM=0 is not the same as just omitting it altogether, which has confused people in the past. Link: https://lore.kernel.org/r/20200317215515.226917-1-ndesaulniers@google.com/ Link: https://lore.kernel.org/r/20220224151322.072632223@infradead.org/ Suggested-by: Masahiro Yamada <masahiroy@kernel.org> Suggested-by: Peter Zijlstra <peterz@infradead.org> Signed-off-by: Nathan Chancellor <nathan@kernel.org> Reviewed-by: Kees Cook <keescook@chromium.org> Reviewed-by: Nick Desaulniers <ndesaulniers@google.com> Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
This commit is contained in:
parent
9fbed27a7a
commit
e9c281928c
|
@ -49,17 +49,36 @@ example: ::
|
|||
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: ::
|
||||
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
|
||||
|
||||
To simplify the above command, Kbuild supports the ``LLVM`` variable::
|
||||
|
||||
make LLVM=1
|
||||
|
||||
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.
|
||||
|
||||
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.
|
||||
|
||||
``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 integrated assembler is enabled by default. You can pass ``LLVM_IAS=0`` to
|
||||
disable it.
|
||||
|
||||
|
|
26
Makefile
26
Makefile
|
@ -424,8 +424,14 @@ 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++
|
||||
ifneq ($(filter %/,$(LLVM)),)
|
||||
LLVM_PREFIX := $(LLVM)
|
||||
else ifneq ($(filter -%,$(LLVM)),)
|
||||
LLVM_SUFFIX := $(LLVM)
|
||||
endif
|
||||
|
||||
HOSTCC = $(LLVM_PREFIX)clang$(LLVM_SUFFIX)
|
||||
HOSTCXX = $(LLVM_PREFIX)clang++$(LLVM_SUFFIX)
|
||||
else
|
||||
HOSTCC = gcc
|
||||
HOSTCXX = g++
|
||||
|
@ -444,14 +450,14 @@ KBUILD_HOSTLDLIBS := $(HOST_LFS_LIBS) $(HOSTLDLIBS)
|
|||
# Make variables (CC, etc...)
|
||||
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
|
||||
STRIP = llvm-strip
|
||||
CC = $(LLVM_PREFIX)clang$(LLVM_SUFFIX)
|
||||
LD = $(LLVM_PREFIX)ld.lld$(LLVM_SUFFIX)
|
||||
AR = $(LLVM_PREFIX)llvm-ar$(LLVM_SUFFIX)
|
||||
NM = $(LLVM_PREFIX)llvm-nm$(LLVM_SUFFIX)
|
||||
OBJCOPY = $(LLVM_PREFIX)llvm-objcopy$(LLVM_SUFFIX)
|
||||
OBJDUMP = $(LLVM_PREFIX)llvm-objdump$(LLVM_SUFFIX)
|
||||
READELF = $(LLVM_PREFIX)llvm-readelf$(LLVM_SUFFIX)
|
||||
STRIP = $(LLVM_PREFIX)llvm-strip$(LLVM_SUFFIX)
|
||||
else
|
||||
CC = $(CROSS_COMPILE)gcc
|
||||
LD = $(CROSS_COMPILE)ld
|
||||
|
|
|
@ -52,11 +52,17 @@ define allow-override
|
|||
endef
|
||||
|
||||
ifneq ($(LLVM),)
|
||||
$(call allow-override,CC,clang)
|
||||
$(call allow-override,AR,llvm-ar)
|
||||
$(call allow-override,LD,ld.lld)
|
||||
$(call allow-override,CXX,clang++)
|
||||
$(call allow-override,STRIP,llvm-strip)
|
||||
ifneq ($(filter %/,$(LLVM)),)
|
||||
LLVM_PREFIX := $(LLVM)
|
||||
else ifneq ($(filter -%,$(LLVM)),)
|
||||
LLVM_SUFFIX := $(LLVM)
|
||||
endif
|
||||
|
||||
$(call allow-override,CC,$(LLVM_PREFIX)clang$(LLVM_SUFFIX))
|
||||
$(call allow-override,AR,$(LLVM_PREFIX)llvm-ar$(LLVM_SUFFIX))
|
||||
$(call allow-override,LD,$(LLVM_PREFIX)ld.lld$(LLVM_SUFFIX))
|
||||
$(call allow-override,CXX,$(LLVM_PREFIX)clang++$(LLVM_SUFFIX))
|
||||
$(call allow-override,STRIP,$(LLVM_PREFIX)llvm-strip$(LLVM_SUFFIX))
|
||||
else
|
||||
# Allow setting various cross-compile vars or setting CROSS_COMPILE as a prefix.
|
||||
$(call allow-override,CC,$(CROSS_COMPILE)gcc)
|
||||
|
@ -69,9 +75,9 @@ endif
|
|||
CC_NO_CLANG := $(shell $(CC) -dM -E -x c /dev/null | grep -Fq "__clang__"; echo $$?)
|
||||
|
||||
ifneq ($(LLVM),)
|
||||
HOSTAR ?= llvm-ar
|
||||
HOSTCC ?= clang
|
||||
HOSTLD ?= ld.lld
|
||||
HOSTAR ?= $(LLVM_PREFIX)llvm-ar$(LLVM_SUFFIX)
|
||||
HOSTCC ?= $(LLVM_PREFIX)clang$(LLVM_SUFFIX)
|
||||
HOSTLD ?= $(LLVM_PREFIX)ld.lld$(LLVM_SUFFIX)
|
||||
else
|
||||
HOSTAR ?= ar
|
||||
HOSTCC ?= gcc
|
||||
|
|
|
@ -1,7 +1,13 @@
|
|||
# This mimics the top-level Makefile. We do it explicitly here so that this
|
||||
# Makefile can operate with or without the kbuild infrastructure.
|
||||
ifneq ($(LLVM),)
|
||||
CC := clang
|
||||
ifneq ($(filter %/,$(LLVM)),)
|
||||
LLVM_PREFIX := $(LLVM)
|
||||
else ifneq ($(filter -%,$(LLVM)),)
|
||||
LLVM_SUFFIX := $(LLVM)
|
||||
endif
|
||||
|
||||
CC := $(LLVM_PREFIX)clang$(LLVM_SUFFIX)
|
||||
else
|
||||
CC := $(CROSS_COMPILE)gcc
|
||||
endif
|
||||
|
|
Loading…
Reference in New Issue