You've already forked linux-rockchip
mirror of
https://github.com/armbian/linux-rockchip.git
synced 2026-01-06 11:08:10 -08:00
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>
178 lines
5.6 KiB
Makefile
178 lines
5.6 KiB
Makefile
# SPDX-License-Identifier: GPL-2.0
|
|
ifneq ($(O),)
|
|
ifeq ($(origin O), command line)
|
|
dummy := $(if $(shell cd $(PWD); test -d $(O) || echo $(O)),$(error O=$(O) does not exist),)
|
|
ABSOLUTE_O := $(shell cd $(PWD); cd $(O) ; pwd)
|
|
OUTPUT := $(ABSOLUTE_O)/$(if $(subdir),$(subdir)/)
|
|
COMMAND_O := O=$(ABSOLUTE_O)
|
|
ifeq ($(objtree),)
|
|
objtree := $(O)
|
|
endif
|
|
endif
|
|
endif
|
|
|
|
# check that the output directory actually exists
|
|
ifneq ($(OUTPUT),)
|
|
OUTDIR := $(shell cd $(OUTPUT) && pwd)
|
|
$(if $(OUTDIR),, $(error output directory "$(OUTPUT)" does not exist))
|
|
endif
|
|
|
|
#
|
|
# Include saner warnings here, which can catch bugs:
|
|
#
|
|
EXTRA_WARNINGS := -Wbad-function-cast
|
|
EXTRA_WARNINGS += -Wdeclaration-after-statement
|
|
EXTRA_WARNINGS += -Wformat-security
|
|
EXTRA_WARNINGS += -Wformat-y2k
|
|
EXTRA_WARNINGS += -Winit-self
|
|
EXTRA_WARNINGS += -Wmissing-declarations
|
|
EXTRA_WARNINGS += -Wmissing-prototypes
|
|
EXTRA_WARNINGS += -Wnested-externs
|
|
EXTRA_WARNINGS += -Wno-system-headers
|
|
EXTRA_WARNINGS += -Wold-style-definition
|
|
EXTRA_WARNINGS += -Wpacked
|
|
EXTRA_WARNINGS += -Wredundant-decls
|
|
EXTRA_WARNINGS += -Wstrict-prototypes
|
|
EXTRA_WARNINGS += -Wswitch-default
|
|
EXTRA_WARNINGS += -Wswitch-enum
|
|
EXTRA_WARNINGS += -Wundef
|
|
EXTRA_WARNINGS += -Wwrite-strings
|
|
EXTRA_WARNINGS += -Wformat
|
|
EXTRA_WARNINGS += -Wno-type-limits
|
|
|
|
# Makefiles suck: This macro sets a default value of $(2) for the
|
|
# variable named by $(1), unless the variable has been set by
|
|
# environment or command line. This is necessary for CC and AR
|
|
# because make sets default values, so the simpler ?= approach
|
|
# won't work as expected.
|
|
define allow-override
|
|
$(if $(or $(findstring environment,$(origin $(1))),\
|
|
$(findstring command line,$(origin $(1)))),,\
|
|
$(eval $(1) = $(2)))
|
|
endef
|
|
|
|
ifneq ($(LLVM),)
|
|
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)
|
|
$(call allow-override,AR,$(CROSS_COMPILE)ar)
|
|
$(call allow-override,LD,$(CROSS_COMPILE)ld)
|
|
$(call allow-override,CXX,$(CROSS_COMPILE)g++)
|
|
$(call allow-override,STRIP,$(CROSS_COMPILE)strip)
|
|
endif
|
|
|
|
CC_NO_CLANG := $(shell $(CC) -dM -E -x c /dev/null | grep -Fq "__clang__"; echo $$?)
|
|
|
|
ifneq ($(LLVM),)
|
|
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
|
|
HOSTLD ?= ld
|
|
endif
|
|
|
|
# Some tools require Clang, LLC and/or LLVM utils
|
|
CLANG ?= clang
|
|
LLC ?= llc
|
|
LLVM_CONFIG ?= llvm-config
|
|
LLVM_OBJCOPY ?= llvm-objcopy
|
|
LLVM_STRIP ?= llvm-strip
|
|
|
|
ifeq ($(CC_NO_CLANG), 1)
|
|
EXTRA_WARNINGS += -Wstrict-aliasing=3
|
|
|
|
else ifneq ($(CROSS_COMPILE),)
|
|
CLANG_CROSS_FLAGS := --target=$(notdir $(CROSS_COMPILE:%-=%))
|
|
GCC_TOOLCHAIN_DIR := $(dir $(shell which $(CROSS_COMPILE)gcc 2>/dev/null))
|
|
ifneq ($(GCC_TOOLCHAIN_DIR),)
|
|
CLANG_CROSS_FLAGS += --prefix=$(GCC_TOOLCHAIN_DIR)$(notdir $(CROSS_COMPILE))
|
|
CLANG_CROSS_FLAGS += --sysroot=$(shell $(CROSS_COMPILE)gcc -print-sysroot)
|
|
CLANG_CROSS_FLAGS += --gcc-toolchain=$(realpath $(GCC_TOOLCHAIN_DIR)/..)
|
|
endif # GCC_TOOLCHAIN_DIR
|
|
CFLAGS += $(CLANG_CROSS_FLAGS)
|
|
AFLAGS += $(CLANG_CROSS_FLAGS)
|
|
endif # CROSS_COMPILE
|
|
|
|
# Hack to avoid type-punned warnings on old systems such as RHEL5:
|
|
# We should be changing CFLAGS and checking gcc version, but this
|
|
# will do for now and keep the above -Wstrict-aliasing=3 in place
|
|
# in newer systems.
|
|
# Needed for the __raw_cmpxchg in tools/arch/x86/include/asm/cmpxchg.h
|
|
#
|
|
# See https://lore.kernel.org/lkml/9a8748490611281710g78402fbeh8ff7fcc162dbcbca@mail.gmail.com/
|
|
# and https://gcc.gnu.org/gcc-4.8/changes.html,
|
|
# that takes into account Linus's comments (search for Wshadow) for the reasoning about
|
|
# -Wshadow not being interesting before gcc 4.8.
|
|
|
|
ifneq ($(filter 3.%,$(MAKE_VERSION)),) # make-3
|
|
EXTRA_WARNINGS += -fno-strict-aliasing
|
|
EXTRA_WARNINGS += -Wno-shadow
|
|
else
|
|
EXTRA_WARNINGS += -Wshadow
|
|
endif
|
|
|
|
ifneq ($(findstring $(MAKEFLAGS), w),w)
|
|
PRINT_DIR = --no-print-directory
|
|
else
|
|
NO_SUBDIR = :
|
|
endif
|
|
|
|
ifneq ($(findstring s,$(filter-out --%,$(MAKEFLAGS))),)
|
|
silent=1
|
|
endif
|
|
|
|
#
|
|
# Define a callable command for descending to a new directory
|
|
#
|
|
# Call by doing: $(call descend,directory[,target])
|
|
#
|
|
descend = \
|
|
+mkdir -p $(OUTPUT)$(1) && \
|
|
$(MAKE) $(COMMAND_O) subdir=$(if $(subdir),$(subdir)/$(1),$(1)) $(PRINT_DIR) -C $(1) $(2)
|
|
|
|
QUIET_SUBDIR0 = +$(MAKE) $(COMMAND_O) -C # space to separate -C and subdir
|
|
QUIET_SUBDIR1 =
|
|
|
|
ifneq ($(silent),1)
|
|
ifneq ($(V),1)
|
|
QUIET_CC = @echo ' CC '$@;
|
|
QUIET_CC_FPIC = @echo ' CC FPIC '$@;
|
|
QUIET_CLANG = @echo ' CLANG '$@;
|
|
QUIET_AR = @echo ' AR '$@;
|
|
QUIET_LINK = @echo ' LINK '$@;
|
|
QUIET_MKDIR = @echo ' MKDIR '$@;
|
|
QUIET_GEN = @echo ' GEN '$@;
|
|
QUIET_SUBDIR0 = +@subdir=
|
|
QUIET_SUBDIR1 = ;$(NO_SUBDIR) \
|
|
echo ' SUBDIR '$$subdir; \
|
|
$(MAKE) $(PRINT_DIR) -C $$subdir
|
|
QUIET_FLEX = @echo ' FLEX '$@;
|
|
QUIET_BISON = @echo ' BISON '$@;
|
|
QUIET_GENSKEL = @echo ' GENSKEL '$@;
|
|
|
|
descend = \
|
|
+@echo ' DESCEND '$(1); \
|
|
mkdir -p $(OUTPUT)$(1) && \
|
|
$(MAKE) $(COMMAND_O) subdir=$(if $(subdir),$(subdir)/$(1),$(1)) $(PRINT_DIR) -C $(1) $(2)
|
|
|
|
QUIET_CLEAN = @printf ' CLEAN %s\n' $1;
|
|
QUIET_INSTALL = @printf ' INSTALL %s\n' $1;
|
|
QUIET_UNINST = @printf ' UNINST %s\n' $1;
|
|
endif
|
|
endif
|
|
|
|
pound := \#
|