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

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

More than 1 year has passed since last update.


NetBSD kernelのcompilation databaseを生成する

Peek 2018-12-23 16-49.gif

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) 上ではこんな感じに作れました:

# 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.
    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



この 作品 は クリエイティブ・コモンズ 表示 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
Help us understand the problem. What are the problem?