分类:
2012-03-28 22:48:45
原文地址:在大型项目中使用Cscope(例子:Linux内核) 作者:RobinKQin
如果正好你需要徜徉在一个大的代码库中的话,Cscope是一个特别有用的工具.Cscope能够做到快速,有针对性的搜索,而 不是手动得随机得通过源文件grep(特别是因为grep遇到一个真正的大型代码库时,初始运行需要一大段时间),因此你可以节省你大量的时间.
本指南中,你将了解到在一个大项目中如何配置Cscope.我们将使用Linux内核源代码作为例子中,在任何其他大型项目但基本步骤都是相同的,这其中 包括C + +或者Java项目.注 意:请确定你有足够的磁盘空间:内核包仅30MB,但一旦展开,源代码将膨胀到150MB,并且生成的Cscope数据库将吞掉另一个 20-100+MB(取决于你决定要将多少内核代码包括在数据库中).如果有必要,你可以将Cscope数据库和源代码扔在不同的磁盘分区.
你可能想使用绝对路径(至少如果你打算在一个编辑器中使用Cscope数据库的话),因为这样你就可以使用你创建的数据库的那个 目录以外的目录. 我展示的命令将首先cd到根目录,以便find打印出绝对路径.
对于很多项目,你的find命令像下面这个一样简单,
cd /
find /my/project/dir -name '*.java' >/my/cscope/dir/
对于Linux内核,有个小技巧,因为我们不需要docs和scripts目录中的任何代码,以及那些针对除了我们心爱的英特尔 x86(这是我猜测的你可能感兴趣的架构)以外的芯片的体系结构和汇编代码的代码.
此 外,在这个例子中我不会包括任何内核驱动程序代码(他们将使得需要解析的代码数量增加到原来的两倍以上,这将撑暴Cscope数据库,它们包含许 多重复的定义,它们往往导致搜索更难度.如果你对驱动程序代码有兴趣,忽略以下的有关行,或把它修改一下使得打印出来的驱动程序文件只包含你感兴趣的):
LNX=/home/jru/linux-2.4.18
cd /
find $LNX \
-path "$LNX/arch/*" ! -path "$LNX/arch/i386*" -prune -o \
-path "$LNX/include/asm-*" ! -path "$LNX/include/asm-i386*" -prune -o \
-path "$LNX/tmp*" -prune -o \
-path "$LNX/Documentation*" -prune -o \
-path "$LNX/scripts*" -prune -o \
-path "$LNX/drivers*" -prune -o \
-name "*.[chxsS]" -print >/home/jru/cscope/cscope.files
虽然写find命令可能有点麻烦,但是对大型项目,这个方法比手动得编辑文件列表更容易,当然,你也可以从别人那里使用剪切或者 拷贝的办法解决问题.
cd /home/jru/cscope # the directory with 'cscope.files'
cscope -b -q -k
'- b'选项告诉Cscope只建立数据库,而不要打开Cscope的GUI. '-q'选项意旨在于创建一个附加的'inverted index'文件,这使得对大型数据库搜索的运行速度更快.最后,'-k'设置Cscope的'kernel'模式-cscop不会在/usr /include中搜索你的源文件中使用#include宏指出的任何头文件(这主要是当你在操作系统和/或C语言库的源代码中——就像我们这个例子一样 ——使用Cscope时是非常有用的).
在我的900兆赫奔腾III系统(标准IDE磁盘),解析这些Linux源代码只需要12秒,解析结果放在3个文件 (cscope.out, cscope.in.out 和 cscope.po.out)一共占25兆字节.
此外,你可以使用Cscope附带的独立的curses-based的图形用户界面,它帮助你执行搜索,然后启动你最喜爱的编辑 器(例如,在你的环境中任何通过$EDITOR环境变量所设置编辑器,或默认的'vi')打开确切的搜索结果所在的行.
如果你使用独立的Cscope浏览器,请务必通过下面的命令调用它
cscope -d
这 就告诉Cscope不要重新生成数据库.不然的话,你只能等待Cscope检查是否有被修改的文件——在大项目中这可能要花一段时间,即使没有任 何文件发生了变化.如果你不小心没有加任何选项得运行了'cscope',这将导致导致数据库重新不带快速索引或之前使用的内核模式从零开始生成,所以你 可能需要重新运行上述正确的cscope命令以重建数据库.
如果你的项目加入了新的文件,如果你想使用它,那么重新运行你的'find'命令来更新cscope.files. 然后只需像你初次生成数据库时一样(例如,cscope -b -q -k)以同样的方式调用cscope(并且在同一目录中)就可以了.