blob: 256f65a401ab8ad78dc0b17cda4831c7352c4a27 [file] [log] [blame]
#!/usr/bin/env python
# Copyright 2017 the V8 project authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""\
Convenience script for generating arch-specific ctags file.
This script MUST be executed at the top directory.
Usage:
$ tools/dev/gen-tags.py [<arch>...]
The example usage is as follows:
$ tools/dev/gen-tags.py x64
If no <arch> is given, it generates tags file for all arches:
$ tools/dev/gen-tags.py
"""
import os
import subprocess
import sys
# All arches that this script understands.
ARCHES = ["ia32", "x64", "arm", "arm64", "mips", "mips64", "ppc", "s390"]
def PrintHelpAndExit():
print(__doc__)
sys.exit(0)
def _Call(cmd, silent=False):
if not silent: print("# %s" % cmd)
return subprocess.call(cmd, shell=True)
def ParseArguments(argv):
if not "tools/dev" in argv[0]:
PrintHelpAndExit()
argv = argv[1:]
# If no argument is given, then generate ctags for all arches.
if len(argv) == 0:
return ARCHES
user_arches = []
for argstring in argv:
if argstring in ("-h", "--help", "help"):
PrintHelpAndExit()
if argstring not in ARCHES:
print("Invalid argument: %s" % argstring)
sys.exit(1)
user_arches.append(argstring)
return user_arches
def Exclude(fullpath, exclude_arches):
for arch in exclude_arches:
if ("/%s/" % arch) in fullpath: return True
return False
def Main(argv):
user_arches = []
user_arches = ParseArguments(argv)
exclude_arches = list(ARCHES)
for user_arch in user_arches:
exclude_arches.remove(user_arch)
paths = ["include", "src", "test"]
exts = [".h", ".cc", ".c"]
gtags_filename = "gtags.files"
with open(gtags_filename, "w") as gtags:
for path in paths:
for root, dirs, files in os.walk(path):
for file in files:
if not file.endswith(tuple(exts)): continue
fullpath = os.path.join(root, file)
if Exclude(fullpath, exclude_arches): continue
gtags.write(fullpath + os.linesep)
_Call("ctags --fields=+l -L " + gtags_filename)
if __name__ == "__main__":
sys.exit(Main(sys.argv))