DPDK logo

Elixir Cross Referencer

#!/bin/sh -e
# Generate tags or gtags or cscope or etags files
#
#   BSD LICENSE
#
#   Copyright 2017 Cavium, Inc
#
#   Redistribution and use in source and binary forms, with or without
#   modification, are permitted provided that the following conditions
#   are met:
#
#     * Redistributions of source code must retain the above copyright
#       notice, this list of conditions and the following disclaimer.
#     * Redistributions in binary form must reproduce the above copyright
#       notice, this list of conditions and the following disclaimer in
#       the documentation and/or other materials provided with the
#       distribution.
#     * Neither the name of Cavium, Inc nor the names of its
#       contributors may be used to endorse or promote products derived
#       from this software without specific prior written permission.
#
#   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
#   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
#   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
#   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
#   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
#   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
#   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
#   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
#   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
#   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
#   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

verbose=false
linux=true
bsd=true
x86_32=true
x86_64=true
ppc_64=true
arm_32=true
arm_64=true

print_usage()
{
	echo "Usage: $(basename $0) [-h] [-v] tags|cscope|gtags|etags [config]"
	echo "Valid configs are:"
	make showconfigs | sed 's,^,\t,'
}

# Move to the root of the git tree
cd $(dirname $0)/..

while getopts hv ARG ; do
	case $ARG in
		v ) verbose=true ;;
		h ) print_usage; exit 0 ;;
		? ) print_usage; exit 1 ;;
	esac
done
shift $(($OPTIND - 1))

#ignore version control files
ignore="( -name .svn -o -name CVS -o -name .hg -o -name .git ) -prune -o"

source_dirs="test app buildtools drivers examples lib"

skip_bsd="( -name bsdapp ) -prune -o"
skip_linux="( -name linuxapp ) -prune -o"
skip_arch="( -name arch ) -prune -o"
skip_sse="( -name *_sse*.[chS] ) -prune -o"
skip_avx="( -name *_avx*.[chS] ) -prune -o"
skip_neon="( -name *_neon*.[chS] ) -prune -o"
skip_altivec="( -name *_altivec*.[chS] ) -prune -o"
skip_arm64="( -name *arm64*.[chS] ) -prune -o"
skip_x86="( -name *x86*.[chS] ) -prune -o"
skip_32b_files="( -name *_32.h ) -prune -o"
skip_64b_files="( -name *_64.h ) -prune -o"

skiplist="$skip_bsd $skip_linux $skip_arch $skip_sse $skip_avx \
		 $skip_neon $skip_altivec $skip_x86 $skip_arm64"

find_sources()
{
	find $1 $ignore $3 -name $2 -not -type l -print
}

common_sources()
{
	find_sources "$source_dirs" '*.[chS]' "$skiplist"
}

linux_sources()
{
	find_sources "lib/librte_eal/linuxapp" '*.[chS]'
}

bsd_sources()
{
	find_sources "lib/librte_eal/bsdapp" '*.[chS]'
}

arm_common()
{
	find_sources "lib/librte_eal/common/arch/arm" '*.[chS]'
	find_sources "$source_dirs" '*neon*.[chS]'
}

arm_32_sources()
{
	arm_common
	find_sources "lib/librte_eal/common/include/arch/arm" '*.[chS]' \
					"$skip_64b_files"
}

arm_64_sources()
{
	arm_common
	find_sources "lib/librte_eal/common/include/arch/arm" '*.[chS]' \
					 "$skip_32b_files"
	find_sources "$source_dirs" '*arm64.[chS]'
}

x86_common()
{
	find_sources "lib/librte_eal/common/arch/x86" '*.[chS]'

	find_sources "examples/performance-thread/common/arch/x86" '*.[chS]'
	find_sources "$source_dirs" '*_sse*.[chS]'
	find_sources "$source_dirs" '*_avx*.[chS]'
	find_sources "$source_dirs" '*x86.[chS]'
}

x86_32_sources()
{
	x86_common
	find_sources "lib/librte_eal/common/include/arch/x86" '*.[chS]' \
					"$skip_64b_files"
}

x86_64_sources()
{
	x86_common
	find_sources "lib/librte_eal/common/include/arch/x86" '*.[chS]' \
					"$skip_32b_files"
}

ppc_64_sources()
{
	find_sources "lib/librte_eal/common/arch/ppc_64" '*.[chS]'
	find_sources "lib/librte_eal/common/include/arch/ppc_64" '*.[chS]'
	find_sources "$source_dirs" '*altivec*.[chS]'
}

check_valid_target()
{
	cfgfound=false
	allconfigs=$(make showconfigs)
	for cfg in $allconfigs ; do
		if [ "$cfg" = "$1" ] ; then
			cfgfound=true
		fi
	done
	if ! $cfgfound ; then
		echo "Invalid config: $1"
		print_usage
		exit 0
	fi
}

if [ -n "$2" ]; then
	check_valid_target $2

	echo $2 | grep -q "linuxapp-" || linux=false
	echo $2 | grep -q "bsdapp-" || bsd=false
	echo $2 | grep -q "x86_64-" || x86_64=false
	echo $2 | grep -q "arm-" || arm_32=false
	echo $2 | grep -q "arm64-" || arm_64=false
	echo $2 | grep -q "ppc_64-" || ppc_64=false
	echo $2 | grep -q -e "i686-" -e "x32-" || x86_32=false
fi

all_sources()
{
	common_sources
	if $linux ; then linux_sources ; fi
	if $bsd ; then bsd_sources ; fi
	if $x86_64 ; then x86_64_sources ; fi
	if $x86_32 ; then x86_32_sources ; fi
	if $ppc_64 ; then ppc_64_sources ; fi
	if $arm_32 ; then arm_32_sources ; fi
	if $arm_64 ; then arm_64_sources ; fi
}

show_flags()
{
	if $verbose ; then
		echo "mode:     $1"
		echo "config:   $2"
		echo "linux:    $linux"
		echo "bsd:      $bsd"
		echo "x86_32:   $x86_32"
		echo "x86_64:   $x86_64"
		echo "ppc_64:   $ppc_64"
		echo "arm_32:   $arm_32"
		echo "arm_64:   $arm_64"
	fi
}

case "$1" in
	"cscope")
		show_flags $1 $2
		all_sources > cscope.files
		cscope -q -b -f cscope.out
		;;
	"gtags")
		show_flags $1 $2
		all_sources | gtags -i -f -
		;;
	"tags")
		show_flags $1 $2
		rm -f tags
		all_sources | xargs ctags -a
		;;
	"etags")
		show_flags $1 $2
		rm -f TAGS
		all_sources | xargs etags -a
		;;
	*)
		echo "Invalid mode: $1"
		print_usage
		;;
esac