Re: [PATCH v2 1/2] scripts/tags.sh: Resolve gtags empty index generation

Masahiro Yamada
2023-05-11T18:52:34Z

On Tue, May 9, 2023 at 10:26 AM Ahmed S. Darwish <darwi@linutronix.de> wrote:
>
> gtags considers any file outside of its current working directory
> "outside the source tree" and refuses to index it. For O= kernel builds,
> or when "make" is invoked from a directory other then the kernel source
> tree, gtags ignores the entire kernel source and generates an empty
> index.
>
> Force-set gtags current working directory to the kernel source tree.
>
> Due to commit 9da0763bdd82 ("kbuild: Use relative path when building in
> a subdir of the source tree"), if the kernel build is done in a
> sub-directory of the kernel source tree, the kernel Makefile will set
> the kernel's $srctree to ".." for shorter compile-time and run-time
> warnings. Consequently, the list of files to be indexed will be in the
> "../*" form, rendering all such paths invalid once gtags switches to the
> kernel source tree as its current working directory.
>
> If gtags indexing is requested and the build directory is not the kernel
> source tree, index all files in absolute-path form.
>
> Note, indexing in absolute-path form will not affect the generated
> index, as paths in gtags indices are always relative to the gtags "root
> directory" (as evidenced by "gtags --dump").

The code works as claimed, but I am just curious.
If all the paths are relative, how can you use the tags files located
in a separate directory?

"make O=foo gtags" creates tags files in foo/.
I want to use them from emacs.
emacs cannot find the right file because
it assumes the path is relative to 'foo' instead of the source tree.

I set GTAGSROOT to the source tree, but I could not find a way
to use it in a useful way.

> diff --git a/scripts/tags.sh b/scripts/tags.sh
> index ea31640b2671..3de4b4ebd891 100755
> --- a/scripts/tags.sh
> +++ b/scripts/tags.sh
> @@ -32,6 +32,14 @@ else
> tree=${srctree}/
> fi
>
> +

Unneeded empty line addition.

> +# gtags(1) refuses to index any file outside of its current working dir.
> +# If gtags indexing is requested and the build output directory is not
> +# the kernel source tree, index all files in absolute-path form.
> +if [ "$1" = "gtags" -a -n "${tree}" ]; then
> + tree=$(realpath $tree)/

I decided to run shellcheck for new code.
Please follow the suggestion from the tool.

In scripts/tags.sh line 40:
tree=$(realpath $tree)/
^---^ SC2086 (info): Double quote to prevent
globbing and word splitting.

Did you mean:
tree=$(realpath "$tree")/

(You do not need to fix the entire script.
This is only for new code).

> @@ -131,7 +139,11 @@ docscope()
>
> dogtags()
> {
> - all_target_sources | gtags -i -f -
> + local gtagsoutdir="${PWD}"
> + local gtagsroot="${tree}"
> +
> + [ -z "${gtagsroot}" ] && gtagsroot="."
> + all_target_sources | gtags -i -C $gtagsroot -f - $gtagsoutdir
> }

You can write it in one line.

dogtags()
{
all_target_sources | gtags -i -C "${tree:-.}" -f - "${PWD}"
}

--
Best Regards
Masahiro Yamada