CScope & exuberant Ctags

, par MiKaël Navarro

Quelques outils d’indexation de code pour le développeur.

CTags & Exuberant Ctags

Ctags était un programme Unix écrit par Steve Kirkendall qui génère un fichier index (tag) des fonctions, variables, classes, macros, ... trouvées dans des fichiers source C.

Exuberant Ctags, évolution de ctags écrite par Darren Hiebert à partir de 1996, il fut initialement distribué avec Vim, puis est devenu un projet séparé depuis la version 6 de Vim. Il est compatible avec GNU Emacs.

Exuberant Ctags inclu le support de plus de 40 languages de programmation et autorise l’ajout de nouvelles syntaxes via des expressions régulières.

ETAGS

Etags est l’utilitaire Ctags fourni avec GNU Emacs :

M-x shell $ find . -name "*/*/*.c*" | xargs etags —append — declarations —members —lang=c
M-x shell $ find . -name "*/*/*.h*" | xargs etags —append — declarations —members —lang=c

Puis dans les sources, le curseur sur un objet (fonction, variable, define, ...) M-. permet de lister où est défini le tag en question.

Cscope

cscope est un outil pour développeurs permettant de naviguer dans le code source.

Pour l’utiliser avec GNU Emacs :

 Tout d’abord charger l’extension xcscope.el livré avec cscope dans son .emacs :

;; CScope
(require 'xcscope)

 Puis indexer une base de code, pour cela un petit script shell, cscope_indexer.bash, pour se simplifier la vie :

#! /usr/bin/bash
#
# Automatically rebuild CScope cross-reference DB from a list of directories.
#

MY_WA=~/dev

if [ $# -ne 1 -o "$1" == "-h" -o "$1" == "--help" ]; then
 echo "Usage: ${0} <proj.lst>"
 echo ""
 echo "Build CScope cross-reference database from a list of working area."
 echo ""
 exit 1
else
 # Get working area list (proj.lst)
 PROJ_LST=$1
 echo "Indexing:"
 cat ${PROJ_LST}

 PROJ_FILES="${MY_WA}/cscope-${PROJ_LST%.lst}.files"

 echo -n "Building files list..."
 rm -f ${PROJ_FILES}
 for d in `grep -v "#" $PROJ_LST`; do
     find $d -name "*.[hc]"
 done >> ${PROJ_FILES}
 #cat ${PROJ_FILES}
 
 echo " and create symlink."
 rm -f cscope.files
 ln -s ${PROJ_FILES} cscope.files
 
 echo "Building CScope database:"
 cscope -bv
fi

Permetant ainsi d’indexer (cscope.out) les fichiers header et source C trouvés (cscope.files) dans une liste de répertoires.

Dans Emacs, indiquer tout d’abord où se trouve le fichier cscope.out : M-x cscope-set-initial-directory.

Puis on utilisera, par exemple, les séquences de touches :

  • C-c s d pour trouver la définition d’un symbol,
  • ou C-c s c pour lister les fonctions appelant la fonction sélectionnée.