Tech Racho エンジニアの「?」を「!」に。
  • 開発

cmake-serverで遊んでみる

どうもです。2016年新卒としてBPSに入社しましたtjmです。
普段の業務ではAndroidのアプリ開発で、JavaとC++に触っています。

この記事は BPS Advent Calendar 2016 の 14日目1の記事です。

Vimのpath、正しく指定しているとベンリですよね。僕はgfが好きです。

そんなわけ2でプロジェクトで使用しているインクルードディレクトリをVimで正しくpathとして指定するために調べものしてみました。

たぶんできる手法

  1. cmake-server を使う
  2. Python でcmake-serverと通信して情報を取得する
  3. Vimに情報を反映する
  4. Success!!!

※2,3,4はこの記事ではやってません。何もSuccessしてません。どうしよう状態なので続きができ次第別記事の形で投稿すると思います。
CMakeを知らない方向けにざっくり一言で説明すると、CMakeは「ビルドツール向けジェネレータ」です。CMakeLists.txtにルールを書いて、Visual StudioだったりGNU Make向けのファイル群を吐き出したりできます。

成果物

まだない(cmake-serverとの通信方法がわかりました)

以下作業記録とcmake-serverについて説明。

cmake-server

cmake art

幸い3にも僕が関わっているプロジェクトではCMakeが使用されていました。

CMakeには最近 cmake-server なる機能が増えたようなので使ってみます4

cmake-server を使用するにはCMakeのバージョンが3.7以上である必要があります
お手元のCMakeのバージョンが3.7に満たない場合は https://cmake.org/download/ から3.7以上のものをダウンロードしてください。

以下のコマンドでcmake-serverがお試し使用できます。

cmake -E server --debug --experimantal

experimental... gradleが思い出されるやつだこれ

上記のコマンドで起動すると標準入出力を用いてcmake-serverとプロトコルに則った通信ができます。
標準出力にはすでに何か出力されていると思います。

[== "CMake Server" ==[
{"supportedProtocolVersions":[{"isExperimental":true,"major":1,"minor":0}],"type":"hello"}
]== "CMake Server" ==]

こんな感じですよね。

プロトコルに関して詳しくは OperationProtocol API を見ていただければいいと思います。が、注意点として、

[== "CMake Server" ==[
{
... some JSON message ...
}
]== "CMake Server" ==]

[== "CMake Server" ==[]== "CMake Server" ==]はcmake-serverからのレスポンスだけじゃなく、こちらから送るときも必要です。こちらから送るときも必要です5

handshake -> configure -> compute の手続きをするとプロジェクトの情報が取得できる codemodel が使用できるようになります。

llvmを対象にする例: /home/tjm/srcにllvmのソースコードがあるとしたら

[== "CMake Server" ==[
{"cookie":"experimentalhayavai","type":"handshake","protocolVersion":{"major":1},"sourceDirectory":"/home/tjm/src/llvm","buildDirectory":"/home/tjm/src/llvm-build","generator":"Ninja"}
]== "CMake Server" ==]
[== "CMake Server" ==[
{"cookie":"experimentalhayavai","type":"configure","cacheArguments":["-DCMAKE_INSTALL_PREFIX=/home/tjm/Tools/llvm"]}
]== "CMake Server" ==]
[== "CMake Server" ==[
{"cookie":"experimentalhayavai","type":"compute"}
]== "CMake Server" ==]
[== "CMake Server" ==[
{"cookie":"experimentalhayavai","type":"codemodel"}
]== "CMake Server" ==]

これをPythonから入出力すれば良い、と。

Pythonで入出力(まだ書いてません)

"type:"codemodel"で帰ってきたjsonをterminalでコピーして保存したら1.4Mになりました。
頑張ってpipe使おうと思います。

参考

CMake: https://cmake.org/
cmake-server: https://cmake.org/cmake/help/v3.7/manual/cmake-server.7.html


  1. 25:30。深夜アニメのアレですね。 
  2. ほんとはお勉強中のRust使って何かやってみたかったけど時間ああー 
  3. そもそも弊社C++プロジェクトはほぼCMakeです。ありがたや。 
  4. Qt Createrでは使用しているらしい。使わないから知りませんでした。 
  5. これが書きたかった。もはや達成した。英語はきちんと読みましょう…… 

CONTACT

TechRachoでは、パートナーシップをご検討いただける方からの
ご連絡をお待ちしております。ぜひお気軽にご意見・ご相談ください。