cmake でビルドされた C++ ライブラリがあります。ライブラリは、ビルドの一部として実行したい単体テストによってテストされます。ライブラリまたは単体テストのソースが変更されたときにテストを実行したい。
cmakeメーリングリストの過去の投稿でいくつかの助けを見つけました:
http://www.cmake.org/pipermail/cmake/2010-January/034419.html
単体テスト プログラムで add_custom_command() を使用するこのアプローチは、ライブラリが共有または静的である場合は Linux で機能し、ライブラリが静的である場合は Windows で機能します。問題は、Windows で共有されるライブラリを構築することです。その場合、テストは最初のビルドで実行されますが、ライブラリが変更されると実行されません。
この問題を示す例を次に示します。
CMakeLists.txt
cmake_minimum_required(VERSION 2.8)
project(xyz)
SET(BUILD_SHARED_LIBS ON)
#----------- build library
if(${BUILD_SHARED_LIBS})
add_definitions(-DXYZ_SHARED)
endif(${BUILD_SHARED_LIBS})
add_library(${PROJECT_NAME} xyz.cpp xyz.h)
#----------- build unit tests program
add_executable(${PROJECT_NAME}_unit_tests unit_tests.cpp)
target_link_libraries(${PROJECT_NAME}_unit_tests ${PROJECT_NAME})
#----------- run unit tests program after it is built
add_custom_command(TARGET ${PROJECT_NAME}_unit_tests
POST_BUILD COMMAND ${PROJECT_NAME}_unit_tests)
xyz.h
#pragma once
#ifdef XYZ_SHARED
#ifdef _WIN32
#ifdef xyz_EXPORTS
#define XYZ_EXPORT __declspec(dllexport)
#else
#define XYZ_EXPORT __declspec(dllimport)
#endif
#else //_WIN32
#define XYZ_EXPORT
#endif //_WIN32
#else //XYZ_SHARED
#define XYZ_EXPORT
#endif //XYZ_SHARED
XYZ_EXPORT bool xyz_return_true();
xyz.cpp
#include "xyz.h"
XYZ_EXPORT bool xyz_return_true()
{
return true;
}
unit_tests.cpp
#include <iostream>
#include "xyz.h"
int main(int argc, char *argv[])
{
using namespace std;
cout << "running unit tests: ";
if (xyz_return_true()) {
//no error
cout << "pass" << endl;
return 0;
}
//error
cout << "fail" << endl;
return 1;
}
Windows でビルドし、xyz.cpp の関数を変更して false を返し、再度ビルドすると、テストは実行されません。この場合、テストを実行するにはどうすればよいですか?
ビルド時に xyz_unit_tests.exe はインポート ライブラリ (xyz.lib) のみに依存するため、テストは実行されていないと思います。ライブラリ インターフェイスが変更されない場合、インポート ライブラリは変更されません。
Visual Studio 10 と cmake 2.8.11.2 を使用しています。