tools: add an option to generate cscope database

When --cscope option is given to Scons, it will generate a cscope
cross-reference database in current directory, which is useful in
Vim(and other cscope-aware text editors). For example, `scons -s
--cscope` will do nothing except generating the database. You can use
this option with other options together.

It is inspired by the `make cscope` of Linux.
This commit is contained in:
Grissiom 2013-06-19 17:57:22 +08:00
parent ce176ee1d6
commit 3ee4a18506
2 changed files with 46 additions and 0 deletions

View File

@ -83,6 +83,11 @@ def PrepareBuilding(env, root_directory, has_libcpu=False, remove_components = [
action='store_true', action='store_true',
default=False, default=False,
help='copy header of rt-thread directory to local.') 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 # add build library option
AddOption('--buildlib', AddOption('--buildlib',
@ -341,6 +346,10 @@ def EndBuilding(target, program = None):
if GetOption('copy-header') and program != None: if GetOption('copy-header') and program != None:
MakeCopyHeader(program) MakeCopyHeader(program)
if GetOption('cscope'):
from cscope import CscopeDatabase
CscopeDatabase(Projects)
def SrcRemove(src, remove): def SrcRemove(src, remove):
if type(src[0]) == type('str'): if type(src[0]) == type('str'):
for item in src: for item in src:

37
tools/cscope.py Normal file
View File

@ -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')