From 1ed70e22b9e42b5710e52252ce76212d79737186 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= Date: Thu, 17 Oct 2019 12:47:37 +0200 Subject: [PATCH] Add source tags targets --- docs/markdown/snippets/tags.md | 4 +++ mesonbuild/backend/ninjabackend.py | 18 +++++++++++ mesonbuild/scripts/tags.py | 51 ++++++++++++++++++++++++++++++ 3 files changed, 73 insertions(+) create mode 100644 docs/markdown/snippets/tags.md create mode 100644 mesonbuild/scripts/tags.py diff --git a/docs/markdown/snippets/tags.md b/docs/markdown/snippets/tags.md new file mode 100644 index 000000000..e27fc5bc1 --- /dev/null +++ b/docs/markdown/snippets/tags.md @@ -0,0 +1,4 @@ +## Source tags targets + +When the respective tools are available, 'ctags', 'TAGS' and 'cscope' +targets will be generated by Meson, unless you have defined your own. diff --git a/mesonbuild/backend/ninjabackend.py b/mesonbuild/backend/ninjabackend.py index fe1eee6d0..0f652532c 100644 --- a/mesonbuild/backend/ninjabackend.py +++ b/mesonbuild/backend/ninjabackend.py @@ -2682,11 +2682,29 @@ https://gcc.gnu.org/bugzilla/show_bug.cgi?id=47485''')) return self.generate_clangtool('tidy') + def generate_tags(self, tool, target_name): + import shutil + if not shutil.which(tool): + return + if target_name in self.all_outputs: + return + cmd = self.environment.get_build_command() + \ + ['--internal', 'tags', tool, self.environment.source_dir] + elem = NinjaBuildElement(self.all_outputs, 'meson-' + target_name, 'CUSTOM_COMMAND', 'PHONY') + elem.add_item('COMMAND', cmd) + elem.add_item('pool', 'console') + self.add_build(elem) + # Alias that runs the target defined above + self.create_target_alias('meson-' + target_name) + # For things like scan-build and other helper tools we might have. def generate_utils(self): self.generate_scanbuild() self.generate_clangformat() self.generate_clangtidy() + self.generate_tags('etags', 'TAGS') + self.generate_tags('ctags', 'ctags') + self.generate_tags('cscope', 'cscope') cmd = self.environment.get_build_command() + ['--internal', 'uninstall'] elem = NinjaBuildElement(self.all_outputs, 'meson-uninstall', 'CUSTOM_COMMAND', 'PHONY') elem.add_item('COMMAND', cmd) diff --git a/mesonbuild/scripts/tags.py b/mesonbuild/scripts/tags.py new file mode 100644 index 000000000..431bb5fd3 --- /dev/null +++ b/mesonbuild/scripts/tags.py @@ -0,0 +1,51 @@ +# Copyright 2019 The Meson development team + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import os +import subprocess +from pathlib import Path + + +def ls_as_bytestream(): + if os.path.exists('.git'): + return subprocess.run(['git', 'ls-tree', '-r', '--name-only', 'HEAD'], + stdout=subprocess.PIPE).stdout + + files = [str(p) for p in Path('.').glob('**/*') + if not p.is_dir() and + not next((x for x in p.parts if x.startswith('.')), None)] + return '\n'.join(files).encode() + + +def cscope(): + ls = b'\n'.join([b'"%s"' % f for f in ls_as_bytestream().split()]) + return subprocess.run(['cscope', '-v', '-b', '-i-'], input=ls).returncode + + +def ctags(): + ls = ls_as_bytestream() + return subprocess.run(['ctags', '-L-'], input=ls).returncode + + +def etags(): + ls = ls_as_bytestream() + return subprocess.run(['etags', '-'], input=ls).returncode + + +def run(args): + tool_name = args[0] + srcdir_name = args[1] + os.chdir(srcdir_name) + assert tool_name in ['cscope', 'ctags', 'etags'] + return globals()[tool_name]()