diff --git a/tools/building.py b/tools/building.py index a90ad69c1d284abe5cea58fcb0d52ecc979ff003..6b752674b52b95076f7b43bcd708da6bc834b578 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 0000000000000000000000000000000000000000..18568b4c355028a46c67f864533535b78fedaf0a --- /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') +