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, 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 is we do not use O=.. builds
  21if [ "${KBUILD_SRC}" = "" ]; then
  22        tree=
  23else
  24        tree=${srctree}/
  25fi
  26
  27# Detect if ALLSOURCE_ARCHS is set. If not, we assume SRCARCH
  28if [ "${ALLSOURCE_ARCHS}" = "" ]; then
  29        ALLSOURCE_ARCHS=${SRCARCH}
  30fi
  31
  32# find sources in arch/$ARCH
  33find_arch_sources()
  34{
  35        find ${tree}arch/$1 $ignore -name "$2" -print;
  36}
  37
  38# find sources in arch/$1/include
  39find_arch_include_sources()
  40{
  41        find ${tree}arch/$1/include $ignore -name "$2" -print;
  42}
  43
  44# find sources in include/
  45find_include_sources()
  46{
  47        find ${tree}include $ignore -name config -prune -o -name "$1" -print;
  48}
  49
  50# find sources in rest of tree
  51# we could benefit from a list of dirs to search in here
  52find_other_sources()
  53{
  54        find ${tree}* $ignore \
  55             \( -name include -o -name arch -o -name '.tmp_*' \) -prune -o \
  56               -name "$1" -print;
  57}
  58
  59find_sources()
  60{
  61        find_arch_sources $1 "$2"
  62}
  63
  64all_sources()
  65{
  66        for arch in $ALLSOURCE_ARCHS
  67        do
  68                find_sources $arch '*.[chS]'
  69        done
  70        if [ ! -z "$archinclude" ]; then
  71                find_arch_include_sources $archinclude '*.[chS]'
  72        fi
  73        find_include_sources '*.[chS]'
  74        find_other_sources '*.[chS]'
  75}
  76
  77all_kconfigs()
  78{
  79        for arch in $ALLSOURCE_ARCHS; do
  80                find_sources $arch 'Kconfig*'
  81        done
  82        find_other_sources 'Kconfig*'
  83}
  84
  85all_defconfigs()
  86{
  87        find_sources $ALLSOURCE_ARCHS "defconfig"
  88}
  89
  90docscope()
  91{
  92        (echo \-k; echo \-q; all_sources) > cscope.files
  93        cscope -b -f cscope.out
  94}
  95
  96exuberant()
  97{
  98        all_sources | xargs $1 -a                               \
  99        -I __initdata,__exitdata,__acquires,__releases          \
 100        -I __read_mostly,____cacheline_aligned                  \
 101        -I ____cacheline_aligned_in_smp                         \
 102        -I ____cacheline_internodealigned_in_smp                \
 103        -I EXPORT_SYMBOL,EXPORT_SYMBOL_GPL                      \
 104        -I DEFINE_TRACE,EXPORT_TRACEPOINT_SYMBOL,EXPORT_TRACEPOINT_SYMBOL_GPL \
 105        --extra=+f --c-kinds=-px                                \
 106        --regex-asm='/^ENTRY\(([^)]*)\).*/\1/'                  \
 107        --regex-c='/^SYSCALL_DEFINE[[:digit:]]?\(([^,)]*).*/sys_\1/'
 108
 109        all_kconfigs | xargs $1 -a                              \
 110        --langdef=kconfig --language-force=kconfig              \
 111        --regex-kconfig='/^[[:blank:]]*(menu|)config[[:blank:]]+([[:alnum:]_]+)/\2/'
 112
 113        all_kconfigs | xargs $1 -a                              \
 114        --langdef=kconfig --language-force=kconfig              \
 115        --regex-kconfig='/^[[:blank:]]*(menu|)config[[:blank:]]+([[:alnum:]_]+)/CONFIG_\2/'
 116
 117        all_defconfigs | xargs -r $1 -a                         \
 118        --langdef=dotconfig --language-force=dotconfig          \
 119        --regex-dotconfig='/^#?[[:blank:]]*(CONFIG_[[:alnum:]_]+)/\1/'
 120
 121}
 122
 123emacs()
 124{
 125        all_sources | xargs $1 -a                               \
 126        --regex='/^ENTRY(\([^)]*\)).*/\1/'                      \
 127        --regex='/^SYSCALL_DEFINE[0-9]?(\([^,)]*\).*/sys_\1/'
 128
 129        all_kconfigs | xargs $1 -a                              \
 130        --regex='/^[ \t]*\(\(menu\)*config\)[ \t]+\([a-zA-Z0-9_]+\)/\3/'
 131
 132        all_kconfigs | xargs $1 -a                              \
 133        --regex='/^[ \t]*\(\(menu\)*config\)[ \t]+\([a-zA-Z0-9_]+\)/CONFIG_\3/'
 134
 135        all_defconfigs | xargs -r $1 -a                         \
 136        --regex='/^#?[ \t]?\(CONFIG_[a-zA-Z0-9_]+\)/\1/'
 137}
 138
 139xtags()
 140{
 141        if $1 --version 2>&1 | grep -iq exuberant; then
 142                exuberant $1
 143        elif $1 --version 2>&1 | grep -iq emacs; then
 144                emacs $1
 145        else
 146                all_sources | xargs $1 -a
 147        fi
 148}
 149
 150
 151# Support um (which uses SUBARCH)
 152if [ "${ARCH}" = "um" ]; then
 153        if [ "$SUBARCH" = "i386" ]; then
 154                archinclude=x86
 155        elif [ "$SUBARCH" = "x86_64" ]; then
 156                archinclude=x86
 157        else
 158                archinclude=${SUBARCH}
 159        fi
 160fi
 161
 162case "$1" in
 163        "cscope")
 164                docscope
 165                ;;
 166
 167        "tags")
 168                rm -f tags
 169                xtags ctags
 170                ;;
 171
 172        "TAGS")
 173                rm -f TAGS
 174                xtags etags
 175                ;;
 176esac
 177