193209d65SMichal Marek#!/bin/bash 2457c8996SThomas Gleixner# SPDX-License-Identifier: GPL-2.0-only 3a680eedcSSam Ravnborg# Generate tags or cscope files 4a680eedcSSam Ravnborg# Usage tags.sh <mode> 5a680eedcSSam Ravnborg# 64f3f263dSRené Nyffenegger# mode may be any of: tags, gtags, TAGS, cscope 7a680eedcSSam Ravnborg# 8a680eedcSSam Ravnborg# Uses the following environment variables: 9b3b3eb9dSMasahiro Yamada# SUBARCH, SRCARCH, srctree 10a680eedcSSam Ravnborg 116ae4b986SMasahiro Yamadaif [[ "$KBUILD_VERBOSE" =~ 1 ]]; then 12a680eedcSSam Ravnborg set -x 13a680eedcSSam Ravnborgfi 14a680eedcSSam Ravnborg 15ae63b2d7SPrarit Bhargava# RCS_FIND_IGNORE has escaped ()s -- remove them. 16ae63b2d7SPrarit Bhargavaignore="$(echo "$RCS_FIND_IGNORE" | sed 's|\\||g' )" 17ae63b2d7SPrarit Bhargava# tags and cscope files should also ignore MODVERSION *.mod.c files 18ae63b2d7SPrarit Bhargavaignore="$ignore ( -name *.mod.c ) -prune -o" 19a680eedcSSam Ravnborg 2040bf2fcdSPaulo Miguel Almeida# ignore arbitrary directories 2140bf2fcdSPaulo Miguel Almeidaif [ -n "${IGNORE_DIRS}" ]; then 2240bf2fcdSPaulo Miguel Almeida for i in ${IGNORE_DIRS}; do 2340bf2fcdSPaulo Miguel Almeida ignore="${ignore} ( -path $i ) -prune -o" 2440bf2fcdSPaulo Miguel Almeida done 2540bf2fcdSPaulo Miguel Almeidafi 2640bf2fcdSPaulo Miguel Almeida 2795fd3f87SMasahiro Yamada# Use make KBUILD_ABS_SRCTREE=1 {tags|cscope} 28e93bc1a0SMichal Marek# to force full paths for a non-O= build 29c69ef1c8SMasahiro Yamadaif [ "${srctree}" = "." -o -z "${srctree}" ]; then 30a680eedcSSam Ravnborg tree= 31a680eedcSSam Ravnborgelse 32709cc372SJiri Slaby tree=${srctree}/ 33a680eedcSSam Ravnborgfi 34a680eedcSSam Ravnborg 35e1b37563SAhmed S. Darwish# gtags(1) refuses to index any file outside of its current working dir. 36e1b37563SAhmed S. Darwish# If gtags indexing is requested and the build output directory is not 37e1b37563SAhmed S. Darwish# the kernel source tree, index all files in absolute-path form. 38e1b37563SAhmed S. Darwishif [[ "$1" == "gtags" && -n "${tree}" ]]; then 39e1b37563SAhmed S. Darwish tree=$(realpath "$tree")/ 40e1b37563SAhmed S. Darwishfi 41e1b37563SAhmed S. Darwish 424f628248SJike Song# Detect if ALLSOURCE_ARCHS is set. If not, we assume SRCARCH 434f628248SJike Songif [ "${ALLSOURCE_ARCHS}" = "" ]; then 444f628248SJike Song ALLSOURCE_ARCHS=${SRCARCH} 45bc75cc6bSJohn Kacurelif [ "${ALLSOURCE_ARCHS}" = "all" ]; then 46656c1077SJoey Pabalinas ALLSOURCE_ARCHS=$(find ${tree}arch/ -mindepth 1 -maxdepth 1 -type d -printf '%f ') 474f628248SJike Songfi 484f628248SJike Song 49b3b3eb9dSMasahiro Yamada# find sources in arch/$1 50a680eedcSSam Ravnborgfind_arch_sources() 51a680eedcSSam Ravnborg{ 52f81b1be4SGuennadi Liakhovetski for i in $archincludedir; do 530aedf7a2SWei Yang local prune="$prune ( -path $i ) -prune -o" 54f81b1be4SGuennadi Liakhovetski done 55d1db881dSMasahiro Yamada find ${tree}arch/$1 $ignore $prune -name "$2" -not -type l -print; 56a680eedcSSam Ravnborg} 57a680eedcSSam Ravnborg 58a680eedcSSam Ravnborg# find sources in arch/$1/include 59a680eedcSSam Ravnborgfind_arch_include_sources() 60a680eedcSSam Ravnborg{ 610aedf7a2SWei Yang local include=$(find ${tree}arch/$1/ -name include -type d -print); 62f81b1be4SGuennadi Liakhovetski if [ -n "$include" ]; then 63f81b1be4SGuennadi Liakhovetski archincludedir="$archincludedir $include" 649b24a15dSYann Droneaud find $include $ignore -name "$2" -not -type l -print; 65f81b1be4SGuennadi Liakhovetski fi 66a680eedcSSam Ravnborg} 67a680eedcSSam Ravnborg 68a680eedcSSam Ravnborg# find sources in include/ 69a680eedcSSam Ravnborgfind_include_sources() 70a680eedcSSam Ravnborg{ 719b24a15dSYann Droneaud find ${tree}include $ignore -name config -prune -o -name "$1" \ 729b24a15dSYann Droneaud -not -type l -print; 73a680eedcSSam Ravnborg} 74a680eedcSSam Ravnborg 75a680eedcSSam Ravnborg# find sources in rest of tree 76a680eedcSSam Ravnborg# we could benefit from a list of dirs to search in here 77a680eedcSSam Ravnborgfind_other_sources() 78a680eedcSSam Ravnborg{ 79a680eedcSSam Ravnborg find ${tree}* $ignore \ 8099443f81SArend van Spriel \( -path ${tree}include -o -path ${tree}arch -o -name '.tmp_*' \) -prune -o \ 819b24a15dSYann Droneaud -name "$1" -not -type l -print; 82a680eedcSSam Ravnborg} 83a680eedcSSam Ravnborg 84a680eedcSSam Ravnborgall_sources() 85a680eedcSSam Ravnborg{ 86a8bac511SMichal Marek find_arch_include_sources ${SRCARCH} '*.[chS]' 87d70a091fSWei Yang if [ -n "$archinclude" ]; then 88709cc372SJiri Slaby find_arch_include_sources $archinclude '*.[chS]' 89a680eedcSSam Ravnborg fi 904f628248SJike Song find_include_sources '*.[chS]' 91f81b1be4SGuennadi Liakhovetski for arch in $ALLSOURCE_ARCHS 92f81b1be4SGuennadi Liakhovetski do 932ad3cc05SWei Yang find_arch_sources $arch '*.[chS]' 94f81b1be4SGuennadi Liakhovetski done 954f628248SJike Song find_other_sources '*.[chS]' 96a680eedcSSam Ravnborg} 97a680eedcSSam Ravnborg 98923e02ecSJoonsoo Kimall_compiled_sources() 99923e02ecSJoonsoo Kim{ 1007394d2ebSCristian Ciocaltea { 1017394d2ebSCristian Ciocaltea echo include/generated/autoconf.h 1027394d2ebSCristian Ciocaltea find $ignore -name "*.cmd" -exec \ 10382089b00SJialu Xu grep -Poh '(?<=^ )\S+|(?<== )\S+[^\\](?=$)' {} \+ | 1047394d2ebSCristian Ciocaltea awk '!a[$0]++' 105d60be533SVipin Sharma } | xargs realpath -esq $([ -z "$KBUILD_ABS_SRCTREE" ] && echo --relative-to=.) | 1067394d2ebSCristian Ciocaltea sort -u 107923e02ecSJoonsoo Kim} 108923e02ecSJoonsoo Kim 109923e02ecSJoonsoo Kimall_target_sources() 110923e02ecSJoonsoo Kim{ 111923e02ecSJoonsoo Kim if [ -n "$COMPILED_SOURCE" ]; then 112923e02ecSJoonsoo Kim all_compiled_sources 113923e02ecSJoonsoo Kim else 114923e02ecSJoonsoo Kim all_sources 115923e02ecSJoonsoo Kim fi 116923e02ecSJoonsoo Kim} 117923e02ecSJoonsoo Kim 118a680eedcSSam Ravnborgall_kconfigs() 119a680eedcSSam Ravnborg{ 1207659c655SHou Tao find ${tree}arch/ -maxdepth 1 $ignore \ 1217659c655SHou Tao -name "Kconfig*" -not -type l -print; 122953fae66SAlexey Dobriyan for arch in $ALLSOURCE_ARCHS; do 1232ad3cc05SWei Yang find_arch_sources $arch 'Kconfig*' 124953fae66SAlexey Dobriyan done 125953fae66SAlexey Dobriyan find_other_sources 'Kconfig*' 126a680eedcSSam Ravnborg} 127a680eedcSSam Ravnborg 128a680eedcSSam Ravnborgdocscope() 129a680eedcSSam Ravnborg{ 130923e02ecSJoonsoo Kim (echo \-k; echo \-q; all_target_sources) > cscope.files 131a680eedcSSam Ravnborg cscope -b -f cscope.out 132a680eedcSSam Ravnborg} 133a680eedcSSam Ravnborg 134f4ed1009SJianbin Kangdogtags() 135f4ed1009SJianbin Kang{ 136e1b37563SAhmed S. Darwish all_target_sources | gtags -i -C "${tree:-.}" -f - "$PWD" 137f4ed1009SJianbin Kang} 138f4ed1009SJianbin Kang 13993209d65SMichal Marek# Basic regular expressions with an optional /kind-spec/ for ctags and 14093209d65SMichal Marek# the following limitations: 14193209d65SMichal Marek# - No regex modifiers 14293209d65SMichal Marek# - Use \{0,1\} instead of \?, because etags expects an unescaped ? 14393209d65SMichal Marek# - \s is not working with etags, use a space or [ \t] 14493209d65SMichal Marek# - \w works, but does not match underscores in etags 14593209d65SMichal Marek# - etags regular expressions have to match at the start of a line; 14693209d65SMichal Marek# a ^[^#] is prepended by setup_regex unless an anchor is already present 14793209d65SMichal Marekregex_asm=( 148b6379e73SZhaoyu Liu '/^\(ENTRY\|_GLOBAL\)([[:space:]]*\([[:alnum:]_\\]*\)).*/\2/' 149*1a09cd9bSCosta Shulyupin '/^SYM_[[:alnum:]_]*START[[:alnum:]_]*([[:space:]]*\([[:alnum:]_\\]*\)).*/\1/' 15093209d65SMichal Marek) 15193209d65SMichal Marekregex_c=( 152b6379e73SZhaoyu Liu '/^SYSCALL_DEFINE[0-9]([[:space:]]*\([[:alnum:]_]*\).*/sys_\1/' 153b6379e73SZhaoyu Liu '/^BPF_CALL_[0-9]([[:space:]]*\([[:alnum:]_]*\).*/\1/' 154b6379e73SZhaoyu Liu '/^COMPAT_SYSCALL_DEFINE[0-9]([[:space:]]*\([[:alnum:]_]*\).*/compat_sys_\1/' 155b6379e73SZhaoyu Liu '/^TRACE_EVENT([[:space:]]*\([[:alnum:]_]*\).*/trace_\1/' 156b6379e73SZhaoyu Liu '/^DEFINE_EVENT([^,)]*,[[:space:]]*\([[:alnum:]_]*\).*/trace_\1/' 157b6379e73SZhaoyu Liu '/^DEFINE_INSN_CACHE_OPS([[:space:]]*\([[:alnum:]_]*\).*/get_\1_slot/' 158b6379e73SZhaoyu Liu '/^DEFINE_INSN_CACHE_OPS([[:space:]]*\([[:alnum:]_]*\).*/free_\1_slot/' 159b6379e73SZhaoyu Liu '/^PAGEFLAG([[:space:]]*\([[:alnum:]_]*\).*/Page\1/' 160b6379e73SZhaoyu Liu '/^PAGEFLAG([[:space:]]*\([[:alnum:]_]*\).*/SetPage\1/' 161b6379e73SZhaoyu Liu '/^PAGEFLAG([[:space:]]*\([[:alnum:]_]*\).*/ClearPage\1/' 162b6379e73SZhaoyu Liu '/^TESTSETFLAG([[:space:]]*\([[:alnum:]_]*\).*/TestSetPage\1/' 163b6379e73SZhaoyu Liu '/^TESTPAGEFLAG([[:space:]]*\([[:alnum:]_]*\).*/Page\1/' 164b6379e73SZhaoyu Liu '/^SETPAGEFLAG([[:space:]]*\([[:alnum:]_]*\).*/SetPage\1/' 165b6379e73SZhaoyu Liu '/\<__SETPAGEFLAG([[:space:]]*\([[:alnum:]_]*\).*/__SetPage\1/' 166b6379e73SZhaoyu Liu '/\<TESTCLEARFLAG([[:space:]]*\([[:alnum:]_]*\).*/TestClearPage\1/' 167b6379e73SZhaoyu Liu '/\<__TESTCLEARFLAG([[:space:]]*\([[:alnum:]_]*\).*/TestClearPage\1/' 168b6379e73SZhaoyu Liu '/\<CLEARPAGEFLAG([[:space:]]*\([[:alnum:]_]*\).*/ClearPage\1/' 169b6379e73SZhaoyu Liu '/\<__CLEARPAGEFLAG([[:space:]]*\([[:alnum:]_]*\).*/__ClearPage\1/' 170b6379e73SZhaoyu Liu '/^__PAGEFLAG([[:space:]]*\([[:alnum:]_]*\).*/__SetPage\1/' 171b6379e73SZhaoyu Liu '/^__PAGEFLAG([[:space:]]*\([[:alnum:]_]*\).*/__ClearPage\1/' 172b6379e73SZhaoyu Liu '/^PAGEFLAG_FALSE([[:space:]]*\([[:alnum:]_]*\).*/Page\1/' 173b6379e73SZhaoyu Liu '/\<TESTSCFLAG([[:space:]]*\([[:alnum:]_]*\).*/TestSetPage\1/' 174b6379e73SZhaoyu Liu '/\<TESTSCFLAG([[:space:]]*\([[:alnum:]_]*\).*/TestClearPage\1/' 175b6379e73SZhaoyu Liu '/\<SETPAGEFLAG_NOOP([[:space:]]*\([[:alnum:]_]*\).*/SetPage\1/' 176b6379e73SZhaoyu Liu '/\<CLEARPAGEFLAG_NOOP([[:space:]]*\([[:alnum:]_]*\).*/ClearPage\1/' 177b6379e73SZhaoyu Liu '/\<__CLEARPAGEFLAG_NOOP([[:space:]]*\([[:alnum:]_]*\).*/__ClearPage\1/' 178b6379e73SZhaoyu Liu '/\<TESTCLEARFLAG_FALSE([[:space:]]*\([[:alnum:]_]*\).*/TestClearPage\1/' 179b6379e73SZhaoyu Liu '/^PAGE_TYPE_OPS([[:space:]]*\([[:alnum:]_]*\).*/Page\1/' 180b6379e73SZhaoyu Liu '/^PAGE_TYPE_OPS([[:space:]]*\([[:alnum:]_]*\).*/__SetPage\1/' 181b6379e73SZhaoyu Liu '/^PAGE_TYPE_OPS([[:space:]]*\([[:alnum:]_]*\).*/__ClearPage\1/' 182b6379e73SZhaoyu Liu '/^TASK_PFA_TEST([^,]*,[[:space:]]*\([[:alnum:]_]*\))/task_\1/' 183b6379e73SZhaoyu Liu '/^TASK_PFA_SET([^,]*,[[:space:]]*\([[:alnum:]_]*\))/task_set_\1/' 184b6379e73SZhaoyu Liu '/^TASK_PFA_CLEAR([^,]*,[[:space:]]*\([[:alnum:]_]*\))/task_clear_\1/' 185b6379e73SZhaoyu Liu '/^DEF_MMIO_\(IN\|OUT\)_[XD]([[:space:]]*\([[:alnum:]_]*\),[^)]*)/\2/' 186b6379e73SZhaoyu Liu '/^DEBUGGER_BOILERPLATE([[:space:]]*\([[:alnum:]_]*\))/\1/' 187b6379e73SZhaoyu Liu '/^DEF_PCI_AC_\(\|NO\)RET([[:space:]]*\([[:alnum:]_]*\).*/\2/' 188b6379e73SZhaoyu Liu '/^PCI_OP_READ([[:space:]]*\(\w*\).*[1-4])/pci_bus_read_config_\1/' 189b6379e73SZhaoyu Liu '/^PCI_OP_WRITE([[:space:]]*\(\w*\).*[1-4])/pci_bus_write_config_\1/' 190b6379e73SZhaoyu Liu '/\<DEFINE_\(RT_MUTEX\|MUTEX\|SEMAPHORE\|SPINLOCK\)([[:space:]]*\([[:alnum:]_]*\)/\2/v/' 191b6379e73SZhaoyu Liu '/\<DEFINE_\(RAW_SPINLOCK\|RWLOCK\|SEQLOCK\)([[:space:]]*\([[:alnum:]_]*\)/\2/v/' 192def35da7SCosta Shulyupin '/\<DEFINE_TIMER(\([^,)]*\),/\1/' 193b6379e73SZhaoyu Liu '/\<DECLARE_\(RWSEM\|COMPLETION\)([[:space:]]*\([[:alnum:]_]\+\)/\2/v/' 1947428f9d9SCosta Shulyupin '/\<DECLARE_BITMAP([[:space:]]*\([[:alnum:]_]\+\)/\1/v/' 195b6379e73SZhaoyu Liu '/\(^\|\s\)\(\|L\|H\)LIST_HEAD([[:space:]]*\([[:alnum:]_]*\)/\3/v/' 196b6379e73SZhaoyu Liu '/\(^\|\s\)RADIX_TREE([[:space:]]*\([[:alnum:]_]*\)/\2/v/' 197b6379e73SZhaoyu Liu '/\<DEFINE_PER_CPU([^,]*,[[:space:]]*\([[:alnum:]_]*\)/\1/v/' 198b6379e73SZhaoyu Liu '/\<DEFINE_PER_CPU_SHARED_ALIGNED([^,]*,[[:space:]]*\([[:alnum:]_]*\)/\1/v/' 199b6379e73SZhaoyu Liu '/\<DECLARE_WAIT_QUEUE_HEAD([[:space:]]*\([[:alnum:]_]*\)/\1/v/' 200b6379e73SZhaoyu Liu '/\<DECLARE_\(TASKLET\|WORK\|DELAYED_WORK\)([[:space:]]*\([[:alnum:]_]*\)/\2/v/' 201b6379e73SZhaoyu Liu '/\(^\s\)OFFSET([[:space:]]*\([[:alnum:]_]*\)/\2/v/' 202b6379e73SZhaoyu Liu '/\(^\s\)DEFINE([[:space:]]*\([[:alnum:]_]*\)/\2/v/' 203b6379e73SZhaoyu Liu '/\<\(DEFINE\|DECLARE\)_HASHTABLE([[:space:]]*\([[:alnum:]_]*\)/\2/v/' 204b6379e73SZhaoyu Liu '/\<DEFINE_ID\(R\|A\)([[:space:]]*\([[:alnum:]_]\+\)/\2/' 205b6379e73SZhaoyu Liu '/\<DEFINE_WD_CLASS([[:space:]]*\([[:alnum:]_]\+\)/\1/' 206b6379e73SZhaoyu Liu '/\<ATOMIC_NOTIFIER_HEAD([[:space:]]*\([[:alnum:]_]\+\)/\1/' 207b6379e73SZhaoyu Liu '/\<RAW_NOTIFIER_HEAD([[:space:]]*\([[:alnum:]_]\+\)/\1/' 208b6379e73SZhaoyu Liu '/\<DECLARE_FAULT_ATTR([[:space:]]*\([[:alnum:]_]\+\)/\1/' 209b6379e73SZhaoyu Liu '/\<BLOCKING_NOTIFIER_HEAD([[:space:]]*\([[:alnum:]_]\+\)/\1/' 210b6379e73SZhaoyu Liu '/\<DEVICE_ATTR_\(RW\|RO\|WO\)([[:space:]]*\([[:alnum:]_]\+\)/dev_attr_\2/' 211b6379e73SZhaoyu Liu '/\<DRIVER_ATTR_\(RW\|RO\|WO\)([[:space:]]*\([[:alnum:]_]\+\)/driver_attr_\2/' 212b6379e73SZhaoyu Liu '/\<\(DEFINE\|DECLARE\)_STATIC_KEY_\(TRUE\|FALSE\)\(\|_RO\)([[:space:]]*\([[:alnum:]_]\+\)/\4/' 2136eb6d059SPeter Zijlstra '/^SEQCOUNT_LOCKTYPE(\([^,]*\),[[:space:]]*\([^,]*\),[^)]*)/seqcount_\2_t/' 2146eb6d059SPeter Zijlstra '/^SEQCOUNT_LOCKTYPE(\([^,]*\),[[:space:]]*\([^,]*\),[^)]*)/seqcount_\2_init/' 215074c2241SCosta Shulyupin '/^\<DECLARE_IDTENTRY[[:alnum:]_]*([^,)]*,[[:space:]]*\([[:alnum:]_]\+\)/\1/' 216074c2241SCosta Shulyupin '/^\<DEFINE_IDTENTRY[[:alnum:]_]*([[:space:]]*\([[:alnum:]_]\+\)/\1/' 217a937f384SPeter Zijlstra '/^\<DEFINE_FREE(\([[:alnum:]_]\+\)/cleanup_\1/' 218a937f384SPeter Zijlstra '/^\<DEFINE_CLASS(\([[:alnum:]_]\+\)/class_\1/' 219a937f384SPeter Zijlstra '/^\<EXTEND_CLASS(\([[:alnum:]_]\+\),[[:space:]]*\([[:alnum:]_]\+\)/class_\1\2/' 220a937f384SPeter Zijlstra '/^\<DEFINE_GUARD(\([[:alnum:]_]\+\)/class_\1/' 221a937f384SPeter Zijlstra '/^\<DEFINE_GUARD_COND(\([[:alnum:]_]\+\),[[:space:]]*\([[:alnum:]_]\+\)/class_\1\2/' 222a937f384SPeter Zijlstra '/^\<DEFINE_LOCK_GUARD_[[:digit:]](\([[:alnum:]_]\+\)/class_\1/' 223a937f384SPeter Zijlstra '/^\<DEFINE_LOCK_GUARD_[[:digit:]]_COND(\([[:alnum:]_]\+\),[[:space:]]*\([[:alnum:]_]\+\)/class_\1\2/' 22493209d65SMichal Marek) 22593209d65SMichal Marekregex_kconfig=( 22693209d65SMichal Marek '/^[[:blank:]]*\(menu\|\)config[[:blank:]]\+\([[:alnum:]_]\+\)/\2/' 22793209d65SMichal Marek '/^[[:blank:]]*\(menu\|\)config[[:blank:]]\+\([[:alnum:]_]\+\)/CONFIG_\2/' 22893209d65SMichal Marek) 22993209d65SMichal Mareksetup_regex() 23093209d65SMichal Marek{ 23193209d65SMichal Marek local mode=$1 lang tmp=() r 23293209d65SMichal Marek shift 23393209d65SMichal Marek 23493209d65SMichal Marek regex=() 23593209d65SMichal Marek for lang; do 23693209d65SMichal Marek case "$lang" in 23793209d65SMichal Marek asm) tmp=("${regex_asm[@]}") ;; 23893209d65SMichal Marek c) tmp=("${regex_c[@]}") ;; 23993209d65SMichal Marek kconfig) tmp=("${regex_kconfig[@]}") ;; 24093209d65SMichal Marek esac 24193209d65SMichal Marek for r in "${tmp[@]}"; do 24293209d65SMichal Marek if test "$mode" = "exuberant"; then 24393209d65SMichal Marek regex[${#regex[@]}]="--regex-$lang=${r}b" 24493209d65SMichal Marek else 24593209d65SMichal Marek # Remove ctags /kind-spec/ 24693209d65SMichal Marek case "$r" in 24793209d65SMichal Marek /*/*/?/) 24893209d65SMichal Marek r=${r%?/} 24993209d65SMichal Marek esac 25093209d65SMichal Marek # Prepend ^[^#] unless already anchored 25193209d65SMichal Marek case "$r" in 25293209d65SMichal Marek /^*) ;; 25393209d65SMichal Marek *) 25493209d65SMichal Marek r="/^[^#]*${r#/}" 25593209d65SMichal Marek esac 25693209d65SMichal Marek regex[${#regex[@]}]="--regex=$r" 25793209d65SMichal Marek fi 25893209d65SMichal Marek done 25993209d65SMichal Marek done 26093209d65SMichal Marek} 26193209d65SMichal Marek 262a680eedcSSam Ravnborgexuberant() 263a680eedcSSam Ravnborg{ 264d06246ebSPhilip K. Gisslow CTAGS_EXTRA="extra" 265d06246ebSPhilip K. Gisslow if $1 --version 2>&1 | grep -iq universal; then 266d06246ebSPhilip K. Gisslow CTAGS_EXTRA="extras" 267d06246ebSPhilip K. Gisslow fi 26893209d65SMichal Marek setup_regex exuberant asm c 269b0381751SCosta Shulyupin # identifiers to ignore by ctags 270b0381751SCosta Shulyupin local ign=( 271b0381751SCosta Shulyupin ACPI_EXPORT_SYMBOL 2722217573fSCosta Shulyupin DECLARE_BITMAP 273def35da7SCosta Shulyupin DEFINE_{TRACE,MUTEX,TIMER} 274b0381751SCosta Shulyupin EXPORT_SYMBOL EXPORT_SYMBOL_GPL 275b0381751SCosta Shulyupin EXPORT_TRACEPOINT_SYMBOL EXPORT_TRACEPOINT_SYMBOL_GPL 276b0381751SCosta Shulyupin ____cacheline_aligned ____cacheline_aligned_in_smp 277b0381751SCosta Shulyupin ____cacheline_internodealigned_in_smp 278b0381751SCosta Shulyupin __acquires __aligned __always_inline __always_unused 279b0381751SCosta Shulyupin __attribute 280b0381751SCosta Shulyupin __cacheline_aligned __cacheline_aligned_in_smp 281b0381751SCosta Shulyupin __deprecated 282b0381751SCosta Shulyupin __exitdata 283b0381751SCosta Shulyupin __initconst __initdata __initdata_memblock 284b0381751SCosta Shulyupin __maybe_unused __must_check __must_hold 285b0381751SCosta Shulyupin __packed __packed2__ 286b0381751SCosta Shulyupin __read_mostly __refdata __releases __ro_after_init 287b0381751SCosta Shulyupin __used 288b0381751SCosta Shulyupin const 289b0381751SCosta Shulyupin static 290b0381751SCosta Shulyupin ) 291b0381751SCosta Shulyupin all_target_sources | \ 292b0381751SCosta Shulyupin xargs $1 -a -I "$(IFS=','; echo "${ign[*]}")" \ 293d06246ebSPhilip K. Gisslow --$CTAGS_EXTRA=+fq --c-kinds=+px --fields=+iaS --langmap=c:+.h \ 294d0c75f33SMathieu Maret "${regex[@]}" 295a680eedcSSam Ravnborg 29621773790SKevin Hao KCONFIG_ARGS=() 29721773790SKevin Hao if ! $1 --list-languages | grep -iq kconfig; then 29893209d65SMichal Marek setup_regex exuberant kconfig 29921773790SKevin Hao KCONFIG_ARGS=(--langdef=kconfig --language-force=kconfig "${regex[@]}") 30021773790SKevin Hao fi 30121773790SKevin Hao all_kconfigs | xargs $1 -a "${KCONFIG_ARGS[@]}" 302a680eedcSSam Ravnborg} 303a680eedcSSam Ravnborg 304a680eedcSSam Ravnborgemacs() 305a680eedcSSam Ravnborg{ 30693209d65SMichal Marek setup_regex emacs asm c 30793209d65SMichal Marek all_target_sources | xargs $1 -a "${regex[@]}" 308a680eedcSSam Ravnborg 30993209d65SMichal Marek setup_regex emacs kconfig 31093209d65SMichal Marek all_kconfigs | xargs $1 -a "${regex[@]}" 311a680eedcSSam Ravnborg} 312a680eedcSSam Ravnborg 313a680eedcSSam Ravnborgxtags() 314a680eedcSSam Ravnborg{ 315a680eedcSSam Ravnborg if $1 --version 2>&1 | grep -iq exuberant; then 316a680eedcSSam Ravnborg exuberant $1 317a680eedcSSam Ravnborg elif $1 --version 2>&1 | grep -iq emacs; then 318a680eedcSSam Ravnborg emacs $1 319a680eedcSSam Ravnborg else 320923e02ecSJoonsoo Kim all_target_sources | xargs $1 -a 321a680eedcSSam Ravnborg fi 322a680eedcSSam Ravnborg} 323a680eedcSSam Ravnborg 324a680eedcSSam Ravnborg# Support um (which uses SUBARCH) 325a6ba0cb3SJiri Slabyif [ "${ARCH}" = "um" ]; then 326a6ba0cb3SJiri Slaby if [ "$SUBARCH" = "i386" ]; then 327a680eedcSSam Ravnborg archinclude=x86 328a6ba0cb3SJiri Slaby elif [ "$SUBARCH" = "x86_64" ]; then 329a680eedcSSam Ravnborg archinclude=x86 330a680eedcSSam Ravnborg else 331a680eedcSSam Ravnborg archinclude=${SUBARCH} 332a680eedcSSam Ravnborg fi 333a680eedcSSam Ravnborgfi 334a680eedcSSam Ravnborg 33566979224SYang Bairemove_structs= 336a680eedcSSam Ravnborgcase "$1" in 337a680eedcSSam Ravnborg "cscope") 338a680eedcSSam Ravnborg docscope 339a680eedcSSam Ravnborg ;; 340a680eedcSSam Ravnborg 341f4ed1009SJianbin Kang "gtags") 342f4ed1009SJianbin Kang dogtags 343f4ed1009SJianbin Kang ;; 344f4ed1009SJianbin Kang 345a680eedcSSam Ravnborg "tags") 3462e6cb8b0SMatt Kraai rm -f tags 347a680eedcSSam Ravnborg xtags ctags 34866979224SYang Bai remove_structs=y 349a680eedcSSam Ravnborg ;; 350a680eedcSSam Ravnborg 351a680eedcSSam Ravnborg "TAGS") 3522e6cb8b0SMatt Kraai rm -f TAGS 353a680eedcSSam Ravnborg xtags etags 35466979224SYang Bai remove_structs=y 355a680eedcSSam Ravnborg ;; 356a680eedcSSam Ravnborgesac 35766979224SYang Bai 35866979224SYang Bai# Remove structure forward declarations. 3590eb043d0SStephen Boydif [ -n "$remove_structs" ]; then 36077a88274SMasahiro Yamada LC_ALL=C sed -i -e '/^\([a-zA-Z_][a-zA-Z0-9_]*\)\t.*\t\/\^struct \1;.*\$\/;"\tx$/d' $1 36166979224SYang Baifi 362