Merge tag 'kbuild-v5.18-v2' of git://git.kernel.org/pub/scm/linux/kernel/git/masahiro...
authorLinus Torvalds <torvalds@linux-foundation.org>
Thu, 31 Mar 2022 18:59:03 +0000 (11:59 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Thu, 31 Mar 2022 18:59:03 +0000 (11:59 -0700)
Pull Kbuild updates from Masahiro Yamada:

 - Add new environment variables, USERCFLAGS and USERLDFLAGS to allow
   additional flags to be passed to user-space programs.

 - Fix missing fflush() bugs in Kconfig and fixdep

 - Fix a minor bug in the comment format of the .config file

 - Make kallsyms ignore llvm's local labels, .L*

 - Fix UAPI compile-test for cross-compiling with Clang

 - Extend the LLVM= syntax to support LLVM=<suffix> form for using a
   particular version of LLVm, and LLVM=<prefix> form for using custom
   LLVM in a particular directory path.

 - Clean up Makefiles

* tag 'kbuild-v5.18-v2' of git://git.kernel.org/pub/scm/linux/kernel/git/masahiroy/linux-kbuild:
  kbuild: Make $(LLVM) more flexible
  kbuild: add --target to correctly cross-compile UAPI headers with Clang
  fixdep: use fflush() and ferror() to ensure successful write to files
  arch: syscalls: simplify uapi/kapi directory creation
  usr/include: replace extra-y with always-y
  certs: simplify empty certs creation in certs/Makefile
  certs: include certs/signing_key.x509 unconditionally
  kallsyms: ignore all local labels prefixed by '.L'
  kconfig: fix missing '# end of' for empty menu
  kconfig: add fflush() before ferror() check
  kbuild: replace $(if A,A,B) with $(or A,B)
  kbuild: Add environment variables for userprogs flags
  kbuild: unify cmd_copy and cmd_shipped

1  2 
Makefile
arch/x86/entry/syscalls/Makefile
init/Kconfig
scripts/Makefile.build
scripts/Makefile.lib
tools/bpf/bpftool/Makefile
tools/lib/bpf/Makefile
tools/perf/Makefile.perf
tools/power/x86/intel-speed-select/Makefile
tools/scripts/Makefile.include
usr/include/Makefile

diff --combined Makefile
+++ b/Makefile
@@@ -2,7 -2,7 +2,7 @@@
  VERSION = 5
  PATCHLEVEL = 17
  SUBLEVEL = 0
 -EXTRAVERSION = -rc4
 +EXTRAVERSION =
  NAME = Superb Owl
  
  # *DOCUMENTATION*
@@@ -424,19 -424,25 +424,26 @@@ HOST_LFS_LDFLAGS := $(shell getconf LFS
  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++
  endif
  
- export KBUILD_USERCFLAGS := -Wall -Wmissing-prototypes -Wstrict-prototypes \
-                             -O2 -fomit-frame-pointer -std=gnu11 \
-                             -Wdeclaration-after-statement
- export KBUILD_USERLDFLAGS :=
+ KBUILD_USERHOSTCFLAGS := -Wall -Wmissing-prototypes -Wstrict-prototypes \
 -                       -O2 -fomit-frame-pointer -std=gnu89
++                       -O2 -fomit-frame-pointer -std=gnu11 \
++                       -Wdeclaration-after-statement
+ KBUILD_USERCFLAGS  := $(KBUILD_USERHOSTCFLAGS) $(USERCFLAGS)
+ KBUILD_USERLDFLAGS := $(USERLDFLAGS)
  
- KBUILD_HOSTCFLAGS   := $(KBUILD_USERCFLAGS) $(HOST_LFS_CFLAGS) $(HOSTCFLAGS)
+ KBUILD_HOSTCFLAGS   := $(KBUILD_USERHOSTCFLAGS) $(HOST_LFS_CFLAGS) $(HOSTCFLAGS)
  KBUILD_HOSTCXXFLAGS := -Wall -O2 $(HOST_LFS_CFLAGS) $(HOSTCXXFLAGS)
  KBUILD_HOSTLDFLAGS  := $(HOST_LFS_LDFLAGS) $(HOSTLDFLAGS)
  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
@@@ -516,7 -522,7 +523,7 @@@ KBUILD_CFLAGS   := -Wall -Wundef -Werro
                   -fno-strict-aliasing -fno-common -fshort-wchar -fno-PIE \
                   -Werror=implicit-function-declaration -Werror=implicit-int \
                   -Werror=return-type -Wno-format-security \
 -                 -std=gnu89
 +                 -std=gnu11
  KBUILD_CPPFLAGS := -D__KERNEL__
  KBUILD_AFLAGS_KERNEL :=
  KBUILD_CFLAGS_KERNEL :=
@@@ -531,6 -537,7 +538,7 @@@ export CPP AR NM STRIP OBJCOPY OBJDUMP 
  export PERL PYTHON3 CHECK CHECKFLAGS MAKE UTS_MACHINE HOSTCXX
  export KGZIP KBZIP2 KLZOP LZMA LZ4 XZ ZSTD
  export KBUILD_HOSTCXXFLAGS KBUILD_HOSTLDFLAGS KBUILD_HOSTLDLIBS LDFLAGS_MODULE
+ export KBUILD_USERCFLAGS KBUILD_USERLDFLAGS
  
  export KBUILD_CPPFLAGS NOSTDINC_FLAGS LINUXINCLUDE OBJCOPYFLAGS KBUILD_LDFLAGS
  export KBUILD_CFLAGS CFLAGS_KERNEL CFLAGS_MODULE
@@@ -783,7 -790,7 +791,7 @@@ KBUILD_CFLAGS += $(KBUILD_CFLAGS-y) $(C
  
  ifdef CONFIG_CC_IS_CLANG
  KBUILD_CPPFLAGS += -Qunused-arguments
 -# The kernel builds with '-std=gnu89' so use of GNU extensions is acceptable.
 +# The kernel builds with '-std=gnu11' so use of GNU extensions is acceptable.
  KBUILD_CFLAGS += -Wno-gnu
  # CLANG uses a _MergedGlobals as optimization, but this breaks modpost, as the
  # source of a reference will be _MergedGlobals and not on of the whitelisted names.
@@@ -952,6 -959,8 +960,6 @@@ KBUILD_CFLAGS += $(call cc-option, -Wca
  KBUILD_CFLAGS += $(call cc-disable-warning, stringop-truncation)
  
  # We'll want to enable this eventually, but it's not going away for 5.7 at least
 -KBUILD_CFLAGS += $(call cc-disable-warning, zero-length-bounds)
 -KBUILD_CFLAGS += -Wno-array-bounds
  KBUILD_CFLAGS += $(call cc-disable-warning, stringop-overflow)
  
  # Another good warning that we'll want to enable eventually
@@@ -1237,8 -1246,8 +1245,8 @@@ define filechk_version.
        echo \#define LINUX_VERSION_SUBLEVEL $(SUBLEVEL)
  endef
  
- $(version_h): PATCHLEVEL := $(if $(PATCHLEVEL), $(PATCHLEVEL), 0)
- $(version_h): SUBLEVEL := $(if $(SUBLEVEL), $(SUBLEVEL), 0)
+ $(version_h): PATCHLEVEL := $(or $(PATCHLEVEL), 0)
+ $(version_h): SUBLEVEL := $(or $(SUBLEVEL), 0)
  $(version_h): FORCE
        $(call filechk,version.h)
  
@@@ -1621,7 -1630,7 +1629,7 @@@ help
        @$(MAKE) -f $(srctree)/Documentation/Makefile dochelp
        @echo  ''
        @echo  'Architecture specific targets ($(SRCARCH)):'
-       @$(if $(archhelp),$(archhelp),\
+       @$(or $(archhelp),\
                echo '  No architecture specific help defined for $(SRCARCH)')
        @echo  ''
        @$(if $(boards), \
@@@ -1838,7 -1847,7 +1846,7 @@@ $(clean-dirs)
  
  clean: $(clean-dirs)
        $(call cmd,rmfiles)
-       @find $(if $(KBUILD_EXTMOD), $(KBUILD_EXTMOD), .) $(RCS_FIND_IGNORE) \
+       @find $(or $(KBUILD_EXTMOD), .) $(RCS_FIND_IGNORE) \
                \( -name '*.[aios]' -o -name '*.ko' -o -name '.*.cmd' \
                -o -name '*.ko.*' \
                -o -name '*.dtb' -o -name '*.dtbo' -o -name '*.dtb.S' -o -name '*.dt.yaml' \
@@@ -3,8 -3,7 +3,7 @@@ out := arch/$(SRCARCH)/include/generate
  uapi := arch/$(SRCARCH)/include/generated/uapi/asm
  
  # Create output directory if not already present
- _dummy := $(shell [ -d '$(out)' ] || mkdir -p '$(out)') \
-         $(shell [ -d '$(uapi)' ] || mkdir -p '$(uapi)')
+ $(shell mkdir -p $(out) $(uapi))
  
  syscall32 := $(src)/syscall_32.tbl
  syscall64 := $(src)/syscall_64.tbl
@@@ -67,7 -66,7 +66,7 @@@ uapisyshdr-y                  += unistd_32.h unistd_64
  syshdr-y                      += syscalls_32.h
  syshdr-$(CONFIG_X86_64)               += unistd_32_ia32.h unistd_64_x32.h
  syshdr-$(CONFIG_X86_64)               += syscalls_64.h
 -syshdr-$(CONFIG_X86_X32)      += syscalls_x32.h
 +syshdr-$(CONFIG_X86_X32_ABI)  += syscalls_x32.h
  syshdr-$(CONFIG_XEN)          += xen-hypercalls.h
  
  uapisyshdr-y  := $(addprefix $(uapi)/, $(uapisyshdr-y))
diff --combined init/Kconfig
@@@ -62,13 -62,13 +62,13 @@@ config LLD_VERSIO
  
  config CC_CAN_LINK
        bool
-       default $(success,$(srctree)/scripts/cc-can-link.sh $(CC) $(CLANG_FLAGS) $(m64-flag)) if 64BIT
-       default $(success,$(srctree)/scripts/cc-can-link.sh $(CC) $(CLANG_FLAGS) $(m32-flag))
+       default $(success,$(srctree)/scripts/cc-can-link.sh $(CC) $(CLANG_FLAGS) $(USERCFLAGS) $(USERLDFLAGS) $(m64-flag)) if 64BIT
+       default $(success,$(srctree)/scripts/cc-can-link.sh $(CC) $(CLANG_FLAGS) $(USERCFLAGS) $(USERLDFLAGS) $(m32-flag))
  
  config CC_CAN_LINK_STATIC
        bool
-       default $(success,$(srctree)/scripts/cc-can-link.sh $(CC) $(CLANG_FLAGS) $(m64-flag) -static) if 64BIT
-       default $(success,$(srctree)/scripts/cc-can-link.sh $(CC) $(CLANG_FLAGS) $(m32-flag) -static)
+       default $(success,$(srctree)/scripts/cc-can-link.sh $(CC) $(CLANG_FLAGS) $(USERCFLAGS) $(USERLDFLAGS) $(m64-flag) -static) if 64BIT
+       default $(success,$(srctree)/scripts/cc-can-link.sh $(CC) $(CLANG_FLAGS) $(USERCFLAGS) $(USERLDFLAGS) $(m32-flag) -static)
  
  config CC_HAS_ASM_GOTO
        def_bool $(success,$(srctree)/scripts/gcc-goto.sh $(CC))
@@@ -86,10 -86,6 +86,10 @@@ config CC_HAS_ASM_INLIN
  config CC_HAS_NO_PROFILE_FN_ATTR
        def_bool $(success,echo '__attribute__((no_profile_instrument_function)) int x();' | $(CC) -x c - -c -o /dev/null -Werror)
  
 +config PAHOLE_VERSION
 +      int
 +      default $(shell,$(srctree)/scripts/pahole-version.sh $(PAHOLE))
 +
  config CONSTRUCTORS
        bool
  
@@@ -2058,7 -2054,6 +2058,7 @@@ source "arch/Kconfig
  
  config RT_MUTEXES
        bool
 +      default y if PREEMPT_RT
  
  config BASE_SMALL
        int
diff --combined scripts/Makefile.build
@@@ -40,8 -40,7 +40,7 @@@ include $(srctree)/scripts/Makefile.com
  
  # The filename Kbuild has precedence over Makefile
  kbuild-dir := $(if $(filter /%,$(src)),$(src),$(srctree)/$(src))
- kbuild-file := $(if $(wildcard $(kbuild-dir)/Kbuild),$(kbuild-dir)/Kbuild,$(kbuild-dir)/Makefile)
- include $(kbuild-file)
+ include $(or $(wildcard $(kbuild-dir)/Kbuild),$(kbuild-dir)/Makefile)
  
  include $(srctree)/scripts/Makefile.lib
  
@@@ -88,8 -87,8 +87,8 @@@ endi
  
  targets-for-modules := $(patsubst %.o, %.mod, $(filter %.o, $(obj-m)))
  
 -ifdef CONFIG_LTO_CLANG
 -targets-for-modules += $(patsubst %.o, %.lto.o, $(filter %.o, $(obj-m)))
 +ifneq ($(CONFIG_LTO_CLANG)$(CONFIG_X86_KERNEL_IBT),)
 +targets-for-modules += $(patsubst %.o, %.prelink.o, $(filter %.o, $(obj-m)))
  endif
  
  ifdef need-modorder
@@@ -230,7 -229,6 +229,7 @@@ objtool := $(objtree)/tools/objtool/obj
  objtool_args =                                                                \
        $(if $(CONFIG_UNWINDER_ORC),orc generate,check)                 \
        $(if $(part-of-module), --module)                               \
 +      $(if $(CONFIG_X86_KERNEL_IBT), --lto --ibt)                     \
        $(if $(CONFIG_FRAME_POINTER),, --no-fp)                         \
        $(if $(CONFIG_GCOV_KERNEL)$(CONFIG_LTO_CLANG), --no-unreachable)\
        $(if $(CONFIG_RETPOLINE), --retpoline)                          \
@@@ -243,7 -241,7 +242,7 @@@ cmd_gen_objtooldep = $(if $(objtool-ena
  
  endif # CONFIG_STACK_VALIDATION
  
 -ifdef CONFIG_LTO_CLANG
 +ifneq ($(CONFIG_LTO_CLANG)$(CONFIG_X86_KERNEL_IBT),)
  
  # Skip objtool for LLVM bitcode
  $(obj)/%.o: objtool-enabled :=
@@@ -289,24 -287,24 +288,24 @@@ $(obj)/%.o: $(src)/%.c $(recordmcount_s
        $(call if_changed_rule,cc_o_c)
        $(call cmd,force_checksrc)
  
 -ifdef CONFIG_LTO_CLANG
 +ifneq ($(CONFIG_LTO_CLANG)$(CONFIG_X86_KERNEL_IBT),)
  # Module .o files may contain LLVM bitcode, compile them into native code
  # before ELF processing
 -quiet_cmd_cc_lto_link_modules = LTO [M] $@
 -cmd_cc_lto_link_modules =                                             \
 +quiet_cmd_cc_prelink_modules = LD [M]  $@
 +      cmd_cc_prelink_modules =                                                \
        $(LD) $(ld_flags) -r -o $@                                      \
 -              $(shell [ -s $(@:.lto.o=.o.symversions) ] &&            \
 -                      echo -T $(@:.lto.o=.o.symversions))             \
 +               $(shell [ -s $(@:.prelink.o=.o.symversions) ] &&               \
 +                       echo -T $(@:.prelink.o=.o.symversions))                \
                --whole-archive $(filter-out FORCE,$^)                  \
                $(cmd_objtool)
  
  # objtool was skipped for LLVM bitcode, run it now that we have compiled
  # modules into native code
 -$(obj)/%.lto.o: objtool-enabled = y
 -$(obj)/%.lto.o: part-of-module := y
 +$(obj)/%.prelink.o: objtool-enabled = y
 +$(obj)/%.prelink.o: part-of-module := y
  
 -$(obj)/%.lto.o: $(obj)/%.o FORCE
 -      $(call if_changed,cc_lto_link_modules)
 +$(obj)/%.prelink.o: $(obj)/%.o FORCE
 +      $(call if_changed,cc_prelink_modules)
  endif
  
  cmd_mod = { \
@@@ -470,7 -468,7 +469,7 @@@ $(obj)/lib.a: $(lib-y) FORC
  # Do not replace $(filter %.o,^) with $(real-prereqs). When a single object
  # module is turned into a multi object module, $^ will contain header file
  # dependencies recorded in the .*.cmd file.
 -ifdef CONFIG_LTO_CLANG
 +ifneq ($(CONFIG_LTO_CLANG)$(CONFIG_X86_KERNEL_IBT),)
  quiet_cmd_link_multi-m = AR [M]  $@
  cmd_link_multi-m =                                            \
        $(cmd_update_lto_symversions);                          \
diff --combined scripts/Makefile.lib
@@@ -87,6 -87,11 +87,6 @@@ base-dtb-y := $(foreach m, $(multi-dtb-
  
  always-y                      += $(dtb-y)
  
 -ifneq ($(CHECK_DTBS),)
 -always-y += $(patsubst %.dtb,%.dt.yaml, $(real-dtb-y))
 -always-y += $(patsubst %.dtbo,%.dt.yaml, $(real-dtb-y))
 -endif
 -
  # Add subdir path
  
  extra-y               := $(addprefix $(obj)/,$(extra-y))
@@@ -106,7 -111,7 +106,7 @@@ subdir-ym  := $(addprefix $(obj)/,$(subd
  modname-multi = $(sort $(foreach m,$(multi-obj-ym),\
                $(if $(filter $*.o, $(call suffix-search, $m, .o, -objs -y -m)),$(m:.o=))))
  
- __modname = $(if $(modname-multi),$(modname-multi),$(basetarget))
+ __modname = $(or $(modname-multi),$(basetarget))
  
  modname = $(subst $(space),:,$(__modname))
  modfile = $(addprefix $(obj)/,$(__modname))
@@@ -225,11 -230,11 +225,11 @@@ dtc_cpp_flags  = -Wp,-MMD,$(depfile).pr
                 $(addprefix -I,$(DTC_INCLUDE))                          \
                 -undef -D__DTS__
  
 -ifeq ($(CONFIG_LTO_CLANG),y)
 +ifneq ($(CONFIG_LTO_CLANG)$(CONFIG_X86_KERNEL_IBT),)
  # With CONFIG_LTO_CLANG, .o files in modules might be LLVM bitcode, so we
  # need to run LTO to compile them into native code (.lto.o) before further
  # processing.
 -mod-prelink-ext := .lto
 +mod-prelink-ext := .prelink
  endif
  
  # Useful for describing the dependency of composite objects
@@@ -241,20 -246,16 +241,16 @@@ $(foreach m, $(notdir $1), 
        $(addprefix $(obj)/, $(foreach s, $3, $($(m:%$(strip $2)=%$(s)))))))
  endef
  
- quiet_cmd_copy = COPY    $@
-       cmd_copy = cp $< $@
- # Shipped files
+ # Copy a file
  # ===========================================================================
  # 'cp' preserves permissions. If you use it to copy a file in read-only srctree,
  # the copy would be read-only as well, leading to an error when executing the
  # rule next time. Use 'cat' instead in order to generate a writable file.
- quiet_cmd_shipped = SHIPPED $@
- cmd_shipped = cat $< > $@
+ quiet_cmd_copy = COPY    $@
+       cmd_copy = cat $< > $@
  
  $(obj)/%: $(src)/%_shipped
-       $(call cmd,shipped)
+       $(call cmd,copy)
  
  # Commands useful for building a boot image
  # ===========================================================================
@@@ -342,6 -343,12 +338,6 @@@ cmd_dtc = $(HOSTCC) -E $(dtc_cpp_flags
                -d $(depfile).dtc.tmp $(dtc-tmp) ; \
        cat $(depfile).pre.tmp $(depfile).dtc.tmp > $(depfile)
  
 -$(obj)/%.dtb: $(src)/%.dts $(DTC) FORCE
 -      $(call if_changed_dep,dtc)
 -
 -$(obj)/%.dtbo: $(src)/%.dts $(DTC) FORCE
 -      $(call if_changed_dep,dtc)
 -
  quiet_cmd_fdtoverlay = DTOVL   $@
        cmd_fdtoverlay = $(objtree)/scripts/dtc/fdtoverlay -o $@ -i $(real-prereqs)
  
@@@ -349,27 -356,23 +345,27 @@@ $(multi-dtb-y): FORC
        $(call if_changed,fdtoverlay)
  $(call multi_depend, $(multi-dtb-y), .dtb, -dtbs)
  
 +ifneq ($(CHECK_DTBS)$(CHECK_DT_BINDING),)
  DT_CHECKER ?= dt-validate
 -DT_CHECKER_FLAGS ?= $(if $(DT_SCHEMA_FILES),,-m)
 +DT_CHECKER_FLAGS ?= $(if $(DT_SCHEMA_FILES),-l $(DT_SCHEMA_FILES),-m)
  DT_BINDING_DIR := Documentation/devicetree/bindings
 -# DT_TMP_SCHEMA may be overridden from Documentation/devicetree/bindings/Makefile
 -DT_TMP_SCHEMA ?= $(objtree)/$(DT_BINDING_DIR)/processed-schema.json
 +DT_TMP_SCHEMA := $(objtree)/$(DT_BINDING_DIR)/processed-schema.json
  
  quiet_cmd_dtb_check = CHECK   $@
 -      cmd_dtb_check = $(DT_CHECKER) $(DT_CHECKER_FLAGS) -u $(srctree)/$(DT_BINDING_DIR) -p $(DT_TMP_SCHEMA) $@
 +      cmd_dtb_check = $(DT_CHECKER) $(DT_CHECKER_FLAGS) -u $(srctree)/$(DT_BINDING_DIR) -p $(DT_TMP_SCHEMA) $@ || true
 +endif
  
  define rule_dtc
        $(call cmd_and_fixdep,dtc)
        $(call cmd,dtb_check)
  endef
  
 -$(obj)/%.dt.yaml: $(src)/%.dts $(DTC) $(DT_TMP_SCHEMA) FORCE
 +$(obj)/%.dtb: $(src)/%.dts $(DTC) $(DT_TMP_SCHEMA) FORCE
        $(call if_changed_rule,dtc)
  
 +$(obj)/%.dtbo: $(src)/%.dts $(DTC) FORCE
 +      $(call if_changed_dep,dtc)
 +
  dtc-tmp = $(subst $(comma),_,$(dot-target).dts.tmp)
  
  # Bzip2
@@@ -431,7 -434,7 +427,7 @@@ MKIMAGE := $(srctree)/scripts/mkuboot.s
  # SRCARCH just happens to match slightly more than ARCH (on sparc), so reduces
  # the number of overrides in arch makefiles
  UIMAGE_ARCH ?= $(SRCARCH)
- UIMAGE_COMPRESSION ?= $(if $(2),$(2),none)
+ UIMAGE_COMPRESSION ?= $(or $(2),none)
  UIMAGE_OPTS-y ?=
  UIMAGE_TYPE ?= kernel
  UIMAGE_LOADADDR ?= arch_must_set_this
@@@ -18,33 -18,37 +18,33 @@@ BPF_DIR = $(srctree)/tools/lib/bp
  ifneq ($(OUTPUT),)
    _OUTPUT := $(OUTPUT)
  else
 -  _OUTPUT := $(CURDIR)
 +  _OUTPUT := $(CURDIR)/
  endif
 -BOOTSTRAP_OUTPUT := $(_OUTPUT)/bootstrap/
 +BOOTSTRAP_OUTPUT := $(_OUTPUT)bootstrap/
  
 -LIBBPF_OUTPUT := $(_OUTPUT)/libbpf/
 +LIBBPF_OUTPUT := $(_OUTPUT)libbpf/
  LIBBPF_DESTDIR := $(LIBBPF_OUTPUT)
 -LIBBPF_INCLUDE := $(LIBBPF_DESTDIR)/include
 +LIBBPF_INCLUDE := $(LIBBPF_DESTDIR)include
  LIBBPF_HDRS_DIR := $(LIBBPF_INCLUDE)/bpf
  LIBBPF := $(LIBBPF_OUTPUT)libbpf.a
  
  LIBBPF_BOOTSTRAP_OUTPUT := $(BOOTSTRAP_OUTPUT)libbpf/
  LIBBPF_BOOTSTRAP_DESTDIR := $(LIBBPF_BOOTSTRAP_OUTPUT)
 -LIBBPF_BOOTSTRAP_INCLUDE := $(LIBBPF_BOOTSTRAP_DESTDIR)/include
 +LIBBPF_BOOTSTRAP_INCLUDE := $(LIBBPF_BOOTSTRAP_DESTDIR)include
  LIBBPF_BOOTSTRAP_HDRS_DIR := $(LIBBPF_BOOTSTRAP_INCLUDE)/bpf
  LIBBPF_BOOTSTRAP := $(LIBBPF_BOOTSTRAP_OUTPUT)libbpf.a
  
 -# We need to copy hashmap.h and nlattr.h which is not otherwise exported by
 -# libbpf, but still required by bpftool.
 -LIBBPF_INTERNAL_HDRS := $(addprefix $(LIBBPF_HDRS_DIR)/,hashmap.h nlattr.h)
 -LIBBPF_BOOTSTRAP_INTERNAL_HDRS := $(addprefix $(LIBBPF_BOOTSTRAP_HDRS_DIR)/,hashmap.h)
 -
 -ifeq ($(BPFTOOL_VERSION),)
 -BPFTOOL_VERSION := $(shell make -rR --no-print-directory -sC ../../.. kernelversion)
 -endif
 +# We need to copy hashmap.h, nlattr.h, relo_core.h and libbpf_internal.h
 +# which are not otherwise exported by libbpf, but still required by bpftool.
 +LIBBPF_INTERNAL_HDRS := $(addprefix $(LIBBPF_HDRS_DIR)/,hashmap.h nlattr.h relo_core.h libbpf_internal.h)
 +LIBBPF_BOOTSTRAP_INTERNAL_HDRS := $(addprefix $(LIBBPF_BOOTSTRAP_HDRS_DIR)/,hashmap.h relo_core.h libbpf_internal.h)
  
  $(LIBBPF_OUTPUT) $(BOOTSTRAP_OUTPUT) $(LIBBPF_BOOTSTRAP_OUTPUT) $(LIBBPF_HDRS_DIR) $(LIBBPF_BOOTSTRAP_HDRS_DIR):
        $(QUIET_MKDIR)mkdir -p $@
  
  $(LIBBPF): $(wildcard $(BPF_DIR)/*.[ch] $(BPF_DIR)/Makefile) | $(LIBBPF_OUTPUT)
        $(Q)$(MAKE) -C $(BPF_DIR) OUTPUT=$(LIBBPF_OUTPUT) \
 -              DESTDIR=$(LIBBPF_DESTDIR) prefix= $(LIBBPF) install_headers
 +              DESTDIR=$(LIBBPF_DESTDIR:/=) prefix= $(LIBBPF) install_headers
  
  $(LIBBPF_INTERNAL_HDRS): $(LIBBPF_HDRS_DIR)/%.h: $(BPF_DIR)/%.h | $(LIBBPF_HDRS_DIR)
        $(call QUIET_INSTALL, $@)
@@@ -52,7 -56,7 +52,7 @@@
  
  $(LIBBPF_BOOTSTRAP): $(wildcard $(BPF_DIR)/*.[ch] $(BPF_DIR)/Makefile) | $(LIBBPF_BOOTSTRAP_OUTPUT)
        $(Q)$(MAKE) -C $(BPF_DIR) OUTPUT=$(LIBBPF_BOOTSTRAP_OUTPUT) \
 -              DESTDIR=$(LIBBPF_BOOTSTRAP_DESTDIR) prefix= \
 +              DESTDIR=$(LIBBPF_BOOTSTRAP_DESTDIR:/=) prefix= \
                ARCH= CROSS_COMPILE= CC=$(HOSTCC) LD=$(HOSTLD) $@ install_headers
  
  $(LIBBPF_BOOTSTRAP_INTERNAL_HDRS): $(LIBBPF_BOOTSTRAP_HDRS_DIR)/%.h: $(BPF_DIR)/%.h | $(LIBBPF_BOOTSTRAP_HDRS_DIR)
@@@ -74,14 -78,12 +74,14 @@@ CFLAGS += -O
  CFLAGS += -W -Wall -Wextra -Wno-unused-parameter -Wno-missing-field-initializers
  CFLAGS += $(filter-out -Wswitch-enum -Wnested-externs,$(EXTRA_WARNINGS))
  CFLAGS += -DPACKAGE='"bpftool"' -D__EXPORTED_HEADERS__ \
-       -I$(if $(OUTPUT),$(OUTPUT),.) \
+       -I$(or $(OUTPUT),.) \
        -I$(LIBBPF_INCLUDE) \
        -I$(srctree)/kernel/bpf/ \
        -I$(srctree)/tools/include \
        -I$(srctree)/tools/include/uapi
 +ifneq ($(BPFTOOL_VERSION),)
  CFLAGS += -DBPFTOOL_VERSION='"$(BPFTOOL_VERSION)"'
 +endif
  ifneq ($(EXTRA_CFLAGS),)
  CFLAGS += $(EXTRA_CFLAGS)
  endif
@@@ -93,7 -95,7 +93,7 @@@ INSTALL ?= instal
  RM ?= rm -f
  
  FEATURE_USER = .bpftool
 -FEATURE_TESTS = libbfd disassembler-four-args reallocarray zlib libcap \
 +FEATURE_TESTS = libbfd disassembler-four-args zlib libcap \
        clang-bpf-co-re
  FEATURE_DISPLAY = libbfd disassembler-four-args zlib libcap \
        clang-bpf-co-re
@@@ -118,6 -120,10 +118,6 @@@ ifeq ($(feature-disassembler-four-args)
  CFLAGS += -DDISASM_FOUR_ARGS_SIGNATURE
  endif
  
 -ifeq ($(feature-reallocarray), 0)
 -CFLAGS += -DCOMPAT_NEED_REALLOCARRAY
 -endif
 -
  LIBS = $(LIBBPF) -lelf -lz
  LIBS_BOOTSTRAP = $(LIBBPF_BOOTSTRAP) -lelf -lz
  ifeq ($(feature-libcap), 1)
@@@ -180,7 -186,7 +180,7 @@@ endi
  
  $(OUTPUT)%.bpf.o: skeleton/%.bpf.c $(OUTPUT)vmlinux.h $(LIBBPF_BOOTSTRAP)
        $(QUIET_CLANG)$(CLANG) \
-               -I$(if $(OUTPUT),$(OUTPUT),.) \
+               -I$(or $(OUTPUT),.) \
                -I$(srctree)/tools/include/uapi/ \
                -I$(LIBBPF_BOOTSTRAP_INCLUDE) \
                -g -O2 -Wall -target bpf -c $< -o $@
diff --combined tools/lib/bpf/Makefile
@@@ -60,7 -60,7 +60,7 @@@ ifndef VERBOS
    VERBOSE = 0
  endif
  
- INCLUDES = -I$(if $(OUTPUT),$(OUTPUT),.)                              \
+ INCLUDES = -I$(or $(OUTPUT),.) \
           -I$(srctree)/tools/include -I$(srctree)/tools/include/uapi
  
  export prefix libdir src obj
@@@ -131,7 -131,7 +131,7 @@@ GLOBAL_SYM_COUNT = $(shell readelf -s -
                           sort -u | wc -l)
  VERSIONED_SYM_COUNT = $(shell readelf --dyn-syms --wide $(OUTPUT)libbpf.so | \
                              sed 's/\[.*\]//' | \
 -                            awk '/GLOBAL/ && /DEFAULT/ && !/UND/ {print $$NF}' | \
 +                            awk '/GLOBAL/ && /DEFAULT/ && !/UND|ABS/ {print $$NF}' | \
                              grep -Eo '[^ ]+@LIBBPF_' | cut -d@ -f1 | sort -u | wc -l)
  
  CMD_TARGETS = $(LIB_TARGET) $(PC_FILE)
@@@ -194,7 -194,7 +194,7 @@@ check_abi: $(OUTPUT)libbpf.so $(VERSION
                    sort -u > $(OUTPUT)libbpf_global_syms.tmp;           \
                readelf --dyn-syms --wide $(OUTPUT)libbpf.so |           \
                    sed 's/\[.*\]//' |                                   \
 -                  awk '/GLOBAL/ && /DEFAULT/ && !/UND/ {print $$NF}'|  \
 +                  awk '/GLOBAL/ && /DEFAULT/ && !/UND|ABS/ {print $$NF}'|  \
                    grep -Eo '[^ ]+@LIBBPF_' | cut -d@ -f1 |             \
                    sort -u > $(OUTPUT)libbpf_versioned_syms.tmp;        \
                diff -u $(OUTPUT)libbpf_global_syms.tmp                  \
diff --combined tools/perf/Makefile.perf
@@@ -691,7 -691,7 +691,7 @@@ $(OUTPUT)common-cmds.h: $(wildcard Docu
  $(SCRIPTS) : % : %.sh
        $(QUIET_GEN)$(INSTALL) '$@.sh' '$(OUTPUT)$@'
  
 -$(OUTPUT)PERF-VERSION-FILE: ../../.git/HEAD
 +$(OUTPUT)PERF-VERSION-FILE: ../../.git/HEAD ../../.git/ORIG_HEAD
        $(Q)$(SHELL_PATH) util/PERF-VERSION-GEN $(OUTPUT)
        $(Q)touch $(OUTPUT)PERF-VERSION-FILE
  
@@@ -724,7 -724,7 +724,7 @@@ endi
  # get relative building directory (to $(OUTPUT))
  # and '.' if it's $(OUTPUT) itself
  __build-dir = $(subst $(OUTPUT),,$(dir $@))
- build-dir   = $(if $(__build-dir),$(__build-dir),.)
+ build-dir   = $(or $(__build-dir),.)
  
  prepare: $(OUTPUT)PERF-VERSION-FILE $(OUTPUT)common-cmds.h archheaders $(drm_ioctl_array) \
        $(fadvise_advice_array) \
@@@ -1090,7 -1090,7 +1090,7 @@@ bpf-skel-clean
  
  clean:: $(LIBTRACEEVENT)-clean $(LIBAPI)-clean $(LIBBPF)-clean $(LIBSUBCMD)-clean $(LIBPERF)-clean fixdep-clean python-clean bpf-skel-clean
        $(call QUIET_CLEAN, core-objs)  $(RM) $(LIBPERF_A) $(OUTPUT)perf-archive $(OUTPUT)perf-with-kcore $(OUTPUT)perf-iostat $(LANG_BINDINGS)
-       $(Q)find $(if $(OUTPUT),$(OUTPUT),.) -name '*.o' -delete -o -name '\.*.cmd' -delete -o -name '\.*.d' -delete
+       $(Q)find $(or $(OUTPUT),.) -name '*.o' -delete -o -name '\.*.cmd' -delete -o -name '\.*.d' -delete
        $(Q)$(RM) $(OUTPUT).config-detected
        $(call QUIET_CLEAN, core-progs) $(RM) $(ALL_PROGRAMS) perf perf-read-vdso32 perf-read-vdsox32 $(OUTPUT)pmu-events/jevents $(OUTPUT)$(LIBJVMTI).so
        $(call QUIET_CLEAN, core-gen)   $(RM)  *.spec *.pyc *.pyo */*.pyc */*.pyo $(OUTPUT)common-cmds.h TAGS tags cscope* $(OUTPUT)PERF-VERSION-FILE $(OUTPUT)FEATURE-DUMP $(OUTPUT)util/*-bison* $(OUTPUT)util/*-flex* \
@@@ -1144,7 -1144,7 +1144,7 @@@ endi
  # then force version regeneration:
  #
  ifeq ($(wildcard ../../.git/HEAD),)
 -    GIT-HEAD-PHONY = ../../.git/HEAD
 +    GIT-HEAD-PHONY = ../../.git/HEAD ../../.git/ORIG_HEAD
  else
      GIT-HEAD-PHONY =
  endif
@@@ -13,8 -13,8 +13,8 @@@ endi
  # Do not use make's built-in rules
  # (this improves performance and avoids hard-to-debug behaviour);
  MAKEFLAGS += -r
 -
 -override CFLAGS += -O2 -Wall -g -D_GNU_SOURCE -I$(OUTPUT)include
 +override CFLAGS += -O2 -Wall -g -D_GNU_SOURCE -I$(OUTPUT)include -I/usr/include/libnl3
 +override LDFLAGS += -lnl-genl-3 -lnl-3
  
  ALL_TARGETS := intel-speed-select
  ALL_PROGRAMS := $(patsubst %,$(OUTPUT)%,$(ALL_TARGETS))
@@@ -31,11 -31,7 +31,11 @@@ $(OUTPUT)include/linux/isst_if.h: ../..
        mkdir -p $(OUTPUT)include/linux 2>&1 || true
        ln -sf $(CURDIR)/../../../../include/uapi/linux/isst_if.h $@
  
 -prepare: $(OUTPUT)include/linux/isst_if.h
 +$(OUTPUT)include/linux/thermal.h: ../../../../include/uapi/linux/thermal.h
 +      mkdir -p $(OUTPUT)include/linux 2>&1 || true
 +      ln -sf $(CURDIR)/../../../../include/uapi/linux/thermal.h $@
 +
 +prepare: $(OUTPUT)include/linux/isst_if.h $(OUTPUT)include/linux/thermal.h
  
  ISST_IN := $(OUTPUT)intel-speed-select-in.o
  
@@@ -47,7 -43,7 +47,7 @@@ $(OUTPUT)intel-speed-select: $(ISST_IN
  clean:
        rm -f $(ALL_PROGRAMS)
        rm -rf $(OUTPUT)include/linux/isst_if.h
-       find $(if $(OUTPUT),$(OUTPUT),.) -name '*.o' -delete -o -name '\.*.d' -delete
+       find $(or $(OUTPUT),.) -name '*.o' -delete -o -name '\.*.d' -delete
  
  install: $(ALL_PROGRAMS)
        install -d -m 755 $(DESTDIR)$(bindir);          \
@@@ -52,11 -52,17 +52,17 @@@ define allow-overrid
  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 +75,9 @@@ endi
  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
@@@ -89,9 -95,6 +95,9 @@@ ifeq ($(CC_NO_CLANG), 1
  EXTRA_WARNINGS += -Wstrict-aliasing=3
  
  else ifneq ($(CROSS_COMPILE),)
 +# Allow userspace to override CLANG_CROSS_FLAGS to specify their own
 +# sysroots and flags or to avoid the GCC call in pure Clang builds.
 +ifeq ($(CLANG_CROSS_FLAGS),)
  CLANG_CROSS_FLAGS := --target=$(notdir $(CROSS_COMPILE:%-=%))
  GCC_TOOLCHAIN_DIR := $(dir $(shell which $(CROSS_COMPILE)gcc 2>/dev/null))
  ifneq ($(GCC_TOOLCHAIN_DIR),)
@@@ -99,7 -102,6 +105,7 @@@ CLANG_CROSS_FLAGS += --prefix=$(GCC_TOO
  CLANG_CROSS_FLAGS += --sysroot=$(shell $(CROSS_COMPILE)gcc -print-sysroot)
  CLANG_CROSS_FLAGS += --gcc-toolchain=$(realpath $(GCC_TOOLCHAIN_DIR)/..)
  endif # GCC_TOOLCHAIN_DIR
 +endif # CLANG_CROSS_FLAGS
  CFLAGS += $(CLANG_CROSS_FLAGS)
  AFLAGS += $(CLANG_CROSS_FLAGS)
  endif # CROSS_COMPILE
diff --combined usr/include/Makefile
@@@ -10,7 -10,10 +10,10 @@@ UAPI_CFLAGS := -std=c90 -Wall -Werror=i
  
  # In theory, we do not care -m32 or -m64 for header compile tests.
  # It is here just because CONFIG_CC_CAN_LINK is tested with -m32 or -m64.
- UAPI_CFLAGS += $(filter -m32 -m64, $(KBUILD_CFLAGS))
+ UAPI_CFLAGS += $(filter -m32 -m64 --target=%, $(KBUILD_CFLAGS))
+ # USERCFLAGS might contain sysroot location for CC.
+ UAPI_CFLAGS += $(USERCFLAGS)
  
  override c_flags = $(UAPI_CFLAGS) -Wp,-MMD,$(depfile) -I$(objtree)/usr/include
  
  # Please consider to fix the header first.
  #
  # Sorted alphabetically.
 -no-header-test += asm/shmbuf.h
 -no-header-test += asm/signal.h
  no-header-test += asm/ucontext.h
  no-header-test += drm/vmwgfx_drm.h
  no-header-test += linux/am437x-vpfe.h
 -no-header-test += linux/android/binder.h
 -no-header-test += linux/android/binderfs.h
  no-header-test += linux/coda.h
  no-header-test += linux/cyclades.h
  no-header-test += linux/errqueue.h
 -no-header-test += linux/fsmap.h
  no-header-test += linux/hdlc/ioctl.h
  no-header-test += linux/ivtv.h
 -no-header-test += linux/kexec.h
  no-header-test += linux/matroxfb.h
  no-header-test += linux/omap3isp.h
  no-header-test += linux/omapfb.h
  no-header-test += linux/patchkey.h
  no-header-test += linux/phonet.h
 -no-header-test += linux/reiserfs_xattr.h
  no-header-test += linux/sctp.h
 -no-header-test += linux/signal.h
  no-header-test += linux/sysctl.h
  no-header-test += linux/usb/audio.h
  no-header-test += linux/v4l2-mediabus.h
@@@ -84,7 -95,7 +87,7 @@@ endi
  # asm-generic/*.h is used by asm/*.h, and should not be included directly
  no-header-test += asm-generic/%
  
extra-y := $(patsubst $(obj)/%.h,%.hdrtest, $(shell find $(obj) -name '*.h' 2>/dev/null))
always-y := $(patsubst $(obj)/%.h,%.hdrtest, $(shell find $(obj) -name '*.h' 2>/dev/null))
  
  # Include the header twice to detect missing include guard.
  quiet_cmd_hdrtest = HDRTEST $<