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
...
This commit is contained in:
@@ -79,8 +79,8 @@ endef
|
||||
# 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
|
||||
# GNU Make 4.2.1 release.
|
||||
cc-cross-prefix = $(firstword $(foreach c, $(filter-out -%, $(1)), \
|
||||
$(if $(shell command -v $(c)gcc 2>/dev/null), $(c))))
|
||||
cc-cross-prefix = $(firstword $(foreach c, $(1), \
|
||||
$(if $(shell command -v -- $(c)gcc 2>/dev/null), $(c))))
|
||||
|
||||
# output directory for tests below
|
||||
TMPOUT := $(if $(KBUILD_EXTMOD),$(firstword $(KBUILD_EXTMOD))/)
|
||||
@@ -187,12 +187,6 @@ dtbinst := -f $(srctree)/scripts/Makefile.dtbinst obj
|
||||
# $(Q)$(MAKE) $(clean)=dir
|
||||
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.
|
||||
# Short version is used, if $(quiet) equals `quiet_', otherwise full one.
|
||||
echo-cmd = $(if $($(quiet)cmd_$(1)),\
|
||||
@@ -213,12 +207,12 @@ objectify = $(foreach o,$(1),$(if $(filter /%,$(o)),$(o),$(obj)/$(o)))
|
||||
# See Documentation/kbuild/makefiles.rst for more info
|
||||
|
||||
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
|
||||
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))))
|
||||
else
|
||||
arg-check = $(if $(strip $(cmd_$@)),,1)
|
||||
cmd-check = $(if $(strip $(cmd_$@)),,1)
|
||||
endif
|
||||
|
||||
# Replace >$< with >$$< to preserve $ when reloading the .cmd file
|
||||
@@ -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.
|
||||
# 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.
|
||||
if_changed = $(if $(strip $(any-prereq) $(arg-check)), \
|
||||
if_changed = $(if $(any-prereq)$(cmd-check), \
|
||||
$(cmd); \
|
||||
printf '%s\n' 'cmd_$@ := $(make-cmd)' > $(dot-target).cmd, @:)
|
||||
|
||||
# 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); \
|
||||
@@ -249,7 +243,7 @@ cmd_and_fixdep = \
|
||||
# Usage: $(call if_changed_rule,foo)
|
||||
# Will check if $(cmd_foo) or any of the prerequisites changed,
|
||||
# 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
|
||||
@@ -274,8 +268,8 @@ ifeq ($(KBUILD_VERBOSE),2)
|
||||
why = \
|
||||
$(if $(filter $@, $(PHONY)),- due to target is PHONY, \
|
||||
$(if $(wildcard $@), \
|
||||
$(if $(strip $(any-prereq)),- due to: $(any-prereq), \
|
||||
$(if $(arg-check), \
|
||||
$(if $(any-prereq),- due to: $(any-prereq), \
|
||||
$(if $(cmd-check), \
|
||||
$(if $(cmd_$@),- due to command line change, \
|
||||
$(if $(filter $@, $(targets)), \
|
||||
- due to missing .cmd file, \
|
||||
|
||||
@@ -31,11 +31,6 @@ always := $(hostprogs-y) $(hostprogs-m)
|
||||
# The following hostprogs-y programs are only build on demand
|
||||
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_MODVERSIONS) += genksyms
|
||||
subdir-$(CONFIG_SECURITY_SELINUX) += selinux
|
||||
|
||||
@@ -294,6 +294,15 @@ quiet_cmd_cc_lst_c = MKLST $@
|
||||
$(obj)/%.lst: $(src)/%.c FORCE
|
||||
$(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)
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
@@ -504,7 +513,7 @@ existing-targets := $(wildcard $(sort $(targets)))
|
||||
|
||||
-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
|
||||
obj-dirs := $(sort $(obj) $(patsubst %/,%, $(dir $(targets))))
|
||||
# If targets exist, their directories apparently exist. Skip mkdir.
|
||||
|
||||
@@ -34,7 +34,6 @@ warning-1 += $(call cc-option, -Wstringop-truncation)
|
||||
warning-1 += -Wno-missing-field-initializers
|
||||
warning-1 += -Wno-sign-compare
|
||||
|
||||
warning-2 := -Waggregate-return
|
||||
warning-2 += -Wcast-align
|
||||
warning-2 += -Wdisabled-optimization
|
||||
warning-2 += -Wnested-externs
|
||||
@@ -68,10 +67,8 @@ else
|
||||
|
||||
ifdef CONFIG_CC_IS_CLANG
|
||||
KBUILD_CFLAGS += -Wno-initializer-overrides
|
||||
KBUILD_CFLAGS += -Wno-unused-value
|
||||
KBUILD_CFLAGS += -Wno-format
|
||||
KBUILD_CFLAGS += -Wno-sign-compare
|
||||
KBUILD_CFLAGS += -Wno-format-zero-length
|
||||
KBUILD_CFLAGS += -Wno-uninitialized
|
||||
endif
|
||||
endif
|
||||
|
||||
@@ -14,109 +14,89 @@ __headers:
|
||||
|
||||
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
|
||||
# $(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)/*/)))))
|
||||
-include $(src)/Kbuild
|
||||
|
||||
# Recursion
|
||||
__headers: $(subdirs)
|
||||
# $(filter %/, ...) is a workaround for GNU Make <= 4.2.1, where
|
||||
# $(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)
|
||||
$(subdirs):
|
||||
$(Q)$(MAKE) $(hdr-inst)=$(obj)/$@ dst=$(dst)/$@
|
||||
src-headers := $(if $(src-subdirs), $(shell cd $(src) && find $(src-subdirs) -name '*.h'))
|
||||
src-headers := $(filter-out $(no-export-headers), $(src-headers))
|
||||
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.
|
||||
# We have only sub-directories there.
|
||||
skip-inst := $(if $(filter %/uapi,$(obj)),1)
|
||||
# If the same header is exported from source and generated directories,
|
||||
# the former takes precedence, but this should be warned.
|
||||
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
|
||||
kbuild-file := $(srctree)/$(obj)/Kbuild
|
||||
-include $(kbuild-file)
|
||||
|
||||
installdir := $(INSTALL_HDR_PATH)/$(dst)
|
||||
gendir := $(objtree)/$(subst include/,include/generated/,$(obj))
|
||||
header-files := $(notdir $(wildcard $(srcdir)/*.h))
|
||||
header-files := $(filter-out $(no-export-headers), $(header-files))
|
||||
genhdr-files := $(notdir $(wildcard $(gendir)/*.h))
|
||||
genhdr-files := $(filter-out $(header-files), $(genhdr-files))
|
||||
|
||||
# files used to track state of install/check
|
||||
install-file := $(installdir)/.install
|
||||
check-file := $(installdir)/.check
|
||||
|
||||
# all headers files for this dir
|
||||
all-files := $(header-files) $(genhdr-files)
|
||||
output-files := $(addprefix $(installdir)/, $(all-files))
|
||||
# Add dst path prefix
|
||||
all-subdirs := $(addprefix $(dst)/, $(all-subdirs))
|
||||
src-headers := $(addprefix $(dst)/, $(src-headers))
|
||||
gen-headers := $(addprefix $(dst)/, $(gen-headers))
|
||||
all-headers := $(src-headers) $(gen-headers)
|
||||
|
||||
# Work out what needs to be removed
|
||||
oldheaders := $(patsubst $(installdir)/%,%,$(wildcard $(installdir)/*.h))
|
||||
unwanted := $(filter-out $(all-files),$(oldheaders))
|
||||
old-subdirs := $(wildcard $(all-subdirs))
|
||||
old-headers := $(if $(old-subdirs),$(shell find $(old-subdirs) -name '*.h'))
|
||||
unwanted := $(filter-out $(all-headers), $(old-headers))
|
||||
|
||||
# Prefix unwanted with full paths to $(INSTALL_HDR_PATH)
|
||||
unwanted-file := $(addprefix $(installdir)/, $(unwanted))
|
||||
# Create directories
|
||||
existing-dirs := $(sort $(dir $(old-headers)))
|
||||
wanted-dirs := $(sort $(dir $(all-headers)))
|
||||
new-dirs := $(filter-out $(existing-dirs), $(wanted-dirs))
|
||||
$(if $(new-dirs), $(shell mkdir -p $(new-dirs)))
|
||||
|
||||
printdir = $(patsubst $(INSTALL_HDR_PATH)/%/,%,$(dir $@))
|
||||
|
||||
quiet_cmd_install = INSTALL $(printdir) ($(words $(all-files))\
|
||||
file$(if $(word 2, $(all-files)),s))
|
||||
cmd_install = \
|
||||
$(CONFIG_SHELL) $< $(installdir) $(srcdir) $(header-files); \
|
||||
$(CONFIG_SHELL) $< $(installdir) $(gendir) $(genhdr-files); \
|
||||
touch $@
|
||||
|
||||
quiet_cmd_remove = REMOVE $(unwanted)
|
||||
cmd_remove = rm -f $(unwanted-file)
|
||||
|
||||
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 $@
|
||||
# Rules
|
||||
|
||||
ifndef HDRCHECK
|
||||
# Rules for installing headers
|
||||
__headers: $(install-file)
|
||||
@:
|
||||
|
||||
targets += $(install-file)
|
||||
$(install-file): scripts/headers_install.sh \
|
||||
$(addprefix $(srcdir)/,$(header-files)) \
|
||||
$(addprefix $(gendir)/,$(genhdr-files)) FORCE
|
||||
$(if $(unwanted),$(call cmd,remove),)
|
||||
$(if $(wildcard $(dir $@)),,$(shell mkdir -p $(dir $@)))
|
||||
quiet_cmd_install = HDRINST $@
|
||||
cmd_install = $(CONFIG_SHELL) $(srctree)/scripts/headers_install.sh $< $@
|
||||
|
||||
$(src-headers): $(dst)/%.h: $(src)/%.h $(srctree)/scripts/headers_install.sh FORCE
|
||||
$(call if_changed,install)
|
||||
|
||||
else
|
||||
__headers: $(check-file)
|
||||
$(gen-headers): $(dst)/%.h: $(gen)/%.h $(srctree)/scripts/headers_install.sh FORCE
|
||||
$(call if_changed,install)
|
||||
|
||||
quiet_cmd_remove = REMOVE $(unwanted)
|
||||
cmd_remove = rm -f $(unwanted)
|
||||
|
||||
__headers: $(all-headers)
|
||||
ifneq ($(unwanted),)
|
||||
$(call cmd,remove)
|
||||
endif
|
||||
@:
|
||||
|
||||
targets += $(check-file)
|
||||
$(check-file): scripts/headers_check.pl $(output-files) FORCE
|
||||
$(call if_changed,check)
|
||||
existing-headers := $(filter $(old-headers), $(all-headers))
|
||||
|
||||
-include $(foreach f,$(existing-headers),$(dir $(f)).$(notdir $(f)).cmd)
|
||||
|
||||
else
|
||||
|
||||
quiet_cmd_check = HDRCHK $<
|
||||
cmd_check = $(PERL) $(srctree)/scripts/headers_check.pl $(dst) $(SRCARCH) $<; touch $@
|
||||
|
||||
check-files := $(addsuffix .chk, $(all-headers))
|
||||
|
||||
$(check-files): $(dst)/%.chk : $(dst)/% $(srctree)/scripts/headers_check.pl
|
||||
$(call cmd,check)
|
||||
|
||||
__headers: $(check-files)
|
||||
@:
|
||||
|
||||
endif
|
||||
|
||||
cmd_files := $(wildcard \
|
||||
$(foreach f,$(sort $(targets)),$(dir $(f)).$(notdir $(f)).cmd))
|
||||
|
||||
ifneq ($(cmd_files),)
|
||||
include $(cmd_files)
|
||||
endif
|
||||
|
||||
endif # skip-inst
|
||||
|
||||
PHONY += FORCE
|
||||
FORCE: ;
|
||||
FORCE:
|
||||
|
||||
.PHONY: $(PHONY)
|
||||
|
||||
@@ -69,7 +69,7 @@ _hostcxx_flags = $(KBUILD_HOSTCXXFLAGS) $(HOST_EXTRACXXFLAGS) \
|
||||
|
||||
# $(objtree)/$(obj) for including generated headers from checkin source files
|
||||
ifeq ($(KBUILD_EXTMOD),)
|
||||
ifneq ($(srctree),.)
|
||||
ifdef building_out_of_srctree
|
||||
_hostc_flags += -I $(objtree)/$(obj)
|
||||
_hostcxx_flags += -I $(objtree)/$(obj)
|
||||
endif
|
||||
|
||||
@@ -66,6 +66,20 @@ extra-y += $(patsubst %.dtb,%.dt.yaml, $(dtb-y))
|
||||
extra-$(CONFIG_OF_ALL_DTBS) += $(patsubst %.dtb,%.dt.yaml, $(dtb-))
|
||||
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
|
||||
|
||||
extra-y := $(addprefix $(obj)/,$(extra-y))
|
||||
@@ -140,7 +154,7 @@ endif
|
||||
# $(srctree)/$(src) for including checkin headers from generated source files
|
||||
# $(objtree)/$(obj) for including generated headers from checkin source files
|
||||
ifeq ($(KBUILD_EXTMOD),)
|
||||
ifneq ($(srctree),.)
|
||||
ifdef building_out_of_srctree
|
||||
_c_flags += -I $(srctree)/$(src) -I $(objtree)/$(obj)
|
||||
_a_flags += -I $(srctree)/$(src) -I $(objtree)/$(obj)
|
||||
_cpp_flags += -I $(srctree)/$(src) -I $(objtree)/$(obj)
|
||||
@@ -331,19 +345,19 @@ printf "%08x\n" $$dec_size | \
|
||||
)
|
||||
|
||||
quiet_cmd_bzip2 = BZIP2 $@
|
||||
cmd_bzip2 = { cat $(real-prereqs) | bzip2 -9 && $(size_append); } > $@
|
||||
cmd_bzip2 = { cat $(real-prereqs) | bzip2 -9; $(size_append); } > $@
|
||||
|
||||
# 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 $@
|
||||
cmd_lzo = { cat $(real-prereqs) | lzop -9 && $(size_append); } > $@
|
||||
cmd_lzo = { cat $(real-prereqs) | lzop -9; $(size_append); } > $@
|
||||
|
||||
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); } > $@
|
||||
|
||||
# U-Boot mkimage
|
||||
@@ -386,7 +400,7 @@ quiet_cmd_uimage = UIMAGE $@
|
||||
# big dictionary would increase the memory usage too much in the multi-call
|
||||
# decompression mode. A BCJ filter isn't used either.
|
||||
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); } > $@
|
||||
|
||||
quiet_cmd_xzmisc = XZMISC $@
|
||||
|
||||
@@ -15,7 +15,7 @@ include include/config/tristate.conf
|
||||
|
||||
include scripts/Kbuild.include
|
||||
|
||||
ifneq ($(srctree),.)
|
||||
ifdef building_out_of_srctree
|
||||
# Create output directory if not already present
|
||||
_dummy := $(shell [ -d $(obj) ] || mkdir -p $(obj))
|
||||
endif
|
||||
|
||||
@@ -99,6 +99,7 @@
|
||||
#include <unistd.h>
|
||||
#include <fcntl.h>
|
||||
#include <string.h>
|
||||
#include <stdarg.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <ctype.h>
|
||||
@@ -109,6 +110,36 @@ static void usage(void)
|
||||
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
|
||||
*/
|
||||
@@ -116,7 +147,7 @@ static void print_dep(const char *m, int slen, const char *dir)
|
||||
{
|
||||
int c, prev_c = '/', i;
|
||||
|
||||
printf(" $(wildcard %s/", dir);
|
||||
xprintf(" $(wildcard %s/", dir);
|
||||
for (i = 0; i < slen; i++) {
|
||||
c = m[i];
|
||||
if (c == '_')
|
||||
@@ -124,10 +155,10 @@ static void print_dep(const char *m, int slen, const char *dir)
|
||||
else
|
||||
c = tolower(c);
|
||||
if (c != '/' || prev_c != '/')
|
||||
putchar(c);
|
||||
xputchar(c);
|
||||
prev_c = c;
|
||||
}
|
||||
printf(".h) \\\n");
|
||||
xprintf(".h) \\\n");
|
||||
}
|
||||
|
||||
struct item {
|
||||
@@ -324,13 +355,13 @@ static void parse_dep_file(char *m, const char *target)
|
||||
*/
|
||||
if (!saw_any_target) {
|
||||
saw_any_target = 1;
|
||||
printf("source_%s := %s\n\n",
|
||||
target, m);
|
||||
printf("deps_%s := \\\n", target);
|
||||
xprintf("source_%s := %s\n\n",
|
||||
target, m);
|
||||
xprintf("deps_%s := \\\n", target);
|
||||
}
|
||||
is_first_dep = 0;
|
||||
} else {
|
||||
printf(" %s \\\n", m);
|
||||
xprintf(" %s \\\n", m);
|
||||
}
|
||||
|
||||
buf = read_file(m);
|
||||
@@ -353,8 +384,8 @@ static void parse_dep_file(char *m, const char *target)
|
||||
exit(1);
|
||||
}
|
||||
|
||||
printf("\n%s: $(deps_%s)\n\n", target, target);
|
||||
printf("$(deps_%s):\n", target);
|
||||
xprintf("\n%s: $(deps_%s)\n\n", target, target);
|
||||
xprintf("$(deps_%s):\n", target);
|
||||
}
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
@@ -369,7 +400,7 @@ int main(int argc, char *argv[])
|
||||
target = argv[2];
|
||||
cmdline = argv[3];
|
||||
|
||||
printf("cmd_%s := %s\n\n", target, cmdline);
|
||||
xprintf("cmd_%s := %s\n\n", target, cmdline);
|
||||
|
||||
buf = read_file(depfile);
|
||||
parse_dep_file(buf, target);
|
||||
|
||||
@@ -77,7 +77,7 @@ p1 << r1.p1;
|
||||
p2 << r1.p2;
|
||||
@@
|
||||
|
||||
cocci.print_main("WARNING opportunity for kstrdep",p1)
|
||||
cocci.print_main("WARNING opportunity for kstrdup",p1)
|
||||
cocci.print_secs("strcpy",p2)
|
||||
|
||||
@script:python depends on org@
|
||||
@@ -85,7 +85,7 @@ p1 << r2.p1;
|
||||
p2 << r2.p2;
|
||||
@@
|
||||
|
||||
cocci.print_main("WARNING opportunity for kstrdep",p1)
|
||||
cocci.print_main("WARNING opportunity for kstrdup",p1)
|
||||
cocci.print_secs("memcpy",p2)
|
||||
|
||||
@script:python depends on report@
|
||||
@@ -93,7 +93,7 @@ p1 << r1.p1;
|
||||
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)
|
||||
|
||||
@script:python depends on report@
|
||||
@@ -101,5 +101,5 @@ p1 << r2.p1;
|
||||
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)
|
||||
|
||||
@@ -35,11 +35,11 @@ type loff_t;
|
||||
// a function that blocks
|
||||
@ blocks @
|
||||
identifier block_f;
|
||||
identifier wait_event =~ "^wait_event_.*";
|
||||
identifier wait =~ "^wait_.*";
|
||||
@@
|
||||
block_f(...) {
|
||||
... when exists
|
||||
wait_event(...)
|
||||
wait(...)
|
||||
... when exists
|
||||
}
|
||||
|
||||
@@ -49,12 +49,12 @@ identifier wait_event =~ "^wait_event_.*";
|
||||
// XXX currently reader_blocks supports only direct and 1-level indirect cases.
|
||||
@ reader_blocks_direct @
|
||||
identifier stream_reader.readstream;
|
||||
identifier wait_event =~ "^wait_event_.*";
|
||||
identifier wait =~ "^wait_.*";
|
||||
@@
|
||||
readstream(...)
|
||||
{
|
||||
... when exists
|
||||
wait_event(...)
|
||||
wait(...)
|
||||
... when exists
|
||||
}
|
||||
|
||||
|
||||
@@ -24,7 +24,7 @@ if (id == NULL || ...) { ... return ...; }
|
||||
when != of_dev_put(id)
|
||||
when != if (id) { ... put_device(&id->dev) ... }
|
||||
when != e1 = (T)id
|
||||
when != e1 = &id->dev
|
||||
when != e1 = (T)(&id->dev)
|
||||
when != e1 = get_device(&id->dev)
|
||||
when != e1 = (T1)platform_get_drvdata(id)
|
||||
(
|
||||
@@ -42,11 +42,10 @@ p1 << search.p1;
|
||||
p2 << search.p2;
|
||||
@@
|
||||
|
||||
coccilib.report.print_report(p2[0], "ERROR: missing put_device; "
|
||||
+ "call of_find_device_by_node on line "
|
||||
+ p1[0].line
|
||||
+ ", but without a corresponding object release "
|
||||
+ "within this function.")
|
||||
coccilib.report.print_report(p2[0],
|
||||
"ERROR: missing put_device; call of_find_device_by_node on line "
|
||||
+ p1[0].line
|
||||
+ ", but without a corresponding object release within this function.")
|
||||
|
||||
@script:python depends on org@
|
||||
p1 << search.p1;
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
|
||||
ifneq ($(srctree),.)
|
||||
ifdef building_out_of_srctree
|
||||
|
||||
symlinks := $(patsubst $(srctree)/$(src)/%,%,$(wildcard $(srctree)/$(src)/*.py))
|
||||
|
||||
|
||||
@@ -25,6 +25,10 @@ static struct resword {
|
||||
{ "__volatile__", VOLATILE_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
|
||||
{ "_Bool", BOOL_KEYW },
|
||||
{ "_restrict", RESTRICT_KEYW },
|
||||
|
||||
@@ -76,6 +76,7 @@ static void record_compound(struct string_list **keyw,
|
||||
%token ATTRIBUTE_KEYW
|
||||
%token AUTO_KEYW
|
||||
%token BOOL_KEYW
|
||||
%token BUILTIN_INT_KEYW
|
||||
%token CHAR_KEYW
|
||||
%token CONST_KEYW
|
||||
%token DOUBLE_KEYW
|
||||
@@ -263,6 +264,7 @@ simple_type_specifier:
|
||||
| VOID_KEYW
|
||||
| BOOL_KEYW
|
||||
| VA_LIST_KEYW
|
||||
| BUILTIN_INT_KEYW
|
||||
| TYPE { (*$1)->tag = SYM_TYPEDEF; $$ = $1; }
|
||||
;
|
||||
|
||||
|
||||
@@ -1,29 +0,0 @@
|
||||
#!/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
|
||||
@@ -1,47 +1,39 @@
|
||||
#!/bin/sh
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
|
||||
if [ $# -lt 2 ]
|
||||
if [ $# -ne 2 ]
|
||||
then
|
||||
echo "Usage: headers_install.sh OUTDIR SRCDIR [FILES...]"
|
||||
echo "Usage: headers_install.sh INFILE OUTFILE"
|
||||
echo
|
||||
echo "Prepares kernel header files for use by user space, by removing"
|
||||
echo "all compiler.h definitions and #includes, removing any"
|
||||
echo "#ifdef __KERNEL__ sections, and putting __underscores__ around"
|
||||
echo "asm/inline/volatile keywords."
|
||||
echo
|
||||
echo "OUTDIR: directory to write each userspace header FILE to."
|
||||
echo "SRCDIR: source directory where files are picked."
|
||||
echo "FILES: list of header files to operate on."
|
||||
echo "INFILE: header file to operate on"
|
||||
echo "OUTFILE: output file which the processed header is writen to"
|
||||
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Grab arguments
|
||||
INFILE=$1
|
||||
OUTFILE=$2
|
||||
TMPFILE=$OUTFILE.tmp
|
||||
|
||||
OUTDIR="$1"
|
||||
shift
|
||||
SRCDIR="$1"
|
||||
shift
|
||||
trap 'rm -f $OUTFILE $TMPFILE' EXIT
|
||||
|
||||
# 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=
|
||||
trap 'rm -f "$OUTDIR/$FILE" "$OUTDIR/$FILE.sed"' EXIT
|
||||
for i in "$@"
|
||||
do
|
||||
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
|
||||
scripts/unifdef -U__KERNEL__ -D__EXPORTED_HEADERS__ $TMPFILE > $OUTFILE
|
||||
[ $? -gt 1 ] && exit 1
|
||||
|
||||
rm -f $TMPFILE
|
||||
trap - EXIT
|
||||
|
||||
@@ -150,6 +150,9 @@ static int read_symbol(FILE *in, struct sym_entry *s)
|
||||
/* exclude debugging symbols */
|
||||
else if (stype == 'N' || stype == 'n')
|
||||
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
|
||||
* compressed together */
|
||||
|
||||
@@ -130,7 +130,7 @@ if is_enabled CONFIG_MODULES; then
|
||||
fi
|
||||
|
||||
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"
|
||||
fi
|
||||
|
||||
|
||||
@@ -31,7 +31,7 @@ PROVIDES="$PROVIDES kernel-$KERNELRELEASE"
|
||||
__KERNELRELEASE=$(echo $KERNELRELEASE | sed -e "s/-/_/g")
|
||||
EXCLUDES="$RCS_TAR_IGNORE --exclude=.tmp_versions --exclude=*vmlinux* \
|
||||
--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
|
||||
#
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
# mode may be any of: tags, TAGS, cscope
|
||||
#
|
||||
# Uses the following environment variables:
|
||||
# ARCH, SUBARCH, SRCARCH, srctree, src, obj
|
||||
# SUBARCH, SRCARCH, srctree
|
||||
|
||||
if [ "$KBUILD_VERBOSE" = "1" ]; then
|
||||
set -x
|
||||
@@ -17,8 +17,7 @@ ignore="$(echo "$RCS_FIND_IGNORE" | sed 's|\\||g' )"
|
||||
# tags and cscope files should also ignore MODVERSION *.mod.c files
|
||||
ignore="$ignore ( -name *.mod.c ) -prune -o"
|
||||
|
||||
# Do not use full path if we do not use O=.. builds
|
||||
# Use make O=. {tags|cscope}
|
||||
# Use make KBUILD_ABS_SRCTREE=1 {tags|cscope}
|
||||
# to force full paths for a non-O= build
|
||||
if [ "${srctree}" = "." -o -z "${srctree}" ]; then
|
||||
tree=
|
||||
@@ -36,21 +35,19 @@ elif [ "${ALLSOURCE_ARCHS}" = "all" ]; then
|
||||
ALLSOURCE_ARCHS=$(find ${tree}arch/ -mindepth 1 -maxdepth 1 -type d -printf '%f ')
|
||||
fi
|
||||
|
||||
# find sources in arch/$ARCH
|
||||
# find sources in arch/$1
|
||||
find_arch_sources()
|
||||
{
|
||||
for i in $archincludedir; do
|
||||
prune="$prune -wholename $i -prune -o"
|
||||
done
|
||||
find ${tree}arch/$1 $ignore $subarchprune $prune -name "$2" \
|
||||
-not -type l -print;
|
||||
find ${tree}arch/$1 $ignore $prune -name "$2" -not -type l -print;
|
||||
}
|
||||
|
||||
# find sources in arch/$1/include
|
||||
find_arch_include_sources()
|
||||
{
|
||||
include=$(find ${tree}arch/$1/ $subarchprune \
|
||||
-name include -type d -print);
|
||||
include=$(find ${tree}arch/$1/ -name include -type d -print);
|
||||
if [ -n "$include" ]; then
|
||||
archincludedir="$archincludedir $include"
|
||||
find $include $ignore -name "$2" -not -type l -print;
|
||||
@@ -306,36 +303,6 @@ if [ "${ARCH}" = "um" ]; then
|
||||
else
|
||||
archinclude=${SUBARCH}
|
||||
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
|
||||
|
||||
remove_structs=
|
||||
|
||||
Reference in New Issue
Block a user