3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

NetBSD kernelのcompilation databaseを生成する

Last updated at Posted at 2018-12-23

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

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?