1. wataash

    license

    wataash
Changes in body
Source | HTML | Preview

Peek 2018-12-23 16-49.gif
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

image.png
エディタは 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

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

ライセンス

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

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