linux/scripts/tags.sh
<<
>>
Prefs
   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, SRCARCH, srctree, src, obj
   9
  10if [ "$KBUILD_VERBOSE" = "1" ]; then
  11        set -x
  12fi
  13
  14# This is a duplicate of RCS_FIND_IGNORE without escaped '()'
  15ignore="( -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 if we do not use O=.. builds
  21# Use make O=. {tags|cscope}
  22# to force full paths for a non-O= build
  23if [ "${KBUILD_SRC}" = "" ]; then
  24        tree=
  25else
  26        tree=${srctree}/
  27fi
  28
  29# Find all available archs
  30find_all_archs()
  31{
  32        ALLSOURCE_ARCHS=""
  33        for arch in `ls ${tree}arch`; do
  34                ALLSOURCE_ARCHS="${ALLSOURCE_ARCHS} "${arch##\/}
  35        done
  36}
  37
  38# Detect if ALLSOURCE_ARCHS is set. If not, we assume SRCARCH
  39if [ "${ALLSOURCE_ARCHS}" = "" ]; then
  40        ALLSOURCE_ARCHS=${SRCARCH}
  41elif [ "${ALLSOURCE_ARCHS}" = "all" ]; then
  42        find_all_archs
  43fi
  44
  45# find sources in arch/$ARCH
  46find_arch_sources()
  47{
  48        for i in $archincludedir; do
  49                prune="$prune -wholename $i -prune -o"
  50        done
  51        find ${tree}arch/$1 $ignore $subarchprune $prune -name "$2" -print;
  52}
  53
  54# find sources in arch/$1/include
  55find_arch_include_sources()
  56{
  57        include=$(find ${tree}arch/$1/ $subarchprune \
  58                                        -name include -type d -print);
  59        if [ -n "$include" ]; then
  60                archincludedir="$archincludedir $include"
  61                find $include $ignore -name "$2" -print;
  62        fi
  63}
  64
  65# find sources in include/
  66find_include_sources()
  67{
  68        find ${tree}include $ignore -name config -prune -o -name "$1" -print;
  69}
  70
  71# find sources in rest of tree
  72# we could benefit from a list of dirs to search in here
  73find_other_sources()
  74{
  75        find ${tree}* $ignore \
  76             \( -name include -o -name arch -o -name '.tmp_*' \) -prune -o \
  77               -name "$1" -print;
  78}
  79
  80find_sources()
  81{
  82        find_arch_sources $1 "$2"
  83}
  84
  85all_sources()
  86{
  87        find_arch_include_sources ${SRCARCH} '*.[chS]'
  88        if [ ! -z "$archinclude" ]; then
  89                find_arch_include_sources $archinclude '*.[chS]'
  90        fi
  91        find_include_sources '*.[chS]'
  92        for arch in $ALLSOURCE_ARCHS
  93        do
  94                find_sources $arch '*.[chS]'
  95        done
  96        find_other_sources '*.[chS]'
  97}
  98
  99all_compiled_sources()
 100{
 101        for i in $(all_sources); do
 102                case "$i" in
 103                        *.[cS])
 104                                j=${i/\.[cS]/\.o}
 105                                if [ -e $j ]; then
 106                                        echo $i
 107                                fi
 108                                ;;
 109                        *)
 110                                echo $i
 111                                ;;
 112                esac
 113        done
 114}
 115
 116all_target_sources()
 117{
 118        if [ -n "$COMPILED_SOURCE" ]; then
 119                all_compiled_sources
 120        else
 121                all_sources
 122        fi
 123}
 124
 125all_kconfigs()
 126{
 127        for arch in $ALLSOURCE_ARCHS; do
 128                find_sources $arch 'Kconfig*'
 129        done
 130        find_other_sources 'Kconfig*'
 131}
 132
 133all_defconfigs()
 134{
 135        find_sources $ALLSOURCE_ARCHS "defconfig"
 136}
 137
 138docscope()
 139{
 140        (echo \-k; echo \-q; all_target_sources) > cscope.files
 141        cscope -b -f cscope.out
 142}
 143
 144dogtags()
 145{
 146        all_target_sources | gtags -i -f -
 147}
 148
 149exuberant()
 150{
 151        all_target_sources | xargs $1 -a                        \
 152        -I __initdata,__exitdata,__acquires,__releases          \
 153        -I __read_mostly,____cacheline_aligned                  \
 154        -I ____cacheline_aligned_in_smp                         \
 155        -I ____cacheline_internodealigned_in_smp                \
 156        -I EXPORT_SYMBOL,EXPORT_SYMBOL_GPL                      \
 157        -I DEFINE_TRACE,EXPORT_TRACEPOINT_SYMBOL,EXPORT_TRACEPOINT_SYMBOL_GPL \
 158        --extra=+f --c-kinds=+px                                \
 159        --regex-asm='/^(ENTRY|_GLOBAL)\(([^)]*)\).*/\2/'        \
 160        --regex-c='/^SYSCALL_DEFINE[[:digit:]]?\(([^,)]*).*/sys_\1/' \
 161        --regex-c++='/^TRACE_EVENT\(([^,)]*).*/trace_\1/'               \
 162        --regex-c++='/^DEFINE_EVENT\([^,)]*, *([^,)]*).*/trace_\1/'     \
 163        --regex-c++='/PAGEFLAG\(([^,)]*).*/Page\1/'                     \
 164        --regex-c++='/PAGEFLAG\(([^,)]*).*/SetPage\1/'                  \
 165        --regex-c++='/PAGEFLAG\(([^,)]*).*/ClearPage\1/'                \
 166        --regex-c++='/TESTSETFLAG\(([^,)]*).*/TestSetPage\1/'           \
 167        --regex-c++='/TESTPAGEFLAG\(([^,)]*).*/Page\1/'                 \
 168        --regex-c++='/SETPAGEFLAG\(([^,)]*).*/SetPage\1/'               \
 169        --regex-c++='/__SETPAGEFLAG\(([^,)]*).*/__SetPage\1/'           \
 170        --regex-c++='/TESTCLEARFLAG\(([^,)]*).*/TestClearPage\1/'       \
 171        --regex-c++='/__TESTCLEARFLAG\(([^,)]*).*/TestClearPage\1/'     \
 172        --regex-c++='/CLEARPAGEFLAG\(([^,)]*).*/ClearPage\1/'           \
 173        --regex-c++='/__CLEARPAGEFLAG\(([^,)]*).*/__ClearPage\1/'       \
 174        --regex-c++='/__PAGEFLAG\(([^,)]*).*/__SetPage\1/'              \
 175        --regex-c++='/__PAGEFLAG\(([^,)]*).*/__ClearPage\1/'            \
 176        --regex-c++='/PAGEFLAG_FALSE\(([^,)]*).*/Page\1/'               \
 177        --regex-c++='/TESTSCFLAG\(([^,)]*).*/TestSetPage\1/'            \
 178        --regex-c++='/TESTSCFLAG\(([^,)]*).*/TestClearPage\1/'          \
 179        --regex-c++='/SETPAGEFLAG_NOOP\(([^,)]*).*/SetPage\1/'          \
 180        --regex-c++='/CLEARPAGEFLAG_NOOP\(([^,)]*).*/ClearPage\1/'      \
 181        --regex-c++='/__CLEARPAGEFLAG_NOOP\(([^,)]*).*/__ClearPage\1/'  \
 182        --regex-c++='/TESTCLEARFLAG_FALSE\(([^,)]*).*/TestClearPage\1/' \
 183        --regex-c++='/__TESTCLEARFLAG_FALSE\(([^,)]*).*/__TestClearPage\1/' \
 184        --regex-c++='/_PE\(([^,)]*).*/PEVENT_ERRNO__\1/'                \
 185        --regex-c='/PCI_OP_READ\(([a-z]*[a-z]).*[1-4]\)/pci_bus_read_config_\1/' \
 186        --regex-c='/PCI_OP_WRITE\(([a-z]*[a-z]).*[1-4]\)/pci_bus_write_config_\1/'
 187
 188        all_kconfigs | xargs $1 -a                              \
 189        --langdef=kconfig --language-force=kconfig              \
 190        --regex-kconfig='/^[[:blank:]]*(menu|)config[[:blank:]]+([[:alnum:]_]+)/\2/'
 191
 192        all_kconfigs | xargs $1 -a                              \
 193        --langdef=kconfig --language-force=kconfig              \
 194        --regex-kconfig='/^[[:blank:]]*(menu|)config[[:blank:]]+([[:alnum:]_]+)/CONFIG_\2/'
 195
 196        all_defconfigs | xargs -r $1 -a                         \
 197        --langdef=dotconfig --language-force=dotconfig          \
 198        --regex-dotconfig='/^#?[[:blank:]]*(CONFIG_[[:alnum:]_]+)/\1/'
 199}
 200
 201emacs()
 202{
 203        all_target_sources | xargs $1 -a                        \
 204        --regex='/^(ENTRY|_GLOBAL)(\([^)]*\)).*/\2/'            \
 205        --regex='/^SYSCALL_DEFINE[0-9]?(\([^,)]*\).*/sys_\1/'   \
 206        --regex='/^TRACE_EVENT(\([^,)]*\).*/trace_\1/'          \
 207        --regex='/^DEFINE_EVENT([^,)]*, *\([^,)]*\).*/trace_\1/' \
 208        --regex='/PAGEFLAG\(([^,)]*).*/Page\1/'                 \
 209        --regex='/PAGEFLAG\(([^,)]*).*/SetPage\1/'              \
 210        --regex='/PAGEFLAG\(([^,)]*).*/ClearPage\1/'            \
 211        --regex='/TESTSETFLAG\(([^,)]*).*/TestSetPage\1/'       \
 212        --regex='/TESTPAGEFLAG\(([^,)]*).*/Page\1/'             \
 213        --regex='/SETPAGEFLAG\(([^,)]*).*/SetPage\1/'           \
 214        --regex='/__SETPAGEFLAG\(([^,)]*).*/__SetPage\1/'       \
 215        --regex='/TESTCLEARFLAG\(([^,)]*).*/TestClearPage\1/'   \
 216        --regex='/__TESTCLEARFLAG\(([^,)]*).*/TestClearPage\1/' \
 217        --regex='/CLEARPAGEFLAG\(([^,)]*).*/ClearPage\1/'       \
 218        --regex='/__CLEARPAGEFLAG\(([^,)]*).*/__ClearPage\1/'   \
 219        --regex='/__PAGEFLAG\(([^,)]*).*/__SetPage\1/'          \
 220        --regex='/__PAGEFLAG\(([^,)]*).*/__ClearPage\1/'        \
 221        --regex='/PAGEFLAG_FALSE\(([^,)]*).*/Page\1/'           \
 222        --regex='/TESTSCFLAG\(([^,)]*).*/TestSetPage\1/'        \
 223        --regex='/TESTSCFLAG\(([^,)]*).*/TestClearPage\1/'      \
 224        --regex='/SETPAGEFLAG_NOOP\(([^,)]*).*/SetPage\1/'      \
 225        --regex='/CLEARPAGEFLAG_NOOP\(([^,)]*).*/ClearPage\1/'  \
 226        --regex='/__CLEARPAGEFLAG_NOOP\(([^,)]*).*/__ClearPage\1/' \
 227        --regex='/TESTCLEARFLAG_FALSE\(([^,)]*).*/TestClearPage\1/' \
 228        --regex='/__TESTCLEARFLAG_FALSE\(([^,)]*).*/__TestClearPage\1/' \
 229        --regex='/_PE\(([^,)]*).*/PEVENT_ERRNO__\1/'            \
 230        --regex='/PCI_OP_READ\(([a-z]*[a-z]).*[1-4]\)/pci_bus_read_config_\1/' \
 231        --regex='/PCI_OP_WRITE\(([a-z]*[a-z]).*[1-4]\)/pci_bus_write_config_\1/'
 232
 233        all_kconfigs | xargs $1 -a                              \
 234        --regex='/^[ \t]*\(\(menu\)*config\)[ \t]+\([a-zA-Z0-9_]+\)/\3/'
 235
 236        all_kconfigs | xargs $1 -a                              \
 237        --regex='/^[ \t]*\(\(menu\)*config\)[ \t]+\([a-zA-Z0-9_]+\)/CONFIG_\3/'
 238
 239        all_defconfigs | xargs -r $1 -a                         \
 240        --regex='/^#?[ \t]?\(CONFIG_[a-zA-Z0-9_]+\)/\1/'
 241}
 242
 243xtags()
 244{
 245        if $1 --version 2>&1 | grep -iq exuberant; then
 246                exuberant $1
 247        elif $1 --version 2>&1 | grep -iq emacs; then
 248                emacs $1
 249        else
 250                all_target_sources | xargs $1 -a
 251        fi
 252}
 253
 254# Support um (which uses SUBARCH)
 255if [ "${ARCH}" = "um" ]; then
 256        if [ "$SUBARCH" = "i386" ]; then
 257                archinclude=x86
 258        elif [ "$SUBARCH" = "x86_64" ]; then
 259                archinclude=x86
 260        else
 261                archinclude=${SUBARCH}
 262        fi
 263elif [ "${SRCARCH}" = "arm" -a "${SUBARCH}" != "" ]; then
 264        subarchdir=$(find ${tree}arch/$SRCARCH/ -name "mach-*" -type d -o \
 265                                                        -name "plat-*" -type d);
 266        for i in $subarchdir; do
 267                case "$i" in
 268                        *"mach-"${SUBARCH})
 269                                ;;
 270                        *"plat-"${SUBARCH})
 271                                ;;
 272                        *)
 273                                subarchprune="$subarchprune \
 274                                                -wholename $i -prune -o"
 275                                ;;
 276                esac
 277        done
 278fi
 279
 280remove_structs=
 281case "$1" in
 282        "cscope")
 283                docscope
 284                ;;
 285
 286        "gtags")
 287                dogtags
 288                ;;
 289
 290        "tags")
 291                rm -f tags
 292                xtags ctags
 293                remove_structs=y
 294                ;;
 295
 296        "TAGS")
 297                rm -f TAGS
 298                xtags etags
 299                remove_structs=y
 300                ;;
 301esac
 302
 303# Remove structure forward declarations.
 304if [ -n "$remove_structs" ]; then
 305    LANG=C sed -i -e '/^\([a-zA-Z_][a-zA-Z0-9_]*\)\t.*\t\/\^struct \1;.*\$\/;"\tx$/d' $1
 306fi
 307
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.