1. wataash

    license

    wataash
Changes in body
Source | HTML | Preview
@@ -1,59 +1,58 @@
![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` のエラーが出るかもしれません:
```
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](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動画のようにサクサクコードジャンプできるはずです。
## ライセンス
<a rel="license" href="http://creativecommons.org/licenses/by/4.0/"><img alt="クリエイティブ・コモンズ・ライセンス" style="border-width:0" src="https://i.creativecommons.org/l/by/4.0/88x31.png" /></a><br />この 作品 は <a rel="license" href="http://creativecommons.org/licenses/by/4.0/">クリエイティブ・コモンズ 表示 4.0 国際 ライセンス</a>の下に提供されています。
-関連するソフトウェアの公式ドキュメントのメンテナの方へ:この記事の内容を公式
-ドキュメントに記載して頂ける場合、この記事にコメントして頂くか、twitter [@wata_ash](https://twitter.com/wata_ash) にご連絡下さい。
+関連するソフトウェアの公式ドキュメントのメンテナの方へ:この記事の内容を公式ドキュメントに記載して頂ける場合、この記事にコメントして頂くか、twitter [@wata_ash](https://twitter.com/wata_ash) にご連絡下さい。