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 にご連絡下さい。