0%

FreeBSD源码笔记02-代码阅读指引

本文记录使用vscode和clangd的环境下,阅读FreeBSD源码的方法;在真机环境下使用Bear记录整个编译过程,生成compile_commands.json文件;通过配置clangd以及事先生成好的索引文件,可以开启FreeBSD源码的语义导航;这个是区别于ctags的标签导航的。

1. FreeBSD内核编译

  • 更改Ports源
    在 /etc/make.conf 中添加以下内容
    1
    MASTER_SITE_OVERRIDE?=http://mirrors.ustc.edu.cn/freebsd-ports/distfiles/${DIST_SUBDIR}/
  • 增加pkg源
    1
    vi /usr/local/etc/pkg/repos/163.conf
    163.conf文件内容如下:
    1
    2
    3
    4
    5
    6
    7
    8
    163: {
    url: "pkg+http://mirrors.163.com/freebsd-pkg/${ABI}/quarterly",
    mirror_type: "srv",
    signature_type: "none",
    fingerprints: "/usr/share/keys/pkg",
    enabled: yes
    }
    FreeBSD: { enabled: no }
  • 编译安装Bear
    1
    2
    cd /usr/ports/devel/bear
    make
    如果安装一些依赖可以使用pkg的方式安装,不要使用pkg的方式安装bear(bear 3.0.19),貌似有一些问题.
  • 开始编译内核
    不会的可以参考这篇文章,另外我安装的版本是FreeBSD-12.3-stable版本,安装系统时可以带上ports和src;这里我使用的配置是MINIMAL!是为了编译快点完成,后续也以这个配置为准。
    1
    2
    cd /usr/src
    bear -- make buildkernel KERNCONF=MYKERNEL
    产生了compile_commands.json文件,点击这里下载

2. 生成本地索引文件

我的操作系统MAXOSX下的vscode,安装插件clangd,生成本地索引文件是为了加快代码的导航,不用动态解析compile_commands.json。

  • 安装clangd-indexing-tools工具在这个页面上,里面有我们需要生成本地索引文件的clangd-indexer工具
  • 替换源码相对路径
    1
    2
    3
    4
    5
    6
    # 先将/usr/obj目录替换成自己想对的目录
    sed 's#/usr/obj/usr/src/amd64.amd64#/Users/xxxx/Documents/project/freebsd/amd64.amd64#g' ./compile_commands.json > compile_commands2.json

    # 替换/usr/src
    sed 's#/usr/src#/Users/xxxx/Documents/project/freebsd#g' ./compile_commands2.json > compile_commands.json

  • 生成本地索引文件
    1
    clangd-indexer --executor=all-TUs ./compile_commands.json > clangd.dex

3. 配置clangd

在src/sys目录下配置.clangd文件,内容如下:

1
2
3
4
5
6
7
If:
PathExclude: [arm/.*,arm64/.*,mips/.*,powerpc/.*,riscv/.*,modules/.*,tests/.*,tools/.*]

Index:
Background: Skip
External:
File: /Users/xxxx/Documents/project/freebsd/sys/clangd.dex

你可以自己手动生成compile_commands.json文件,也可以通过下载我的文件以后自行修改目录生成本地索引文件,现在你可以愉快的阅读FreeBSD源码了,不过仍然有一个问题需要注意的是编译内核时,内核编译的中间文件都在/usr/obj目录下,不同的配置文件下不同的平台文件夹内.