1. wataash

    Posted

    wataash
Changes in title
+NetBSD kernelのcompilation databaseを生成する
Changes in tags
Changes in body
Source | HTML | Preview
@@ -0,0 +1,43 @@
+![Peek 2018-12-23 16-49.gif](https://qiita-image-store.s3.amazonaws.com/0/167409/744421a3-26f2-50ca-a59f-46fcc9fec6a4.gif)
+[English](https://dev.to/wataash/create-compilation-database-compilecommandsjson-for-netbsd-kernel-source-3c3n)
+
+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](https://clang.llvm.org/docs/JSONCompilationDatabase.html) (`compile_commands.json`) です。
+
+Linux (Ubuntu 18.04) 上ではこんな感じに作れました:
+(近いうちにNetBSD、macOS上での生成手順も載せる予定です。ほぼ一緒ですが、NetBSDでは[bearのissue](https://github.com/rizsotto/Bear/issues/212)に当たるかもしれません。[scan-build](https://github.com/rizsotto/scan-build)だと回避できた記憶があります。macOSはリンク時に警告が出ます。)
+
+```sh
+# 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](https://github.com/Valloric/YouCompleteMe#c-family-semantic-completion)などのプラグインを使えばOKで、CLionは[マニュアル](https://www.jetbrains.com/help/clion/compilation-database.html)に従えばOKです。この記事ではCLionを使っています。開くと `cc` のエラーが出るかもしれません:
+![image.png](https://qiita-image-store.s3.amazonaws.com/0/167409/aba7814e-7157-603e-94f9-4507b3a03d35.png)
+エディタは `compile_commands.json` に従って `/usr/bin/cc` を実行しますが、`${TOOLDIR}/bin/x86_64--netbsd-gcc[--<target>]` であるべきです。`compile_commands.json` を書き替えます:
+
+```sh
+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](https://qiita-image-store.s3.amazonaws.com/0/167409/c9d37160-1359-8671-4784-b3935f452ec1.png)
+正常に読み込めました。これで冒頭のGIF動画のようにサクサクコードジャンプできるはずです。