|  | #!/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 <linux/export.h> | 
|  | # | 
|  | # The rule for including <linux/export.h> is very simple: | 
|  | # Include <linux/export.h> only when you use EXPORT_SYMBOL(). That's it. | 
|  | # | 
|  | # However, some headers include <linux/export.h> even though they are completely | 
|  | # unrelated to EXPORT_SYMBOL(). | 
|  | # | 
|  | # One example is include/linux/module.h. Please note <linux/module.h> and | 
|  | # <linux/export.h> are orthogonal. <linux/module.h> should be included by files | 
|  | # that can be compiled as modules. In other words, <linux/module.h> should be | 
|  | # included by EXPORT_SYMBOL consumers. In contrast, <linux/export.h> should be | 
|  | # included from EXPORT_SYMBOL providers, which may or may not be modular. | 
|  | # Hence, include/linux/module.h should *not* include <linux/export.h>. | 
|  | # | 
|  | # 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 <linux/export.h>, even though only some of them | 
|  | # actually export symbols. Hence, include/linux/linkage.h should *not* include | 
|  | # <linux/export.h>. | 
|  | # | 
|  | # Before fixing such headers, we must ensure that C files using EXPORT_SYMBOL() | 
|  | # include <linux/export.h> directly, since many C files currently rely on | 
|  | # <linux/export.h> being included indirectly (likely, via <linux/linkage> etc.). | 
|  | # | 
|  | # Therefore, this check. | 
|  | # | 
|  | # The problem is simple - the warned files use EXPORT_SYMBOL(), but do not | 
|  | # include <linux/export.h>. Please add #include <linux/export.h> to them. | 
|  | # | 
|  | # If the included headers are sorted alphabetically, please insert | 
|  | # <linux/export.h> in the appropriate position to maintain the sort order. | 
|  | # For this reason, this script only checks missing <linux/export.h>, 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:]]*<linux/export\.h>' | | 
|  | xargs -r printf "%s: warning: EXPORT_SYMBOL() is used, but #include <linux/export.h> is missing\n" >&2 | 
|  | } | 
|  |  | 
|  | # If you do not use EXPORT_SYMBOL(), please do not include <linux/export.h>. | 
|  | # Currently, this is checked for *.c files, but not for *.h files, because some | 
|  | # *.c files rely on <linux/export.h> being included indirectly. | 
|  | check_unnecessary_include_linux_export_h () { | 
|  |  | 
|  | git -C "${srctree:-.}" grep --files-with-matches '#include[[:space:]]*<linux/export\.h>' \ | 
|  | -- '*.[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 <linux/export.h> is present\n" >&2 | 
|  | } | 
|  |  | 
|  | case "${KBUILD_EXTRA_WARN}" in | 
|  | *1*) | 
|  | check_tracked_ignored_files | 
|  | ;; | 
|  | esac | 
|  |  | 
|  | case "${KBUILD_EXTRA_WARN}" in | 
|  | *2*) | 
|  | check_missing_include_linux_export_h | 
|  | check_unnecessary_include_linux_export_h | 
|  | ;; | 
|  | esac |