Something went wrong. Try again.
Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
Something went wrong. Try again.
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677#!/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)?|_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)?|_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