@@ -1391,6 +1391,9 @@ help:
@echo ' headerdep - Detect inclusion cycles in headers'
@echo ' coccicheck - Check with Coccinelle'
@echo ''
+ @echo 'Tools:'
+ @echo ' nsdeps - Generate missing symbol namespace dependencies'
+ @echo ''
@echo 'Kernel selftest:'
@echo ' kselftest - Build and run kernel selftest (run as root)'
@echo ' Build, install, and boot kernel before'
@@ -1566,6 +1569,14 @@ quiet_cmd_tags = GEN $@
tags TAGS cscope gtags: FORCE
$(call cmd,tags)
+# Script to generate missing namespace dependencies
+
+PHONY += nsdeps
+
+nsdeps:
+ $(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modpost nsdeps
+ $(Q)$(CONFIG_SHELL) $(srctree)/scripts/$@
+
# Scripts to check various things for consistency
# ---------------------------------------------------------------------------
@@ -79,7 +79,8 @@ modpost = scripts/mod/modpost \
$(if $(KBUILD_EXTMOD),-o $(modulesymfile)) \
$(if $(CONFIG_DEBUG_SECTION_MISMATCH),,-S) \
$(if $(CONFIG_SECTION_MISMATCH_WARN_ONLY),,-E) \
- $(if $(KBUILD_EXTMOD)$(KBUILD_MODPOST_WARN),-w)
+ $(if $(KBUILD_EXTMOD)$(KBUILD_MODPOST_WARN),-w) \
+ $(if $(filter nsdeps,$(MAKECMDGOALS)),-d)
MODPOST_OPT=$(subst -i,-n,$(filter -i,$(MAKEFLAGS)))
@@ -130,6 +131,7 @@ $(modules): %.ko :%.o %.mod.o FORCE
targets += $(modules)
+nsdeps: _modpost
# Add FORCE to the prequisites of a target to force it to be always rebuilt.
# ---------------------------------------------------------------------------
new file mode 100644
@@ -0,0 +1,19 @@
+@has_ns_import@
+declarer name MODULE_IMPORT_NS;
+identifier virtual.ns;
+@@
+MODULE_IMPORT_NS(ns);
+
+@has_module_license@
+declarer name MODULE_LICENSE;
+expression license;
+@@
+MODULE_LICENSE(license);
+
+@do_import depends on has_module_license && !has_ns_import@
+declarer name MODULE_LICENSE;
+expression license;
+identifier virtual.ns;
+@@
+MODULE_LICENSE(license);
++ MODULE_IMPORT_NS(ns);
new file mode 100644
@@ -0,0 +1,41 @@
+#!/bin/bash
+# SPDX-License-Identifier: GPL-2.0
+# Linux kernel symbol namespace import generator
+#
+# This script requires at least spatch
+# version 1.0.6.
+SPATCH_REQ_VERSION="1.0.6"
+
+DIR="$(dirname $(readlink -f $0))/.."
+SPATCH="`which ${SPATCH:=spatch}`"
+if [ ! -x "$SPATCH" ]; then
+ echo 'spatch is part of the Coccinelle project and is available at http://coccinelle.lip6.fr/'
+ exit 1
+fi
+
+SPATCH_REQ_VERSION_NUM=$(echo $SPATCH_REQ_VERSION | ${DIR}/scripts/ld-version.sh)
+SPATCH_VERSION=$($SPATCH --version | head -1 | awk '{print $3}')
+SPATCH_VERSION_NUM=$(echo $SPATCH_VERSION | ${DIR}/scripts/ld-version.sh)
+
+if [ "$SPATCH_VERSION_NUM" -lt "$SPATCH_REQ_VERSION_NUM" ] ; then
+ echo 'spatch needs to be version 1.06 or higher'
+ exit 1
+fi
+
+generate_deps_for_ns() {
+ $SPATCH --very-quiet --in-place --sp-file $srctree/scripts/add_namespace.cocci -D ns=$1 $2
+}
+
+generate_deps() {
+ local mod_file=`echo $@ | sed -e 's/\.ns_deps/\.mod/'`
+ local mod_name=`cat $mod_file | sed -n 1p | sed -e 's/\/[^.]*$//'`
+ local mod_source_files=`cat $mod_file | sed -n 2p | sed -e 's/\.o/\.c/'`
+ for ns in `cat $@`; do
+ echo "Adding namespace $ns to module $mod_name (if needed)."
+ generate_deps_for_ns $ns $mod_source_files
+ done
+}
+
+for f in `find $srctree/.tmp_versions/ -name *.ns_deps`; do
+ generate_deps $f
+done
A script that uses the '<module>.ns_deps' file generated by modpost to automatically add the required symbol namespace dependencies to each module. Usage: 1) Move some symbols to a namespace with EXPORT_SYMBOL_NS() 2) Run 'make' (or 'make modules'), get warnings about modules not importing that namespace 3) Run 'make nsdeps' to automatically add required import statements to said modules This makes it easer for subsystem maintainers to introduce and maintain symbol namespaces into their codebase. Signed-off-by: Martijn Coenen <maco@android.com> --- Makefile | 11 ++++++++++ scripts/Makefile.modpost | 4 +++- scripts/add_namespace.cocci | 19 +++++++++++++++++ scripts/nsdeps | 41 +++++++++++++++++++++++++++++++++++++ 4 files changed, 74 insertions(+), 1 deletion(-) create mode 100644 scripts/add_namespace.cocci create mode 100644 scripts/nsdeps