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,__initconst,__devinitdata      \
 153        -I __devinitconst,__cpuinitdata,__initdata_memblock     \
 154        -I __refdata,__attribute                                \
 155        -I __acquires,__releases,__deprecated                   \
 156        -I __read_mostly,__aligned,____cacheline_aligned        \
 157        -I ____cacheline_aligned_in_smp                         \
 158        -I ____cacheline_internodealigned_in_smp                \
 159        -I __used,__packed,__packed2__,__must_check,__must_hold \
 160        -I EXPORT_SYMBOL,EXPORT_SYMBOL_GPL                      \
 161        -I DEFINE_TRACE,EXPORT_TRACEPOINT_SYMBOL,EXPORT_TRACEPOINT_SYMBOL_GPL \
 162        -I static,const                                         \
 163        --extra=+f --c-kinds=+px                                \
 164        --regex-asm='/^(ENTRY|_GLOBAL)\(([^)]*)\).*/\2/'        \
 165        --regex-c='/^SYSCALL_DEFINE[[:digit:]]?\(([^,)]*).*/sys_\1/' \
 166        --regex-c++='/^TRACE_EVENT\(([^,)]*).*/trace_\1/'               \
 167        --regex-c++='/^DEFINE_EVENT\([^,)]*, *([^,)]*).*/trace_\1/'     \
 168        --regex-c++='/PAGEFLAG\(([^,)]*).*/Page\1/'                     \
 169        --regex-c++='/PAGEFLAG\(([^,)]*).*/SetPage\1/'                  \
 170        --regex-c++='/PAGEFLAG\(([^,)]*).*/ClearPage\1/'                \
 171        --regex-c++='/TESTSETFLAG\(([^,)]*).*/TestSetPage\1/'           \
 172        --regex-c++='/TESTPAGEFLAG\(([^,)]*).*/Page\1/'                 \
 173        --regex-c++='/SETPAGEFLAG\(([^,)]*).*/SetPage\1/'               \
 174        --regex-c++='/__SETPAGEFLAG\(([^,)]*).*/__SetPage\1/'           \
 175        --regex-c++='/TESTCLEARFLAG\(([^,)]*).*/TestClearPage\1/'       \
 176        --regex-c++='/__TESTCLEARFLAG\(([^,)]*).*/TestClearPage\1/'     \
 177        --regex-c++='/CLEARPAGEFLAG\(([^,)]*).*/ClearPage\1/'           \
 178        --regex-c++='/__CLEARPAGEFLAG\(([^,)]*).*/__ClearPage\1/'       \
 179        --regex-c++='/__PAGEFLAG\(([^,)]*).*/__SetPage\1/'              \
 180        --regex-c++='/__PAGEFLAG\(([^,)]*).*/__ClearPage\1/'            \
 181        --regex-c++='/PAGEFLAG_FALSE\(([^,)]*).*/Page\1/'               \
 182        --regex-c++='/TESTSCFLAG\(([^,)]*).*/TestSetPage\1/'            \
 183        --regex-c++='/TESTSCFLAG\(([^,)]*).*/TestClearPage\1/'          \
 184        --regex-c++='/SETPAGEFLAG_NOOP\(([^,)]*).*/SetPage\1/'          \
 185        --regex-c++='/CLEARPAGEFLAG_NOOP\(([^,)]*).*/ClearPage\1/'      \
 186        --regex-c++='/__CLEARPAGEFLAG_NOOP\(([^,)]*).*/__ClearPage\1/'  \
 187        --regex-c++='/TESTCLEARFLAG_FALSE\(([^,)]*).*/TestClearPage\1/' \
 188        --regex-c++='/__TESTCLEARFLAG_FALSE\(([^,)]*).*/__TestClearPage\1/' \
 189        --regex-c++='/_PE\(([^,)]*).*/PEVENT_ERRNO__\1/'                \
 190        --regex-c='/PCI_OP_READ\((\w*).*[1-4]\)/pci_bus_read_config_\1/' \
 191        --regex-c='/PCI_OP_WRITE\((\w*).*[1-4]\)/pci_bus_write_config_\1/' \
 192        --regex-c='/DEFINE_(MUTEX|SEMAPHORE|SPINLOCK)\((\w*)/\2/v/'     \
 193        --regex-c='/DEFINE_(RAW_SPINLOCK|RWLOCK|SEQLOCK)\((\w*)/\2/v/'  \
 194        --regex-c='/DECLARE_(RWSEM|COMPLETION)\((\w*)/\2/v/'            \
 195        --regex-c='/DECLARE_BITMAP\((\w*)/\1/v/'                        \
 196        --regex-c='/(^|\s)(|L|H)LIST_HEAD\((\w*)/\3/v/'                 \
 197        --regex-c='/(^|\s)RADIX_TREE\((\w*)/\2/v/'                      \
 198        --regex-c='/DEFINE_PER_CPU\(([^,]*,\s*)(\w*).*\)/\2/v/'         \
 199        --regex-c='/DEFINE_PER_CPU_SHARED_ALIGNED\(([^,]*,\s*)(\w*).*\)/\2/v/' \
 200        --regex-c='/DECLARE_WAIT_QUEUE_HEAD\((\w*)/\1/v/'               \
 201        --regex-c='/DECLARE_(TASKLET|WORK|DELAYED_WORK)\((\w*)/\2/v/'   \
 202        --regex-c='/DEFINE_PCI_DEVICE_TABLE\((\w*)/\1/v/'               \
 203        --regex-c='/(^\s)OFFSET\((\w*)/\2/v/'                           \
 204        --regex-c='/(^\s)DEFINE\((\w*)/\2/v/'
 205
 206        all_kconfigs | xargs $1 -a                              \
 207        --langdef=kconfig --language-force=kconfig              \
 208        --regex-kconfig='/^[[:blank:]]*(menu|)config[[:blank:]]+([[:alnum:]_]+)/\2/'
 209
 210        all_kconfigs | xargs $1 -a                              \
 211        --langdef=kconfig --language-force=kconfig              \
 212        --regex-kconfig='/^[[:blank:]]*(menu|)config[[:blank:]]+([[:alnum:]_]+)/CONFIG_\2/'
 213
 214        all_defconfigs | xargs -r $1 -a                         \
 215        --langdef=dotconfig --language-force=dotconfig          \
 216        --regex-dotconfig='/^#?[[:blank:]]*(CONFIG_[[:alnum:]_]+)/\1/'
 217}
 218
 219emacs()
 220{
 221        all_target_sources | xargs $1 -a                        \
 222        --regex='/^\(ENTRY\|_GLOBAL\)(\([^)]*\)).*/\2/'         \
 223        --regex='/^SYSCALL_DEFINE[0-9]?(\([^,)]*\).*/sys_\1/'   \
 224        --regex='/^TRACE_EVENT(\([^,)]*\).*/trace_\1/'          \
 225        --regex='/^DEFINE_EVENT([^,)]*, *\([^,)]*\).*/trace_\1/' \
 226        --regex='/PAGEFLAG(\([^,)]*\).*/Page\1/'                        \
 227        --regex='/PAGEFLAG(\([^,)]*\).*/SetPage\1/'             \
 228        --regex='/PAGEFLAG(\([^,)]*\).*/ClearPage\1/'           \
 229        --regex='/TESTSETFLAG(\([^,)]*\).*/TestSetPage\1/'      \
 230        --regex='/TESTPAGEFLAG(\([^,)]*\).*/Page\1/'            \
 231        --regex='/SETPAGEFLAG(\([^,)]*\).*/SetPage\1/'          \
 232        --regex='/__SETPAGEFLAG(\([^,)]*\).*/__SetPage\1/'      \
 233        --regex='/TESTCLEARFLAG(\([^,)]*\).*/TestClearPage\1/'  \
 234        --regex='/__TESTCLEARFLAG(\([^,)]*\).*/TestClearPage\1/'        \
 235        --regex='/CLEARPAGEFLAG(\([^,)]*\).*/ClearPage\1/'      \
 236        --regex='/__CLEARPAGEFLAG(\([^,)]*\).*/__ClearPage\1/'  \
 237        --regex='/__PAGEFLAG(\([^,)]*\).*/__SetPage\1/'         \
 238        --regex='/__PAGEFLAG(\([^,)]*\).*/__ClearPage\1/'       \
 239        --regex='/PAGEFLAG_FALSE(\([^,)]*\).*/Page\1/'          \
 240        --regex='/TESTSCFLAG(\([^,)]*\).*/TestSetPage\1/'       \
 241        --regex='/TESTSCFLAG(\([^,)]*\).*/TestClearPage\1/'     \
 242        --regex='/SETPAGEFLAG_NOOP(\([^,)]*\).*/SetPage\1/'     \
 243        --regex='/CLEARPAGEFLAG_NOOP(\([^,)]*\).*/ClearPage\1/' \
 244        --regex='/__CLEARPAGEFLAG_NOOP(\([^,)]*\).*/__ClearPage\1/' \
 245        --regex='/TESTCLEARFLAG_FALSE(\([^,)]*\).*/TestClearPage\1/' \
 246        --regex='/__TESTCLEARFLAG_FALSE(\([^,)]*\).*/__TestClearPage\1/' \
 247        --regex='/_PE(\([^,)]*\).*/PEVENT_ERRNO__\1/'           \
 248        --regex='/PCI_OP_READ(\([a-z]*[a-z]\).*[1-4])/pci_bus_read_config_\1/' \
 249        --regex='/PCI_OP_WRITE(\([a-z]*[a-z]\).*[1-4])/pci_bus_write_config_\1/'
 250
 251        all_kconfigs | xargs $1 -a                              \
 252        --regex='/^[ \t]*\(\(menu\)*config\)[ \t]+\([a-zA-Z0-9_]+\)/\3/'
 253
 254        all_kconfigs | xargs $1 -a                              \
 255        --regex='/^[ \t]*\(\(menu\)*config\)[ \t]+\([a-zA-Z0-9_]+\)/CONFIG_\3/'
 256
 257        all_defconfigs | xargs -r $1 -a                         \
 258        --regex='/^#?[ \t]?\(CONFIG_[a-zA-Z0-9_]+\)/\1/'
 259}
 260
 261xtags()
 262{
 263        if $1 --version 2>&1 | grep -iq exuberant; then
 264                exuberant $1
 265        elif $1 --version 2>&1 | grep -iq emacs; then
 266                emacs $1
 267        else
 268                all_target_sources | xargs $1 -a
 269        fi
 270}
 271
 272# Support um (which uses SUBARCH)
 273if [ "${ARCH}" = "um" ]; then
 274        if [ "$SUBARCH" = "i386" ]; then
 275                archinclude=x86
 276        elif [ "$SUBARCH" = "x86_64" ]; then
 277                archinclude=x86
 278        else
 279                archinclude=${SUBARCH}
 280        fi
 281elif [ "${SRCARCH}" = "arm" -a "${SUBARCH}" != "" ]; then
 282        subarchdir=$(find ${tree}arch/$SRCARCH/ -name "mach-*" -type d -o \
 283                                                        -name "plat-*" -type d);
 284        for i in $subarchdir; do
 285                case "$i" in
 286                        *"mach-"${SUBARCH})
 287                                ;;
 288                        *"plat-"${SUBARCH})
 289                                ;;
 290                        *)
 291                                subarchprune="$subarchprune \
 292                                                -wholename $i -prune -o"
 293                                ;;
 294                esac
 295        done
 296fi
 297
 298remove_structs=
 299case "$1" in
 300        "cscope")
 301                docscope
 302                ;;
 303
 304        "gtags")
 305                dogtags
 306                ;;
 307
 308        "tags")
 309                rm -f tags
 310                xtags ctags
 311                remove_structs=y
 312                ;;
 313
 314        "TAGS")
 315                rm -f TAGS
 316                xtags etags
 317                remove_structs=y
 318                ;;
 319esac
 320
 321# Remove structure forward declarations.
 322if [ -n "$remove_structs" ]; then
 323    LANG=C sed -i -e '/^\([a-zA-Z_][a-zA-Z0-9_]*\)\t.*\t\/\^struct \1;.*\$\/;"\tx$/d' $1
 324fi
 325