嵌入式Linux中文站

在大型项目中使用Cscope


(例子:Linux内核)

如果正好你需要徜徉在一个大的代码库中的话,Cscope是一个特别有用的工具.Cscope能够做到快速,有针对性的搜索,而不是手动得随机得通过源文件grep(特别是因为grep遇到一个真正的大型代码库时,初始运行需要一大段时间),因此你可以节省你大量的时间.

本指南中,你将了解到在一个大项目中如何配置Cscope.我们将使用Linux内核源代码作为例子中,在任何其他大型项目但基本步骤都是相同的,这其中包括C + +或者Java项目.
  1. 下载源码.首先得到的源代码.你可以从http://www.kernel.org下载Linux内核源代码.在后面的教程,我会假设你已经下载的Linux 2.4.18和并且把它安装到了/ home/jru/linux-2.4.18 .

    注 意:请确定你有足够的磁盘空间:内核包仅30MB,但一旦展开,源代码将膨胀到150MB,并且生成的Cscope数据库将吞掉另一个 20-100+MB(取决于你决定要将多少内核代码包括在数据库中).如果有必要,你可以将Cscope数据库和源代码扔在不同的磁盘分区.

  2. 看看你想要把你的Cscope数据库文件放在哪里.我会假设你使用/home/jru/cscope作为目录来存储你的数据库和相关文件.
  3. 产 生包含需要进行扫描的文件列表的cscope.files. 对某些项目来说,你可能需要把所有C源文件包含进Cscope数据库的项目的目录中. 在这种情况下,你可以跳过这一步,你只要在该项目的最高层的目录中使用'cscope -R'来建立你Cscope数据库就可以了.但是,如果你并不希望包含有一些代码,并且/或者你的项目包含C++或者Java的源代码(默认情况下 Cscope只能解析.c[译者:c源文件] .h[译者:c头文件] .y[译者:yacc源文件]或者 .l[译者:lex源文件]为扩展名的文件),你就得生成一个名为cscope.files了,这个文件中应包含你想让Cscope扫描的所有文件的文件名 (每行一个文件名).[译者注:听起来有点龟毛,巧用你的find和管道可以很容易搞定这件事情].

    你可能想使用绝对路径(至少如果你打算在一个编辑器中使用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命令可能有点麻烦,但是对大型项目,这个方法比手动得编辑文件列表更容易,当然,你也可以从别人那里使用剪切或者拷贝的办法解决问题.

  4. 生成Cscope数据库.现在是时候产生Cscope数据库了:
        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兆字节.

  5. 使 用数据库. 如果你要使用Vim中或Emacs/xemacs,我建议你了解一下如何在这些编辑器中使用Cscope,这将帮助你很容易得运行搜索. 我们有一个面向Vim和emacs用户的教程,其中试图相当聪明得指出在Cscope发行版中所包含的cscope/contrib/xcscope/目 录下包含的一切从有用的注释.

    此外,你可以使用Cscope附带的独立的curses-based的图形用户界面,它帮助你执行搜索,然后启动你最喜爱的编辑器(例如,在你的环境中任何通过$EDITOR环境变量所设置编辑器,或默认的'vi')打开确切的搜索结果所在的行.

    如果你使用独立的Cscope浏览器,请务必通过下面的命令调用它

            cscope -d

    这 就告诉Cscope不要重新生成数据库.不然的话,你只能等待Cscope检查是否有被修改的文件——在大项目中这可能要花一段时间,即使没有任 何文件发生了变化.如果你不小心没有加任何选项得运行了'cscope',这将导致导致数据库重新不带快速索引或之前使用的内核模式从零开始生成,所以你 可能需要重新运行上述正确的cscope命令以重建数据库.

  6. 当源代码发生变化时,再次生成数据库.

    如果你的项目加入了新的文件,如果你想使用它,那么重新运行你的'find'命令来更新cscope.files. 然后只需像你初次生成数据库时一样(例如,cscope -b -q -k)以同样的方式调用cscope(并且在同一目录中)就可以了.

Tutorial by Jason Duell
Jason Duell 著
Adam Jiang 译

本文永久更新链接:http://embeddedlinux.org.cn/emb-linux/system-development/200903/17-557.html



分享:

评论