ソフトな忘却力(3) リモートVS Code、CMake Toolsでcmakeするのだ

Joseph Halfmoon

CMakeには随分昔からお世話になっているような気がしますが、よくわかっていないです。何かの折に「ディレクション」のまま走らせるばかりで、自分で積極的に使ったことが無いので身につきません。しかし、最近ラズパイPicoなどやっておりますとCMake必須。この際少し勉強しておこうという気になりましたです。

さてCMakeといって、よくわからないのはCMakeだけではないのです。この頃はVS Codeからビルドやらデバッグやら動かしていることも多いので、VS Codeの上で動作しているCMake Toolsというものも分かってないです。何やらいろいろやってくれてるみたいな気もするのだけれど。。。CMakeの上にCMake Toolsとよくわからないものが積み重なると何がなんだか。まあ、繰り返し何度もやってみるしか覚えますまい。忘却力だし。

環境と参照文書の確認

今回は、ターゲットマシンを Raspberry Pi 3およびPi 4、どちらもRaspberry Pi OS(32bit)で動作させているものといたしました。別件でもいろいろ使っている関係で。PC上のVS Codeからリモート接続で動かしております。

まずは CMakeなどのバージョン確認から。

$ cmake --version
cmake version 3.16.3

最新版からすると、かなり古い感じがしますが、3.16以上であればCMake Toolsも対応みたいなのでこれで行くと。CMake自体は、各種バージョンのドキュメントが充実しており、3.16であれば参照するのは以下のようです。

CMake 3.16.9 Documentation

実際には上のドキュメントのページで「バージョン」を選択すれば別なバージョンに直ぐに切り替わります。なお、Opencv.jp様の日本語ドキュメント

CMake チュートリアル

は、ちょっと古い版だと思いますが公式のチュートリアルを日本語に訳していただいているようなのでありがたいです。

VS CodeからのCMake Toolsについては、以下から始める、感じですかね。

Get started with CMake Tools on Linux

今回は、ほぼほぼ上記文書にそって実習させていただきます。

CMake: Quick Start

CMake Toolsを使うと、VS Code上でCMake使ったプロジェクトを作成することができます。早速リモート接続したRaspberry Pi 3上でVS Codeのコマンド・パレットを呼び出してみます。”CMake”とな。その中の「クイックスタート」こそが最初の一歩でありました。CMakeQuickStart

クイックスタート開始すると、まず ”Kit” の選択を迫られます。Kitの定義は何なぞや?などと思いつつも、ツールチェーンのバージョン選択みたいなので、ここでは、一番下のGCC 8.3.0 arm-linux-gnueabihf を選択いたしました。これが、このRaspberry Pi 3機上で “gcc” と打ったら立ち上がってくるものなので。 今回は Raspberry Pi 3上でのセルフ開発、クロス環境は使いませぬ。Cortex-M用のクロス環境もインストールしてある Pi 4 であると当然変わってくるのかな。後でやってみます。
SelectAKit
なお、CMakeLists.txtも何もない空のフォルダからQuick Startしたので、右下をみると、以下のようなCMakeLists.txt作っていいか的な質問がなされていました。ここは “Create” と答えました。

CMakeCreate
続いて問われるのは、Libraryを作るつもりなのか、Executable(実行ファイル)を作るつもりなのかです。今回は両方やってみてその挙動を観察します。まずはExecutableの方をクリック。

LIBorEXEExecutableを指定して、空のディレクトリに配置されたのが以下です。直下にはCMakeLists.txtと main.cpp、そして build サブディレクトリです。とりあえずサンプルプロジェクト的な、即ビルド可能でした。

ExeProjCreatedmainの中を見ると、単なるHello worldでした。当然か。

MainVS Codeの下部のステータスバーを見れば、DebugなのかReleaseなのか、ツールチェーンが何なのか、ビルド、デバッグ、実行などのボタンも見えております。

Barここでは早速、”Build” を押して生成されたファイルをビルドしてみます。ビルドできるとこんな感じ。buildサブディレクトリ配下に実行ファイルも出来ておりますがな。

Buildそのままターミナルを開いて実行ファイルを起動しても良いのですが、Debugを押してデバッガ起動してみます。初回デバッグ時には launch.jsonが無いので作っていいかみたいなことを聞かれましたが、良しとすれば勝手に作って起動してくれました(この動作は誰がやってくれているのだろう?)なお、mainの先頭に自動でブレーク指定してくれるようなことは無かったので、自主的にブレークポイントを置いてからDebugです。ブレークで止まったところがこちら。

Debug何もデバッグすることもないので、RUNボタンを押すと、ターミナルウインドウに結果が出ました。

exec

Libraryを指定した場合

Libraryを指定した場合も、雛形のソースファイルと、CMakeList.txtを生成してくれるのは同じです。当然、CMakeLists.txtの内容は異なります。また、ソースはmain.cppでなく、プロジェクト名.cppでした。2ファイルを開いて並べたところがこちら。

Libこれまた build を押せばビルドできます。buildディレクトリ内をみると libプロジェクト名.a というライブラリファイルができています。念のため、objdumpで中身をみてみたところがこちら。

FuncInLib

CMakeLists.txtの中身

忘れちゃいけない、肝心なのは、生成してくれたCMakeLists.txtを手掛かりにCMakeを勉強することなのです。さすがVS Code + その拡張です。良い機能がが仕込まれています。下のスクリーンショットはちょっと見ずらいですが、CMakeLists.txtの特定の要素にカーソルを当てると、ポップアップでその要素の説明が出ます。便利。
CMakeLists忘れても大丈夫?

次回は、CMakeLists.txtを改造?しながらお試しの予定。

ソフトな忘却力(2) ラズパイ4でCプログラミング、libconfig に戻る