【保存版】CMake: CTest でテストを成功させるための変数設定ガイド - CTest_SOURCE_DIRECTORY を制する


CTEST_SOURCE_DIRECTORY の主な役割は以下のとおりです。

  • テスト結果の報告書やダッシュボードに表示されるソースコードのパスを設定します。
  • Ctestがテスト対象のソースコードを検索する場所を指定します。

CTEST_SOURCE_DIRECTORY の設定方法は以下のとおりです。

  • ctest(1) ダッシュボードクライアントスクリプト内で設定する
set(CTEST_SOURCE_DIRECTORY "/path/to/source/directory")
  • cmakeコマンドラインオプションで設定する
cmake -DCTEST_SOURCE_DIRECTORY="/path/to/source/directory" .

CTEST_SOURCE_DIRECTORY を設定しないと、Ctestは現在のワーキングディレクトリをソースディレクトリと仮定します。これは通常望ましい動作ではありません。 ソースディレクトリを明示的に設定することで、テスト対象のソースコードが確実に検出され、正しいパスで報告されるようにすることができます。

CTEST_SOURCE_DIRECTORY の使用例

set(CTEST_SOURCE_DIRECTORY "/path/to/source/directory")

ctest_start(Experimental)

この例では、CTEST_SOURCE_DIRECTORY 変数を /path/to/source/directory に設定し、Ctestにテストを開始するように指示しています。 Ctestは /path/to/source/directory ディレクトリ内のテストをすべて検出して実行し、結果を報告します。

CTEST_SOURCE_DIRECTORY は、Ctestダッシュボードクライアントスクリプトを使用する場合は必須の変数です。 この変数を設定することで、テスト対象のソースコードが確実に検出され、正しいパスで報告されるようにすることができます。

以下のコード例は、CTEST_SOURCE_DIRECTORY 変数を使用して、テスト対象のソースディレクトリを指定する方法を示しています。

cmake_minimum_required(VERSION 3.1)

project(MyProject)

add_executable(MyTest test/MyTest.cpp)

set(CTEST_SOURCE_DIRECTORY "/path/to/source/directory")

ctest_start(Experimental)

このコード例では、以下の操作が行われます。

  1. CMake の最小バージョンを 3.1 に設定します。
  2. MyProject という名前のプロジェクトを作成します。
  3. MyTest.cpp ファイルから MyTest という名前の実行可能ファイルを作成します。
  4. CTEST_SOURCE_DIRECTORY 変数を /path/to/source/directory に設定します。
  5. Ctest にテストを開始するように指示します。

Ctest は /path/to/source/directory ディレクトリ内の MyTest テストを実行し、結果を報告します。



# CMakeLists.txt

cmake_minimum_required(VERSION 3.1)

project(MyProject)

add_executable(MyTest test/MyTest.cpp)

set(CTEST_SOURCE_DIRECTORY "${CMAKE_SOURCE_DIR}")

ctest_start(Experimental)

この CMakeLists.txt ファイルは、以下の操作を行います。

  1. CMake の最小バージョンを 3.1 に設定します。
  2. MyProject という名前のプロジェクトを作成します。
  3. test/MyTest.cpp ファイルから MyTest という名前の実行可能ファイルを作成します。
  4. CTEST_SOURCE_DIRECTORY 変数を CMAKE_SOURCE_DIR に設定します。 これにより、CTEST_SOURCE_DIRECTORY 変数がプロジェクトのソースディレクトリに設定されます。
  5. Ctest にテストを開始するように指示します。

このコードをビルドするには、次のコマンドを実行します。

cmake .
make
ctest

このコマンドは、以下の操作を行います。

  1. CMake を使用して、プロジェクトをビルドするための必要な Makefile を生成します。
  2. make コマンドを使用して、プロジェクトをビルドします。
  3. ctest コマンドを使用して、テストを実行します。

テストが成功すると、次の出力が表示されます。

100% tests passed

この出力は、すべてのテストが成功したことを示しています。

以下の MyTest.cpp ファイルは、上記の CMakeLists.txt ファイルで使用されるテストコードです。

// test/MyTest.cpp

#include <gtest/gtest.h>

TEST(MyTest, BasicTest) {
  EXPECT_EQ(1, 1);
}

このテストコードは、1 が 1 に等しいことを確認する基本的なテストです。

このコードをビルドしてテストするには、上記の指示に従ってください。

説明

以下は、このコード例で示されている重要なポイントです。

  • CTEST_SOURCE_DIRECTORY 変数を設定しないと、Ctest は現在のワーキングディレクトリをソースディレクトリと仮定します。
  • CTEST_SOURCE_DIRECTORY 変数は、cmake コマンドラインオプションで設定できます。
  • CTEST_SOURCE_DIRECTORY 変数は、ctest(1) ダッシュボードクライアントスクリプト内で設定できます。
  • CTEST_SOURCE_DIRECTORY 変数は、テスト対象のソースディレクトリを指定します。
  • CTEST_SOURCE_DIRECTORY 変数は、CMake の Ctest モジュールで使用される変数です。


CTEST_SOURCE_DIRECTORY の代替方法として、以下の方法があります。

  • CTEST_CMAKE_ARGS 変数を使用する
    CTEST_CMAKE_ARGS 変数は、Ctest コマンドラインに渡される引数を指定するために使用できます。この変数を使用して、-S オプションでソースディレクトリを指定することができます。
  • ソースコードの場所を推測する
    Ctest は、現在のワーキングディレクトリをソースディレクトリと仮定します。ソースコードが現在のワーキングディレクトリにある場合は、この方法で問題ありません。ただし、ソースコードが別の場所にある場合は、CTEST_SOURCE_DIRECTORY 変数を明示的に設定する必要があります。
set(CTEST_CMAKE_ARGS "-S /path/to/source/directory")
ctest_start(Experimental)
  • CTestモジュールの CMake_ARGS メソッドを使用する
    CTest モジュールの CMake_ARGS メソッドを使用して、Ctest コマンドラインに渡される引数を指定することができます。
ctest_configure()
ctest_target(MyTest)
ctest_memcheck(MyTest)

これらの代替方法は、状況に応じて使用できます。ただし、CTEST_SOURCE_DIRECTORY 変数を明示的に設定するのが最も一般的な方法です。

ソースコードの場所を推測する

利点

  • 設定が不要

欠点

  • ソースコードの場所が変更されると、テストが失敗する可能性がある
  • ソースコードが現在のワーキングディレクトリにある場合にのみ機能する

CTEST_CMAKE_ARGS 変数を使用する

利点

  • ソースコードの場所を明示的に指定できる

欠点

  • CTEST_CMAKE_ARGS 変数の設定が必要

CTestモジュールの CMake_ARGS メソッドを使用する

利点

  • Ctest の他の機能と組み合わせることができる
  • ソースコードの場所を明示的に指定できる

欠点

  • CTest モジュールの使用方法を理解する必要がある

CTEST_SOURCE_DIRECTORY 変数は、テスト対象のソースディレクトリを指定するための最も一般的な方法です。ただし、状況によっては、上記の代替方法を使用することもできます。