给linux内核建立代码索引

参考:
https://cloud-atlas.readthedocs.io/zh_CN/latest/kernel/startup/prepare_kernel_dev.html

使用 scripts/tags.sh 脚本创建索引

内核源代码提供了一个很好的脚本 scripts/tags.sh 来创建内核索引数据库,也就是使用 make cscope 和 make tags 规则来创建索引,类似如下:

make O=. ARCH=arm SUBARCH=omap2 COMPILED_SOURCE=1 cscope tags
这里:

O=. 使用绝对路径(如果你需要在内核源代码目录之外加载创建的 cscope/ctags 索引文件,例如开发 out-of-tree 内核模块)。如果你想使用相对路径(例如只在内核源代码目录下开发)就可以忽略这个参数

ARCH=... 选择索引的CPU架构。例如使用 ARCH=arm 则 arch/arm/ 目录将会索引,其他 arch/* 目录将被忽略

SUBARCH=... 选择子架构(和主办相关文件)索引。例如 SUBARCH=omap2 则只有 arch/arm/mach-omap2/ 和 arch/arm/plat-omap/ 目录被索引,其他主机和平台被忽略。

COMPILED_SOURCE=1 只索引编译过文件。通常只是对源代码中你编译部分索引,如果还需要所有其他不被编译的文件,就不使用这个参数

cscope 创建cscope索引的规则

tags 创建ctags索引的规则

例如,开发x86的代码:

make ARCH=x86 cscope tags

手工创建索引

内核脚本 tags.sh 有可能不能正常工作,或者你需要采用更多控制索引的功能,此时你可以手工索引内核源代码(详情可参考 Using Cscope on large projects (example: the Linux kernel) ):

首先创建一个 cscope.files 文件列出所有需要索引的文件

如果是ARM架构:

howto_learn_kernel/cscope-arm.files:

find    $dir                                          \
        -path "$dir/arch*"               -prune -o    \
        -path "$dir/tmp*"                -prune -o    \
        -path "$dir/Documentation*"      -prune -o    \
        -path "$dir/scripts*"            -prune -o    \
        -path "$dir/tools*"              -prune -o    \
        -path "$dir/include/config*"     -prune -o    \
        -path "$dir/usr/include*"        -prune -o    \
        -type f                                       \
        -not -name '*.mod.c'                          \
        -name "*.[chsS]" -print > cscope.files
find    $dir/arch/arm                                 \
        -path "$dir/arch/arm/mach-*"     -prune -o    \
        -path "$dir/arch/arm/plat-*"     -prune -o    \
        -path "$dir/arch/arm/configs"    -prune -o    \
        -path "$dir/arch/arm/kvm"        -prune -o    \
        -path "$dir/arch/arm/xen"        -prune -o    \
        -type f                                       \
        -not -name '*.mod.c'                          \
        -name "*.[chsS]" -print >> cscope.files
find    $dir/arch/arm/mach-omap2/                     \
        $dir/arch/arm/plat-omap/                      \
        -type f                                       \
        -not -name '*.mod.c'                          \
        -name "*.[chsS]" -print >> cscope.files

如果是X86架构:

howto_learn_kernel/cscope-x86.files:

find    $dir                                          \
        -path "$dir/arch*"               -prune -o    \
        -path "$dir/tmp*"                -prune -o    \
        -path "$dir/Documentation*"      -prune -o    \
        -path "$dir/scripts*"            -prune -o    \
        -path "$dir/tools*"              -prune -o    \
        -path "$dir/include/config*"     -prune -o    \
        -path "$dir/usr/include*"        -prune -o    \
        -type f                                       \
        -not -name '*.mod.c'                          \
        -name "*.[chsS]" -print > cscope.files
find    $dir/arch/x86                                 \
        -path "$dir/arch/x86/configs"    -prune -o    \
        -path "$dir/arch/x86/kvm"        -prune -o    \
        -path "$dir/arch/x86/lguest"     -prune -o    \
        -path "$dir/arch/x86/xen"        -prune -o    \
        -type f                                       \
        -not -name '*.mod.c'                          \
        -name "*.[chsS]" -print >> cscope.files

这里 dir 变量有以下值:

  • . 如果直接在内核源代码目录,也就是所有命令都在源代码目录的根上执行

  • 内核源代码的绝对路径 则是在内核源代码目录外开发模块时候使用

当 cscope.files 文件生成后,需要运行实际索引:

cscope -b -q -k
这里参数 -k 是让 cscope 不要索引C标准库(因为kernel不使用)

然后就是创建 ctags 索引数据库,这里需要重用刚才创建的 cscope.files

ctags -L cscope.files
在完成了 cscope 和 ctages 索引数据库创建之后,我们可以删除 cscope.files 因为不再需要这个文件:

rm -f cscpe.files
以下文件位于源代码目录下包含了索引:

cscope.out
cscope.out.in
cscope.out.po
tags
posted @ 2022-07-29 11:53  dolinux  阅读(442)  评论(0)    收藏  举报