tags.sh 3.8 KB
Newer Older
1 2 3 4 5 6 7 8 9
#!/bin/sh
# Generate tags or cscope files
# Usage tags.sh <mode>
#
# mode may be any of: tags, TAGS, cscope
#
# Uses the following environment variables:
# ARCH, SUBARCH, srctree, src, obj

10
if [ "$KBUILD_VERBOSE" = "1" ]; then
11 12 13 14 15 16 17 18 19 20
	set -x
fi

# This is a duplicate of RCS_FIND_IGNORE without escaped '()'
ignore="( -name SCCS -o -name BitKeeper -o -name .svn -o \
          -name CVS  -o -name .pc       -o -name .hg  -o \
          -name .git )                                   \
          -prune -o"

# Do not use full path is we do not use O=.. builds
21
if [ "${KBUILD_SRC}" = "" ]; then
22 23
	tree=
else
J
Jiri Slaby 已提交
24
	tree=${srctree}/
25 26
fi

27 28 29 30 31
# Detect if ALLSOURCE_ARCHS is set. If not, we assume SRCARCH
if [ "${ALLSOURCE_ARCHS}" = "" ]; then
	ALLSOURCE_ARCHS=${SRCARCH}
fi

32 33 34
# find sources in arch/$ARCH
find_arch_sources()
{
J
Jiri Slaby 已提交
35
	find ${tree}arch/$1 $ignore -name "$2" -print;
36 37 38 39 40
}

# find sources in arch/$1/include
find_arch_include_sources()
{
J
Jiri Slaby 已提交
41
	find ${tree}arch/$1/include $ignore -name "$2" -print;
42 43 44 45 46
}

# find sources in include/
find_include_sources()
{
J
Jiri Slaby 已提交
47
	find ${tree}include $ignore -name config -prune -o -name "$1" -print;
48 49 50 51 52 53 54 55
}

# find sources in rest of tree
# we could benefit from a list of dirs to search in here
find_other_sources()
{
	find ${tree}* $ignore \
	     \( -name include -o -name arch -o -name '.tmp_*' \) -prune -o \
J
Jiri Slaby 已提交
56
	       -name "$1" -print;
57 58 59 60
}

find_sources()
{
J
Jiri Slaby 已提交
61
	find_arch_sources $1 "$2"
62 63 64 65
}

all_sources()
{
66 67 68 69
	for arch in $ALLSOURCE_ARCHS
	do
		find_sources $arch '*.[chS]'
	done
70
	if [ ! -z "$archinclude" ]; then
J
Jiri Slaby 已提交
71
		find_arch_include_sources $archinclude '*.[chS]'
72
	fi
73 74
	find_include_sources '*.[chS]'
	find_other_sources '*.[chS]'
75 76 77 78
}

all_kconfigs()
{
79 80 81 82
	for arch in $ALLSOURCE_ARCHS; do
		find_sources $arch 'Kconfig*'
	done
	find_other_sources 'Kconfig*'
83 84 85 86
}

all_defconfigs()
{
87
	find_sources $ALLSOURCE_ARCHS "defconfig"
88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147
}

docscope()
{
	(echo \-k; echo \-q; all_sources) > cscope.files
	cscope -b -f cscope.out
}

exuberant()
{
	all_sources | xargs $1 -a                               \
	-I __initdata,__exitdata,__acquires,__releases          \
	-I __read_mostly,____cacheline_aligned                  \
	-I ____cacheline_aligned_in_smp                         \
	-I ____cacheline_internodealigned_in_smp                \
	-I EXPORT_SYMBOL,EXPORT_SYMBOL_GPL                      \
	--extra=+f --c-kinds=+px                                \
	--regex-asm='/^ENTRY\(([^)]*)\).*/\1/'

	all_kconfigs | xargs $1 -a                              \
	--langdef=kconfig --language-force=kconfig              \
	--regex-kconfig='/^[[:blank:]]*(menu|)config[[:blank:]]+([[:alnum:]_]+)/\2/'

	all_kconfigs | xargs $1 -a                              \
	--langdef=kconfig --language-force=kconfig              \
	--regex-kconfig='/^[[:blank:]]*(menu|)config[[:blank:]]+([[:alnum:]_]+)/CONFIG_\2/'

	all_defconfigs | xargs -r $1 -a                         \
	--langdef=dotconfig --language-force=dotconfig          \
	--regex-dotconfig='/^#?[[:blank:]]*(CONFIG_[[:alnum:]_]+)/\1/'

}

emacs()
{
	all_sources | xargs $1 -a

	all_kconfigs | xargs $1 -a                              \
	--regex='/^[ \t]*\(\(menu\)*config\)[ \t]+\([a-zA-Z0-9_]+\)/\3/'

	all_kconfigs | xargs $1 -a                              \
	--regex='/^[ \t]*\(\(menu\)*config\)[ \t]+\([a-zA-Z0-9_]+\)/CONFIG_\3/'

	all_defconfigs | xargs -r $1 -a                         \
	--regex='/^#?[ \t]?\(CONFIG_[a-zA-Z0-9_]+\)/\1/'
}

xtags()
{
	if $1 --version 2>&1 | grep -iq exuberant; then
		exuberant $1
	elif $1 --version 2>&1 | grep -iq emacs; then
		emacs $1
	else
		all_sources | xargs $1 -a
        fi
}


# Support um (which uses SUBARCH)
148 149
if [ "${ARCH}" = "um" ]; then
	if [ "$SUBARCH" = "i386" ]; then
150
		archinclude=x86
151
	elif [ "$SUBARCH" = "x86_64" ]; then
152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170
		archinclude=x86
	else
		archinclude=${SUBARCH}
	fi
fi

case "$1" in
	"cscope")
		docscope
		;;

	"tags")
		xtags ctags
		;;

	"TAGS")
		xtags etags
		;;
esac