tags and cscope support really belongs in a shell script
[safe/jmp/linux-2.6] / scripts / tags.sh
1 #!/bin/sh
2 # Generate tags or cscope files
3 # Usage tags.sh <mode>
4 #
5 # mode may be any of: tags, TAGS, cscope
6 #
7 # Uses the following environment variables:
8 # ARCH, SUBARCH, srctree, src, obj
9
10 if [ $KBUILD_VERBOSE == 1 ]; then
11         set -x
12 fi
13
14 # This is a duplicate of RCS_FIND_IGNORE without escaped '()'
15 ignore="( -name SCCS -o -name BitKeeper -o -name .svn -o \
16           -name CVS  -o -name .pc       -o -name .hg  -o \
17           -name .git )                                   \
18           -prune -o"
19
20 # Do not use full path is we do not use O=.. builds
21 if [ ${src} == ${obj} ]; then
22         tree=
23 else
24         tree=${srctree}
25 fi
26
27 # find sources in arch/$ARCH
28 find_arch_sources()
29 {
30         find ${tree}arch/$1 $ignore -name $2 -print;
31 }
32
33 # find sources in arch/$1/include
34 find_arch_include_sources()
35 {
36         find ${tree}arch/$1/include $ignore -name $2 -print;
37 }
38
39 # find sources in include/
40 find_include_sources()
41 {
42         find ${tree}include $ignore -name config -prune -o -name $1 -print;
43 }
44
45 # find sources in rest of tree
46 # we could benefit from a list of dirs to search in here
47 find_other_sources()
48 {
49         find ${tree}* $ignore \
50              \( -name include -o -name arch -o -name '.tmp_*' \) -prune -o \
51                -name $1 -print;
52 }
53
54 find_sources()
55 {
56         find_arch_sources $1 $2
57         find_include_sources $2
58         find_other_sources $2
59 }
60
61 all_sources()
62 {
63         find_sources $SRCARCH *.[chS]
64         if [ ! -z "$archinclude" ]; then
65                 find_arch_include_sources $archinclude *.[chS]
66         fi
67 }
68
69 all_kconfigs()
70 {
71         find_sources $SRCARCH "Kconfig*"
72 }
73
74 all_defconfigs()
75 {
76         find_sources $SRCARCH "defconfig"
77 }
78
79 docscope()
80 {
81         (echo \-k; echo \-q; all_sources) > cscope.files
82         cscope -b -f cscope.out
83 }
84
85 exuberant()
86 {
87         all_sources > all
88         all_sources | xargs $1 -a                               \
89         -I __initdata,__exitdata,__acquires,__releases          \
90         -I __read_mostly,____cacheline_aligned                  \
91         -I ____cacheline_aligned_in_smp                         \
92         -I ____cacheline_internodealigned_in_smp                \
93         -I EXPORT_SYMBOL,EXPORT_SYMBOL_GPL                      \
94         --extra=+f --c-kinds=+px                                \
95         --regex-asm='/^ENTRY\(([^)]*)\).*/\1/'
96
97         all_kconfigs | xargs $1 -a                              \
98         --langdef=kconfig --language-force=kconfig              \
99         --regex-kconfig='/^[[:blank:]]*(menu|)config[[:blank:]]+([[:alnum:]_]+)/\2/'
100
101         all_kconfigs | xargs $1 -a                              \
102         --langdef=kconfig --language-force=kconfig              \
103         --regex-kconfig='/^[[:blank:]]*(menu|)config[[:blank:]]+([[:alnum:]_]+)/CONFIG_\2/'
104
105         all_defconfigs | xargs -r $1 -a                         \
106         --langdef=dotconfig --language-force=dotconfig          \
107         --regex-dotconfig='/^#?[[:blank:]]*(CONFIG_[[:alnum:]_]+)/\1/'
108
109 }
110
111 emacs()
112 {
113         all_sources | xargs $1 -a
114
115         all_kconfigs | xargs $1 -a                              \
116         --regex='/^[ \t]*\(\(menu\)*config\)[ \t]+\([a-zA-Z0-9_]+\)/\3/'
117
118         all_kconfigs | xargs $1 -a                              \
119         --regex='/^[ \t]*\(\(menu\)*config\)[ \t]+\([a-zA-Z0-9_]+\)/CONFIG_\3/'
120
121         all_defconfigs | xargs -r $1 -a                         \
122         --regex='/^#?[ \t]?\(CONFIG_[a-zA-Z0-9_]+\)/\1/'
123 }
124
125 xtags()
126 {
127         if $1 --version 2>&1 | grep -iq exuberant; then
128                 exuberant $1
129         elif $1 --version 2>&1 | grep -iq emacs; then
130                 emacs $1
131         else
132                 all_sources | xargs $1 -a
133         fi
134 }
135
136
137 # Support um (which uses SUBARCH)
138 if [ ${ARCH} == um ]; then
139         if [ $SUBARCH == i386 ]; then
140                 archinclude=x86
141         elif [ $SUBARCH == x86_64 ]; then
142                 archinclude=x86
143         else
144                 archinclude=${SUBARCH}
145         fi
146 fi
147
148 case "$1" in
149         "cscope")
150                 docscope
151                 ;;
152
153         "tags")
154                 xtags ctags
155                 ;;
156
157         "TAGS")
158                 xtags etags
159                 ;;
160 esac