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
 204        all_kconfigs | xargs $1 -a                              \
 205        --langdef=kconfig --language-force=kconfig              \
 206        --regex-kconfig='/^[[:blank:]]*(menu|)config[[:blank:]]+([[:alnum:]_]+)/\2/'
 207
 208        all_kconfigs | xargs $1 -a                              \
 209        --langdef=kconfig --language-force=kconfig              \
 210        --regex-kconfig='/^[[:blank:]]*(menu|)config[[:blank:]]+([[:alnum:]_]+)/CONFIG_\2/'
 211
 212        all_defconfigs | xargs -r $1 -a                         \
 213        --langdef=dotconfig --language-force=dotconfig          \
 214        --regex-dotconfig='/^#?[[:blank:]]*(CONFIG_[[:alnum:]_]+)/\1/'
 215}
 216
 217emacs()
 218{
 219        all_target_sources | xargs $1 -a                        \
 220        --regex='/^\(ENTRY\|_GLOBAL\)(\([^)]*\)).*/\2/'         \
 221        --regex='/^SYSCALL_DEFINE[0-9]?(\([^,)]*\).*/sys_\1/'   \
 222        --regex='/^TRACE_EVENT(\([^,)]*\).*/trace_\1/'          \
 223        --regex='/^DEFINE_EVENT([^,)]*, *\([^,)]*\).*/trace_\1/' \
 224        --regex='/PAGEFLAG(\([^,)]*\).*/Page\1/'                        \
 225        --regex='/PAGEFLAG(\([^,)]*\).*/SetPage\1/'             \
 226        --regex='/PAGEFLAG(\([^,)]*\).*/ClearPage\1/'           \
 227        --regex='/TESTSETFLAG(\([^,)]*\).*/TestSetPage\1/'      \
 228        --regex='/TESTPAGEFLAG(\([^,)]*\).*/Page\1/'            \
 229        --regex='/SETPAGEFLAG(\([^,)]*\).*/SetPage\1/'          \
 230        --regex='/__SETPAGEFLAG(\([^,)]*\).*/__SetPage\1/'      \
 231        --regex='/TESTCLEARFLAG(\([^,)]*\).*/TestClearPage\1/'  \
 232        --regex='/__TESTCLEARFLAG(\([^,)]*\).*/TestClearPage\1/'        \
 233        --regex='/CLEARPAGEFLAG(\([^,)]*\).*/ClearPage\1/'      \
 234        --regex='/__CLEARPAGEFLAG(\([^,)]*\).*/__ClearPage\1/'  \
 235        --regex='/__PAGEFLAG(\([^,)]*\).*/__SetPage\1/'         \
 236        --regex='/__PAGEFLAG(\([^,)]*\).*/__ClearPage\1/'       \
 237        --regex='/PAGEFLAG_FALSE(\([^,)]*\).*/Page\1/'          \
 238        --regex='/TESTSCFLAG(\([^,)]*\).*/TestSetPage\1/'       \
 239        --regex='/TESTSCFLAG(\([^,)]*\).*/TestClearPage\1/'     \
 240        --regex='/SETPAGEFLAG_NOOP(\([^,)]*\).*/SetPage\1/'     \
 241        --regex='/CLEARPAGEFLAG_NOOP(\([^,)]*\).*/ClearPage\1/' \
 242        --regex='/__CLEARPAGEFLAG_NOOP(\([^,)]*\).*/__ClearPage\1/' \
 243        --regex='/TESTCLEARFLAG_FALSE(\([^,)]*\).*/TestClearPage\1/' \
 244        --regex='/__TESTCLEARFLAG_FALSE(\([^,)]*\).*/__TestClearPage\1/' \
 245        --regex='/_PE(\([^,)]*\).*/PEVENT_ERRNO__\1/'           \
 246        --regex='/PCI_OP_READ(\([a-z]*[a-z]\).*[1-4])/pci_bus_read_config_\1/' \
 247        --regex='/PCI_OP_WRITE(\([a-z]*[a-z]\).*[1-4])/pci_bus_write_config_\1/'
 248
 249        all_kconfigs | xargs $1 -a                              \
 250        --regex='/^[ \t]*\(\(menu\)*config\)[ \t]+\([a-zA-Z0-9_]+\)/\3/'
 251
 252        all_kconfigs | xargs $1 -a                              \
 253        --regex='/^[ \t]*\(\(menu\)*config\)[ \t]+\([a-zA-Z0-9_]+\)/CONFIG_\3/'
 254
 255        all_defconfigs | xargs -r $1 -a                         \
 256        --regex='/^#?[ \t]?\(CONFIG_[a-zA-Z0-9_]+\)/\1/'
 257}
 258
 259xtags()
 260{
 261        if $1 --version 2>&1 | grep -iq exuberant; then
 262                exuberant $1
 263        elif $1 --version 2>&1 | grep -iq emacs; then
 264                emacs $1
 265        else
 266                all_target_sources | xargs $1 -a
 267        fi
 268}
 269
 270# Support um (which uses SUBARCH)
 271if [ "${ARCH}" = "um" ]; then
 272        if [ "$SUBARCH" = "i386" ]; then
 273                archinclude=x86
 274        elif [ "$SUBARCH" = "x86_64" ]; then
 275                archinclude=x86
 276        else
 277                archinclude=${SUBARCH}
 278        fi
 279elif [ "${SRCARCH}" = "arm" -a "${SUBARCH}" != "" ]; then
 280        subarchdir=$(find ${tree}arch/$SRCARCH/ -name "mach-*" -type d -o \
 281                                                        -name "plat-*" -type d);
 282        for i in $subarchdir; do
 283                case "$i" in
 284                        *"mach-"${SUBARCH})
 285                                ;;
 286                        *"plat-"${SUBARCH})
 287                                ;;
 288                        *)
 289                                subarchprune="$subarchprune \
 290                                                -wholename $i -prune -o"
 291                                ;;
 292                esac
 293        done
 294fi
 295
 296remove_structs=
 297case "$1" in
 298        "cscope")
 299                docscope
 300                ;;
 301
 302        "gtags")
 303                dogtags
 304                ;;
 305
 306        "tags")
 307                rm -f tags
 308                xtags ctags
 309                remove_structs=y
 310                ;;
 311
 312        "TAGS")
 313                rm -f TAGS
 314                xtags etags
 315                remove_structs=y
 316                ;;
 317esac
 318
 319# Remove structure forward declarations.
 320if [ -n "$remove_structs" ]; then
 321    LANG=C sed -i -e '/^\([a-zA-Z_][a-zA-Z0-9_]*\)\t.*\t\/\^struct \1;.*\$\/;"\tx$/d' $1
 322fi
 323
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.