Commit 39ceda5c authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'kbuild-v5.3' of git://git.kernel.org/pub/scm/linux/kernel/git/masahiroy/linux-kbuild

Pull Kbuild updates from Masahiro Yamada:

 - remove headers_{install,check}_all targets

 - remove unreasonable 'depends on !UML' from CONFIG_SAMPLES

 - re-implement 'make headers_install' more cleanly

 - add new header-test-y syntax to compile-test headers

 - compile-test exported headers to ensure they are compilable in
   user-space

 - compile-test headers under include/ to ensure they are self-contained

 - remove -Waggregate-return, -Wno-uninitialized, -Wno-unused-value
   flags

 - add -Werror=unknown-warning-option for Clang

 - add 128-bit built-in types support to genksyms

 - fix missed rebuild of modules.builtin

 - propagate 'No space left on device' error in fixdep to Make

 - allow Clang to use its integrated assembler

 - improve some coccinelle scripts

 - add a new flag KBUILD_ABS_SRCTREE to request Kbuild to use absolute
   path for $(srctree).

 - do not ignore errors when compression utility is missing

 - misc cleanups

* tag 'kbuild-v5.3' of git://git.kernel.org/pub/scm/linux/kernel/git/masahiroy/linux-kbuild: (49 commits)
  kbuild: use -- separater intead of $(filter-out ...) for cc-cross-prefix
  kbuild: Inform user to pass ARCH= for make mrproper
  kbuild: fix compression errors getting ignored
  kbuild: add a flag to force absolute path for srctree
  kbuild: replace KBUILD_SRCTREE with boolean building_out_of_srctree
  kbuild: remove src and obj from the top Makefile
  scripts/tags.sh: remove unused environment variables from comments
  scripts/tags.sh: drop SUBARCH support for ARM
  kbuild: compile-test kernel headers to ensure they are self-contained
  kheaders: include only headers into kheaders_data.tar.xz
  kheaders: remove meaningless -R option of 'ls'
  kbuild: support header-test-pattern-y
  kbuild: do not create wrappers for header-test-y
  kbuild: compile-test exported headers to ensure they are self-contained
  init/Kconfig: add CONFIG_CC_CAN_LINK
  kallsyms: exclude kasan local symbols on s390
  kbuild: add more hints about SUBDIRS replacement
  coccinelle: api/stream_open: treat all wait_.*() calls as blocking
  coccinelle: put_device: Add a cast to an expression for an assignment
  coccinelle: put_device: Adjust a message construction
  ...
parents 5f26f114 d4a74bbf
...@@ -40,12 +40,5 @@ INSTALL_HDR_PATH indicates where to install the headers. It defaults to ...@@ -40,12 +40,5 @@ INSTALL_HDR_PATH indicates where to install the headers. It defaults to
An 'include' directory is automatically created inside INSTALL_HDR_PATH and An 'include' directory is automatically created inside INSTALL_HDR_PATH and
headers are installed in 'INSTALL_HDR_PATH/include'. headers are installed in 'INSTALL_HDR_PATH/include'.
The command "make headers_install_all" exports headers for all architectures
simultaneously. (This is mostly of interest to distribution maintainers,
who create an architecture-independent tarball from the resulting include
directory.) You also can use HDR_ARCH_LIST to specify list of architectures.
Remember to provide the appropriate linux/asm directory via "mv" or "ln -s"
before building a C library with headers exported this way.
The kernel header export infrastructure is maintained by David Woodhouse The kernel header export infrastructure is maintained by David Woodhouse
<dwmw2@infradead.org>. <dwmw2@infradead.org>.
...@@ -200,6 +200,15 @@ The output directory is often set using "O=..." on the commandline. ...@@ -200,6 +200,15 @@ The output directory is often set using "O=..." on the commandline.
The value can be overridden in which case the default value is ignored. The value can be overridden in which case the default value is ignored.
KBUILD_ABS_SRCTREE
--------------------------------------------------
Kbuild uses a relative path to point to the tree when possible. For instance,
when building in the source tree, the source tree path is '.'
Setting this flag requests Kbuild to use absolute path to the source tree.
There are some useful cases to do so, like when generating tag files with
absolute path entries etc.
KBUILD_SIGN_PIN KBUILD_SIGN_PIN
--------------- ---------------
This variable allows a passphrase or PIN to be passed to the sign-file This variable allows a passphrase or PIN to be passed to the sign-file
......
...@@ -999,11 +999,7 @@ When kbuild executes, the following steps are followed (roughly): ...@@ -999,11 +999,7 @@ When kbuild executes, the following steps are followed (roughly):
------------------------------------ ------------------------------------
The archheaders: rule is used to generate header files that The archheaders: rule is used to generate header files that
may be installed into user space by "make header_install" or may be installed into user space by "make header_install".
"make headers_install_all". In order to support
"make headers_install_all", this target has to be able to run
on an unconfigured tree, or a tree configured for another
architecture.
It is run before "make archprepare" when run on the It is run before "make archprepare" when run on the
architecture itself. architecture itself.
...@@ -1140,6 +1136,22 @@ When kbuild executes, the following steps are followed (roughly): ...@@ -1140,6 +1136,22 @@ When kbuild executes, the following steps are followed (roughly):
In this example, extra-y is used to list object files that In this example, extra-y is used to list object files that
shall be built, but shall not be linked as part of built-in.a. shall be built, but shall not be linked as part of built-in.a.
header-test-y
header-test-y specifies headers (*.h) in the current directory that
should be compile tested to ensure they are self-contained,
i.e. compilable as standalone units. If CONFIG_HEADER_TEST is enabled,
this builds them as part of extra-y.
header-test-pattern-y
This works as a weaker version of header-test-y, and accepts wildcard
patterns. The typical usage is:
header-test-pattern-y += *.h
This specifies all the files that matches to '*.h' in the current
directory, but the files in 'header-test-' are excluded.
6.7 Commands useful for building a boot image 6.7 Commands useful for building a boot image
--------------------------------------------- ---------------------------------------------
......
...@@ -212,6 +212,13 @@ endif ...@@ -212,6 +212,13 @@ endif
ifdef SUBDIRS ifdef SUBDIRS
$(warning ================= WARNING ================) $(warning ================= WARNING ================)
$(warning 'SUBDIRS' will be removed after Linux 5.3) $(warning 'SUBDIRS' will be removed after Linux 5.3)
$(warning )
$(warning If you are building an individual subdirectory)
$(warning in the kernel tree, you can do like this:)
$(warning $$ make path/to/dir/you/want/to/build/)
$(warning (Do not forget the trailing slash))
$(warning )
$(warning If you are building an external module,)
$(warning Please use 'M=' or 'KBUILD_EXTMOD' instead) $(warning Please use 'M=' or 'KBUILD_EXTMOD' instead)
$(warning ==========================================) $(warning ==========================================)
KBUILD_EXTMOD ?= $(SUBDIRS) KBUILD_EXTMOD ?= $(SUBDIRS)
...@@ -221,9 +228,12 @@ ifeq ("$(origin M)", "command line") ...@@ -221,9 +228,12 @@ ifeq ("$(origin M)", "command line")
KBUILD_EXTMOD := $(M) KBUILD_EXTMOD := $(M)
endif endif
export KBUILD_CHECKSRC KBUILD_EXTMOD
ifeq ($(abs_srctree),$(abs_objtree)) ifeq ($(abs_srctree),$(abs_objtree))
# building in the source tree # building in the source tree
srctree := . srctree := .
building_out_of_srctree :=
else else
ifeq ($(abs_srctree)/,$(dir $(abs_objtree))) ifeq ($(abs_srctree)/,$(dir $(abs_objtree)))
# building in a subdirectory of the source tree # building in a subdirectory of the source tree
...@@ -231,22 +241,17 @@ else ...@@ -231,22 +241,17 @@ else
else else
srctree := $(abs_srctree) srctree := $(abs_srctree)
endif endif
building_out_of_srctree := 1
# TODO:
# KBUILD_SRC is only used to distinguish in-tree/out-of-tree build.
# Replace it with $(srctree) or something.
KBUILD_SRC := $(abs_srctree)
endif endif
export KBUILD_CHECKSRC KBUILD_EXTMOD KBUILD_SRC ifneq ($(KBUILD_ABS_SRCTREE),)
srctree := $(abs_srctree)
endif
objtree := . objtree := .
src := $(srctree)
obj := $(objtree)
VPATH := $(srctree) VPATH := $(srctree)
export srctree objtree VPATH export building_out_of_srctree srctree objtree VPATH
# To make sure we do not include .config for any of the *config targets # To make sure we do not include .config for any of the *config targets
# catch them early, and hand them over to scripts/kconfig/Makefile # catch them early, and hand them over to scripts/kconfig/Makefile
...@@ -262,7 +267,7 @@ old_version_h := include/linux/version.h ...@@ -262,7 +267,7 @@ old_version_h := include/linux/version.h
clean-targets := %clean mrproper cleandocs clean-targets := %clean mrproper cleandocs
no-dot-config-targets := $(clean-targets) \ no-dot-config-targets := $(clean-targets) \
cscope gtags TAGS tags help% %docs check% coccicheck \ cscope gtags TAGS tags help% %docs check% coccicheck \
$(version_h) headers_% archheaders archscripts \ $(version_h) headers headers_% archheaders archscripts \
%asm-generic kernelversion %src-pkg %asm-generic kernelversion %src-pkg
no-sync-config-targets := $(no-dot-config-targets) install %install \ no-sync-config-targets := $(no-dot-config-targets) install %install \
kernelrelease kernelrelease
...@@ -449,7 +454,7 @@ USERINCLUDE := \ ...@@ -449,7 +454,7 @@ USERINCLUDE := \
LINUXINCLUDE := \ LINUXINCLUDE := \
-I$(srctree)/arch/$(SRCARCH)/include \ -I$(srctree)/arch/$(SRCARCH)/include \
-I$(objtree)/arch/$(SRCARCH)/include/generated \ -I$(objtree)/arch/$(SRCARCH)/include/generated \
$(if $(filter .,$(srctree)),,-I$(srctree)/include) \ $(if $(building_out_of_srctree),-I$(srctree)/include) \
-I$(objtree)/include \ -I$(objtree)/include \
$(USERINCLUDE) $(USERINCLUDE)
...@@ -510,7 +515,7 @@ PHONY += outputmakefile ...@@ -510,7 +515,7 @@ PHONY += outputmakefile
# At the same time when output Makefile generated, generate .gitignore to # At the same time when output Makefile generated, generate .gitignore to
# ignore whole output directory # ignore whole output directory
outputmakefile: outputmakefile:
ifneq ($(srctree),.) ifdef building_out_of_srctree
$(Q)ln -fsn $(srctree) source $(Q)ln -fsn $(srctree) source
$(Q)$(CONFIG_SHELL) $(srctree)/scripts/mkmakefile $(srctree) $(Q)$(CONFIG_SHELL) $(srctree)/scripts/mkmakefile $(srctree)
$(Q)test -e .gitignore || \ $(Q)test -e .gitignore || \
...@@ -527,7 +532,10 @@ endif ...@@ -527,7 +532,10 @@ endif
ifneq ($(GCC_TOOLCHAIN),) ifneq ($(GCC_TOOLCHAIN),)
CLANG_FLAGS += --gcc-toolchain=$(GCC_TOOLCHAIN) CLANG_FLAGS += --gcc-toolchain=$(GCC_TOOLCHAIN)
endif endif
ifeq ($(shell $(AS) --version 2>&1 | head -n 1 | grep clang),)
CLANG_FLAGS += -no-integrated-as CLANG_FLAGS += -no-integrated-as
endif
CLANG_FLAGS += -Werror=unknown-warning-option
KBUILD_CFLAGS += $(CLANG_FLAGS) KBUILD_CFLAGS += $(CLANG_FLAGS)
KBUILD_AFLAGS += $(CLANG_FLAGS) KBUILD_AFLAGS += $(CLANG_FLAGS)
export CLANG_FLAGS export CLANG_FLAGS
...@@ -608,6 +616,7 @@ ifeq ($(KBUILD_EXTMOD),) ...@@ -608,6 +616,7 @@ ifeq ($(KBUILD_EXTMOD),)
init-y := init/ init-y := init/
drivers-y := drivers/ sound/ drivers-y := drivers/ sound/
drivers-$(CONFIG_SAMPLES) += samples/ drivers-$(CONFIG_SAMPLES) += samples/
drivers-$(CONFIG_KERNEL_HEADER_TEST) += include/
net-y := net/ net-y := net/
libs-y := lib/ libs-y := lib/
core-y := usr/ core-y := usr/
...@@ -1053,9 +1062,6 @@ vmlinux: scripts/link-vmlinux.sh autoksyms_recursive $(vmlinux-deps) FORCE ...@@ -1053,9 +1062,6 @@ vmlinux: scripts/link-vmlinux.sh autoksyms_recursive $(vmlinux-deps) FORCE
targets := vmlinux targets := vmlinux
# Some samples need headers_install.
samples: headers_install
# The actual objects are generated when descending, # The actual objects are generated when descending,
# make sure no implicit rule kicks in # make sure no implicit rule kicks in
$(sort $(vmlinux-deps)): $(vmlinux-dirs) ; $(sort $(vmlinux-deps)): $(vmlinux-dirs) ;
...@@ -1096,12 +1102,12 @@ PHONY += prepare archprepare prepare1 prepare3 ...@@ -1096,12 +1102,12 @@ PHONY += prepare archprepare prepare1 prepare3
# and if so do: # and if so do:
# 1) Check that make has not been executed in the kernel src $(srctree) # 1) Check that make has not been executed in the kernel src $(srctree)
prepare3: include/config/kernel.release prepare3: include/config/kernel.release
ifneq ($(srctree),.) ifdef building_out_of_srctree
@$(kecho) ' Using $(srctree) as source for kernel' @$(kecho) ' Using $(srctree) as source for kernel'
$(Q)if [ -f $(srctree)/.config -o \ $(Q)if [ -f $(srctree)/.config -o \
-d $(srctree)/include/config -o \ -d $(srctree)/include/config -o \
-d $(srctree)/arch/$(SRCARCH)/include/generated ]; then \ -d $(srctree)/arch/$(SRCARCH)/include/generated ]; then \
echo >&2 " $(srctree) is not clean, please run 'make mrproper'"; \ echo >&2 " $(srctree) is not clean, please run 'make ARCH=$(ARCH) mrproper'"; \
echo >&2 " in the '$(srctree)' directory.";\ echo >&2 " in the '$(srctree)' directory.";\
/bin/false; \ /bin/false; \
fi; fi;
...@@ -1181,39 +1187,44 @@ headerdep: ...@@ -1181,39 +1187,44 @@ headerdep:
#Default location for installed headers #Default location for installed headers
export INSTALL_HDR_PATH = $(objtree)/usr export INSTALL_HDR_PATH = $(objtree)/usr
# If we do an all arch process set dst to include/arch-$(SRCARCH) quiet_cmd_headers_install = INSTALL $(INSTALL_HDR_PATH)/include
hdr-dst = $(if $(KBUILD_HEADERS), dst=include/arch-$(SRCARCH), dst=include) cmd_headers_install = \
mkdir -p $(INSTALL_HDR_PATH); \
rsync -mrl --include='*/' --include='*\.h' --exclude='*' \
usr/include $(INSTALL_HDR_PATH)
PHONY += archheaders archscripts PHONY += headers_install
headers_install: headers
$(call cmd,headers_install)
PHONY += __headers PHONY += archheaders archscripts
__headers: $(version_h) scripts_basic uapi-asm-generic archheaders archscripts
$(Q)$(MAKE) $(build)=scripts build_unifdef
PHONY += headers_install_all hdr-inst := -f $(srctree)/scripts/Makefile.headersinst obj
headers_install_all:
$(Q)$(CONFIG_SHELL) $(srctree)/scripts/headers.sh install
PHONY += headers_install PHONY += headers
headers_install: __headers headers: $(version_h) scripts_unifdef uapi-asm-generic archheaders archscripts
$(if $(wildcard $(srctree)/arch/$(SRCARCH)/include/uapi/asm/Kbuild),, \ $(if $(wildcard $(srctree)/arch/$(SRCARCH)/include/uapi/asm/Kbuild),, \
$(error Headers not exportable for the $(SRCARCH) architecture)) $(error Headers not exportable for the $(SRCARCH) architecture))
$(Q)$(MAKE) $(hdr-inst)=include/uapi dst=include $(Q)$(MAKE) $(hdr-inst)=include/uapi
$(Q)$(MAKE) $(hdr-inst)=arch/$(SRCARCH)/include/uapi $(hdr-dst) $(Q)$(MAKE) $(hdr-inst)=arch/$(SRCARCH)/include/uapi
PHONY += headers_check_all
headers_check_all: headers_install_all
$(Q)$(CONFIG_SHELL) $(srctree)/scripts/headers.sh check
PHONY += headers_check PHONY += headers_check
headers_check: headers_install headers_check: headers
$(Q)$(MAKE) $(hdr-inst)=include/uapi dst=include HDRCHECK=1 $(Q)$(MAKE) $(hdr-inst)=include/uapi HDRCHECK=1
$(Q)$(MAKE) $(hdr-inst)=arch/$(SRCARCH)/include/uapi $(hdr-dst) HDRCHECK=1 $(Q)$(MAKE) $(hdr-inst)=arch/$(SRCARCH)/include/uapi HDRCHECK=1
ifdef CONFIG_HEADERS_INSTALL
prepare: headers
endif
ifdef CONFIG_HEADERS_CHECK ifdef CONFIG_HEADERS_CHECK
all: headers_check all: headers_check
endif endif
PHONY += scripts_unifdef
scripts_unifdef: scripts_basic
$(Q)$(MAKE) $(build)=scripts scripts/unifdef
# --------------------------------------------------------------------------- # ---------------------------------------------------------------------------
# Kernel selftest # Kernel selftest
...@@ -1283,18 +1294,24 @@ all: modules ...@@ -1283,18 +1294,24 @@ all: modules
# using awk while concatenating to the final file. # using awk while concatenating to the final file.
PHONY += modules PHONY += modules
modules: $(vmlinux-dirs) $(if $(KBUILD_BUILTIN),vmlinux) modules.builtin modules: $(if $(KBUILD_BUILTIN),vmlinux) modules.order modules.builtin
$(Q)$(AWK) '!x[$$0]++' $(vmlinux-dirs:%=$(objtree)/%/modules.order) > $(objtree)/modules.order
@$(kecho) ' Building modules, stage 2.'; @$(kecho) ' Building modules, stage 2.';
$(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modpost $(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modpost
$(Q)$(CONFIG_SHELL) $(srctree)/scripts/modules-check.sh $(Q)$(CONFIG_SHELL) $(srctree)/scripts/modules-check.sh
modules.builtin: $(vmlinux-dirs:%=%/modules.builtin) modules.order: $(vmlinux-dirs)
$(Q)$(AWK) '!x[$$0]++' $^ > $(objtree)/modules.builtin $(Q)$(AWK) '!x[$$0]++' $(addsuffix /$@, $(vmlinux-dirs)) > $@
modbuiltin-dirs := $(addprefix _modbuiltin_, $(vmlinux-dirs))
%/modules.builtin: include/config/auto.conf include/config/tristate.conf modules.builtin: $(modbuiltin-dirs)
$(Q)$(MAKE) $(modbuiltin)=$* $(Q)$(AWK) '!x[$$0]++' $(addsuffix /$@, $(vmlinux-dirs)) > $@
PHONY += $(modbuiltin-dirs)
# tristate.conf is not included from this Makefile. Add it as a prerequisite
# here to make it self-healing in case somebody accidentally removes it.
$(modbuiltin-dirs): include/config/tristate.conf
$(Q)$(MAKE) $(modbuiltin)=$(patsubst _modbuiltin_%,%,$@)
# Target to prepare building external modules # Target to prepare building external modules
PHONY += modules_prepare PHONY += modules_prepare
...@@ -1360,7 +1377,7 @@ CLEAN_DIRS += $(MODVERDIR) include/ksym ...@@ -1360,7 +1377,7 @@ CLEAN_DIRS += $(MODVERDIR) include/ksym
CLEAN_FILES += modules.builtin.modinfo CLEAN_FILES += modules.builtin.modinfo
# Directories & files removed with 'make mrproper' # Directories & files removed with 'make mrproper'
MRPROPER_DIRS += include/config usr/include include/generated \ MRPROPER_DIRS += include/config include/generated \
arch/$(SRCARCH)/include/generated .tmp_objdiff arch/$(SRCARCH)/include/generated .tmp_objdiff
MRPROPER_FILES += .config .config.old .version \ MRPROPER_FILES += .config .config.old .version \
Module.symvers tags TAGS cscope* GPATH GTAGS GRTAGS GSYMS \ Module.symvers tags TAGS cscope* GPATH GTAGS GRTAGS GSYMS \
...@@ -1551,7 +1568,7 @@ $(DOC_TARGETS): scripts_basic FORCE ...@@ -1551,7 +1568,7 @@ $(DOC_TARGETS): scripts_basic FORCE
# --------------------------------------------------------------------------- # ---------------------------------------------------------------------------
PHONY += scripts_gdb PHONY += scripts_gdb
scripts_gdb: prepare scripts_gdb: prepare0
$(Q)$(MAKE) $(build)=scripts/gdb $(Q)$(MAKE) $(build)=scripts/gdb
$(Q)ln -fsn $(abspath $(srctree)/scripts/gdb/vmlinux-gdb.py) $(Q)ln -fsn $(abspath $(srctree)/scripts/gdb/vmlinux-gdb.py)
...@@ -1698,7 +1715,7 @@ CHECKSTACK_ARCH := $(ARCH) ...@@ -1698,7 +1715,7 @@ CHECKSTACK_ARCH := $(ARCH)
endif endif
checkstack: checkstack:
$(OBJDUMP) -d vmlinux $$(find . -name '*.ko') | \ $(OBJDUMP) -d vmlinux $$(find . -name '*.ko') | \
$(PERL) $(src)/scripts/checkstack.pl $(CHECKSTACK_ARCH) $(PERL) $(srctree)/scripts/checkstack.pl $(CHECKSTACK_ARCH)
kernelrelease: kernelrelease:
@echo "$(KERNELVERSION)$$($(CONFIG_SHELL) $(srctree)/scripts/setlocalversion $(srctree))" @echo "$(KERNELVERSION)$$($(CONFIG_SHELL) $(srctree)/scripts/setlocalversion $(srctree))"
...@@ -1717,11 +1734,11 @@ endif ...@@ -1717,11 +1734,11 @@ endif
tools/: FORCE tools/: FORCE
$(Q)mkdir -p $(objtree)/tools $(Q)mkdir -p $(objtree)/tools
$(Q)$(MAKE) LDFLAGS= MAKEFLAGS="$(tools_silent) $(filter --j% -j,$(MAKEFLAGS))" O=$(abspath $(objtree)) subdir=tools -C $(src)/tools/ $(Q)$(MAKE) LDFLAGS= MAKEFLAGS="$(tools_silent) $(filter --j% -j,$(MAKEFLAGS))" O=$(abspath $(objtree)) subdir=tools -C $(srctree)/tools/
tools/%: FORCE tools/%: FORCE
$(Q)mkdir -p $(objtree)/tools $(Q)mkdir -p $(objtree)/tools
$(Q)$(MAKE) LDFLAGS= MAKEFLAGS="$(tools_silent) $(filter --j% -j,$(MAKEFLAGS))" O=$(abspath $(objtree)) subdir=tools -C $(src)/tools/ $* $(Q)$(MAKE) LDFLAGS= MAKEFLAGS="$(tools_silent) $(filter --j% -j,$(MAKEFLAGS))" O=$(abspath $(objtree)) subdir=tools -C $(srctree)/tools/ $*
# Single targets # Single targets
# --------------------------------------------------------------------------- # ---------------------------------------------------------------------------
...@@ -1755,8 +1772,6 @@ build-dir = $(patsubst %/,%,$(dir $(build-target))) ...@@ -1755,8 +1772,6 @@ build-dir = $(patsubst %/,%,$(dir $(build-target)))
PHONY += / PHONY += /
/: ./ /: ./
# Make sure the latest headers are built for Documentation
Documentation/ samples/: headers_install
%/: prepare FORCE %/: prepare FORCE
$(Q)$(MAKE) KBUILD_MODULES=1 $(build)=$(build-dir) $(Q)$(MAKE) KBUILD_MODULES=1 $(build)=$(build-dir)
......
...@@ -19,7 +19,7 @@ ifdef CONFIG_ARC_CURR_IN_REG ...@@ -19,7 +19,7 @@ ifdef CONFIG_ARC_CURR_IN_REG
# any kernel headers, and missing the r25 global register # any kernel headers, and missing the r25 global register
# Can't do unconditionally because of recursive include issues # Can't do unconditionally because of recursive include issues
# due to <linux/thread_info.h> # due to <linux/thread_info.h>
LINUXINCLUDE += -include ${src}/arch/arc/include/asm/current.h LINUXINCLUDE += -include $(srctree)/arch/arc/include/asm/current.h
endif endif
cflags-y += -fsection-anchors cflags-y += -fsection-anchors
......
...@@ -94,6 +94,7 @@ CONFIG_CONFIGFS_FS=y ...@@ -94,6 +94,7 @@ CONFIG_CONFIGFS_FS=y
CONFIG_DEBUG_INFO=y CONFIG_DEBUG_INFO=y
CONFIG_STRIP_ASM_SYMS=y CONFIG_STRIP_ASM_SYMS=y
CONFIG_DEBUG_FS=y CONFIG_DEBUG_FS=y
CONFIG_HEADERS_INSTALL=y
CONFIG_HEADERS_CHECK=y CONFIG_HEADERS_CHECK=y
CONFIG_DEBUG_SECTION_MISMATCH=y CONFIG_DEBUG_SECTION_MISMATCH=y
CONFIG_MAGIC_SYSRQ=y CONFIG_MAGIC_SYSRQ=y
......
...@@ -92,6 +92,7 @@ CONFIG_DEBUG_INFO=y ...@@ -92,6 +92,7 @@ CONFIG_DEBUG_INFO=y
CONFIG_DEBUG_INFO_DWARF4=y CONFIG_DEBUG_INFO_DWARF4=y
CONFIG_GDB_SCRIPTS=y CONFIG_GDB_SCRIPTS=y
CONFIG_READABLE_ASM=y CONFIG_READABLE_ASM=y
CONFIG_HEADERS_INSTALL=y
CONFIG_HEADERS_CHECK=y CONFIG_HEADERS_CHECK=y
CONFIG_DEBUG_SECTION_MISMATCH=y CONFIG_DEBUG_SECTION_MISMATCH=y
CONFIG_MAGIC_SYSRQ=y CONFIG_MAGIC_SYSRQ=y
......
...@@ -120,8 +120,8 @@ PALO := $(shell if (which palo 2>&1); then : ; \ ...@@ -120,8 +120,8 @@ PALO := $(shell if (which palo 2>&1); then : ; \
elif [ -x /sbin/palo ]; then echo /sbin/palo; \ elif [ -x /sbin/palo ]; then echo /sbin/palo; \
fi) fi)
PALOCONF := $(shell if [ -f $(src)/palo.conf ]; then echo $(src)/palo.conf; \ PALOCONF := $(shell if [ -f $(srctree)/palo.conf ]; then echo $(srctree)/palo.conf; \
else echo $(obj)/palo.conf; \ else echo $(objtree)/palo.conf; \
fi) fi)
palo lifimage: vmlinuz palo lifimage: vmlinuz
...@@ -131,8 +131,8 @@ palo lifimage: vmlinuz ...@@ -131,8 +131,8 @@ palo lifimage: vmlinuz
false; \ false; \
fi fi
@if test ! -f "$(PALOCONF)"; then \ @if test ! -f "$(PALOCONF)"; then \
cp $(src)/arch/parisc/defpalo.conf $(obj)/palo.conf; \ cp $(srctree)/arch/parisc/defpalo.conf $(objtree)/palo.conf; \
echo 'A generic palo config file ($(obj)/palo.conf) has been created for you.'; \ echo 'A generic palo config file ($(objree)/palo.conf) has been created for you.'; \
echo 'You should check it and re-run "make palo".'; \ echo 'You should check it and re-run "make palo".'; \
echo 'WARNING: the "lifimage" file is now placed in this directory by default!'; \ echo 'WARNING: the "lifimage" file is now placed in this directory by default!'; \
false; \ false; \
...@@ -162,10 +162,10 @@ vmlinuz: vmlinux ...@@ -162,10 +162,10 @@ vmlinuz: vmlinux
endif endif
install: install:
$(CONFIG_SHELL) $(src)/arch/parisc/install.sh \ $(CONFIG_SHELL) $(srctree)/arch/parisc/install.sh \
$(KERNELRELEASE) vmlinux System.map "$(INSTALL_PATH)" $(KERNELRELEASE) vmlinux System.map "$(INSTALL_PATH)"
zinstall: zinstall:
$(CONFIG_SHELL) $(src)/arch/parisc/install.sh \ $(CONFIG_SHELL) $(srctree)/arch/parisc/install.sh \
$(KERNELRELEASE) vmlinuz System.map "$(INSTALL_PATH)" $(KERNELRELEASE) vmlinuz System.map "$(INSTALL_PATH)"
CLEAN_FILES += lifimage CLEAN_FILES += lifimage
......
...@@ -166,6 +166,7 @@ CONFIG_NLS_ISO8859_1=m ...@@ -166,6 +166,7 @@ CONFIG_NLS_ISO8859_1=m
CONFIG_NLS_ISO8859_15=m CONFIG_NLS_ISO8859_15=m
CONFIG_NLS_UTF8=m CONFIG_NLS_UTF8=m
CONFIG_DEBUG_FS=y CONFIG_DEBUG_FS=y
CONFIG_HEADERS_INSTALL=y
CONFIG_HEADERS_CHECK=y CONFIG_HEADERS_CHECK=y
CONFIG_MAGIC_SYSRQ=y CONFIG_MAGIC_SYSRQ=y
# CONFIG_DEBUG_BUGVERBOSE is not set # CONFIG_DEBUG_BUGVERBOSE is not set
......
...@@ -90,6 +90,7 @@ CONFIG_NLS_ASCII=m ...@@ -90,6 +90,7 @@ CONFIG_NLS_ASCII=m
CONFIG_NLS_ISO8859_1=m CONFIG_NLS_ISO8859_1=m
CONFIG_NLS_ISO8859_15=m CONFIG_NLS_ISO8859_15=m
CONFIG_NLS_UTF8=m CONFIG_NLS_UTF8=m
CONFIG_HEADERS_INSTALL=y
CONFIG_HEADERS_CHECK=y CONFIG_HEADERS_CHECK=y
CONFIG_MAGIC_SYSRQ=y CONFIG_MAGIC_SYSRQ=y
CONFIG_DEBUG_KERNEL=y CONFIG_DEBUG_KERNEL=y
......
...@@ -139,6 +139,7 @@ CONFIG_NLS_ISO8859_1=m ...@@ -139,6 +139,7 @@ CONFIG_NLS_ISO8859_1=m
CONFIG_NLS_ISO8859_15=m CONFIG_NLS_ISO8859_15=m
CONFIG_NLS_UTF8=m CONFIG_NLS_UTF8=m
CONFIG_DEBUG_FS=y CONFIG_DEBUG_FS=y
CONFIG_HEADERS_INSTALL=y
CONFIG_HEADERS_CHECK=y CONFIG_HEADERS_CHECK=y
CONFIG_MAGIC_SYSRQ=y CONFIG_MAGIC_SYSRQ=y
CONFIG_DEBUG_MUTEXES=y CONFIG_DEBUG_MUTEXES=y
......
...@@ -183,6 +183,7 @@ CONFIG_NLS_KOI8_R=m ...@@ -183,6 +183,7 @@ CONFIG_NLS_KOI8_R=m
CONFIG_NLS_KOI8_U=m CONFIG_NLS_KOI8_U=m
CONFIG_NLS_UTF8=y CONFIG_NLS_UTF8=y
CONFIG_DEBUG_FS=y CONFIG_DEBUG_FS=y
CONFIG_HEADERS_INSTALL=y
CONFIG_HEADERS_CHECK=y CONFIG_HEADERS_CHECK=y
CONFIG_MAGIC_SYSRQ=y CONFIG_MAGIC_SYSRQ=y
CONFIG_DEBUG_KERNEL=y CONFIG_DEBUG_KERNEL=y
......
...@@ -1123,6 +1123,7 @@ CONFIG_NLS_KOI8_R=m ...@@ -1123,6 +1123,7 @@ CONFIG_NLS_KOI8_R=m
CONFIG_NLS_KOI8_U=m CONFIG_NLS_KOI8_U=m
CONFIG_DEBUG_INFO=y CONFIG_DEBUG_INFO=y
CONFIG_UNUSED_SYMBOLS=y CONFIG_UNUSED_SYMBOLS=y
CONFIG_HEADERS_INSTALL=y
CONFIG_HEADERS_CHECK=y CONFIG_HEADERS_CHECK=y
CONFIG_MAGIC_SYSRQ=y CONFIG_MAGIC_SYSRQ=y
CONFIG_DEBUG_KERNEL=y CONFIG_DEBUG_KERNEL=y
......
...@@ -588,6 +588,7 @@ CONFIG_GDB_SCRIPTS=y ...@@ -588,6 +588,7 @@ CONFIG_GDB_SCRIPTS=y
CONFIG_FRAME_WARN=1024 CONFIG_FRAME_WARN=1024
CONFIG_READABLE_ASM=y CONFIG_READABLE_ASM=y
CONFIG_UNUSED_SYMBOLS=y CONFIG_UNUSED_SYMBOLS=y
CONFIG_HEADERS_INSTALL=y
CONFIG_HEADERS_CHECK=y CONFIG_HEADERS_CHECK=y
CONFIG_DEBUG_SECTION_MISMATCH=y CONFIG_DEBUG_SECTION_MISMATCH=y
CONFIG_MAGIC_SYSRQ=y CONFIG_MAGIC_SYSRQ=y
......
...@@ -73,7 +73,7 @@ KBUILD_AFLAGS += $(ARCH_INCLUDE) ...@@ -73,7 +73,7 @@ KBUILD_AFLAGS += $(ARCH_INCLUDE)
USER_CFLAGS = $(patsubst $(KERNEL_DEFINES),,$(patsubst -I%,,$(KBUILD_CFLAGS))) \ USER_CFLAGS = $(patsubst $(KERNEL_DEFINES),,$(patsubst -I%,,$(KBUILD_CFLAGS))) \
$(ARCH_INCLUDE) $(MODE_INCLUDE) $(filter -I%,$(CFLAGS)) \ $(ARCH_INCLUDE) $(MODE_INCLUDE) $(filter -I%,$(CFLAGS)) \
-D_FILE_OFFSET_BITS=64 -idirafter $(srctree)/include \ -D_FILE_OFFSET_BITS=64 -idirafter $(srctree)/include \
-idirafter $(obj)/include -D__KERNEL__ -D__UM_HOST__ -idirafter $(objtree)/include -D__KERNEL__ -D__UM_HOST__
#This will adjust *FLAGS accordingly to the platform. #This will adjust *FLAGS accordingly to the platform.
include $(ARCH_DIR)/Makefile-os-$(OS) include $(ARCH_DIR)/Makefile-os-$(OS)
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
# Copyright © 2019 Intel Corporation # Copyright © 2019 Intel Corporation
# Test the headers are compilable as standalone units # Test the headers are compilable as standalone units
header_test := \ header-test-$(CONFIG_DRM_I915_WERROR) := \
i915_active_types.h \ i915_active_types.h \
i915_gem_context_types.h \ i915_gem_context_types.h \
i915_priolist_types.h \ i915_priolist_types.h \
...@@ -35,13 +35,3 @@ header_test := \ ...@@ -35,13 +35,3 @@ header_test := \
intel_sprite.h \ intel_sprite.h \
intel_tv.h \ intel_tv.h \
intel_workarounds_types.h intel_workarounds_types.h
quiet_cmd_header_test = HDRTEST $@
cmd_header_test = echo "\#include \"$(<F)\"" > $@
header_test_%.c: %.h
$(call cmd,header_test)
i915-$(CONFIG_DRM_I915_WERROR) += $(foreach h,$(header_test),$(patsubst %.h,header_test_%.o,$(h)))
clean-files += $(foreach h,$(header_test),$(patsubst %.h,header_test_%.c,$(h)))
This diff is collapsed.
# SPDX-License-Identifier: GPL-2.0 # SPDX-License-Identifier: GPL-2.0
ifeq ($(wildcard $(srctree)/arch/$(SRCARCH)/include/uapi/asm/a.out.h),) ifeq ($(wildcard $(srctree)/arch/$(SRCARCH)/include/uapi/asm/a.out.h),)
no-export-headers += a.out.h no-export-headers += linux/a.out.h
endif endif
ifeq ($(wildcard $(srctree)/arch/$(SRCARCH)/include/uapi/asm/kvm.h),) ifeq ($(wildcard $(srctree)/arch/$(SRCARCH)/include/uapi/asm/kvm.h),)
no-export-headers += kvm.h no-export-headers += linux/kvm.h
endif endif
ifeq ($(wildcard $(srctree)/arch/$(SRCARCH)/include/uapi/asm/kvm_para.h),) ifeq ($(wildcard $(srctree)/arch/$(SRCARCH)/include/uapi/asm/kvm_para.h),)
ifeq ($(wildcard $(objtree)/arch/$(SRCARCH)/include/generated/uapi/asm/kvm_para.h),) ifeq ($(wildcard $(objtree)/arch/$(SRCARCH)/include/generated/uapi/asm/kvm_para.h),)
no-export-headers += kvm_para.h no-export-headers += linux/kvm_para.h
endif endif
endif endif
...@@ -24,6 +24,9 @@ config CLANG_VERSION ...@@ -24,6 +24,9 @@ config CLANG_VERSION
int int
default $(shell,$(srctree)/scripts/clang-version.sh $(CC)) default $(shell,$(srctree)/scripts/clang-version.sh $(CC))
config CC_CAN_LINK
def_bool $(success,$(srctree)/scripts/cc-can-link.sh $(CC))
config CC_HAS_ASM_GOTO config CC_HAS_ASM_GOTO
def_bool $(success,$(srctree)/scripts/gcc-goto.sh $(CC)) def_bool $(success,$(srctree)/scripts/gcc-goto.sh $(CC))
...@@ -96,6 +99,36 @@ config COMPILE_TEST ...@@ -96,6 +99,36 @@ config COMPILE_TEST
here. If you are a user/distributor, say N here to exclude useless here. If you are a user/distributor, say N here to exclude useless
drivers to be distributed. drivers to be distributed.
config HEADER_TEST
bool "Compile test headers that should be standalone compilable"
help
Compile test headers listed in header-test-y target to ensure they are
self-contained, i.e. compilable as standalone units.
If you are a developer or tester and want to ensure the requested
headers are self-contained, say Y here. Otherwise, choose N.
config KERNEL_HEADER_TEST
bool "Compile test kernel headers"
depends on HEADER_TEST
help
Headers in include/ are used to build external moduls.
Compile test them to ensure they are self-contained, i.e.
compilable as standalone units.
If you are a developer or tester and want to ensure the headers
in include/ are self-contained, say Y here. Otherwise, choose N.
config UAPI_HEADER_TEST
bool "Compile test UAPI headers"
depends on HEADER_TEST && HEADERS_INSTALL && CC_CAN_LINK
help
Compile test headers exported to user-space to ensure they are
self-contained, i.e. compilable as standalone units.
If you are a developer or tester and want to ensure the exported
headers are self-contained, say Y here. Otherwise, choose N.
config LOCALVERSION config LOCALVERSION
string "Local version - append to kernel release" string "Local version - append to kernel release"
help help
......
...@@ -4,24 +4,12 @@ ...@@ -4,24 +4,12 @@
# This script generates an archive consisting of kernel headers # This script generates an archive consisting of kernel headers
# for CONFIG_IKHEADERS. # for CONFIG_IKHEADERS.
set -e set -e
spath="$(dirname "$(readlink -f "$0")")" sfile="$(readlink -f "$0")"
kroot="$spath/.."
outdir="$(pwd)" outdir="$(pwd)"
tarfile=$1 tarfile=$1
cpio_dir=$outdir/$tarfile.tmp cpio_dir=$outdir/$tarfile.tmp
# Script filename relative to the kernel source root dir_list="
# We add it to the archive because it is small and any changes
# to this script will also cause a rebuild of the archive.
sfile="$(realpath --relative-to $kroot "$(readlink -f "$0")")"
src_file_list="
include/
arch/$SRCARCH/include/
$sfile
"
obj_file_list="
include/ include/
arch/$SRCARCH/include/ arch/$SRCARCH/include/
" "
...@@ -33,33 +21,29 @@ arch/$SRCARCH/include/ ...@@ -33,33 +21,29 @@ arch/$SRCARCH/include/
# Uncomment it for debugging. # Uncomment it for debugging.
# if [ ! -f /tmp/iter ]; then iter=1; echo 1 > /tmp/iter; # if [ ! -f /tmp/iter ]; then iter=1; echo 1 > /tmp/iter;
# else iter=$(($(cat /tmp/iter) + 1)); echo $iter > /tmp/iter; fi # else iter=$(($(cat /tmp/iter) + 1)); echo $iter > /tmp/iter; fi
# find $src_file_list -type f | xargs ls -lR > /tmp/src-ls-$iter # find $src_file_list -name "*.h" | xargs ls -l > /tmp/src-ls-$iter
# find $obj_file_list -type f | xargs ls -lR > /tmp/obj-ls-$iter # find $obj_file_list -name "*.h" | xargs ls -l > /tmp/obj-ls-$iter
# include/generated/compile.h is ignored because it is touched even when none # include/generated/compile.h is ignored because it is touched even when none
# of the source files changed. This causes pointless regeneration, so let us # of the source files changed. This causes pointless regeneration, so let us
# ignore them for md5 calculation. # ignore them for md5 calculation.
pushd $kroot > /dev/null pushd $srctree > /dev/null
src_files_md5="$(find $src_file_list -type f | src_files_md5="$(find $dir_list -name "*.h" |
grep -v "include/generated/compile.h" | grep -v "include/generated/compile.h" |
grep -v "include/generated/autoconf.h" | grep -v "include/generated/autoconf.h" |
grep -v "include/config/auto.conf" | xargs ls -l | md5sum | cut -d ' ' -f1)"
grep -v "include/config/auto.conf.cmd" |
grep -v "include/config/tristate.conf" |
xargs ls -lR | md5sum | cut -d ' ' -f1)"
popd > /dev/null popd > /dev/null
obj_files_md5="$(find $obj_file_list -type f | obj_files_md5="$(find $dir_list -name "*.h" |
grep -v "include/generated/compile.h" | grep -v "include/generated/compile.h" |
grep -v "include/generated/autoconf.h" | grep -v "include/generated/autoconf.h" |
grep -v "include/config/auto.conf" | xargs ls -l | md5sum | cut -d ' ' -f1)"
grep -v "include/config/auto.conf.cmd" | # Any changes to this script will also cause a rebuild of the archive.
grep -v "include/config/tristate.conf" | this_file_md5="$(ls -l $sfile | md5sum | cut -d ' ' -f1)"
xargs ls -lR | md5sum | cut -d ' ' -f1)"
if [ -f $tarfile ]; then tarfile_md5="$(md5sum $tarfile | cut -d ' ' -f1)"; fi if [ -f $tarfile ]; then tarfile_md5="$(md5sum $tarfile | cut -d ' ' -f1)"; fi
if [ -f kernel/kheaders.md5 ] && if [ -f kernel/kheaders.md5 ] &&
[ "$(cat kernel/kheaders.md5|head -1)" == "$src_files_md5" ] && [ "$(cat kernel/kheaders.md5|head -1)" == "$src_files_md5" ] &&
[ "$(cat kernel/kheaders.md5|head -2|tail -1)" == "$obj_files_md5" ] && [ "$(cat kernel/kheaders.md5|head -2|tail -1)" == "$obj_files_md5" ] &&
[ "$(cat kernel/kheaders.md5|head -3|tail -1)" == "$this_file_md5" ] &&
[ "$(cat kernel/kheaders.md5|tail -1)" == "$tarfile_md5" ]; then [ "$(cat kernel/kheaders.md5|tail -1)" == "$tarfile_md5" ]; then
exit exit
fi fi
...@@ -71,16 +55,16 @@ fi ...@@ -71,16 +55,16 @@ fi
rm -rf $cpio_dir rm -rf $cpio_dir
mkdir $cpio_dir mkdir $cpio_dir
pushd $kroot > /dev/null pushd $srctree > /dev/null
for f in $src_file_list; for f in $dir_list;
do find "$f" ! -name "*.cmd" ! -name ".*"; do find "$f" -name "*.h";
done | cpio --quiet -pd $cpio_dir done | cpio --quiet -pd $cpio_dir
popd > /dev/null popd > /dev/null
# The second CPIO can complain if files already exist which can # The second CPIO can complain if files already exist which can
# happen with out of tree builds. Just silence CPIO for now. # happen with out of tree builds. Just silence CPIO for now.
for f in $obj_file_list; for f in $dir_list;
do find "$f" ! -name "*.cmd" ! -name ".*"; do find "$f" -name "*.h";
done | cpio --quiet -pd $cpio_dir >/dev/null 2>&1 done | cpio --quiet -pd $cpio_dir >/dev/null 2>&1
# Remove comments except SDPX lines # Remove comments except SDPX lines
...@@ -91,6 +75,7 @@ tar -Jcf $tarfile -C $cpio_dir/ . > /dev/null ...@@ -91,6 +75,7 @@ tar -Jcf $tarfile -C $cpio_dir/ . > /dev/null
echo "$src_files_md5" > kernel/kheaders.md5 echo "$src_files_md5" > kernel/kheaders.md5
echo "$obj_files_md5" >> kernel/kheaders.md5 echo "$obj_files_md5" >> kernel/kheaders.md5
echo "$this_file_md5" >> kernel/kheaders.md5
echo "$(md5sum $tarfile | cut -d ' ' -f1)" >> kernel/kheaders.md5 echo "$(md5sum $tarfile | cut -d ' ' -f1)" >> kernel/kheaders.md5
rm -rf $cpio_dir rm -rf $cpio_dir
...@@ -305,19 +305,26 @@ config DEBUG_FS ...@@ -305,19 +305,26 @@ config DEBUG_FS
If unsure, say N. If unsure, say N.
config HEADERS_CHECK config HEADERS_INSTALL
bool "Run 'make headers_check' when building vmlinux" bool "Install uapi headers to usr/include"
depends on !UML depends on !UML
help help
This option will extract the user-visible kernel headers whenever This option will install uapi headers (headers exported to user-space)
building the kernel, and will run basic sanity checks on them to into the usr/include directory for use during the kernel build.
ensure that exported files do not attempt to include files which This is unneeded for building the kernel itself, but needed for some
were not exported, etc. user-space program samples. It is also needed by some features such
as uapi header sanity checks.
config HEADERS_CHECK
bool "Run sanity checks on uapi headers when building 'all'"
depends on HEADERS_INSTALL
help
This option will run basic sanity checks on uapi headers when
building the 'all' target, for example, ensure that they do not
attempt to include files which were not exported, etc.
If you're making modifications to header files which are If you're making modifications to header files which are
relevant for userspace, say 'Y', and check the headers relevant for userspace, say 'Y'.
exported to $(INSTALL_HDR_PATH) (usually 'usr/include' in
your build tree), to make sure they're suitable.
config OPTIMIZE_INLINING config OPTIMIZE_INLINING
bool "Allow compiler to uninline functions marked 'inline'" bool "Allow compiler to uninline functions marked 'inline'"
......
...@@ -12,9 +12,6 @@ raid6_pq-$(CONFIG_S390) += s390vx8.o recov_s390xc.o ...@@ -12,9 +12,6 @@ raid6_pq-$(CONFIG_S390) += s390vx8.o recov_s390xc.o
hostprogs-y += mktables hostprogs-y += mktables
quiet_cmd_unroll = UNROLL $@
cmd_unroll = $(AWK) -f$(srctree)/$(src)/unroll.awk -vN=$(UNROLL) < $< > $@
ifeq ($(CONFIG_ALTIVEC),y) ifeq ($(CONFIG_ALTIVEC),y)
altivec_flags := -maltivec $(call cc-option,-mabi=altivec) altivec_flags := -maltivec $(call cc-option,-mabi=altivec)
...@@ -26,7 +23,6 @@ CFLAGS_REMOVE_altivec1.o += -msoft-float ...@@ -26,7 +23,6 @@ CFLAGS_REMOVE_altivec1.o += -msoft-float
CFLAGS_REMOVE_altivec2.o += -msoft-float CFLAGS_REMOVE_altivec2.o += -msoft-float
CFLAGS_REMOVE_altivec4.o += -msoft-float CFLAGS_REMOVE_altivec4.o += -msoft-float
CFLAGS_REMOVE_altivec8.o += -msoft-float CFLAGS_REMOVE_altivec8.o += -msoft-float
CFLAGS_REMOVE_altivec8.o += -msoft-float
CFLAGS_REMOVE_vpermxor1.o += -msoft-float CFLAGS_REMOVE_vpermxor1.o += -msoft-float
CFLAGS_REMOVE_vpermxor2.o += -msoft-float CFLAGS_REMOVE_vpermxor2.o += -msoft-float
CFLAGS_REMOVE_vpermxor4.o += -msoft-float CFLAGS_REMOVE_vpermxor4.o += -msoft-float
...@@ -51,111 +47,39 @@ CFLAGS_REMOVE_neon8.o += -mgeneral-regs-only ...@@ -51,111 +47,39 @@ CFLAGS_REMOVE_neon8.o += -mgeneral-regs-only
endif endif
endif endif
targets += int1.c quiet_cmd_unroll = UNROLL $@
$(obj)/int1.c: UNROLL := 1 cmd_unroll = $(AWK) -f$(srctree)/$(src)/unroll.awk -vN=$* < $< > $@
$(obj)/int1.c: $(src)/int.uc $(src)/unroll.awk FORCE
$(call if_changed,unroll)
targets += int2.c
$(obj)/int2.c: UNROLL := 2
$(obj)/int2.c: $(src)/int.uc $(src)/unroll.awk FORCE
$(call if_changed,unroll)
targets += int4.c
$(obj)/int4.c: UNROLL := 4
$(obj)/int4.c: $(src)/int.uc $(src)/unroll.awk FORCE
$(call if_changed,unroll)
targets += int8.c
$(obj)/int8.c: UNROLL := 8
$(obj)/int8.c: $(src)/int.uc $(src)/unroll.awk FORCE
$(call if_changed,unroll)
targets += int16.c
$(obj)/int16.c: UNROLL := 16
$(obj)/int16.c: $(src)/int.uc $(src)/unroll.awk FORCE
$(call if_changed,unroll)
targets += int32.c targets += int1.c int2.c int4.c int8.c int16.c int32.c
$(obj)/int32.c: UNROLL := 32 $(obj)/int%.c: $(src)/int.uc $(src)/unroll.awk FORCE
$(obj)/int32.c: $(src)/int.uc $(src)/unroll.awk FORCE
$(call if_changed,unroll) $(call if_changed,unroll)
CFLAGS_altivec1.o += $(altivec_flags) CFLAGS_altivec1.o += $(altivec_flags)
targets += altivec1.c
$(obj)/altivec1.c: UNROLL := 1
$(obj)/altivec1.c: $(src)/altivec.uc $(src)/unroll.awk FORCE
$(call if_changed,unroll)
CFLAGS_altivec2.o += $(altivec_flags) CFLAGS_altivec2.o += $(altivec_flags)
targets += altivec2.c
$(obj)/altivec2.c: UNROLL := 2
$(obj)/altivec2.c: $(src)/altivec.uc $(src)/unroll.awk FORCE
$(call if_changed,unroll)
CFLAGS_altivec4.o += $(altivec_flags) CFLAGS_altivec4.o += $(altivec_flags)
targets += altivec4.c
$(obj)/altivec4.c: UNROLL := 4
$(obj)/altivec4.c: $(src)/altivec.uc $(src)/unroll.awk FORCE
$(call if_changed,unroll)
CFLAGS_altivec8.o += $(altivec_flags) CFLAGS_altivec8.o += $(altivec_flags)
targets += altivec8.c targets += altivec1.c altivec2.c altivec4.c altivec8.c
$(obj)/altivec8.c: UNROLL := 8 $(obj)/altivec%.c: $(src)/altivec.uc $(src)/unroll.awk FORCE
$(obj)/altivec8.c: $(src)/altivec.uc $(src)/unroll.awk FORCE
$(call if_changed,unroll) $(call if_changed,unroll)
CFLAGS_vpermxor1.o += $(altivec_flags) CFLAGS_vpermxor1.o += $(altivec_flags)
targets += vpermxor1.c
$(obj)/vpermxor1.c: UNROLL := 1
$(obj)/vpermxor1.c: $(src)/vpermxor.uc $(src)/unroll.awk FORCE
$(call if_changed,unroll)
CFLAGS_vpermxor2.o += $(altivec_flags) CFLAGS_vpermxor2.o += $(altivec_flags)
targets += vpermxor2.c
$(obj)/vpermxor2.c: UNROLL := 2
$(obj)/vpermxor2.c: $(src)/vpermxor.uc $(src)/unroll.awk FORCE
$(call if_changed,unroll)
CFLAGS_vpermxor4.o += $(altivec_flags) CFLAGS_vpermxor4.o += $(altivec_flags)
targets += vpermxor4.c
$(obj)/vpermxor4.c: UNROLL := 4
$(obj)/vpermxor4.c: $(src)/vpermxor.uc $(src)/unroll.awk FORCE
$(call if_changed,unroll)
CFLAGS_vpermxor8.o += $(altivec_flags) CFLAGS_vpermxor8.o += $(altivec_flags)
targets += vpermxor8.c targets += vpermxor1.o vpermxor2.o vpermxor4.o vpermxor8.o
$(obj)/vpermxor8.c: UNROLL := 8 $(obj)/vpermxor%.c: $(src)/vpermxor.uc $(src)/unroll.awk FORCE
$(obj)/vpermxor8.c: $(src)/vpermxor.uc $(src)/unroll.awk FORCE
$(call if_changed,unroll) $(call if_changed,unroll)
CFLAGS_neon1.o += $(NEON_FLAGS) CFLAGS_neon1.o += $(NEON_FLAGS)
targets += neon1.c
$(obj)/neon1.c: UNROLL := 1
$(obj)/neon1.c: $(src)/neon.uc $(src)/unroll.awk FORCE
$(call if_changed,unroll)
CFLAGS_neon2.o += $(NEON_FLAGS) CFLAGS_neon2.o += $(NEON_FLAGS)
targets += neon2.c
$(obj)/neon2.c: UNROLL := 2
$(obj)/neon2.c: $(src)/neon.uc $(src)/unroll.awk FORCE
$(call if_changed,unroll)
CFLAGS_neon4.o += $(NEON_FLAGS) CFLAGS_neon4.o += $(NEON_FLAGS)
targets += neon4.c
$(obj)/neon4.c: UNROLL := 4
$(obj)/neon4.c: $(src)/neon.uc $(src)/unroll.awk FORCE
$(call if_changed,unroll)
CFLAGS_neon8.o += $(NEON_FLAGS) CFLAGS_neon8.o += $(NEON_FLAGS)
targets += neon8.c targets += neon1.c neon2.c neon4.c neon8.c
$(obj)/neon8.c: UNROLL := 8 $(obj)/neon%.c: $(src)/neon.uc $(src)/unroll.awk FORCE
$(obj)/neon8.c: $(src)/neon.uc $(src)/unroll.awk FORCE
$(call if_changed,unroll) $(call if_changed,unroll)
targets += s390vx8.c targets += s390vx8.c
$(obj)/s390vx8.c: UNROLL := 8 $(obj)/s390vx%.c: $(src)/s390vx.uc $(src)/unroll.awk FORCE
$(obj)/s390vx8.c: $(src)/s390vx.uc $(src)/unroll.awk FORCE
$(call if_changed,unroll) $(call if_changed,unroll)
quiet_cmd_mktable = TABLE $@ quiet_cmd_mktable = TABLE $@
......
...@@ -9,7 +9,7 @@ menuconfig BPFILTER ...@@ -9,7 +9,7 @@ menuconfig BPFILTER
if BPFILTER if BPFILTER
config BPFILTER_UMH config BPFILTER_UMH
tristate "bpfilter kernel module with user mode helper" tristate "bpfilter kernel module with user mode helper"
depends on $(success,$(srctree)/scripts/cc-can-link.sh $(CC)) depends on CC_CAN_LINK
default m default m
help help
This builds bpfilter kernel module with embedded user mode helper This builds bpfilter kernel module with embedded user mode helper
......
# SPDX-License-Identifier: GPL-2.0-only # SPDX-License-Identifier: GPL-2.0-only
menuconfig SAMPLES menuconfig SAMPLES
bool "Sample kernel code" bool "Sample kernel code"
depends on !UML
help help
You can build and test sample kernel code here. You can build and test sample kernel code here.
...@@ -95,16 +94,24 @@ config SAMPLE_CONFIGFS ...@@ -95,16 +94,24 @@ config SAMPLE_CONFIGFS
config SAMPLE_CONNECTOR config SAMPLE_CONNECTOR
tristate "Build connector sample -- loadable modules only" tristate "Build connector sample -- loadable modules only"
depends on CONNECTOR && m depends on CONNECTOR && HEADERS_INSTALL && m
help help
When enabled, this builds both a sample kernel module for When enabled, this builds both a sample kernel module for
the connector interface and a user space tool to communicate the connector interface and a user space tool to communicate
with it. with it.
See also Documentation/connector/connector.txt See also Documentation/connector/connector.txt
config SAMPLE_HIDRAW
bool "hidraw sample"
depends on HEADERS_INSTALL
config SAMPLE_PIDFD
bool "pidfd sample"
depends on HEADERS_INSTALL
config SAMPLE_SECCOMP config SAMPLE_SECCOMP
bool "Build seccomp sample code" bool "Build seccomp sample code"
depends on SECCOMP_FILTER depends on SECCOMP_FILTER && HEADERS_INSTALL
help help
Build samples of seccomp filters using various methods of Build samples of seccomp filters using various methods of
BPF filter construction. BPF filter construction.
...@@ -156,6 +163,7 @@ config SAMPLE_ANDROID_BINDERFS ...@@ -156,6 +163,7 @@ config SAMPLE_ANDROID_BINDERFS
config SAMPLE_VFS config SAMPLE_VFS
bool "Build example programs that use new VFS system calls" bool "Build example programs that use new VFS system calls"
depends on HEADERS_INSTALL
help help
Build example userspace programs that use new VFS system calls such Build example userspace programs that use new VFS system calls such
as mount API and statx(). Note that this is restricted to the x86 as mount API and statx(). Note that this is restricted to the x86
......
...@@ -4,14 +4,14 @@ ...@@ -4,14 +4,14 @@
obj-$(CONFIG_SAMPLE_ANDROID_BINDERFS) += binderfs/ obj-$(CONFIG_SAMPLE_ANDROID_BINDERFS) += binderfs/
obj-$(CONFIG_SAMPLE_CONFIGFS) += configfs/ obj-$(CONFIG_SAMPLE_CONFIGFS) += configfs/
obj-$(CONFIG_SAMPLE_CONNECTOR) += connector/ obj-$(CONFIG_SAMPLE_CONNECTOR) += connector/
subdir-y += hidraw subdir-$(CONFIG_SAMPLE_HIDRAW) += hidraw
obj-$(CONFIG_SAMPLE_HW_BREAKPOINT) += hw_breakpoint/ obj-$(CONFIG_SAMPLE_HW_BREAKPOINT) += hw_breakpoint/
obj-$(CONFIG_SAMPLE_KDB) += kdb/ obj-$(CONFIG_SAMPLE_KDB) += kdb/
obj-$(CONFIG_SAMPLE_KFIFO) += kfifo/ obj-$(CONFIG_SAMPLE_KFIFO) += kfifo/
obj-$(CONFIG_SAMPLE_KOBJECT) += kobject/ obj-$(CONFIG_SAMPLE_KOBJECT) += kobject/
obj-$(CONFIG_SAMPLE_KPROBES) += kprobes/ obj-$(CONFIG_SAMPLE_KPROBES) += kprobes/
obj-$(CONFIG_SAMPLE_LIVEPATCH) += livepatch/ obj-$(CONFIG_SAMPLE_LIVEPATCH) += livepatch/
subdir-y += pidfd subdir-$(CONFIG_SAMPLE_PIDFD) += pidfd
obj-$(CONFIG_SAMPLE_QMI_CLIENT) += qmi/ obj-$(CONFIG_SAMPLE_QMI_CLIENT) += qmi/
obj-$(CONFIG_SAMPLE_RPMSG_CLIENT) += rpmsg/ obj-$(CONFIG_SAMPLE_RPMSG_CLIENT) += rpmsg/
subdir-$(CONFIG_SAMPLE_SECCOMP) += seccomp subdir-$(CONFIG_SAMPLE_SECCOMP) += seccomp
......
...@@ -79,8 +79,8 @@ endef ...@@ -79,8 +79,8 @@ endef
# would try to directly execute the shell builtin 'command'. This workaround # would try to directly execute the shell builtin 'command'. This workaround
# should be kept for a long time since this issue was fixed only after the # should be kept for a long time since this issue was fixed only after the
# GNU Make 4.2.1 release. # GNU Make 4.2.1 release.
cc-cross-prefix = $(firstword $(foreach c, $(filter-out -%, $(1)), \ cc-cross-prefix = $(firstword $(foreach c, $(1), \
$(if $(shell command -v $(c)gcc 2>/dev/null), $(c)))) $(if $(shell command -v -- $(c)gcc 2>/dev/null), $(c))))
# output directory for tests below # output directory for tests below
TMPOUT := $(if $(KBUILD_EXTMOD),$(firstword $(KBUILD_EXTMOD))/) TMPOUT := $(if $(KBUILD_EXTMOD),$(firstword $(KBUILD_EXTMOD))/)
...@@ -187,12 +187,6 @@ dtbinst := -f $(srctree)/scripts/Makefile.dtbinst obj ...@@ -187,12 +187,6 @@ dtbinst := -f $(srctree)/scripts/Makefile.dtbinst obj
# $(Q)$(MAKE) $(clean)=dir # $(Q)$(MAKE) $(clean)=dir
clean := -f $(srctree)/scripts/Makefile.clean obj clean := -f $(srctree)/scripts/Makefile.clean obj
###
# Shorthand for $(Q)$(MAKE) -f scripts/Makefile.headersinst obj=
# Usage:
# $(Q)$(MAKE) $(hdr-inst)=dir
hdr-inst := -f $(srctree)/scripts/Makefile.headersinst obj
# echo command. # echo command.
# Short version is used, if $(quiet) equals `quiet_', otherwise full one. # Short version is used, if $(quiet) equals `quiet_', otherwise full one.
echo-cmd = $(if $($(quiet)cmd_$(1)),\ echo-cmd = $(if $($(quiet)cmd_$(1)),\
...@@ -213,12 +207,12 @@ objectify = $(foreach o,$(1),$(if $(filter /%,$(o)),$(o),$(obj)/$(o))) ...@@ -213,12 +207,12 @@ objectify = $(foreach o,$(1),$(if $(filter /%,$(o)),$(o),$(obj)/$(o)))
# See Documentation/kbuild/makefiles.rst for more info # See Documentation/kbuild/makefiles.rst for more info
ifneq ($(KBUILD_NOCMDDEP),1) ifneq ($(KBUILD_NOCMDDEP),1)
# Check if both arguments are the same including their order. Result is empty # Check if both commands are the same including their order. Result is empty
# string if equal. User may override this check using make KBUILD_NOCMDDEP=1 # string if equal. User may override this check using make KBUILD_NOCMDDEP=1
arg-check = $(filter-out $(subst $(space),$(space_escape),$(strip $(cmd_$@))), \ cmd-check = $(filter-out $(subst $(space),$(space_escape),$(strip $(cmd_$@))), \
$(subst $(space),$(space_escape),$(strip $(cmd_$1)))) $(subst $(space),$(space_escape),$(strip $(cmd_$1))))
else else
arg-check = $(if $(strip $(cmd_$@)),,1) cmd-check = $(if $(strip $(cmd_$@)),,1)
endif endif
# Replace >$< with >$$< to preserve $ when reloading the .cmd file # Replace >$< with >$$< to preserve $ when reloading the .cmd file
...@@ -231,15 +225,15 @@ make-cmd = $(call escsq,$(subst $(pound),$$(pound),$(subst $$,$$$$,$(cmd_$(1)))) ...@@ -231,15 +225,15 @@ make-cmd = $(call escsq,$(subst $(pound),$$(pound),$(subst $$,$$$$,$(cmd_$(1))))
# Find any prerequisites that is newer than target or that does not exist. # Find any prerequisites that is newer than target or that does not exist.
# PHONY targets skipped in both cases. # PHONY targets skipped in both cases.
any-prereq = $(filter-out $(PHONY),$?) $(filter-out $(PHONY) $(wildcard $^),$^) any-prereq = $(filter-out $(PHONY),$?)$(filter-out $(PHONY) $(wildcard $^),$^)
# Execute command if command has changed or prerequisite(s) are updated. # Execute command if command has changed or prerequisite(s) are updated.
if_changed = $(if $(strip $(any-prereq) $(arg-check)), \ if_changed = $(if $(any-prereq)$(cmd-check), \
$(cmd); \ $(cmd); \
printf '%s\n' 'cmd_$@ := $(make-cmd)' > $(dot-target).cmd, @:) printf '%s\n' 'cmd_$@ := $(make-cmd)' > $(dot-target).cmd, @:)
# Execute the command and also postprocess generated .d dependencies file. # Execute the command and also postprocess generated .d dependencies file.
if_changed_dep = $(if $(strip $(any-prereq) $(arg-check)),$(cmd_and_fixdep),@:) if_changed_dep = $(if $(any-prereq)$(cmd-check),$(cmd_and_fixdep),@:)
cmd_and_fixdep = \ cmd_and_fixdep = \
$(cmd); \ $(cmd); \
...@@ -249,7 +243,7 @@ cmd_and_fixdep = \ ...@@ -249,7 +243,7 @@ cmd_and_fixdep = \
# Usage: $(call if_changed_rule,foo) # Usage: $(call if_changed_rule,foo)
# Will check if $(cmd_foo) or any of the prerequisites changed, # Will check if $(cmd_foo) or any of the prerequisites changed,
# and if so will execute $(rule_foo). # and if so will execute $(rule_foo).
if_changed_rule = $(if $(strip $(any-prereq) $(arg-check)),$(rule_$(1)),@:) if_changed_rule = $(if $(any-prereq)$(cmd-check),$(rule_$(1)),@:)
### ###
# why - tell why a target got built # why - tell why a target got built
...@@ -274,8 +268,8 @@ ifeq ($(KBUILD_VERBOSE),2) ...@@ -274,8 +268,8 @@ ifeq ($(KBUILD_VERBOSE),2)
why = \ why = \
$(if $(filter $@, $(PHONY)),- due to target is PHONY, \ $(if $(filter $@, $(PHONY)),- due to target is PHONY, \
$(if $(wildcard $@), \ $(if $(wildcard $@), \
$(if $(strip $(any-prereq)),- due to: $(any-prereq), \ $(if $(any-prereq),- due to: $(any-prereq), \
$(if $(arg-check), \ $(if $(cmd-check), \
$(if $(cmd_$@),- due to command line change, \ $(if $(cmd_$@),- due to command line change, \
$(if $(filter $@, $(targets)), \ $(if $(filter $@, $(targets)), \
- due to missing .cmd file, \ - due to missing .cmd file, \
......
...@@ -31,11 +31,6 @@ always := $(hostprogs-y) $(hostprogs-m) ...@@ -31,11 +31,6 @@ always := $(hostprogs-y) $(hostprogs-m)
# The following hostprogs-y programs are only build on demand # The following hostprogs-y programs are only build on demand
hostprogs-y += unifdef hostprogs-y += unifdef
# These targets are used internally to avoid "is up to date" messages
PHONY += build_unifdef
build_unifdef: $(obj)/unifdef
@:
subdir-$(CONFIG_GCC_PLUGINS) += gcc-plugins subdir-$(CONFIG_GCC_PLUGINS) += gcc-plugins
subdir-$(CONFIG_MODVERSIONS) += genksyms subdir-$(CONFIG_MODVERSIONS) += genksyms
subdir-$(CONFIG_SECURITY_SELINUX) += selinux subdir-$(CONFIG_SECURITY_SELINUX) += selinux
......
...@@ -294,6 +294,15 @@ quiet_cmd_cc_lst_c = MKLST $@ ...@@ -294,6 +294,15 @@ quiet_cmd_cc_lst_c = MKLST $@
$(obj)/%.lst: $(src)/%.c FORCE $(obj)/%.lst: $(src)/%.c FORCE
$(call if_changed_dep,cc_lst_c) $(call if_changed_dep,cc_lst_c)
# header test (header-test-y target)
# ---------------------------------------------------------------------------
quiet_cmd_cc_s_h = CC $@
cmd_cc_s_h = $(CC) $(c_flags) -S -o $@ -x c /dev/null -include $<
$(obj)/%.h.s: $(src)/%.h FORCE
$(call if_changed_dep,cc_s_h)
# Compile assembler sources (.S) # Compile assembler sources (.S)
# --------------------------------------------------------------------------- # ---------------------------------------------------------------------------
...@@ -504,7 +513,7 @@ existing-targets := $(wildcard $(sort $(targets))) ...@@ -504,7 +513,7 @@ existing-targets := $(wildcard $(sort $(targets)))
-include $(foreach f,$(existing-targets),$(dir $(f)).$(notdir $(f)).cmd) -include $(foreach f,$(existing-targets),$(dir $(f)).$(notdir $(f)).cmd)
ifneq ($(srctree),.) ifdef building_out_of_srctree
# Create directories for object files if they do not exist # Create directories for object files if they do not exist
obj-dirs := $(sort $(obj) $(patsubst %/,%, $(dir $(targets)))) obj-dirs := $(sort $(obj) $(patsubst %/,%, $(dir $(targets))))
# If targets exist, their directories apparently exist. Skip mkdir. # If targets exist, their directories apparently exist. Skip mkdir.
......
...@@ -34,7 +34,6 @@ warning-1 += $(call cc-option, -Wstringop-truncation) ...@@ -34,7 +34,6 @@ warning-1 += $(call cc-option, -Wstringop-truncation)
warning-1 += -Wno-missing-field-initializers warning-1 += -Wno-missing-field-initializers
warning-1 += -Wno-sign-compare warning-1 += -Wno-sign-compare
warning-2 := -Waggregate-return
warning-2 += -Wcast-align warning-2 += -Wcast-align
warning-2 += -Wdisabled-optimization warning-2 += -Wdisabled-optimization
warning-2 += -Wnested-externs warning-2 += -Wnested-externs
...@@ -68,10 +67,8 @@ else ...@@ -68,10 +67,8 @@ else
ifdef CONFIG_CC_IS_CLANG ifdef CONFIG_CC_IS_CLANG
KBUILD_CFLAGS += -Wno-initializer-overrides KBUILD_CFLAGS += -Wno-initializer-overrides
KBUILD_CFLAGS += -Wno-unused-value
KBUILD_CFLAGS += -Wno-format KBUILD_CFLAGS += -Wno-format
KBUILD_CFLAGS += -Wno-sign-compare KBUILD_CFLAGS += -Wno-sign-compare
KBUILD_CFLAGS += -Wno-format-zero-length KBUILD_CFLAGS += -Wno-format-zero-length
KBUILD_CFLAGS += -Wno-uninitialized
endif endif
endif endif
...@@ -14,109 +14,89 @@ __headers: ...@@ -14,109 +14,89 @@ __headers:
include scripts/Kbuild.include include scripts/Kbuild.include
srcdir := $(srctree)/$(obj) src := $(srctree)/$(obj)
gen := $(objtree)/$(subst include/,include/generated/,$(obj))
dst := usr/include
# When make is run under a fakechroot environment, the function -include $(src)/Kbuild
# $(wildcard $(srcdir)/*/.) doesn't only return directories, but also regular
# files. So, we are using a combination of sort/dir/wildcard which works
# with fakechroot.
subdirs := $(patsubst $(srcdir)/%/,%,\
$(filter-out $(srcdir)/,\
$(sort $(dir $(wildcard $(srcdir)/*/)))))
# Recursion # $(filter %/, ...) is a workaround for GNU Make <= 4.2.1, where
__headers: $(subdirs) # $(wildcard $(src)/*/) contains not only directories but also regular files.
src-subdirs := $(patsubst $(src)/%/,%,$(filter %/, $(wildcard $(src)/*/)))
gen-subdirs := $(patsubst $(gen)/%/,%,$(filter %/, $(wildcard $(gen)/*/)))
all-subdirs := $(sort $(src-subdirs) $(gen-subdirs))
PHONY += $(subdirs) src-headers := $(if $(src-subdirs), $(shell cd $(src) && find $(src-subdirs) -name '*.h'))
$(subdirs): src-headers := $(filter-out $(no-export-headers), $(src-headers))
$(Q)$(MAKE) $(hdr-inst)=$(obj)/$@ dst=$(dst)/$@ gen-headers := $(if $(gen-subdirs), $(shell cd $(gen) && find $(gen-subdirs) -name '*.h'))
gen-headers := $(filter-out $(no-export-headers), $(gen-headers))
# Skip header install/check for include/uapi and arch/$(SRCARCH)/include/uapi. # If the same header is exported from source and generated directories,
# We have only sub-directories there. # the former takes precedence, but this should be warned.
skip-inst := $(if $(filter %/uapi,$(obj)),1) duplicated := $(filter $(gen-headers), $(src-headers))
$(if $(duplicated), $(warning duplicated header export: $(duplicated)))
ifeq ($(skip-inst),) gen-headers := $(filter-out $(duplicated), $(gen-headers))
# Kbuild file is optional # Add dst path prefix
kbuild-file := $(srctree)/$(obj)/Kbuild all-subdirs := $(addprefix $(dst)/, $(all-subdirs))
-include $(kbuild-file) src-headers := $(addprefix $(dst)/, $(src-headers))
gen-headers := $(addprefix $(dst)/, $(gen-headers))
all-headers := $(src-headers) $(gen-headers)
installdir := $(INSTALL_HDR_PATH)/$(dst) # Work out what needs to be removed
gendir := $(objtree)/$(subst include/,include/generated/,$(obj)) old-subdirs := $(wildcard $(all-subdirs))
header-files := $(notdir $(wildcard $(srcdir)/*.h)) old-headers := $(if $(old-subdirs),$(shell find $(old-subdirs) -name '*.h'))
header-files := $(filter-out $(no-export-headers), $(header-files)) unwanted := $(filter-out $(all-headers), $(old-headers))
genhdr-files := $(notdir $(wildcard $(gendir)/*.h))
genhdr-files := $(filter-out $(header-files), $(genhdr-files))
# files used to track state of install/check # Create directories
install-file := $(installdir)/.install existing-dirs := $(sort $(dir $(old-headers)))
check-file := $(installdir)/.check wanted-dirs := $(sort $(dir $(all-headers)))
new-dirs := $(filter-out $(existing-dirs), $(wanted-dirs))
$(if $(new-dirs), $(shell mkdir -p $(new-dirs)))
# all headers files for this dir # Rules
all-files := $(header-files) $(genhdr-files)
output-files := $(addprefix $(installdir)/, $(all-files))
# Work out what needs to be removed ifndef HDRCHECK
oldheaders := $(patsubst $(installdir)/%,%,$(wildcard $(installdir)/*.h))
unwanted := $(filter-out $(all-files),$(oldheaders))
# Prefix unwanted with full paths to $(INSTALL_HDR_PATH) quiet_cmd_install = HDRINST $@
unwanted-file := $(addprefix $(installdir)/, $(unwanted)) cmd_install = $(CONFIG_SHELL) $(srctree)/scripts/headers_install.sh $< $@
printdir = $(patsubst $(INSTALL_HDR_PATH)/%/,%,$(dir $@)) $(src-headers): $(dst)/%.h: $(src)/%.h $(srctree)/scripts/headers_install.sh FORCE
$(call if_changed,install)
quiet_cmd_install = INSTALL $(printdir) ($(words $(all-files))\ $(gen-headers): $(dst)/%.h: $(gen)/%.h $(srctree)/scripts/headers_install.sh FORCE
file$(if $(word 2, $(all-files)),s)) $(call if_changed,install)
cmd_install = \
$(CONFIG_SHELL) $< $(installdir) $(srcdir) $(header-files); \
$(CONFIG_SHELL) $< $(installdir) $(gendir) $(genhdr-files); \
touch $@
quiet_cmd_remove = REMOVE $(unwanted) quiet_cmd_remove = REMOVE $(unwanted)
cmd_remove = rm -f $(unwanted-file) cmd_remove = rm -f $(unwanted)
quiet_cmd_check = CHECK $(printdir) ($(words $(all-files)) files)
# Headers list can be pretty long, xargs helps to avoid
# the "Argument list too long" error.
cmd_check = for f in $(all-files); do \
echo "$(installdir)/$${f}"; done \
| xargs \
$(PERL) $< $(INSTALL_HDR_PATH)/include $(SRCARCH); \
touch $@
ifndef HDRCHECK __headers: $(all-headers)
# Rules for installing headers ifneq ($(unwanted),)
__headers: $(install-file) $(call cmd,remove)
endif
@: @:
targets += $(install-file) existing-headers := $(filter $(old-headers), $(all-headers))
$(install-file): scripts/headers_install.sh \
$(addprefix $(srcdir)/,$(header-files)) \ -include $(foreach f,$(existing-headers),$(dir $(f)).$(notdir $(f)).cmd)
$(addprefix $(gendir)/,$(genhdr-files)) FORCE
$(if $(unwanted),$(call cmd,remove),)
$(if $(wildcard $(dir $@)),,$(shell mkdir -p $(dir $@)))
$(call if_changed,install)
else else
__headers: $(check-file)
@:
targets += $(check-file) quiet_cmd_check = HDRCHK $<
$(check-file): scripts/headers_check.pl $(output-files) FORCE cmd_check = $(PERL) $(srctree)/scripts/headers_check.pl $(dst) $(SRCARCH) $<; touch $@
$(call if_changed,check)
endif check-files := $(addsuffix .chk, $(all-headers))
cmd_files := $(wildcard \ $(check-files): $(dst)/%.chk : $(dst)/% $(srctree)/scripts/headers_check.pl
$(foreach f,$(sort $(targets)),$(dir $(f)).$(notdir $(f)).cmd)) $(call cmd,check)
ifneq ($(cmd_files),) __headers: $(check-files)
include $(cmd_files) @:
endif
endif # skip-inst endif
PHONY += FORCE PHONY += FORCE
FORCE: ; FORCE:
.PHONY: $(PHONY) .PHONY: $(PHONY)
...@@ -69,7 +69,7 @@ _hostcxx_flags = $(KBUILD_HOSTCXXFLAGS) $(HOST_EXTRACXXFLAGS) \ ...@@ -69,7 +69,7 @@ _hostcxx_flags = $(KBUILD_HOSTCXXFLAGS) $(HOST_EXTRACXXFLAGS) \
# $(objtree)/$(obj) for including generated headers from checkin source files # $(objtree)/$(obj) for including generated headers from checkin source files
ifeq ($(KBUILD_EXTMOD),) ifeq ($(KBUILD_EXTMOD),)
ifneq ($(srctree),.) ifdef building_out_of_srctree
_hostc_flags += -I $(objtree)/$(obj) _hostc_flags += -I $(objtree)/$(obj)
_hostcxx_flags += -I $(objtree)/$(obj) _hostcxx_flags += -I $(objtree)/$(obj)
endif endif
......
...@@ -66,6 +66,20 @@ extra-y += $(patsubst %.dtb,%.dt.yaml, $(dtb-y)) ...@@ -66,6 +66,20 @@ extra-y += $(patsubst %.dtb,%.dt.yaml, $(dtb-y))
extra-$(CONFIG_OF_ALL_DTBS) += $(patsubst %.dtb,%.dt.yaml, $(dtb-)) extra-$(CONFIG_OF_ALL_DTBS) += $(patsubst %.dtb,%.dt.yaml, $(dtb-))
endif endif
# Test self-contained headers
# Wildcard searches in $(srctree)/$(src)/, but not in $(objtree)/$(obj)/.
# Stale generated headers are often left over, so pattern matching should
# be avoided. Please notice $(srctree)/$(src)/ and $(objtree)/$(obj) point
# to the same location for in-tree building. So, header-test-pattern-y should
# be used with care.
header-test-y += $(filter-out $(header-test-), \
$(patsubst $(srctree)/$(src)/%, %, \
$(wildcard $(addprefix $(srctree)/$(src)/, \
$(header-test-pattern-y)))))
extra-$(CONFIG_HEADER_TEST) += $(addsuffix .s, $(header-test-y))
# Add subdir path # Add subdir path
extra-y := $(addprefix $(obj)/,$(extra-y)) extra-y := $(addprefix $(obj)/,$(extra-y))
...@@ -140,7 +154,7 @@ endif ...@@ -140,7 +154,7 @@ endif
# $(srctree)/$(src) for including checkin headers from generated source files # $(srctree)/$(src) for including checkin headers from generated source files
# $(objtree)/$(obj) for including generated headers from checkin source files # $(objtree)/$(obj) for including generated headers from checkin source files
ifeq ($(KBUILD_EXTMOD),) ifeq ($(KBUILD_EXTMOD),)
ifneq ($(srctree),.) ifdef building_out_of_srctree
_c_flags += -I $(srctree)/$(src) -I $(objtree)/$(obj) _c_flags += -I $(srctree)/$(src) -I $(objtree)/$(obj)
_a_flags += -I $(srctree)/$(src) -I $(objtree)/$(obj) _a_flags += -I $(srctree)/$(src) -I $(objtree)/$(obj)
_cpp_flags += -I $(srctree)/$(src) -I $(objtree)/$(obj) _cpp_flags += -I $(srctree)/$(src) -I $(objtree)/$(obj)
...@@ -331,19 +345,19 @@ printf "%08x\n" $$dec_size | \ ...@@ -331,19 +345,19 @@ printf "%08x\n" $$dec_size | \
) )
quiet_cmd_bzip2 = BZIP2 $@ quiet_cmd_bzip2 = BZIP2 $@
cmd_bzip2 = { cat $(real-prereqs) | bzip2 -9 && $(size_append); } > $@ cmd_bzip2 = { cat $(real-prereqs) | bzip2 -9; $(size_append); } > $@
# Lzma # Lzma
# --------------------------------------------------------------------------- # ---------------------------------------------------------------------------
quiet_cmd_lzma = LZMA $@ quiet_cmd_lzma = LZMA $@
cmd_lzma = { cat $(real-prereqs) | lzma -9 && $(size_append); } > $@ cmd_lzma = { cat $(real-prereqs) | lzma -9; $(size_append); } > $@
quiet_cmd_lzo = LZO $@ quiet_cmd_lzo = LZO $@
cmd_lzo = { cat $(real-prereqs) | lzop -9 && $(size_append); } > $@ cmd_lzo = { cat $(real-prereqs) | lzop -9; $(size_append); } > $@
quiet_cmd_lz4 = LZ4 $@ quiet_cmd_lz4 = LZ4 $@
cmd_lz4 = { cat $(real-prereqs) | lz4c -l -c1 stdin stdout && \ cmd_lz4 = { cat $(real-prereqs) | lz4c -l -c1 stdin stdout; \
$(size_append); } > $@ $(size_append); } > $@
# U-Boot mkimage # U-Boot mkimage
...@@ -386,7 +400,7 @@ quiet_cmd_uimage = UIMAGE $@ ...@@ -386,7 +400,7 @@ quiet_cmd_uimage = UIMAGE $@
# big dictionary would increase the memory usage too much in the multi-call # big dictionary would increase the memory usage too much in the multi-call
# decompression mode. A BCJ filter isn't used either. # decompression mode. A BCJ filter isn't used either.
quiet_cmd_xzkern = XZKERN $@ quiet_cmd_xzkern = XZKERN $@
cmd_xzkern = { cat $(real-prereqs) | sh $(srctree)/scripts/xz_wrap.sh && \ cmd_xzkern = { cat $(real-prereqs) | sh $(srctree)/scripts/xz_wrap.sh; \
$(size_append); } > $@ $(size_append); } > $@
quiet_cmd_xzmisc = XZMISC $@ quiet_cmd_xzmisc = XZMISC $@
......
...@@ -15,7 +15,7 @@ include include/config/tristate.conf ...@@ -15,7 +15,7 @@ include include/config/tristate.conf
include scripts/Kbuild.include include scripts/Kbuild.include
ifneq ($(srctree),.) ifdef building_out_of_srctree
# Create output directory if not already present # Create output directory if not already present
_dummy := $(shell [ -d $(obj) ] || mkdir -p $(obj)) _dummy := $(shell [ -d $(obj) ] || mkdir -p $(obj))
endif endif
......
...@@ -99,6 +99,7 @@ ...@@ -99,6 +99,7 @@
#include <unistd.h> #include <unistd.h>
#include <fcntl.h> #include <fcntl.h>
#include <string.h> #include <string.h>
#include <stdarg.h>
#include <stdlib.h> #include <stdlib.h>
#include <stdio.h> #include <stdio.h>
#include <ctype.h> #include <ctype.h>
...@@ -109,6 +110,36 @@ static void usage(void) ...@@ -109,6 +110,36 @@ static void usage(void)
exit(1); exit(1);
} }
/*
* In the intended usage of this program, the stdout is redirected to .*.cmd
* files. The return value of printf() and putchar() must be checked to catch
* any error, e.g. "No space left on device".
*/
static void xprintf(const char *format, ...)
{
va_list ap;
int ret;
va_start(ap, format);
ret = vprintf(format, ap);
if (ret < 0) {
perror("fixdep");
exit(1);
}
va_end(ap);
}
static void xputchar(int c)
{
int ret;
ret = putchar(c);
if (ret == EOF) {
perror("fixdep");
exit(1);
}
}
/* /*
* Print out a dependency path from a symbol name * Print out a dependency path from a symbol name
*/ */
...@@ -116,7 +147,7 @@ static void print_dep(const char *m, int slen, const char *dir) ...@@ -116,7 +147,7 @@ static void print_dep(const char *m, int slen, const char *dir)
{ {
int c, prev_c = '/', i; int c, prev_c = '/', i;
printf(" $(wildcard %s/", dir); xprintf(" $(wildcard %s/", dir);
for (i = 0; i < slen; i++) { for (i = 0; i < slen; i++) {
c = m[i]; c = m[i];
if (c == '_') if (c == '_')
...@@ -124,10 +155,10 @@ static void print_dep(const char *m, int slen, const char *dir) ...@@ -124,10 +155,10 @@ static void print_dep(const char *m, int slen, const char *dir)
else else
c = tolower(c); c = tolower(c);
if (c != '/' || prev_c != '/') if (c != '/' || prev_c != '/')
putchar(c); xputchar(c);
prev_c = c; prev_c = c;
} }
printf(".h) \\\n"); xprintf(".h) \\\n");
} }
struct item { struct item {
...@@ -324,13 +355,13 @@ static void parse_dep_file(char *m, const char *target) ...@@ -324,13 +355,13 @@ static void parse_dep_file(char *m, const char *target)
*/ */
if (!saw_any_target) { if (!saw_any_target) {
saw_any_target = 1; saw_any_target = 1;
printf("source_%s := %s\n\n", xprintf("source_%s := %s\n\n",
target, m); target, m);
printf("deps_%s := \\\n", target); xprintf("deps_%s := \\\n", target);
} }
is_first_dep = 0; is_first_dep = 0;
} else { } else {
printf(" %s \\\n", m); xprintf(" %s \\\n", m);
} }
buf = read_file(m); buf = read_file(m);
...@@ -353,8 +384,8 @@ static void parse_dep_file(char *m, const char *target) ...@@ -353,8 +384,8 @@ static void parse_dep_file(char *m, const char *target)
exit(1); exit(1);
} }
printf("\n%s: $(deps_%s)\n\n", target, target); xprintf("\n%s: $(deps_%s)\n\n", target, target);
printf("$(deps_%s):\n", target); xprintf("$(deps_%s):\n", target);
} }
int main(int argc, char *argv[]) int main(int argc, char *argv[])
...@@ -369,7 +400,7 @@ int main(int argc, char *argv[]) ...@@ -369,7 +400,7 @@ int main(int argc, char *argv[])
target = argv[2]; target = argv[2];
cmdline = argv[3]; cmdline = argv[3];
printf("cmd_%s := %s\n\n", target, cmdline); xprintf("cmd_%s := %s\n\n", target, cmdline);
buf = read_file(depfile); buf = read_file(depfile);
parse_dep_file(buf, target); parse_dep_file(buf, target);
......
...@@ -77,7 +77,7 @@ p1 << r1.p1; ...@@ -77,7 +77,7 @@ p1 << r1.p1;
p2 << r1.p2; p2 << r1.p2;
@@ @@
cocci.print_main("WARNING opportunity for kstrdep",p1) cocci.print_main("WARNING opportunity for kstrdup",p1)
cocci.print_secs("strcpy",p2) cocci.print_secs("strcpy",p2)
@script:python depends on org@ @script:python depends on org@
...@@ -85,7 +85,7 @@ p1 << r2.p1; ...@@ -85,7 +85,7 @@ p1 << r2.p1;
p2 << r2.p2; p2 << r2.p2;
@@ @@
cocci.print_main("WARNING opportunity for kstrdep",p1) cocci.print_main("WARNING opportunity for kstrdup",p1)
cocci.print_secs("memcpy",p2) cocci.print_secs("memcpy",p2)
@script:python depends on report@ @script:python depends on report@
...@@ -93,7 +93,7 @@ p1 << r1.p1; ...@@ -93,7 +93,7 @@ p1 << r1.p1;
p2 << r1.p2; p2 << r1.p2;
@@ @@
msg = "WARNING opportunity for kstrdep (strcpy on line %s)" % (p2[0].line) msg = "WARNING opportunity for kstrdup (strcpy on line %s)" % (p2[0].line)
coccilib.report.print_report(p1[0], msg) coccilib.report.print_report(p1[0], msg)
@script:python depends on report@ @script:python depends on report@
...@@ -101,5 +101,5 @@ p1 << r2.p1; ...@@ -101,5 +101,5 @@ p1 << r2.p1;
p2 << r2.p2; p2 << r2.p2;
@@ @@
msg = "WARNING opportunity for kstrdep (memcpy on line %s)" % (p2[0].line) msg = "WARNING opportunity for kstrdup (memcpy on line %s)" % (p2[0].line)
coccilib.report.print_report(p1[0], msg) coccilib.report.print_report(p1[0], msg)
...@@ -35,11 +35,11 @@ type loff_t; ...@@ -35,11 +35,11 @@ type loff_t;
// a function that blocks // a function that blocks
@ blocks @ @ blocks @
identifier block_f; identifier block_f;
identifier wait_event =~ "^wait_event_.*"; identifier wait =~ "^wait_.*";
@@ @@
block_f(...) { block_f(...) {
... when exists ... when exists
wait_event(...) wait(...)
... when exists ... when exists
} }
...@@ -49,12 +49,12 @@ identifier wait_event =~ "^wait_event_.*"; ...@@ -49,12 +49,12 @@ identifier wait_event =~ "^wait_event_.*";
// XXX currently reader_blocks supports only direct and 1-level indirect cases. // XXX currently reader_blocks supports only direct and 1-level indirect cases.
@ reader_blocks_direct @ @ reader_blocks_direct @
identifier stream_reader.readstream; identifier stream_reader.readstream;
identifier wait_event =~ "^wait_event_.*"; identifier wait =~ "^wait_.*";
@@ @@
readstream(...) readstream(...)
{ {
... when exists ... when exists
wait_event(...) wait(...)
... when exists ... when exists
} }
......
...@@ -24,7 +24,7 @@ if (id == NULL || ...) { ... return ...; } ...@@ -24,7 +24,7 @@ if (id == NULL || ...) { ... return ...; }
when != of_dev_put(id) when != of_dev_put(id)
when != if (id) { ... put_device(&id->dev) ... } when != if (id) { ... put_device(&id->dev) ... }
when != e1 = (T)id when != e1 = (T)id
when != e1 = &id->dev when != e1 = (T)(&id->dev)
when != e1 = get_device(&id->dev) when != e1 = get_device(&id->dev)
when != e1 = (T1)platform_get_drvdata(id) when != e1 = (T1)platform_get_drvdata(id)
( (
...@@ -42,11 +42,10 @@ p1 << search.p1; ...@@ -42,11 +42,10 @@ p1 << search.p1;
p2 << search.p2; p2 << search.p2;
@@ @@
coccilib.report.print_report(p2[0], "ERROR: missing put_device; " coccilib.report.print_report(p2[0],
+ "call of_find_device_by_node on line " "ERROR: missing put_device; call of_find_device_by_node on line "
+ p1[0].line + p1[0].line
+ ", but without a corresponding object release " + ", but without a corresponding object release within this function.")
+ "within this function.")
@script:python depends on org@ @script:python depends on org@
p1 << search.p1; p1 << search.p1;
......
# SPDX-License-Identifier: GPL-2.0 # SPDX-License-Identifier: GPL-2.0
ifneq ($(srctree),.) ifdef building_out_of_srctree
symlinks := $(patsubst $(srctree)/$(src)/%,%,$(wildcard $(srctree)/$(src)/*.py)) symlinks := $(patsubst $(srctree)/$(src)/%,%,$(wildcard $(srctree)/$(src)/*.py))
......
...@@ -25,6 +25,10 @@ static struct resword { ...@@ -25,6 +25,10 @@ static struct resword {
{ "__volatile__", VOLATILE_KEYW }, { "__volatile__", VOLATILE_KEYW },
{ "__builtin_va_list", VA_LIST_KEYW }, { "__builtin_va_list", VA_LIST_KEYW },
{ "__int128", BUILTIN_INT_KEYW },
{ "__int128_t", BUILTIN_INT_KEYW },
{ "__uint128_t", BUILTIN_INT_KEYW },
// According to rth, c99 defines "_Bool", __restrict", __restrict__", "restrict". KAO // According to rth, c99 defines "_Bool", __restrict", __restrict__", "restrict". KAO
{ "_Bool", BOOL_KEYW }, { "_Bool", BOOL_KEYW },
{ "_restrict", RESTRICT_KEYW }, { "_restrict", RESTRICT_KEYW },
......
...@@ -76,6 +76,7 @@ static void record_compound(struct string_list **keyw, ...@@ -76,6 +76,7 @@ static void record_compound(struct string_list **keyw,
%token ATTRIBUTE_KEYW %token ATTRIBUTE_KEYW
%token AUTO_KEYW %token AUTO_KEYW
%token BOOL_KEYW %token BOOL_KEYW
%token BUILTIN_INT_KEYW
%token CHAR_KEYW %token CHAR_KEYW
%token CONST_KEYW %token CONST_KEYW
%token DOUBLE_KEYW %token DOUBLE_KEYW
...@@ -263,6 +264,7 @@ simple_type_specifier: ...@@ -263,6 +264,7 @@ simple_type_specifier:
| VOID_KEYW | VOID_KEYW
| BOOL_KEYW | BOOL_KEYW
| VA_LIST_KEYW | VA_LIST_KEYW
| BUILTIN_INT_KEYW
| TYPE { (*$1)->tag = SYM_TYPEDEF; $$ = $1; } | TYPE { (*$1)->tag = SYM_TYPEDEF; $$ = $1; }
; ;
......
#!/bin/sh
# SPDX-License-Identifier: GPL-2.0
# Run headers_$1 command for all suitable architectures
# Stop on error
set -e
do_command()
{
if [ -f ${srctree}/arch/$2/include/asm/Kbuild ]; then
make ARCH=$2 KBUILD_HEADERS=$1 headers_$1
else
printf "Ignoring arch: %s\n" ${arch}
fi
}
archs=${HDR_ARCH_LIST:-$(ls ${srctree}/arch)}
for arch in ${archs}; do
case ${arch} in
um) # no userspace export
;;
*)
if [ -d ${srctree}/arch/${arch} ]; then
do_command $1 ${arch}
fi
;;
esac
done
#!/bin/sh #!/bin/sh
# SPDX-License-Identifier: GPL-2.0 # SPDX-License-Identifier: GPL-2.0
if [ $# -lt 2 ] if [ $# -ne 2 ]
then then
echo "Usage: headers_install.sh OUTDIR SRCDIR [FILES...]" echo "Usage: headers_install.sh INFILE OUTFILE"
echo echo
echo "Prepares kernel header files for use by user space, by removing" echo "Prepares kernel header files for use by user space, by removing"
echo "all compiler.h definitions and #includes, removing any" echo "all compiler.h definitions and #includes, removing any"
echo "#ifdef __KERNEL__ sections, and putting __underscores__ around" echo "#ifdef __KERNEL__ sections, and putting __underscores__ around"
echo "asm/inline/volatile keywords." echo "asm/inline/volatile keywords."
echo echo
echo "OUTDIR: directory to write each userspace header FILE to." echo "INFILE: header file to operate on"
echo "SRCDIR: source directory where files are picked." echo "OUTFILE: output file which the processed header is writen to"
echo "FILES: list of header files to operate on."
exit 1 exit 1
fi fi
# Grab arguments # Grab arguments
INFILE=$1
OUTFILE=$2
TMPFILE=$OUTFILE.tmp
OUTDIR="$1" trap 'rm -f $OUTFILE $TMPFILE' EXIT
shift
SRCDIR="$1"
shift
# Iterate through files listed on command line sed -E -e '
s/([[:space:](])(__user|__force|__iomem)[[:space:]]/\1/g
s/__attribute_const__([[:space:]]|$)/\1/g
s@^#include <linux/compiler(|_types).h>@@
s/(^|[^a-zA-Z0-9])__packed([^a-zA-Z0-9_]|$)/\1__attribute__((packed))\2/g
s/(^|[[:space:](])(inline|asm|volatile)([[:space:](]|$)/\1__\2__\3/g
s@#(ifndef|define|endif[[:space:]]*/[*])[[:space:]]*_UAPI@#\1 @
' $INFILE > $TMPFILE || exit 1
FILE= scripts/unifdef -U__KERNEL__ -D__EXPORTED_HEADERS__ $TMPFILE > $OUTFILE
trap 'rm -f "$OUTDIR/$FILE" "$OUTDIR/$FILE.sed"' EXIT [ $? -gt 1 ] && exit 1
for i in "$@"
do rm -f $TMPFILE
FILE="$(basename "$i")"
sed -E \
-e 's/([[:space:](])(__user|__force|__iomem)[[:space:]]/\1/g' \
-e 's/__attribute_const__([[:space:]]|$)/\1/g' \
-e 's@^#include <linux/compiler(|_types).h>@@' \
-e 's/(^|[^a-zA-Z0-9])__packed([^a-zA-Z0-9_]|$)/\1__attribute__((packed))\2/g' \
-e 's/(^|[[:space:](])(inline|asm|volatile)([[:space:](]|$)/\1__\2__\3/g' \
-e 's@#(ifndef|define|endif[[:space:]]*/[*])[[:space:]]*_UAPI@#\1 @' \
"$SRCDIR/$i" > "$OUTDIR/$FILE.sed" || exit 1
scripts/unifdef -U__KERNEL__ -D__EXPORTED_HEADERS__ "$OUTDIR/$FILE.sed" \
> "$OUTDIR/$FILE"
[ $? -gt 1 ] && exit 1
rm -f "$OUTDIR/$FILE.sed"
done
trap - EXIT trap - EXIT
...@@ -150,6 +150,9 @@ static int read_symbol(FILE *in, struct sym_entry *s) ...@@ -150,6 +150,9 @@ static int read_symbol(FILE *in, struct sym_entry *s)
/* exclude debugging symbols */ /* exclude debugging symbols */
else if (stype == 'N' || stype == 'n') else if (stype == 'N' || stype == 'n')
return -1; return -1;
/* exclude s390 kasan local symbols */
else if (!strncmp(sym, ".LASANPC", 8))
return -1;
/* include the type field in the symbol name, so that it gets /* include the type field in the symbol name, so that it gets
* compressed together */ * compressed together */
......
...@@ -130,7 +130,7 @@ if is_enabled CONFIG_MODULES; then ...@@ -130,7 +130,7 @@ if is_enabled CONFIG_MODULES; then
fi fi
if [ "$ARCH" != "um" ]; then if [ "$ARCH" != "um" ]; then
$MAKE -f $srctree/Makefile headers_check $MAKE -f $srctree/Makefile headers
$MAKE -f $srctree/Makefile headers_install INSTALL_HDR_PATH="$libc_headers_dir/usr" $MAKE -f $srctree/Makefile headers_install INSTALL_HDR_PATH="$libc_headers_dir/usr"
fi fi
......
...@@ -31,7 +31,7 @@ PROVIDES="$PROVIDES kernel-$KERNELRELEASE" ...@@ -31,7 +31,7 @@ PROVIDES="$PROVIDES kernel-$KERNELRELEASE"
__KERNELRELEASE=$(echo $KERNELRELEASE | sed -e "s/-/_/g") __KERNELRELEASE=$(echo $KERNELRELEASE | sed -e "s/-/_/g")
EXCLUDES="$RCS_TAR_IGNORE --exclude=.tmp_versions --exclude=*vmlinux* \ EXCLUDES="$RCS_TAR_IGNORE --exclude=.tmp_versions --exclude=*vmlinux* \
--exclude=*.o --exclude=*.ko --exclude=*.cmd --exclude=Documentation \ --exclude=*.o --exclude=*.ko --exclude=*.cmd --exclude=Documentation \
--exclude=.config.old --exclude=.missing-syscalls.d" --exclude=.config.old --exclude=.missing-syscalls.d --exclude=*.s"
# We can label the here-doc lines for conditional output to the spec file # We can label the here-doc lines for conditional output to the spec file
# #
......
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
# mode may be any of: tags, TAGS, cscope # mode may be any of: tags, TAGS, cscope
# #
# Uses the following environment variables: # Uses the following environment variables:
# ARCH, SUBARCH, SRCARCH, srctree, src, obj # SUBARCH, SRCARCH, srctree
if [ "$KBUILD_VERBOSE" = "1" ]; then if [ "$KBUILD_VERBOSE" = "1" ]; then
set -x set -x
...@@ -17,8 +17,7 @@ ignore="$(echo "$RCS_FIND_IGNORE" | sed 's|\\||g' )" ...@@ -17,8 +17,7 @@ ignore="$(echo "$RCS_FIND_IGNORE" | sed 's|\\||g' )"
# tags and cscope files should also ignore MODVERSION *.mod.c files # tags and cscope files should also ignore MODVERSION *.mod.c files
ignore="$ignore ( -name *.mod.c ) -prune -o" ignore="$ignore ( -name *.mod.c ) -prune -o"
# Do not use full path if we do not use O=.. builds # Use make KBUILD_ABS_SRCTREE=1 {tags|cscope}
# Use make O=. {tags|cscope}
# to force full paths for a non-O= build # to force full paths for a non-O= build
if [ "${srctree}" = "." -o -z "${srctree}" ]; then if [ "${srctree}" = "." -o -z "${srctree}" ]; then
tree= tree=
...@@ -36,21 +35,19 @@ elif [ "${ALLSOURCE_ARCHS}" = "all" ]; then ...@@ -36,21 +35,19 @@ elif [ "${ALLSOURCE_ARCHS}" = "all" ]; then
ALLSOURCE_ARCHS=$(find ${tree}arch/ -mindepth 1 -maxdepth 1 -type d -printf '%f ') ALLSOURCE_ARCHS=$(find ${tree}arch/ -mindepth 1 -maxdepth 1 -type d -printf '%f ')
fi fi
# find sources in arch/$ARCH # find sources in arch/$1
find_arch_sources() find_arch_sources()
{ {
for i in $archincludedir; do for i in $archincludedir; do
prune="$prune -wholename $i -prune -o" prune="$prune -wholename $i -prune -o"
done done
find ${tree}arch/$1 $ignore $subarchprune $prune -name "$2" \ find ${tree}arch/$1 $ignore $prune -name "$2" -not -type l -print;
-not -type l -print;
} }
# find sources in arch/$1/include # find sources in arch/$1/include
find_arch_include_sources() find_arch_include_sources()
{ {
include=$(find ${tree}arch/$1/ $subarchprune \ include=$(find ${tree}arch/$1/ -name include -type d -print);
-name include -type d -print);
if [ -n "$include" ]; then if [ -n "$include" ]; then
archincludedir="$archincludedir $include" archincludedir="$archincludedir $include"
find $include $ignore -name "$2" -not -type l -print; find $include $ignore -name "$2" -not -type l -print;
...@@ -306,36 +303,6 @@ if [ "${ARCH}" = "um" ]; then ...@@ -306,36 +303,6 @@ if [ "${ARCH}" = "um" ]; then
else else
archinclude=${SUBARCH} archinclude=${SUBARCH}
fi fi
elif [ "${SRCARCH}" = "arm" -a "${SUBARCH}" != "" ]; then
subarchdir=$(find ${tree}arch/$SRCARCH/ -name "mach-*" -type d -o \
-name "plat-*" -type d);
mach_suffix=$SUBARCH
plat_suffix=$SUBARCH
# Special cases when $plat_suffix != $mach_suffix
case $mach_suffix in
"omap1" | "omap2")
plat_suffix="omap"
;;
esac
if [ ! -d ${tree}arch/$SRCARCH/mach-$mach_suffix ]; then
echo "Warning: arch/arm/mach-$mach_suffix/ not found." >&2
echo " Fix your \$SUBARCH appropriately" >&2
fi
for i in $subarchdir; do
case "$i" in
*"mach-"${mach_suffix})
;;
*"plat-"${plat_suffix})
;;
*)
subarchprune="$subarchprune \
-wholename $i -prune -o"
;;
esac
done
fi fi
remove_structs= remove_structs=
......
...@@ -74,7 +74,7 @@ endif ...@@ -74,7 +74,7 @@ endif
# Append kselftest to KBUILD_OUTPUT to avoid cluttering # Append kselftest to KBUILD_OUTPUT to avoid cluttering
# KBUILD_OUTPUT with selftest objects and headers installed # KBUILD_OUTPUT with selftest objects and headers installed
# by selftests Makefile or lib.mk. # by selftests Makefile or lib.mk.
ifneq ($(KBUILD_SRC),) ifdef building_out_of_srctree
override LDFLAGS = override LDFLAGS =
endif endif
......
...@@ -70,7 +70,7 @@ define RUN_TESTS ...@@ -70,7 +70,7 @@ define RUN_TESTS
endef endef
run_tests: all run_tests: all
ifneq ($(KBUILD_SRC),) ifdef building_out_of_srctree
@if [ "X$(TEST_PROGS) $(TEST_PROGS_EXTENDED) $(TEST_FILES)" != "X" ]; then @if [ "X$(TEST_PROGS) $(TEST_PROGS_EXTENDED) $(TEST_FILES)" != "X" ]; then
@rsync -aq $(TEST_PROGS) $(TEST_PROGS_EXTENDED) $(TEST_FILES) $(OUTPUT) @rsync -aq $(TEST_PROGS) $(TEST_PROGS_EXTENDED) $(TEST_FILES) $(OUTPUT)
fi fi
...@@ -125,7 +125,7 @@ clean: ...@@ -125,7 +125,7 @@ clean:
# When make O= with kselftest target from main level # When make O= with kselftest target from main level
# the following aren't defined. # the following aren't defined.
# #
ifneq ($(KBUILD_SRC),) ifdef building_out_of_srctree
LINK.c = $(CC) $(CFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET_ARCH) LINK.c = $(CC) $(CFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET_ARCH)
COMPILE.S = $(CC) $(ASFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c COMPILE.S = $(CC) $(ASFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c
LINK.S = $(CC) $(ASFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET_ARCH) LINK.S = $(CC) $(ASFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET_ARCH)
......
...@@ -7,4 +7,3 @@ initramfs_data.cpio.gz ...@@ -7,4 +7,3 @@ initramfs_data.cpio.gz
initramfs_data.cpio.bz2 initramfs_data.cpio.bz2
initramfs_data.cpio.lzma initramfs_data.cpio.lzma
initramfs_list initramfs_list
include
...@@ -56,3 +56,5 @@ $(deps_initramfs): klibcdirs ...@@ -56,3 +56,5 @@ $(deps_initramfs): klibcdirs
$(obj)/$(datafile_y): $(obj)/gen_init_cpio $(deps_initramfs) klibcdirs $(obj)/$(datafile_y): $(obj)/gen_init_cpio $(deps_initramfs) klibcdirs
$(Q)$(initramfs) -l $(ramfs-input) > $(obj)/$(datafile_d_y) $(Q)$(initramfs) -l $(ramfs-input) > $(obj)/$(datafile_d_y)
$(call if_changed,initfs) $(call if_changed,initfs)
subdir-$(CONFIG_UAPI_HEADER_TEST) += include
*
!.gitignore
!Makefile
# SPDX-License-Identifier: GPL-2.0-only
# Unlike the kernel space, exported headers are written in standard C.
# - Forbid C++ style comments
# - Use '__inline__', '__asm__' instead of 'inline', 'asm'
#
# -std=c90 (equivalent to -ansi) catches the violation of those.
# We cannot go as far as adding -Wpedantic since it emits too many warnings.
UAPI_CFLAGS := -std=c90 -Wall -Werror=implicit-function-declaration
override c_flags = $(UAPI_CFLAGS) -Wp,-MD,$(depfile) -I$(objtree)/usr/include
# The following are excluded for now because they fail to build.
#
# Do not add a new header to the blacklist without legitimate reason.
# Please consider to fix the header first.
#
# Sorted alphabetically.
header-test- += asm/ipcbuf.h
header-test- += asm/msgbuf.h
header-test- += asm/sembuf.h
header-test- += asm/shmbuf.h
header-test- += asm/signal.h
header-test- += asm/ucontext.h
header-test- += drm/vmwgfx_drm.h
header-test- += linux/am437x-vpfe.h
header-test- += linux/android/binder.h
header-test- += linux/android/binderfs.h
header-test-$(CONFIG_CPU_BIG_ENDIAN) += linux/byteorder/big_endian.h
header-test-$(CONFIG_CPU_LITTLE_ENDIAN) += linux/byteorder/little_endian.h
header-test- += linux/coda.h
header-test- += linux/coda_psdev.h
header-test- += linux/dvb/audio.h
header-test- += linux/dvb/osd.h
header-test- += linux/elfcore.h
header-test- += linux/errqueue.h
header-test- += linux/fsmap.h
header-test- += linux/hdlc/ioctl.h
header-test- += linux/ivtv.h
header-test- += linux/jffs2.h
header-test- += linux/kexec.h
header-test- += linux/matroxfb.h
header-test- += linux/netfilter_bridge/ebtables.h
header-test- += linux/netfilter_ipv4/ipt_LOG.h
header-test- += linux/netfilter_ipv6/ip6t_LOG.h
header-test- += linux/nfc.h
header-test- += linux/nilfs2_ondisk.h
header-test- += linux/omap3isp.h
header-test- += linux/omapfb.h
header-test- += linux/patchkey.h
header-test- += linux/phonet.h
header-test- += linux/reiserfs_xattr.h
header-test- += linux/scc.h
header-test- += linux/sctp.h
header-test- += linux/signal.h
header-test- += linux/sysctl.h
header-test- += linux/usb/audio.h
header-test- += linux/v4l2-mediabus.h
header-test- += linux/v4l2-subdev.h
header-test- += linux/videodev2.h
header-test- += linux/vm_sockets.h
header-test- += misc/ocxl.h
header-test- += mtd/mtd-abi.h
header-test- += mtd/mtd-user.h
header-test- += scsi/scsi_bsg_fc.h
header-test- += scsi/scsi_netlink.h
header-test- += scsi/scsi_netlink_fc.h
header-test- += sound/asequencer.h
header-test- += sound/asoc.h
header-test- += sound/asound.h
header-test- += sound/compress_offload.h
header-test- += sound/emu10k1.h
header-test- += sound/sfnt_info.h
header-test- += sound/sof/eq.h
header-test- += sound/sof/fw.h
header-test- += sound/sof/header.h
header-test- += sound/sof/manifest.h
header-test- += sound/sof/trace.h
header-test- += xen/evtchn.h
header-test- += xen/gntdev.h
header-test- += xen/privcmd.h
# More headers are broken in some architectures
ifeq ($(SRCARCH),arc)
header-test- += linux/bpf_perf_event.h
endif
ifeq ($(SRCARCH),ia64)
header-test- += asm/setup.h
header-test- += asm/sigcontext.h
header-test- += asm/perfmon.h
header-test- += asm/perfmon_default_smpl.h
header-test- += linux/if_bonding.h
endif
ifeq ($(SRCARCH),mips)
header-test- += asm/stat.h
endif
ifeq ($(SRCARCH),powerpc)
header-test- += asm/stat.h
header-test- += linux/bpf_perf_event.h
endif
ifeq ($(SRCARCH),riscv)
header-test- += linux/bpf_perf_event.h
endif
ifeq ($(SRCARCH),s390)
header-test- += asm/runtime_instr.h
header-test- += asm/zcrypt.h
endif
ifeq ($(SRCARCH),sparc)
header-test- += asm/stat.h
header-test- += asm/uctx.h
header-test- += asm/fbio.h
header-test- += asm/openpromio.h
endif
# asm-generic/*.h is used by asm/*.h, and should not be included directly
header-test- += asm-generic/%
# The rest are compile-tested
header-test-y += $(filter-out $(header-test-), \
$(patsubst $(obj)/%,%, $(wildcard \
$(addprefix $(obj)/, *.h */*.h */*/*.h */*/*/*.h))))
# For GNU Make <= 4.2.1, $(wildcard $(obj)/*/) matches to not only directories
# but also regular files. Use $(filter %/, ...) just in case.
clean-dirs += $(patsubst $(obj)/%/,%,$(filter %/, $(wildcard $(obj)/*/)))
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment