| 1 | #!/bin/sh |
| 2 | # SPDX-License-Identifier: GPL-2.0-only |
| 3 | |
| 4 | set -e |
| 5 | |
| 6 | # Detect files that are tracked but ignored by git. |
| 7 | check_tracked_ignored_files () { |
| 8 | git -C "${srctree:-.}" ls-files -i -c --exclude-per-directory=.gitignore 2>/dev/null | |
| 9 | sed 's/$/: warning: ignored by one of the .gitignore files/' >&2 |
| 10 | } |
| 11 | |
| 12 | # Check for missing #include <linux/export.h> |
| 13 | # |
| 14 | # The rule for including <linux/export.h> is very simple: |
| 15 | # Include <linux/export.h> only when you use EXPORT_SYMBOL(). That's it. |
| 16 | # |
| 17 | # However, some headers include <linux/export.h> even though they are completely |
| 18 | # unrelated to EXPORT_SYMBOL(). |
| 19 | # |
| 20 | # One example is include/linux/module.h. Please note <linux/module.h> and |
| 21 | # <linux/export.h> are orthogonal. <linux/module.h> should be included by files |
| 22 | # that can be compiled as modules. In other words, <linux/module.h> should be |
| 23 | # included by EXPORT_SYMBOL consumers. In contrast, <linux/export.h> should be |
| 24 | # included from EXPORT_SYMBOL providers, which may or may not be modular. |
| 25 | # Hence, include/linux/module.h should *not* include <linux/export.h>. |
| 26 | # |
| 27 | # Another example is include/linux/linkage.h, which is completely unrelated to |
| 28 | # EXPORT_SYMBOL(). Worse, it is included by most C files, which means, most C |
| 29 | # files end up including <linux/export.h>, even though only some of them |
| 30 | # actually export symbols. Hence, include/linux/linkage.h should *not* include |
| 31 | # <linux/export.h>. |
| 32 | # |
| 33 | # Before fixing such headers, we must ensure that C files using EXPORT_SYMBOL() |
| 34 | # include <linux/export.h> directly, since many C files currently rely on |
| 35 | # <linux/export.h> being included indirectly (likely, via <linux/linkage> etc.). |
| 36 | # |
| 37 | # Therefore, this check. |
| 38 | # |
| 39 | # The problem is simple - the warned files use EXPORT_SYMBOL(), but do not |
| 40 | # include <linux/export.h>. Please add #include <linux/export.h> to them. |
| 41 | # |
| 42 | # If the included headers are sorted alphabetically, please insert |
| 43 | # <linux/export.h> in the appropriate position to maintain the sort order. |
| 44 | # For this reason, this script only checks missing <linux/export.h>, but |
| 45 | # does not automatically fix it. |
| 46 | check_missing_include_linux_export_h () { |
| 47 | |
| 48 | git -C "${srctree:-.}" grep --files-with-matches -E 'EXPORT_SYMBOL((_NS)?(_GPL)?|_GPL_FOR_MODULES)\(.*\)' \ |
| 49 | -- '*.[ch]' :^tools/ :^include/linux/export.h | |
| 50 | xargs -r git -C "${srctree:-.}" grep --files-without-match '#include[[:space:]]*<linux/export\.h>' | |
| 51 | xargs -r printf "%s: warning: EXPORT_SYMBOL() is used, but #include <linux/export.h> is missing\n" >&2 |
| 52 | } |
| 53 | |
| 54 | # If you do not use EXPORT_SYMBOL(), please do not include <linux/export.h>. |
| 55 | # Currently, this is checked for *.c files, but not for *.h files, because some |
| 56 | # *.c files rely on <linux/export.h> being included indirectly. |
| 57 | check_unnecessary_include_linux_export_h () { |
| 58 | |
| 59 | git -C "${srctree:-.}" grep --files-with-matches '#include[[:space:]]*<linux/export\.h>' \ |
| 60 | -- '*.[c]' :^tools/ | |
| 61 | xargs -r git -C "${srctree:-.}" grep --files-without-match -E 'EXPORT_SYMBOL((_NS)?(_GPL)?|_GPL_FOR_MODULES)\(.*\)' | |
| 62 | xargs -r printf "%s: warning: EXPORT_SYMBOL() is not used, but #include <linux/export.h> is present\n" >&2 |
| 63 | } |
| 64 | |
| 65 | case "${KBUILD_EXTRA_WARN}" in |
| 66 | *1*) |
| 67 | check_tracked_ignored_files |
| 68 | ;; |
| 69 | esac |
| 70 | |
| 71 | case "${KBUILD_EXTRA_WARN}" in |
| 72 | *2*) |
| 73 | check_missing_include_linux_export_h |
| 74 | check_unnecessary_include_linux_export_h |
| 75 | ;; |
| 76 | esac |