Generating Tag Files
Bash snippet to generate tag files for C/C++.
[ Check out all posts in “c-cpp” series here. ]
Yesterday, I shared a code snippet to check out type size and alignment in C++. I don’t have enough time for a decent post today, so I will just continue with a useful snippet for C/C++ development.
This will be just a few lines of bash
to easily generate a combined tag file using ctags, for multiple related repositories.
Let’s say I use SDL. There are a bunch of repositories that extend the feature set, like SDL_image.
So I want to have a single TAGS file that covers all relevant repositories.
Let’s say I cloned all these repos as subdirectories under $HOME/ext/sdl
. I use a bash
snippet to:
- gather the set of all relevant source files under those locations,
- generate tags for each.
During the process, I am creating a file called src_sdl.list
. It contains the list of source files for which tags will be generated. Then the tag file (called TAGS
) will be generated. Note that src_sdl.list
is useless after tag generation.
Here is the example code:
TAGS_SOURCES_SDL="$HOME/ext/sdl/sdl/src
$HOME/ext/sdl/sdl/include
$HOME/ext/sdl/mxr/src
$HOME/ext/sdl/mxr/include
$HOME/ext/sdl/img
$HOME/ext/sdl/ttf"
cd $HOME/ext/sdl
for d in $TAGS_SOURCES_SDL
do find $d -type f -name '*.h' -o -name '*.hh' -o -name '*.hpp' >> src_sdl.list
done
for d in $TAGS_SOURCES_SDL
do find $d -type f -name '*.c' -o -name '*.cc' -o -name '*.cpp' >> src_sdl.list
done
ctags -e --c++-kinds=+p -L src_sdl.list
The -e
option to ctags
mean “create a tag file for use with Emacs”. So if you use another editor, you probably don’t need that.
This is super simple, but I often regenerate the tags after updating the cloned repos. So it is good to have a script to repeat the process.
Are Tags Still Relevant?
It looks like LSP is all the rage nowadays. And it honestly sounds great.
However, I prefer to rely on fairly rudimentary dev tooling that I know I can absolutely use anywhere, and setup quickly, and tags fits this criteria.
I need cheap and reliable jump-to-definition
. I don’t care about intelligent code completion.
I suspect I am still missing out on some other nice features LSP provides, so I intend to try it sometime.
Anyway, long story short, I use tags. Tags are fine.
Thanks for reading! If you find technical errors, please report in the blog’s Issues page.