summaryrefslogtreecommitdiff
path: root/tools
diff options
context:
space:
mode:
Diffstat (limited to 'tools')
-rw-r--r--tools/building.py9
-rw-r--r--tools/cscope.py37
2 files changed, 46 insertions, 0 deletions
diff --git a/tools/building.py b/tools/building.py
index a90ad69c1d..6b752674b5 100644
--- a/tools/building.py
+++ b/tools/building.py
@@ -83,6 +83,11 @@ def PrepareBuilding(env, root_directory, has_libcpu=False, remove_components = [
action='store_true',
default=False,
help='copy header of rt-thread directory to local.')
+ AddOption('--cscope',
+ dest='cscope',
+ action='store_true',
+ default=False,
+ help='Build Cscope cross reference database. Requires cscope installed.')
# add build library option
AddOption('--buildlib',
@@ -341,6 +346,10 @@ def EndBuilding(target, program = None):
if GetOption('copy-header') and program != None:
MakeCopyHeader(program)
+ if GetOption('cscope'):
+ from cscope import CscopeDatabase
+ CscopeDatabase(Projects)
+
def SrcRemove(src, remove):
if type(src[0]) == type('str'):
for item in src:
diff --git a/tools/cscope.py b/tools/cscope.py
new file mode 100644
index 0000000000..18568b4c35
--- /dev/null
+++ b/tools/cscope.py
@@ -0,0 +1,37 @@
+import os
+
+def _get_src(project):
+ li = []
+ for group in project:
+ for f in group['src']:
+ li.append(os.path.normpath(f.rfile().abspath))
+ return li
+
+def _get_header_dir(dirp):
+ li = []
+ for root, dirs, files in os.walk(dirp):
+ for d in dirs:
+ fpath = os.path.join(root, d)
+ li.extend(_get_header_dir(fpath))
+
+ for f in files:
+ if f[-2:] == '.h':
+ fpath = os.path.join(root, f)
+ li.append(os.path.normpath(fpath))
+ return li
+
+def _get_header(project):
+ li = []
+ for g in project:
+ for d in g.get('CPPPATH', []):
+ li.extend(_get_header_dir(d))
+ return li
+
+def CscopeDatabase(project):
+ files = set(_get_src(project) + _get_header(project))
+ with open('cscope.files', 'w') as db:
+ db.write('-k\n-q\n')
+ db.write('\n'.join(files))
+ db.flush() # let cscope see the full content
+ os.system('cscope -b')
+