Pull Kbuild updates from Masahiro Yamada: "Build system: - add CONFIG_UNUSED_KSYMS_WHITELIST, which will be useful to define a fixed set of export symbols for Generic Kernel Image (GKI) - allow to run 'make dt_binding_check' without .config - use full schema for checking DT examples in *.yaml files - make modpost fail for missing MODULE_IMPORT_NS(), which makes more sense because we know the produced modules are never loadable - Remove unused 'AS' variable Kconfig: - sanitize DEFCONFIG_LIST, and remove ARCH_DEFCONFIG from Kconfig files - relax the 'imply' behavior so that symbols implied by 'y' can become 'm' - make 'imply' obey 'depends on' in order to make 'imply' really weak Misc: - add documentation on building the kernel with Clang/LLVM - revive __HAVE_ARCH_STRLEN for 32bit sparc to use optimized strlen() - fix warning from deb-pkg builds when CONFIG_DEBUG_INFO=n - various script and Makefile cleanups" * tag 'kbuild-v5.7' of git://git.kernel.org/pub/scm/linux/kernel/git/masahiroy/linux-kbuild: (34 commits) Makefile: Update kselftest help information kbuild: deb-pkg: fix warning when CONFIG_DEBUG_INFO is unset kbuild: add outputmakefile to no-dot-config-targets kbuild: remove AS variable net: wan: wanxl: refactor the firmware rebuild rule net: wan: wanxl: use $(M68KCC) instead of $(M68KAS) for rebuilding firmware net: wan: wanxl: use allow to pass CROSS_COMPILE_M68k for rebuilding firmware kbuild: add comment about grouped target kbuild: add -Wall to KBUILD_HOSTCXXFLAGS kconfig: remove unused variable in qconf.cc sparc: revive __HAVE_ARCH_STRLEN for 32bit sparc kbuild: refactor Makefile.dtbinst more kbuild: compute the dtbs_install destination more simply Makefile: disallow data races on gcc-10 as well kconfig: make 'imply' obey the direct dependency kconfig: allow symbols implied by y to become m net: drop_monitor: use IS_REACHABLE() to guard net_dm_hw_report() modpost: return error if module is missing ns imports and MODULE_ALLOW_MISSING_NAMESPACE_IMPORTS=n modpost: rework and consolidate logging interface kbuild: allow to run dt_binding_check without kernel configuration ...
Showing the changes to scripts (15 of 35 files). Show all
Unified · Split
| @@ -13,28 +13,24 @@ src := $(obj) · 12 unmodified lines | |||
| 13 | PHONY := __dtbs_install | 13 | PHONY := __dtbs_install |
| 14 | __dtbs_install: | 14 | __dtbs_install: |
| 15 | 15 | ||
| 16 | export dtbinst_root ?= $(obj) | ||
| 17 | |||
| 18 | include include/config/auto.conf | 16 | include include/config/auto.conf |
| 19 | include scripts/Kbuild.include | 17 | include scripts/Kbuild.include |
| 20 | include $(src)/Makefile | 18 | include $(src)/Makefile |
| 21 | 19 | ||
| 22 | dtbinst-files := $(sort $(dtb-y) $(if $(CONFIG_OF_ALL_DTBS), $(dtb-))) | 20 | dtbs := $(addprefix $(dst)/, $(dtb-y) $(if $(CONFIG_OF_ALL_DTBS),$(dtb-))) |
| 23 | dtbinst-dirs := $(subdir-y) $(subdir-m) | 21 | subdirs := $(addprefix $(obj)/, $(subdir-y) $(subdir-m)) |
| 24 | |||
| 25 | # Helper targets for Installing DTBs into the boot directory | ||
| 26 | quiet_cmd_dtb_install = INSTALL $< | ||
| 27 | cmd_dtb_install = mkdir -p $(2); cp $< $(2) | ||
| 28 | 22 | ||
| 29 | install-dir = $(patsubst $(dtbinst_root)%,$(INSTALL_DTBS_PATH)%,$(obj)) | 23 | __dtbs_install: $(dtbs) $(subdirs) |
| 24 | @: | ||
| 30 | 25 | ||
| 31 | $(dtbinst-files): %.dtb: $(obj)/%.dtb | 26 | quiet_cmd_dtb_install = INSTALL $@ |
| 32 | $(call cmd,dtb_install,$(install-dir)) | 27 | cmd_dtb_install = install -D $< $@ |
| 33 | 28 | ||
| 34 | $(dtbinst-dirs): | 29 | $(dst)/%.dtb: $(obj)/%.dtb |
| 35 | $(Q)$(MAKE) $(dtbinst)=$(obj)/$@ | 30 | $(call cmd,dtb_install) |
| 36 | 31 | ||
| 37 | PHONY += $(dtbinst-files) $(dtbinst-dirs) | 32 | PHONY += $(subdirs) |
| 38 | __dtbs_install: $(dtbinst-files) $(dtbinst-dirs) | 33 | $(subdirs): |
| 34 | $(Q)$(MAKE) $(dtbinst)=$@ dst=$(patsubst $(obj)/%,$(dst)/%,$@) | ||
| 39 | 35 | ||
| 40 | .PHONY: $(PHONY) | 36 | .PHONY: $(PHONY) |
| @@ -297,7 +297,8 @@ $(obj)/%.dtb: $(src)/%.dts $(DTC) FORCE · 296 unmodified lines | |||
| 297 | 297 | ||
| 298 | DT_CHECKER ?= dt-validate | 298 | DT_CHECKER ?= dt-validate |
| 299 | DT_BINDING_DIR := Documentation/devicetree/bindings | 299 | DT_BINDING_DIR := Documentation/devicetree/bindings |
| 300 | DT_TMP_SCHEMA := $(objtree)/$(DT_BINDING_DIR)/processed-schema.yaml | 300 | # DT_TMP_SCHEMA may be overridden from Documentation/devicetree/bindings/Makefile |
| 301 | DT_TMP_SCHEMA ?= $(objtree)/$(DT_BINDING_DIR)/processed-schema.yaml | ||
| 301 | 302 | ||
| 302 | quiet_cmd_dtb_check = CHECK $@ | 303 | quiet_cmd_dtb_check = CHECK $@ |
| 303 | cmd_dtb_check = $(DT_CHECKER) -u $(srctree)/$(DT_BINDING_DIR) -p $(DT_TMP_SCHEMA) $@ | 304 | cmd_dtb_check = $(DT_CHECKER) -u $(srctree)/$(DT_BINDING_DIR) -p $(DT_TMP_SCHEMA) $@ |
| @@ -46,13 +46,14 @@ include scripts/Kbuild.include · 45 unmodified lines | |||
| 46 | kernelsymfile := $(objtree)/Module.symvers | 46 | kernelsymfile := $(objtree)/Module.symvers |
| 47 | modulesymfile := $(firstword $(KBUILD_EXTMOD))/Module.symvers | 47 | modulesymfile := $(firstword $(KBUILD_EXTMOD))/Module.symvers |
| 48 | 48 | ||
| 49 | MODPOST = scripts/mod/modpost \ | 49 | MODPOST = scripts/mod/modpost \ |
| 50 | $(if $(CONFIG_MODVERSIONS),-m) \ | 50 | $(if $(CONFIG_MODVERSIONS),-m) \ |
| 51 | $(if $(CONFIG_MODULE_SRCVERSION_ALL),-a) \ | 51 | $(if $(CONFIG_MODULE_SRCVERSION_ALL),-a) \ |
| 52 | $(if $(KBUILD_EXTMOD),-i,-o) $(kernelsymfile) \ | 52 | $(if $(KBUILD_EXTMOD),-i,-o) $(kernelsymfile) \ |
| 53 | $(if $(KBUILD_EXTMOD),$(addprefix -e ,$(KBUILD_EXTRA_SYMBOLS))) \ | 53 | $(if $(KBUILD_EXTMOD),$(addprefix -e ,$(KBUILD_EXTRA_SYMBOLS))) \ |
| 54 | $(if $(KBUILD_EXTMOD),-o $(modulesymfile)) \ | 54 | $(if $(KBUILD_EXTMOD),-o $(modulesymfile)) \ |
| 55 | $(if $(CONFIG_SECTION_MISMATCH_WARN_ONLY),,-E) \ | 55 | $(if $(CONFIG_SECTION_MISMATCH_WARN_ONLY),,-E) \ |
| 56 | $(if $(CONFIG_MODULE_ALLOW_MISSING_NAMESPACE_IMPORTS)$(KBUILD_NSDEPS),-N) \ | ||
| 56 | $(if $(KBUILD_MODPOST_WARN),-w) | 57 | $(if $(KBUILD_MODPOST_WARN),-w) |
| 57 | 58 | ||
| 58 | ifdef MODPOST_VMLINUX | 59 | ifdef MODPOST_VMLINUX |
| @@ -1,14 +1,13 @@ | |||
| 1 | #!/bin/sh | 1 | #!/bin/sh |
| 2 | # SPDX-License-Identifier: GPL-2.0-only | 2 | # SPDX-License-Identifier: GPL-2.0-only |
| 3 | 3 | ||
| 4 | # Script to create/update include/generated/autoksyms.h and dependency files | 4 | # Script to update include/generated/autoksyms.h and dependency files |
| 5 | # | 5 | # |
| 6 | # Copyright: (C) 2016 Linaro Limited | 6 | # Copyright: (C) 2016 Linaro Limited |
| 7 | # Created by: Nicolas Pitre, January 2016 | 7 | # Created by: Nicolas Pitre, January 2016 |
| 8 | # | 8 | # |
| 9 | 9 | ||
| 10 | # Create/update the include/generated/autoksyms.h file from the list | 10 | # Update the include/generated/autoksyms.h file. |
| 11 | # of all module's needed symbols as recorded on the second line of *.mod files. | ||
| 12 | # | 11 | # |
| 13 | # For each symbol being added or removed, the corresponding dependency | 12 | # For each symbol being added or removed, the corresponding dependency |
| 14 | # file's timestamp is updated to force a rebuild of the affected source | 13 | # file's timestamp is updated to force a rebuild of the affected source |
| @@ -38,23 +37,8 @@ esac · 23 unmodified lines | |||
| 38 | # We need access to CONFIG_ symbols | 37 | # We need access to CONFIG_ symbols |
| 39 | . include/config/auto.conf | 38 | . include/config/auto.conf |
| 40 | 39 | ||
| 41 | # Generate a new ksym list file with symbols needed by the current | 40 | # Generate a new symbol list file |
| 42 | # set of modules. | 41 | $CONFIG_SHELL $srctree/scripts/gen_autoksyms.sh "$new_ksyms_file" |
| 43 | cat > "$new_ksyms_file" << EOT | ||
| 44 | /* | ||
| 45 | * Automatically generated file; DO NOT EDIT. | ||
| 46 | */ | ||
| 47 | |||
| 48 | EOT | ||
| 49 | sed 's/ko$/mod/' modules.order | | ||
| 50 | xargs -n1 sed -n -e '2{s/ /\n/g;/^$/!p;}' -- | | ||
| 51 | sort -u | | ||
| 52 | sed -e 's/\(.*\)/#define __KSYM_\1 1/' >> "$new_ksyms_file" | ||
| 53 | |||
| 54 | # Special case for modversions (see modpost.c) | ||
| 55 | if [ -n "$CONFIG_MODVERSIONS" ]; then | ||
| 56 | echo "#define __KSYM_module_layout 1" >> "$new_ksyms_file" | ||
| 57 | fi | ||
| 58 | 42 | ||
| 59 | # Extract changes between old and new list and touch corresponding | 43 | # Extract changes between old and new list and touch corresponding |
| 60 | # dependency files. | 44 | # dependency files. |
| @@ -77,11 +77,6 @@ · 76 unmodified lines | |||
| 77 | * dependencies on include/config/my/option.h for every | 77 | * dependencies on include/config/my/option.h for every |
| 78 | * CONFIG_MY_OPTION encountered in any of the prerequisites. | 78 | * CONFIG_MY_OPTION encountered in any of the prerequisites. |
| 79 | * | 79 | * |
| 80 | * It will also filter out all the dependencies on *.ver. We need | ||
| 81 | * to make sure that the generated version checksum are globally up | ||
| 82 | * to date before even starting the recursive build, so it's too late | ||
| 83 | * at this point anyway. | ||
| 84 | * | ||
| 85 | * We don't even try to really parse the header files, but | 80 | * We don't even try to really parse the header files, but |
| 86 | * merely grep, i.e. if CONFIG_FOO is mentioned in a comment, it will | 81 | * merely grep, i.e. if CONFIG_FOO is mentioned in a comment, it will |
| 87 | * be picked up as well. It's not a problem with respect to | 82 | * be picked up as well. It's not a problem with respect to |
| @@ -251,7 +246,7 @@ static void parse_config_file(const char *p) · 163 unmodified lines | |||
| 251 | } | 246 | } |
| 252 | p += 7; | 247 | p += 7; |
| 253 | q = p; | 248 | q = p; |
| 254 | while (*q && (isalnum(*q) || *q == '_')) | 249 | while (isalnum(*q) || *q == '_') |
| 255 | q++; | 250 | q++; |
| 256 | if (str_ends_with(p, q - p, "_MODULE")) | 251 | if (str_ends_with(p, q - p, "_MODULE")) |
| 257 | r = q - 7; | 252 | r = q - 7; |
| @@ -299,8 +294,7 @@ static void *read_file(const char *filename) · 41 unmodified lines | |||
| 299 | static int is_ignored_file(const char *s, int len) | 294 | static int is_ignored_file(const char *s, int len) |
| 300 | { | 295 | { |
| 301 | return str_ends_with(s, len, "include/generated/autoconf.h") || | 296 | return str_ends_with(s, len, "include/generated/autoconf.h") || |
| 302 | str_ends_with(s, len, "include/generated/autoksyms.h") || | 297 | str_ends_with(s, len, "include/generated/autoksyms.h"); |
| 303 | str_ends_with(s, len, ".ver"); | ||
| 304 | } | 298 | } |
| 305 | 299 | ||
| 306 | /* | 300 | /* |
| @@ -1,8 +1,9 @@ | |||
| 1 | # SPDX-License-Identifier: GPL-2.0 | 1 | # SPDX-License-Identifier: GPL-2.0 |
| 2 | # scripts/dtc makefile | 2 | # scripts/dtc makefile |
| 3 | 3 | ||
| 4 | hostprogs := dtc | 4 | hostprogs := dtc |
| 5 | always-$(CONFIG_DTC) := $(hostprogs) | 5 | always-$(CONFIG_DTC) += $(hostprogs) |
| 6 | always-$(CHECK_DT_BINDING) += $(hostprogs) | ||
| 6 | 7 | ||
| 7 | dtc-objs := dtc.o flattree.o fstree.o data.o livetree.o treesource.o \ | 8 | dtc-objs := dtc.o flattree.o fstree.o data.o livetree.o treesource.o \ |
| 8 | srcpos.o checks.o util.o | 9 | srcpos.o checks.o util.o |
| @@ -10,7 +10,7 @@ else · 9 unmodified lines | |||
| 10 | HOSTLIBS := hostcxxlibs | 10 | HOSTLIBS := hostcxxlibs |
| 11 | HOST_EXTRACXXFLAGS += -I$(GCC_PLUGINS_DIR)/include -I$(src) -std=gnu++98 -fno-rtti | 11 | HOST_EXTRACXXFLAGS += -I$(GCC_PLUGINS_DIR)/include -I$(src) -std=gnu++98 -fno-rtti |
| 12 | HOST_EXTRACXXFLAGS += -fno-exceptions -fasynchronous-unwind-tables -ggdb | 12 | HOST_EXTRACXXFLAGS += -fno-exceptions -fasynchronous-unwind-tables -ggdb |
| 13 | HOST_EXTRACXXFLAGS += -Wno-narrowing -Wno-unused-variable | 13 | HOST_EXTRACXXFLAGS += -Wno-narrowing -Wno-unused-variable -Wno-c++11-compat |
| 14 | export HOST_EXTRACXXFLAGS | 14 | export HOST_EXTRACXXFLAGS |
| 15 | endif | 15 | endif |
| 16 | 16 | ||
| @@ -0,0 +1,52 @@ | |||
| 1 | #!/bin/sh | ||
| 2 | # SPDX-License-Identifier: GPL-2.0-only | ||
| 3 | |||
| 4 | # Create an autoksyms.h header file from the list of all module's needed symbols | ||
| 5 | # as recorded on the second line of *.mod files and the user-provided symbol | ||
| 6 | # whitelist. | ||
| 7 | |||
| 8 | set -e | ||
| 9 | |||
| 10 | output_file="$1" | ||
| 11 | |||
| 12 | # Use "make V=1" to debug this script. | ||
| 13 | case "$KBUILD_VERBOSE" in | ||
| 14 | *1*) | ||
| 15 | set -x | ||
| 16 | ;; | ||
| 17 | esac | ||
| 18 | |||
| 19 | # We need access to CONFIG_ symbols | ||
| 20 | . include/config/auto.conf | ||
| 21 | |||
| 22 | ksym_wl=/dev/null | ||
| 23 | if [ -n "$CONFIG_UNUSED_KSYMS_WHITELIST" ]; then | ||
| 24 | # Use 'eval' to expand the whitelist path and check if it is relative | ||
| 25 | eval ksym_wl="$CONFIG_UNUSED_KSYMS_WHITELIST" | ||
| 26 | [ "${ksym_wl}" != "${ksym_wl#/}" ] || ksym_wl="$abs_srctree/$ksym_wl" | ||
| 27 | if [ ! -f "$ksym_wl" ] || [ ! -r "$ksym_wl" ]; then | ||
| 28 | echo "ERROR: '$ksym_wl' whitelist file not found" >&2 | ||
| 29 | exit 1 | ||
| 30 | fi | ||
| 31 | fi | ||
| 32 | |||
| 33 | # Generate a new ksym list file with symbols needed by the current | ||
| 34 | # set of modules. | ||
| 35 | cat > "$output_file" << EOT | ||
| 36 | /* | ||
| 37 | * Automatically generated file; DO NOT EDIT. | ||
| 38 | */ | ||
| 39 | |||
| 40 | EOT | ||
| 41 | |||
| 42 | [ -f modules.order ] && modlist=modules.order || modlist=/dev/null | ||
| 43 | sed 's/ko$/mod/' $modlist | | ||
| 44 | xargs -n1 sed -n -e '2{s/ /\n/g;/^$/!p;}' -- | | ||
| 45 | cat - "$ksym_wl" | | ||
| 46 | sort -u | | ||
| 47 | sed -e 's/\(.*\)/#define __KSYM_\1 1/' >> "$output_file" | ||
| 48 | |||
| 49 | # Special case for modversions (see modpost.c) | ||
| 50 | if [ -n "$CONFIG_MODVERSIONS" ]; then | ||
| 51 | echo "#define __KSYM_module_layout 1" >> "$output_file" | ||
| 52 | fi | ||
| @@ -12,10 +12,6 @@ else · 11 unmodified lines | |||
| 12 | Kconfig := Kconfig | 12 | Kconfig := Kconfig |
| 13 | endif | 13 | endif |
| 14 | 14 | ||
| 15 | ifndef KBUILD_DEFCONFIG | ||
| 16 | KBUILD_DEFCONFIG := defconfig | ||
| 17 | endif | ||
| 18 | |||
| 19 | ifeq ($(quiet),silent_) | 15 | ifeq ($(quiet),silent_) |
| 20 | silent := -s | 16 | silent := -s |
| 21 | endif | 17 | endif |
| @@ -309,8 +309,6 @@ ConfigList::ConfigList(ConfigView* p, const char *name) · 308 unmodified lines | |||
| 309 | showName(false), showRange(false), showData(false), mode(singleMode), optMode(normalOpt), | 309 | showName(false), showRange(false), showData(false), mode(singleMode), optMode(normalOpt), |
| 310 | rootEntry(0), headerPopup(0) | 310 | rootEntry(0), headerPopup(0) |
| 311 | { | 311 | { |
| 312 | int i; | ||
| 313 | |||
| 314 | setObjectName(name); | 312 | setObjectName(name); |
| 315 | setSortingEnabled(false); | 313 | setSortingEnabled(false); |
| 316 | setRootIsDecorated(true); | 314 | setRootIsDecorated(true); |
| @@ -221,7 +221,7 @@ static void sym_calc_visibility(struct symbol *sym) · 220 unmodified lines | |||
| 221 | sym_set_changed(sym); | 221 | sym_set_changed(sym); |
| 222 | } | 222 | } |
| 223 | tri = no; | 223 | tri = no; |
| 224 | if (sym->implied.expr && sym->dir_dep.tri != no) | 224 | if (sym->implied.expr) |
| 225 | tri = expr_calc_value(sym->implied.expr); | 225 | tri = expr_calc_value(sym->implied.expr); |
| 226 | if (tri == mod && sym_get_type(sym) == S_BOOLEAN) | 226 | if (tri == mod && sym_get_type(sym) == S_BOOLEAN) |
| 227 | tri = yes; | 227 | tri = yes; |
| @@ -394,6 +394,8 @@ void sym_calc_value(struct symbol *sym) · 166 unmodified lines | |||
| 394 | if (sym->implied.tri != no) { | 394 | if (sym->implied.tri != no) { |
| 395 | sym->flags |= SYMBOL_WRITE; | 395 | sym->flags |= SYMBOL_WRITE; |
| 396 | newval.tri = EXPR_OR(newval.tri, sym->implied.tri); | 396 | newval.tri = EXPR_OR(newval.tri, sym->implied.tri); |
| 397 | newval.tri = EXPR_AND(newval.tri, | ||
| 398 | sym->dir_dep.tri); | ||
| 397 | } | 399 | } |
| 398 | } | 400 | } |
| 399 | calc_newval: | 401 | calc_newval: |
| @@ -401,8 +403,7 @@ void sym_calc_value(struct symbol *sym) · 1 unmodified line | |||
| 401 | sym_warn_unmet_dep(sym); | 403 | sym_warn_unmet_dep(sym); |
| 402 | newval.tri = EXPR_OR(newval.tri, sym->rev_dep.tri); | 404 | newval.tri = EXPR_OR(newval.tri, sym->rev_dep.tri); |
| 403 | } | 405 | } |
| 404 | if (newval.tri == mod && | 406 | if (newval.tri == mod && sym_get_type(sym) == S_BOOLEAN) |
| 405 | (sym_get_type(sym) == S_BOOLEAN || sym->implied.tri == yes)) | ||
| 406 | newval.tri = yes; | 407 | newval.tri = yes; |
| 407 | break; | 408 | break; |
| 408 | case S_STRING: | 409 | case S_STRING: |
| @@ -484,8 +485,6 @@ bool sym_tristate_within_range(struct symbol *sym, tristate val) · 75 unmodified lines | |||
| 484 | return false; | 485 | return false; |
| 485 | if (sym->visible <= sym->rev_dep.tri) | 486 | if (sym->visible <= sym->rev_dep.tri) |
| 486 | return false; | 487 | return false; |
| 487 | if (sym->implied.tri == yes && val == mod) | ||
| 488 | return false; | ||
| 489 | if (sym_is_choice_value(sym) && sym->visible == yes) | 488 | if (sym_is_choice_value(sym) && sym->visible == yes) |
| 490 | return val == yes; | 489 | return val == yes; |
| 491 | return val >= sym->rev_dep.tri && val <= sym->visible; | 490 | return val >= sym->rev_dep.tri && val <= sym->visible; |
| @@ -10,17 +10,6 @@ CC=$6 · 9 unmodified lines | |||
| 10 | 10 | ||
| 11 | vecho() { [ "${quiet}" = "silent_" ] || echo "$@" ; } | 11 | vecho() { [ "${quiet}" = "silent_" ] || echo "$@" ; } |
| 12 | 12 | ||
| 13 | # If compile.h exists already and we don't own autoconf.h | ||
| 14 | # (i.e. we're not the same user who did make *config), don't | ||
| 15 | # modify compile.h | ||
| 16 | # So "sudo make install" won't change the "compiled by <user>" | ||
| 17 | # do "compiled by root" | ||
| 18 | |||
| 19 | if [ -r $TARGET -a ! -O include/generated/autoconf.h ]; then | ||
| 20 | vecho " SKIPPED $TARGET" | ||
| 21 | exit 0 | ||
| 22 | fi | ||
| 23 | |||
| 24 | # Do not expand names | 13 | # Do not expand names |
| 25 | set -f | 14 | set -f |
| 26 | 15 | ||
| @@ -39,6 +39,8 @@ static int sec_mismatch_count = 0; · 38 unmodified lines | |||
| 39 | static int sec_mismatch_fatal = 0; | 39 | static int sec_mismatch_fatal = 0; |
| 40 | /* ignore missing files */ | 40 | /* ignore missing files */ |
| 41 | static int ignore_missing_files; | 41 | static int ignore_missing_files; |
| 42 | /* If set to 1, only warn (instead of error) about missing ns imports */ | ||
| 43 | static int allow_missing_ns_imports; | ||
| 42 | 44 | ||
| 43 | enum export { | 45 | enum export { |
| 44 | export_plain, export_unused, export_gpl, | 46 | export_plain, export_unused, export_gpl, |
| @@ -51,41 +53,33 @@ enum export { · 6 unmodified lines | |||
| 51 | 53 | ||
| 52 | #define MODULE_NAME_LEN (64 - sizeof(Elf_Addr)) | 54 | #define MODULE_NAME_LEN (64 - sizeof(Elf_Addr)) |
| 53 | 55 | ||
| 54 | #define PRINTF __attribute__ ((format (printf, 1, 2))) | 56 | void __attribute__((format(printf, 2, 3))) |
| 55 | 57 | modpost_log(enum loglevel loglevel, const char *fmt, ...) | |
| 56 | PRINTF void fatal(const char *fmt, ...) | ||
| 57 | { | 58 | { |
| 58 | va_list arglist; | 59 | va_list arglist; |
| 59 | 60 | ||
| 60 | fprintf(stderr, "FATAL: "); | 61 | switch (loglevel) { |
| 61 | 62 | case LOG_WARN: | |
| 62 | va_start(arglist, fmt); | 63 | fprintf(stderr, "WARNING: "); |
| 63 | vfprintf(stderr, fmt, arglist); | 64 | break; |
| 64 | va_end(arglist); | 65 | case LOG_ERROR: |
| 65 | 66 | fprintf(stderr, "ERROR: "); | |
| 66 | exit(1); | 67 | break; |
| 67 | } | 68 | case LOG_FATAL: |
| 68 | 69 | fprintf(stderr, "FATAL: "); | |
| 69 | PRINTF void warn(const char *fmt, ...) | 70 | break; |
| 70 | { | 71 | default: /* invalid loglevel, ignore */ |
| 71 | va_list arglist; | 72 | break; |
| 73 | } | ||
| 72 | 74 | ||
| 73 | fprintf(stderr, "WARNING: "); | 75 | fprintf(stderr, "modpost: "); |
| 74 | 76 | ||
| 75 | va_start(arglist, fmt); | 77 | va_start(arglist, fmt); |
| 76 | vfprintf(stderr, fmt, arglist); | 78 | vfprintf(stderr, fmt, arglist); |
| 77 | va_end(arglist); | 79 | va_end(arglist); |
| 78 | } | ||
| 79 | |||
| 80 | PRINTF void merror(const char *fmt, ...) | ||
| 81 | { | ||
| 82 | va_list arglist; | ||
| 83 | 80 | ||
| 84 | fprintf(stderr, "ERROR: "); | 81 | if (loglevel == LOG_FATAL) |
| 85 | 82 | exit(1); | |
| 86 | va_start(arglist, fmt); | ||
| 87 | vfprintf(stderr, fmt, arglist); | ||
| 88 | va_end(arglist); | ||
| 89 | } | 83 | } |
| 90 | 84 | ||
| 91 | static inline bool strends(const char *str, const char *postfix) | 85 | static inline bool strends(const char *str, const char *postfix) |
| @@ -113,7 +107,7 @@ static int is_vmlinux(const char *modname) · 21 unmodified lines | |||
| 113 | void *do_nofail(void *ptr, const char *expr) | 107 | void *do_nofail(void *ptr, const char *expr) |
| 114 | { | 108 | { |
| 115 | if (!ptr) | 109 | if (!ptr) |
| 116 | fatal("modpost: Memory allocation failure: %s.\n", expr); | 110 | fatal("Memory allocation failure: %s.\n", expr); |
| 117 | 111 | ||
| 118 | return ptr; | 112 | return ptr; |
| 119 | } | 113 | } |
| @@ -2022,7 +2016,7 @@ static void read_symbols(const char *modname) · 1902 unmodified lines | |||
| 2022 | 2016 | ||
| 2023 | license = get_modinfo(&info, "license"); | 2017 | license = get_modinfo(&info, "license"); |
| 2024 | if (!license && !is_vmlinux(modname)) | 2018 | if (!license && !is_vmlinux(modname)) |
| 2025 | warn("modpost: missing MODULE_LICENSE() in %s\n" | 2019 | warn("missing MODULE_LICENSE() in %s\n" |
| 2026 | "see include/linux/module.h for " | 2020 | "see include/linux/module.h for " |
| 2027 | "more information\n", modname); | 2021 | "more information\n", modname); |
| 2028 | while (license) { | 2022 | while (license) { |
| @@ -2153,15 +2147,15 @@ static void check_for_gpl_usage(enum export exp, const char *m, const char *s) · 124 unmodified lines | |||
| 2153 | 2147 | ||
| 2154 | switch (exp) { | 2148 | switch (exp) { |
| 2155 | case export_gpl: | 2149 | case export_gpl: |
| 2156 | fatal("modpost: GPL-incompatible module %s%s " | 2150 | fatal("GPL-incompatible module %s%s " |
| 2157 | "uses GPL-only symbol '%s'\n", m, e, s); | 2151 | "uses GPL-only symbol '%s'\n", m, e, s); |
| 2158 | break; | 2152 | break; |
| 2159 | case export_unused_gpl: | 2153 | case export_unused_gpl: |
| 2160 | fatal("modpost: GPL-incompatible module %s%s " | 2154 | fatal("GPL-incompatible module %s%s " |
| 2161 | "uses GPL-only symbol marked UNUSED '%s'\n", m, e, s); | 2155 | "uses GPL-only symbol marked UNUSED '%s'\n", m, e, s); |
| 2162 | break; | 2156 | break; |
| 2163 | case export_gpl_future: | 2157 | case export_gpl_future: |
| 2164 | warn("modpost: GPL-incompatible module %s%s " | 2158 | warn("GPL-incompatible module %s%s " |
| 2165 | "uses future GPL-only symbol '%s'\n", m, e, s); | 2159 | "uses future GPL-only symbol '%s'\n", m, e, s); |
| 2166 | break; | 2160 | break; |
| 2167 | case export_plain: | 2161 | case export_plain: |
| @@ -2179,7 +2173,7 @@ static void check_for_unused(enum export exp, const char *m, const char *s) · 11 unmodified lines | |||
| 2179 | switch (exp) { | 2173 | switch (exp) { |
| 2180 | case export_unused: | 2174 | case export_unused: |
| 2181 | case export_unused_gpl: | 2175 | case export_unused_gpl: |
| 2182 | warn("modpost: module %s%s " | 2176 | warn("module %s%s " |
| 2183 | "uses symbol '%s' marked UNUSED\n", m, e, s); | 2177 | "uses symbol '%s' marked UNUSED\n", m, e, s); |
| 2184 | break; | 2178 | break; |
| 2185 | default: | 2179 | default: |
| @@ -2198,14 +2192,11 @@ static int check_exports(struct module *mod) · 12 unmodified lines | |||
| 2198 | exp = find_symbol(s->name); | 2192 | exp = find_symbol(s->name); |
| 2199 | if (!exp || exp->module == mod) { | 2193 | if (!exp || exp->module == mod) { |
| 2200 | if (have_vmlinux && !s->weak) { | 2194 | if (have_vmlinux && !s->weak) { |
| 2201 | if (warn_unresolved) { | 2195 | modpost_log(warn_unresolved ? LOG_WARN : LOG_ERROR, |
| 2202 | warn("\"%s\" [%s.ko] undefined!\n", | 2196 | "\"%s\" [%s.ko] undefined!\n", |
| 2203 | s->name, mod->name); | 2197 | s->name, mod->name); |
| 2204 | } else { | 2198 | if (!warn_unresolved) |
| 2205 | merror("\"%s\" [%s.ko] undefined!\n", | ||
| 2206 | s->name, mod->name); | ||
| 2207 | err = 1; | 2199 | err = 1; |
| 2208 | } | ||
| 2209 | } | 2200 | } |
| 2210 | continue; | 2201 | continue; |
| 2211 | } | 2202 | } |
| @@ -2217,8 +2208,11 @@ static int check_exports(struct module *mod) · 5 unmodified lines | |||
| 2217 | 2208 | ||
| 2218 | if (exp->namespace && | 2209 | if (exp->namespace && |
| 2219 | !module_imports_namespace(mod, exp->namespace)) { | 2210 | !module_imports_namespace(mod, exp->namespace)) { |
| 2220 | warn("module %s uses symbol %s from namespace %s, but does not import it.\n", | 2211 | modpost_log(allow_missing_ns_imports ? LOG_WARN : LOG_ERROR, |
| 2221 | basename, exp->name, exp->namespace); | 2212 | "module %s uses symbol %s from namespace %s, but does not import it.\n", |
| 2213 | basename, exp->name, exp->namespace); | ||
| 2214 | if (!allow_missing_ns_imports) | ||
| 2215 | err = 1; | ||
| 2222 | add_namespace(&mod->missing_namespaces, exp->namespace); | 2216 | add_namespace(&mod->missing_namespaces, exp->namespace); |
| 2223 | } | 2217 | } |
| 2224 | 2218 | ||
| @@ -2565,7 +2559,7 @@ int main(int argc, char **argv) · 340 unmodified lines | |||
| 2565 | struct ext_sym_list *extsym_iter; | 2559 | struct ext_sym_list *extsym_iter; |
| 2566 | struct ext_sym_list *extsym_start = NULL; | 2560 | struct ext_sym_list *extsym_start = NULL; |
| 2567 | 2561 | ||
| 2568 | while ((opt = getopt(argc, argv, "i:e:mnsT:o:awEd:")) != -1) { | 2562 | while ((opt = getopt(argc, argv, "i:e:mnsT:o:awENd:")) != -1) { |
| 2569 | switch (opt) { | 2563 | switch (opt) { |
| 2570 | case 'i': | 2564 | case 'i': |
| 2571 | kernel_read = optarg; | 2565 | kernel_read = optarg; |
| @@ -2603,6 +2597,9 @@ int main(int argc, char **argv) · 31 unmodified lines | |||
| 2603 | case 'E': | 2597 | case 'E': |
| 2604 | sec_mismatch_fatal = 1; | 2598 | sec_mismatch_fatal = 1; |
| 2605 | break; | 2599 | break; |
| 2600 | case 'N': | ||
| 2601 | allow_missing_ns_imports = 1; | ||
| 2602 | break; | ||
| 2606 | case 'd': | 2603 | case 'd': |
| 2607 | missing_namespace_deps = optarg; | 2604 | missing_namespace_deps = optarg; |
| 2608 | break; | 2605 | break; |
| @@ -2658,7 +2655,7 @@ int main(int argc, char **argv) · 49 unmodified lines | |||
| 2658 | if (dump_write) | 2655 | if (dump_write) |
| 2659 | write_dump(dump_write); | 2656 | write_dump(dump_write); |
| 2660 | if (sec_mismatch_count && sec_mismatch_fatal) | 2657 | if (sec_mismatch_count && sec_mismatch_fatal) |
| 2661 | fatal("modpost: Section mismatches detected.\n" | 2658 | fatal("Section mismatches detected.\n" |
| 2662 | "Set CONFIG_SECTION_MISMATCH_WARN_ONLY=y to allow them.\n"); | 2659 | "Set CONFIG_SECTION_MISMATCH_WARN_ONLY=y to allow them.\n"); |
| 2663 | for (n = 0; n < SYMBOL_HASH_SIZE; n++) { | 2660 | for (n = 0; n < SYMBOL_HASH_SIZE; n++) { |
| 2664 | struct symbol *s; | 2661 | struct symbol *s; |
| @@ -198,6 +198,14 @@ void *grab_file(const char *filename, unsigned long *size); · 197 unmodified lines | |||
| 198 | char* get_next_line(unsigned long *pos, void *file, unsigned long size); | 198 | char* get_next_line(unsigned long *pos, void *file, unsigned long size); |
| 199 | void release_file(void *file, unsigned long size); | 199 | void release_file(void *file, unsigned long size); |
| 200 | 200 | ||
| 201 | void fatal(const char *fmt, ...); | 201 | enum loglevel { |
| 202 | void warn(const char *fmt, ...); | 202 | LOG_WARN, |
| 203 | void merror(const char *fmt, ...); | 203 | LOG_ERROR, |
| 204 | LOG_FATAL | ||
| 205 | }; | ||
| 206 | |||
| 207 | void modpost_log(enum loglevel loglevel, const char *fmt, ...); | ||
| 208 | |||
| 209 | #define warn(fmt, args...) modpost_log(LOG_WARN, fmt, ##args) | ||
| 210 | #define merror(fmt, args...) modpost_log(LOG_ERROR, fmt, ##args) | ||
| 211 | #define fatal(fmt, args...) modpost_log(LOG_FATAL, fmt, ##args) | ||
| @@ -198,6 +198,10 @@ Description: Linux support headers for userspace development · 197 unmodified lines | |||
| 198 | This package provides userspaces headers from the Linux kernel. These headers | 198 | This package provides userspaces headers from the Linux kernel. These headers |
| 199 | are used by the installed headers for GNU glibc and other system libraries. | 199 | are used by the installed headers for GNU glibc and other system libraries. |
| 200 | Multi-Arch: same | 200 | Multi-Arch: same |
| 201 | EOF | ||
| 202 | |||
| 203 | if is_enabled CONFIG_DEBUG_INFO; then | ||
| 204 | cat <<EOF >> debian/control | ||
| 201 | 205 | ||
| 202 | Package: $dbg_packagename | 206 | Package: $dbg_packagename |
| 203 | Section: debug | 207 | Section: debug |
| @@ -206,6 +210,7 @@ Description: Linux kernel debugging symbols for $version · 2 unmodified lines | |||
| 206 | This package will come in handy if you need to debug the kernel. It provides | 210 | This package will come in handy if you need to debug the kernel. It provides |
| 207 | all the necessary debug symbols for the kernel and its modules. | 211 | all the necessary debug symbols for the kernel and its modules. |
| 208 | EOF | 212 | EOF |
| 213 | fi | ||
| 209 | 214 | ||
| 210 | cat <<EOF > debian/rules | 215 | cat <<EOF > debian/rules |
| 211 | #!$(command -v $MAKE) -f | 216 | #!$(command -v $MAKE) -f |