CMake, GoogleTest, GitHub Actionsに対応したC++のアプリケーション・テンプレート

最近やっている電卓いじりですが、どうせ気分転換をやるなら新しいことも試そう、と思いたってGoogleTestを勉強しました。

さて、GoogleTestに関するWEBページが多いのはよいのですが、困ったことに自分にとって使いやすい形のサンプルがありません。結局、一緒に使うCMakeを含めて仕様書を読み、自分用のテンプレートを作ってしまいました。

GitHubにtemplate_applicationおよびtemplate_libraryとして公開済みです。以下、template_applicationについて紹介します。

テンプレートの特徴

このテンプレートは次のような特徴を持っています。

  • C++11コマンドライン・プログラムのアプリケーション・テンプレート
  • CMakeによるコンフィギュレーション、ビルド及びテスト
  • コンフィギュレーション中にCMakeが自動的にGoogleTestのソースコードをダウンロードし、ビルドする
  • ソースコードはサブディレクトリに格納
    • src : アプリケーションのソースコード
    • test : テストのソースコード
  • ソース・ファイル、テスト・ファイルを追加した場合、再度CMakeのコンフィギュレーションをかけるだけで自動的にビルド対象として認識する
  • テストを追加すると、自動的にテスト対象として認識する
  • std::thread対応
  • マルチプラットホームで検証済み
    • Ubuntu 20.04 (GCC)
    • Windows 11 (Visual Studio C++ 2022 )
    • WSL2 (GCC)
  • コマンドラインでも、VS CODEのステータスバーからでもビルド&実行可能
  • GitHub Actionsにより、GitHubへのプッシュ時とPull Requestの受付時に自動的にDebug/Releaseコンフィギュレーションでテストが行われる
  • ビルドやテストをVisual Studio CODEのステータス・バーから容易に制御できる

アプリケーション・テンプレート、と大上段に振りかぶっていますが中身はC++のHello World程度でしかありません。目的はそちらではなく、小さなプログラムをささっとつくりたいときにCMakeやGoogleTestの設定が面倒だったので予め自分用に用意した、という経緯です。

サンプル・プログラムではstd::threadのテストもしています。C++11ではstd::threadが導入され、スレッド・プログラミングからOS依存性がなくなりました。一方で、当然ですがリンクするライブラリにはOS依存性や開発ツール依存性が残ります。せっかく作ったテンプレートが

「Linuxでしか動かない」

などという体たらくでは、利用者である私がイライラします。ですので、簡単なスレッド・プログラミングを行い、Linux(GCC)とWindows(MSVC)双方で問題なくビルド・実行できることを確認済みです。

このアプリケーションは最初からGoogleTestによるユニット・テストが可能です。srcディレクトリにあるmain.cpp以外のすべてのソース・ファイルはテスト対象とすることができます。また、.github以下の隠しディレクトリの設定により、GitHubリポジトリに格納する場合はGitHubアクションによる自動テストが行われます。テストが走るのは以下の場合です

  • developブランチにpushした場合
  • mainブランチにpushした場合
  • プル・リクエストを受け取った場合

各プラットフォームへのインストール

Ubuntu 20.04へのインストール

これが一番簡単です。以下のコマンドをshellから実行します。

sudo snap install code --classic
sudo apt-get install build-essential cmake

VS CODEにはC++ Extention Packをインストールしてください。この拡張機能パッケージはC++のための拡張機能のほかに、CMakeやDoxygen用の拡張機能をインストールします。

Windows 11へのインストール

Windowsは設定がやや面倒です。まず、以下のコマンドをコマンドライン・ウィンドウから実行します。Visual Studio 2022はC++コンパイラを使うためにインストールします。

winget install Microsoft.VisualStudioCode -e
winget install Kitware.CMake -e
winget install Microsoft.VisualStudio.2022.Community -e
winget install Git.Git -e
winget install Python.Python.3 -e

VS CODEにはC++ Extention Packをインストールしてください。この拡張機能パッケージはC++のための拡張機能のほかに、CMakeやDoxygen用の拡張機能をインストールします。

面倒なことに、上のインストール・スクリプトを実行してもCMakeのインストールは完了しません。上記コマンド実行後、CMakeをWindowsのメニューから実行してインストールを完了させてください。

また、Visual Studio 2022も上のインストールスクリプトだけではインストールが完了しません。上記コマンド実行後にVisual Studioを実行し、C++ワークロードをインストールしてください。

以上が終わったら、各ツールの実行ファイルが置かれているパスをPATH環境変数に登録してください。

WSL2へのインストール

WSL2で使用する場合の設定は、UbuntuとWindowsの中間程度の面倒くささです。まず、以下のコマンドをWindowsのコマンドライン・ウィンドウから実行します。

winget install Microsoft.VisualStudioCode -e

S CODEにはC++ Extention Packをインストールして下さい。この拡張機能パッケージはC++のための拡張機能のほかに、CMakeやDoxygen用の拡張機能をインストールします。また、この拡張機能パックにはWSLでの開発をWindowsのVS CODEで行うためのリモート開発拡張も含まれています。

次に以下のコマンドをWSLで動作しているUbuntuのshellから実行します。

sudo apt-get install build-essential cmake ca-certificates

上で説明した拡張機能により、WSLで動作するコマンド群はWSLの外のWindowsにインストールされているVS CODE配下で動作させることができます。詳しくはMicrosoftの解説を参照してください。

使い方

template_applicationを適当なディレクトリにgit cloneするかダウンロードしてください。

コマンドラインでの実行

README.mdが置いてあるトップ・ディレクトリから、以下のコマンドを実行します。

mkdir build
cd build
cmake ..
cmake --build .

これでプロジェクトのコンフィギュレーション、Google Testの取得、ビルドが行われます。

開発中にビルドを行う場合には以下のコマンドを実行します。

cmake --build .

テストを行う場合には以下のコマンドを実行します。

ctest

VS CODEからの実行

README.mdがおいてあるトップ・ディレクトリから、以下のコマンドを実行します。

code .

これでVS CODEが起動しますので、CTRL+SHIFT+Pをタイプしてコマンド・パレットを開き、以下のコマンドを実行します。

CMake: Configure

これでプロジェクトのコンフィギュレーションが完了します。あとは、VS CODEのステータス・バーから、ビルド、実行、テストを行うことができます。

VS CODEのステータス・バー

ソース・ファイルを追加したい場合

srcディレクトリに拡張子.cppでファイルを追加します。CMakeLists.txtの編集は必要ありません。追加後にcmakeのコンフィギュレーションをかけます。

テスト・ファイルを追加したい場合

testディレクトリに拡張子.cppでファイルを追加します。CMakeLists.txtの編集は必要ありません。追加後にcmakeのコンフィギュレーションをかけます。

カスタム化

プロジェクト・トップのCMakeLists.txtの以下の行を変更すると、プロジェクト名を変更できます。プロジェクト名は実行ファイル名として使用されます。

project("template_application")

まとめ

このテンプレート・アプリケーションを使うことでWindowsでもUbuntuでも、簡単にC++アプリケーションの開発を始めることができます。

このご時世に大規模開発をmain()で始まるようなアプリケーションとして開発することはないと思いますが、ちょっとしたプログラムを書きたいときに便利に使えるはずです。

コメントする

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください