给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
本文来自博客园,作者:dolinux,未经同意,禁止转载

浙公网安备 33010602011771号