新しいC ++プロジェクトのセットアップには、通常、テスト、実行可能ファイル、継続的な統合を備えた最新のC ++プロジェクトの場合、かなりの量の準備とボイラープレートコードが必要です。このテンプレートは、以前の多くのプロジェクトからの学習の結果であり、最新のC ++プロジェクトのセットアップに必要な作業を減らすのに役立つはずです。
Greeterプロジェクトの名前を意味し、 greeterファイル名で使用されます。include/greeterディレクトリの名前を変更して、プロジェクトの小文字名を使用し、それに応じてすべての関連する#include sを更新してください。CODECOV_TOKEN最終的には、スタンドアロンディレクトリやプロジェクトの無関係なGitHubワークフローなど、未使用のファイルを削除できます。ライセンスをプロジェクトに適したものに自由に置き換えてください。
ライブラリとサブプロジェクトコードをきれいに分離するために、外側のCMakeList.txtはライブラリ自体を定義しますが、テストやその他のサブプロジェクトは独自のディレクトリに自己完結しています。開発中は、通常、すべてのサブプロジェクトを一度に構築するのが便利です。
次のコマンドを使用して、実行可能ターゲットを構築および実行します。
cmake -S standalone -B build/standalone
cmake --build build/standalone
./build/standalone/Greeter --helpプロジェクトのルートディレクトリから次のコマンドを使用して、テストスイートを実行します。
cmake -S test -B build/test
cmake --build build/test
CTEST_OUTPUT_ON_FAILURE=1 cmake --build build/test --target test
# or simply call the executable:
./build/test/GreeterTestsコードカバレッジ情報を収集するには、 -DENABLE_TEST_COVERAGE=1オプションでcmakeを実行します。
プロジェクトのルートディレクトリから次のコマンドを使用して、C ++およびCmakeソーススタイルを確認および修正します。これには、 Clang-format 、 cmake-format 、およびpyyamlを現在のシステムにインストールする必要があります。
cmake -S test -B build/test
# view changes
cmake --build build/test --target format
# apply changes
cmake --build build/test --target fix-format詳細については、format.cmakeを参照してください。これらの依存関係は、PIPを使用して簡単にインストールできます。
pip install clang-format==14.0.6 cmake_format==0.6.11 pyyamlドキュメントは、GitHubリリースが作成されるたびに自動的に構築および公開されます。ドキュメントを手動で作成するには、次のコマンドを呼び出します。
cmake -S documentation -B build/doc
cmake --build build/doc --target GenerateDocs
# view the docs
open build/doc/doxygen/html/index.htmlローカルでドキュメントを構築するには、システムにDoxygen、Jinja2、Pygmentsがインストールされる必要があります。
このプロジェクトには、すべてのターゲットを同時に構築できるallディレクトリも含まれています。これは、すべてのサブプロジェクトをIDEに公開し、ライブラリの冗長なビルドを回避するため、開発中に役立ちます。
cmake -S all -B build
cmake --build build
# run tests
./build/test/GreeterTests
# format code
cmake --build build --target fix-format
# run standalone
./build/standalone/Greeter --help
# build docs
cmake --build build --target GenerateDocsテストとスタンドアロンのサブプロジェクトには、Cmake構成引数を介して追加のツールをオンデマンドでインポートするために使用されるTools.cmakeファイルが含まれています。現在、以下がサポートされています。
CMAKEを-DUSE_SANITIZER=<Address | Memory | MemoryWithOrigins | Undefined | Thread | Leak | 'Address;Undefined'> 。
-DUSE_STATIC_ANALYZER=<clang-tidy | iwyu | cppcheck>設定することで、静的アナライザーを有効にできます-DUSE_STATIC_ANALYZER=<clang-tidy | iwyu | cppcheck> 、またはセミコロンで区切られた引用符のあるものの組み合わせ。デフォルトでは、アナライザーは.clang-formatなどの構成ファイルを自動的に見つけます。 CLANG_TIDY_ARGS 、 IWYU_ARGS 、またはCPPCHECK_ARGS変数を設定することにより、追加の引数をアナライザーに渡すことができます。
ccacheは-DUSE_CCACHE=<ON | OFF>で構成することで有効にできます-DUSE_CCACHE=<ON | OFF> 。
これをヘッダーのみのライブラリに使用できますか?
はい、ただし、cmakelists.txtに文書化されているように、ライブラリタイプをINTERFACEライブラリに変更する必要があります。テンプレートに基づいたヘッダーのみのライブラリの例については、こちらをご覧ください。
スタンドアロンのターゲット /ドキュメントは必要ありません。どうすればそれを取り除くことができますか?
Standalone / Documentation Directoryを削除し、GitHubワークフローファイルに従って削除するだけです。
スタンドアロンとテストを同時に作成できますか? /すべてのサブプロジェクトについてIDEを伝えるにはどうすればよいですか?
テンプレートをモジュラーに保つために、ライブラリから派生したすべてのサブプロジェクトは、独自のCmakeモジュールに分けられています。このアプローチにより、サードパーティのプロジェクトがプロジェクトライブラリコードを再利用することが簡単になります。 IDEがプロジェクトの完全な範囲を確認できるようにするために、テンプレートには、すべてのサブプロジェクトの単一のビルドを作成するallディレクトリが含まれています。これを、最高のIDEサポートのメインディレクトリとして使用します。
cmakelists.txtにソースファイルを追加するために
GLOBを使用していることがわかります。それは悪ではありませんか?
Sourceファイル構造の変更はCmakeのビルダーによって自動的にキャッチされない可能性があるため、GLOBは悪いと考えられており、Cmakeを変更して手動で呼び出す必要があります。私は個人的にはGLOBソリューションのシンプルさを好みますが、それを自由に変更して、明示的にソースをリストしてください。
ライブラリに依存する追加のターゲットを作成したいと思います。メインのcmakelistを変更してそれらを含める必要がありますか?
図書館のcmakelistから派生プロジェクトを含めることは避けてください(C ++の世界では一般的な光景であるにもかかわらず)。代わりに、ライブラリを依存関係として追加するcmakelistを使用して新しいディレクトリまたはプロジェクトを作成します(たとえば、スタンドアロンディレクトリのような)。タイプに応じて、これらのコンポーネントを別のリポジトリに移動し、ライブラリの特定のコミットまたはバージョンを参照してください。これには、個々のライブラリとコンポーネントを独立して改善および更新できるという利点があります。
cpm.cmakeを使用して外部依存関係を追加することをお勧めします。これにより、私のライブラリのユーザーはCpm.cmakeも使用しますか?
CPM.Cmakeは、自己完結型のCmakeスクリプトであるため、ライブラリユーザーには見えないはずです。問題find_package発生した場合、ユーザーはCMAKEまたはENV変数CPM_USE_LOCAL_PACKAGES CPMAddPackage定義することにより、常にオプトアウトできます。これにより、ユーザーはVCPKGやConanなどのお気に入りの外部C ++依存関係マネージャーでプロジェクトを使用できるようにする必要があります。
プロジェクトをオフラインで構成して構築できますか?
プロジェクトの構築にはインターネット接続は必要ありませんが、CPMを使用すると、Configure Timeで欠落している依存関係がダウンロードされます。冗長なダウンロードを回避するには、CPM.CMake Cacheディレクトリを設定するexport CPM_SOURCE_CACHE=$HOME/.cache/CPMを強くお勧めします。これにより、浅いクローンが可能になり、オフライン構成の依存関係がキャッシュで既に利用可能になります。
CPACKを使用してプロジェクトのパッケージインストーラーを作成できますか?
可能なオプションと構成がたくさんあるため、これはこのテンプレートの範囲内ではありません。 CPACKインストーラーのセットアップの詳細については、CPACKドキュメントを参照してください。
これは多すぎるので、C ++コードを使用していくつかのライブラリをテストしたいだけです。
おそらくミニクップスターターはあなたのためのものです!