NetBSD kernelのcompilation databaseを生成する



English

NetBSD kernelのソース (netbsd-src/sys/) の構造は単純ではなく、cscopeなどの静的ソース解析ツールで正確なコードジャンプを行うのは不可能です。例えば、<machine/endian.h>

  • sys/arch/hpc/stand/include/machine/endian.h ではなく
  • sys/arch/hpcmips/stand/include/machine/endian.h でもなく
  • ${OBJDIR}/sys/arch/amd64/compile/GENERIC/machine/endian.h にある

なんてことはcscopeには分かりません。コンパイルが ${OBJDIR}/sys/arch/amd64/compile/GENERIC-I. フラッグと共に行われたなんてことはケアしないわけです。

正確なコードジャンプを行うには、コンパイル時の情報が必要になってきます。その1つの手法がcompilation database (compile_commands.json) です。

Linux (Ubuntu 18.04) 上ではこんな感じに作れました:
(近いうちにNetBSD、macOS上での生成手順も載せる予定です。ほぼ一緒ですが、NetBSDではbearのissueに当たるかもしれません。scan-buildだと回避できた記憶があります。macOSはリンク時に警告が出ます。)

# https://github.com/rizsotto/Bear/
sudo apt install bear

cd netbsd-src/

# First, create ${OBJDIR}/sys/arch/amd64/compile/GENERIC/Makefile
# and confirm that the kernel can be built
./build.sh kernel=GENERIC

cd ${OBJDIR}/sys/arch/amd64/compile/GENERIC/
${TOOLDIR}/bin/nbmake-amd64 clean
bear ${TOOLDIR}/bin/nbmake-amd64 -j3         # creates compile_commands.json
mv compile_commands.json ${NETBSD-SRC}/sys/  # optional

Compilation databaseをサポートするお好みのエディタでソースを開いてみます。vimだとYouCompleteMeなどのプラグインを使えばOKで、CLionはマニュアルに従えばOKです。この記事ではCLionを使っています。開くと cc のエラーが出るかもしれません:

Compiler exited with error code 1: /usr/bin/cc -xc -c -mcmodel=kernel (snip) -v -dD -E
    Using built-in specs.
    (snip)
    End of search list.
    cc1: error: code model kernel does not support PIC mode


エディタは compile_commands.json に従って /usr/bin/cc を実行しますが、${TOOLDIR}/bin/x86_64--netbsd-gcc[--<target>] であるべきです。compile_commands.json を書き替えます:

cp compile_commands.json compile_commands.json.bak
sed -i s!'"cc",'!'"/home/wsh/src/netbsd/tools/bin/x86_64--netbsd-gcc",'!g compile_commands.json


正常に読み込めました。これで冒頭のGIF動画のようにサクサクコードジャンプできるはずです。

ライセンス


この 作品 は クリエイティブ・コモンズ 表示 4.0 国際 ライセンスの下に提供されています。

関連するソフトウェアの公式ドキュメントのメンテナの方へ:この記事の内容を公式ドキュメントに記載して頂ける場合、この記事にコメントして頂くか、twitter @wata_ash にご連絡下さい。