完全なCMakeガイド。 パート3:テストとパッケージング


はじめに


この記事では、さまざまなソフトウェア製品を開発するための柔軟で汎用性の高いユーティリティセットである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コマンドを使用して必要なファイルのインストールを記述CPackincludeコマンドで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チュートリアルシリーズは終了しました。 プログラミングスキルの向上だけでなく、多くの有用な資料を学習していただけたことを願っています。 頑張って



Source: https://habr.com/ru/post/J433822/


All Articles