Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
0
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

@wataash

NetBSD kernelのcompilation databaseを生成する

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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
0
Help us understand the problem. What are the problem?