はじめに
この記事では、さまざまなソフトウェア製品を開発するための柔軟で汎用性の高いユーティリティセットであるCMakeを使用したプログラムのテストとパッケージ化について説明します。 構文とCMakeの動作を誤解しないように、マニュアルの最初と2番目の部分を読むことを強くお勧めします。
CMake発売
以下は、実践すべきCMake言語の使用例です。 既存のコマンドを変更し、新しいコマンドを追加して、ソースコードを試してください。 これらの例を実行するには、 公式WebサイトからCMakeをインストールしてください 。
試験例
前述のように、CMakeはプログラムの自動テストをサポートしています。 この機能は非常に使いやすいです。通常のCMakeLists.txt
いくつかのコマンドを記述してから、 ctest
またはmake test
を使用してテストを実行します。 自由にプログラムの出力の確認、メモリの動的分析などを行うことができます。
特定の例を使用して、プログラムをテストするプロセスを検討します。 Multiply.c
ソースファイルには、次のコードが含まれています。
#include <stdio.h> #include <stdlib.h> #define ARG_COUNT 3 int main(const int argc, const char *argv[]) { if (argc != ARG_COUNT) { fprintf(stderr, "Error!\n"); return EXIT_FAILURE; } const int first = atoi(argv[1]); const int second = atoi(argv[2]); printf("The result is: %d\n", first * second); return EXIT_SUCCESS; }
このコードは、2つの引数をコンソールに乗算した結果を表示します。 引数の実際の数が予想を満たしていない場合にもエラーが発生する可能性があることに注意してください。この場合、エラーはエラーストリームに出力されますError!
。
同じディレクトリに、ビルドプロセスの説明を含むCMakeLists.txt
ファイルがあり、以下のコードが含まれています。
cmake_minimum_required(VERSION 3.0) project(MyProgram) add_executable(Multiply Multiply.c) set(MULTIPLY_TIMEOUT 1) # : enable_testing() # : add_test(FirstTest Multiply 15 207) add_test(SecondTest Multiply -54 -785) add_test(ThirdTest Multiply 85234) # : set_tests_properties(FirstTest SecondTest ThirdTest PROPERTIES TIMEOUT ${MULTIPLY_TIMEOUT}) set_tests_properties(FirstTest PROPERTIES PASS_REGULAR_EXPRESSION "The result is: 3105" FAIL_REGULAR_EXPRESSION "Error!") set_tests_properties(SecondTest PROPERTIES PASS_REGULAR_EXPRESSION "The result is: 42390" FAIL_REGULAR_EXPRESSION "Error!") set_tests_properties(ThirdTest PROPERTIES PASS_REGULAR_EXPRESSION "Error!")
すべてを順番に考えてみましょう。 最初の4つのコマンドは、 前の記事でおなじみのものであり、次のenable_testing
コマンドでは多くの疑問が生じます。 本質的に、このコマンドはCMakeにプログラムをテストする意図を通知するだけで、同時にいくつかの構成ファイルを生成しますが、その存在は知る必要はありません。
次の3つのadd_test
は、現在のプロジェクトにテストを追加します。 このコマンドの短い形式は、最初の引数としてテストの名前を取り、後続の引数はテストを実行するためのシェルコマンドを形成します。
一連のset_tests_properties
コマンドは、個々のテストの動作を設定します。 テスト項目のリストの後に、キーワードPROPERTIES
続きます。プロパティのリストの始まりを示し、 < > < >
の形式を持ち、選択したテストに設定されます。 利用可能なプロパティの完全なリストはこちらです。
すべてのテストで、 TIMEOUT
プロパティを使用して最大実行時間を1秒に設定し、その後のテストでPASS_REGULAR_EXPRESSION
およびFAIL_REGULAR_EXPRESSION
して期待される出力を設定しFAIL_REGULAR_EXPRESSION
(たとえば、通常のThe result is: 3105
と一致する場合、 The result is: 3105
が実行され、 FirstTest
テストが続行し、一致する場合式がError!
テストは停止し、失敗と見なされます)。
テストを有効にする方法
enable_testing
類似したものがあります-これは、 include
コマンドによるCTest
モジュールの包含です。 一般に、モジュールの組み込みはより普遍的ですが、それらの間にはまだ違いがあります。
enable_testing
コマンドは、現在のディレクトリと後続のすべてのディレクトリのテストを有効にします。 CTestはアセンブリのルートにあるテストファイルを想定しているため、ルートCMakeLists.txt
配置する必要があります。
CTest
モジュールを有効にすると、 CTest
/ CDashを使用したテスト用にプロジェクトが構成され、テストが可能な場合はtrueを受け入れるBUILD_TESTING
オプションも自動的に決定されます(デフォルトではON
)。 したがって、このコマンドを使用する場合、次のようにテストプロセスを説明するのが妥当です。
if(BUILD_TESTING) add_test(FirstTest Test 1) add_test(SecondTest Test 2) add_test(ThirdTest Test 3) # ... endif()
テスト実行
一連のcmake . && cmake --build . && ctest .
コマンドcmake . && cmake --build . && ctest .
cmake . && cmake --build . && ctest .
3つのテストすべてが実行されます。 ctest -R <RegularExpression>
は、特定の正規表現を満たす一連のテストを実行します。 たとえば、 ctest -R ThirdTest
は3番目のテストのみを実行します。
包装例
ソースファイル、ライブラリ、実行可能ファイルのパッケージを作成するには、 install
コマンドを使用して必要なファイルのインストールを記述CPack
、 include
コマンドでCPack
モジュールCPack
有効にするCPack
です。
# "Multiply" "bin": install(TARGETS Multiply DESTINATION bin) # : set(CPACK_PACKAGE_NAME "Multiply") set(CPACK_PACKAGE_VENDOR "MyCompany") set(CPACK_PACKAGE_CONTACT "https://myprojectsite.org") set(CPACK_DEBIAN_PACKAGE_MAINTAINER "mycontacts@gmail.com") set(CPACK_PACKAGE_DESCRIPTION "The most stupid program ever written") # : set(CPACK_GENERATOR "DEB") # "CPack": include(CPack)
この場合、 install
コマンドは、 Multiply
ターゲットインストールディレクトリのパッケージジェネレーターに通知します。 インストールコマンドを記述しないと、パッケージを生成できません。
以下に、いくつかの変数を設定してパッケージの特性をリストします。 実際、パッケージを適切にパッケージ化するこのような変数は数多くあります。 それらのほとんどはオプションですが、一部のパッケージジェネレーターでは定義が必要です。 すべてのパッケージジェネレーターに共通の変数のリストは、 ここから入手できます 。
CPACK_GENERATOR
変数をCPACK_GENERATOR
するCPACK_GENERATOR
-これは、 cpack
ユーティリティによって呼び出されるパッケージジェネレーターのリストです。 この場合、値はDEB
ため、概要アプリケーションのルートディレクトリにdebianパッケージが生成されます。
最後に、 CPack
モジュールがCPack
、以前に定義された変数と実行可能ファイルのインストールコマンドを使用して将来のプロジェクトパッケージを構成し、 package
およびpackage_source
(それぞれバイナリアセンブリとソースアセンブリ)の2つのアセンブリターゲットを追加します。
パッキング実行
一連のcmake . && cmake --build . && cmake --build . --target package
コマンドcmake . && cmake --build . && cmake --build . --target package
cmake . && cmake --build . && cmake --build . --target package
cmake . && cmake --build . && cmake --build . --target package
起動され、選択したジェネレーターを実行してバイナリパッケージとcmake . && cmake --build . && cmake --build . --target package_source
コマンドが作成されますcmake . && cmake --build . && cmake --build . --target package_source
cmake . && cmake --build . && cmake --build . --target package_source
cmake . && cmake --build . && cmake --build . --target package_source
は、ルートディレクトリにソースパッケージを生成します。
完了
この時点で、完全なCMakeチュートリアルシリーズは終了しました。 プログラミングスキルの向上だけでなく、多くの有用な資料を学習していただけたことを願っています。 頑張って