#!/bin/sh # SPDX-License-Identifier: GPL-2.0-only set -e # Detect files that are tracked but ignored by git. check_tracked_ignored_files () { git -C "${srctree:-.}" ls-files -i -c --exclude-per-directory=.gitignore 2>/dev/null | sed 's/$/: warning: ignored by one of the .gitignore files/' >&2 } # Check for missing #include # # The rule for including is very simple: # Include only when you use EXPORT_SYMBOL(). That's it. # # However, some headers include even though they are completely # unrelated to EXPORT_SYMBOL(). # # One example is include/linux/module.h. Please note and # are orthogonal. should be included by files # that can be compiled as modules. In other words, should be # included by EXPORT_SYMBOL consumers. In contrast, should be # included from EXPORT_SYMBOL providers, which may or may not be modular. # Hence, include/linux/module.h should *not* include . # # Another example is include/linux/linkage.h, which is completely unrelated to # EXPORT_SYMBOL(). Worse, it is included by most C files, which means, most C # files end up including , even though only some of them # actually export symbols. Hence, include/linux/linkage.h should *not* include # . # # Before fixing such headers, we must ensure that C files using EXPORT_SYMBOL() # include directly, since many C files currently rely on # being included indirectly (likely, via etc.). # # Therefore, this check. # # The problem is simple - the warned files use EXPORT_SYMBOL(), but do not # include . Please add #include to them. # # If the included headers are sorted alphabetically, please insert # in the appropriate position to maintain the sort order. # For this reason, this script only checks missing , but # does not automatically fix it. check_missing_include_linux_export_h () { git -C "${srctree:-.}" grep --files-with-matches -E 'EXPORT_SYMBOL((_NS)?(_GPL)?|_GPL_FOR_MODULES)\(.*\)' \ -- '*.[ch]' :^tools/ :^include/linux/export.h | xargs -r git -C "${srctree:-.}" grep --files-without-match '#include[[:space:]]*' | xargs -r printf "%s: warning: EXPORT_SYMBOL() is used, but #include is missing\n" >&2 } # If you do not use EXPORT_SYMBOL(), please do not include . # Currently, this is checked for *.c files, but not for *.h files, because some # *.c files rely on being included indirectly. check_unnecessary_include_linux_export_h () { git -C "${srctree:-.}" grep --files-with-matches '#include[[:space:]]*' \ -- '*.[c]' :^tools/ | xargs -r git -C "${srctree:-.}" grep --files-without-match -E 'EXPORT_SYMBOL((_NS)?(_GPL)?|_GPL_FOR_MODULES)\(.*\)' | xargs -r printf "%s: warning: EXPORT_SYMBOL() is not used, but #include is present\n" >&2 } check_tracked_ignored_files check_missing_include_linux_export_h check_unnecessary_include_linux_export_h