173

プロダクションソース(srcサブフォルダー内)とテスト(サブフォルダー内)を含めるようにプロジェクトを構成しようとしていtestます。私はこれを構築するためにCMakeを使用しています。最小限の例として、次のファイルがあります。

CMakeLists.txt:

cmake_minimum_required (VERSION 2.8) 
project (TEST) 

add_subdirectory (src) 
add_subdirectory (test) 

src / CMakeLists.txt:

add_executable (demo main.cpp sqr.cpp) 

src / sqr.h

#ifndef SQR_H
#define SQR_H
double sqr(double);    
#endif // SQR_H

src / sqr.cpp

#include "sqr.h"
double sqr(double x) { return x*x; }

src / main.cpp-sqrを使用しますが、実際には関係ありません

test / CMakeLists.txt:

find_package(Boost COMPONENTS system filesystem unit_test_framework REQUIRED)

include_directories (${TEST_SOURCE_DIR}/src) 

ADD_DEFINITIONS(-DBOOST_TEST_DYN_LINK) 

add_executable (test test.cpp ${TEST_SOURCE_DIR}/src/sqr.cpp) 

target_link_libraries(test
                      ${Boost_FILESYSTEM_LIBRARY}
                      ${Boost_SYSTEM_LIBRARY}
                      ${Boost_UNIT_TEST_FRAMEWORK_LIBRARY}
                      )

enable_testing()
add_test(MyTest test)

test / test.cpp:

#define BOOST_TEST_MODULE SqrTests
#include <boost/test/unit_test.hpp>

#include "sqr.h"

BOOST_AUTO_TEST_CASE(FailTest)
{
    BOOST_CHECK_EQUAL(5, sqr(2));
}

BOOST_AUTO_TEST_CASE(PassTest)
{
    BOOST_CHECK_EQUAL(4, sqr(2));
}

いくつかの質問:

  1. この構造は意味がありますか?このコードを構造化する際のベストプラクティスは何ですか?(私はC#とJavaから来ていますが、ある意味で簡単です)
  2. srcファイル内のフォルダからすべてのファイルを一覧表示する必要があるという事実は好きではありませんtest/CMakeLists.txt。これが図書館プロジェクトの場合は、図書館をリンクするだけです。他のプロジェクトのすべてのcppファイルを一覧表示しないようにする方法はありますか?
  3. enable_testing()とは何add_test(MyTest test)ですか?効果は見られません。CMake(またはCTest)からテストを実行するにはどうすればよいですか?
  4. これまでのところcmake .、ルートフォルダーで実行しましたが、これにより、あらゆる場所に一時ファイルが混乱しました。合理的な構造でコンパイル結果を取得するにはどうすればよいですか?
4

2 に答える 2

151

質問1と2については、main.cpp(この場合はsrc/sqr.cppとsrc/sqr.hのみ)を除く非テストファイルからライブラリを作成することをお勧めします。そうすれば、リストを回避できます(さらに重要なのはすべてのソースを2回再コンパイルします。

質問3の場合、これらのコマンドは、引数なしで実行可能ファイル「test」を呼び出す「MyTest」と呼ばれるテストを追加します。ただし、これらのコマンドをtest / CMakeLists.txtに追加し、トップレベルのCMakeLists.txtには追加していないため、ビルドツリーの「test」サブディレクトリ内からのみテストを呼び出すことができます(try cd test && ctest -N)。トップレベルのビルドディレクトリからテストを実行できるようにする場合はadd_test、トップレベルのCMakeLists.txtから呼び出す必要があります。add_testこれは、テストexeが同じCMakeLists.txtで定義されていないため、より詳細な形式を使用する必要があることも意味します。

あなたの場合、ルートフォルダでcmakeを実行しているので、ビルドツリーとソースツリーは同じです。これはインソースビルドとして知られており、理想的ではないため、質問4が発生します。

ビルドツリーを生成するための推奨される方法は、ソース外のビルドを実行することです。つまり、ソースツリーの外部にディレクトリを作成し、そこからcmakeを実行します。プロジェクトのルートに「ビルド」ディレクトリを作成して実行するcmake ..だけでも、ソースツリーに干渉しないクリーンな構造が提供されます。

最後のポイントの1つは、実行可能ファイルを「テスト」(大文字と小文字を区別)と呼ばないようにすることです。理由については、この回答を参照してください。

これらの変更を実現するために、私は次のことを行います。

CMakeLists.txt:

cmake_minimum_required (VERSION 2.8)
project (TEST)
add_subdirectory (src) 
add_subdirectory (test)
enable_testing ()
add_test (NAME MyTest COMMAND Test)


src / CMakeLists.txt:

add_library (Sqr sqr.cpp sqr.h)
add_executable (demo main.cpp)
target_link_libraries (demo Sqr)


test / CMakeLists.txt:

find_package (Boost COMPONENTS system filesystem unit_test_framework REQUIRED)
include_directories (${TEST_SOURCE_DIR}/src
                     ${Boost_INCLUDE_DIRS}
                     )
add_definitions (-DBOOST_TEST_DYN_LINK)
add_executable (Test test.cpp)
target_link_libraries (Test
                       Sqr
                       ${Boost_FILESYSTEM_LIBRARY}
                       ${Boost_SYSTEM_LIBRARY}
                       ${Boost_UNIT_TEST_FRAMEWORK_LIBRARY}
                       )
于 2013-01-21T21:42:48.433 に答える
61

@Fraserの例が好きですが、test / CMakeLists.txtでadd_testコマンドを使用し、add_subdirectory(test)の前にenable_testingを使用します。

このようにして、test / CMakeLists.txtでテストを指定しながら、最上位のビルドディレクトリからテストを実行できます。

結果は次のようになります(@Fraserの例を再利用しました):

CMakeLists.txt

cmake_minimum_required (VERSION 2.8)
project (TEST)
add_subdirectory (src)

enable_testing ()
add_subdirectory (test)

src / CMakeLists.txt

add_library (Sqr sqr.cpp sqr.h)
add_executable (demo main.cpp)
target_link_libraries (demo Sqr)

test / CMakeLists.txt

find_package (Boost COMPONENTS system filesystem unit_test_framework REQUIRED)
include_directories (${TEST_SOURCE_DIR}/src
                     ${Boost_INCLUDE_DIRS}
                     )
add_definitions (-DBOOST_TEST_DYN_LINK)
add_executable (Test test.cpp)
target_link_libraries (Test
                       Sqr
                       ${Boost_FILESYSTEM_LIBRARY}
                       ${Boost_SYSTEM_LIBRARY}
                       ${Boost_UNIT_TEST_FRAMEWORK_LIBRARY}
                       )
add_test (NAME MyTest COMMAND Test)
于 2016-05-09T02:45:16.537 に答える