CMake: Projektstruktur mit Unit-Tests

Ich versuche mein Projekt so zu strukturieren, dass die Produktionsquellen (insrc Unterordner) und Tests (intest Unterordner). Ich benutze CMake, um dies zu erstellen. Als minimales Beispiel habe ich folgende Dateien:

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 - verwendet sqr, spielt keine Rolle

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));
}

Ein paar Fragen:

Ist diese Struktur sinnvoll? Was sind die Best Practices beim Strukturieren dieses Codes? (Ich komme aus C # und Java, und dort ist es in gewissem Sinne einfacher)Mir gefällt die Tatsache nicht, dass ich alle Dateien aus der Liste auflisten musssrc Ordner in dertest/CMakeLists.txt Datei. Wenn dies ein Bibliotheksprojekt wäre, würde ich nur die Bibliothek verlinken. Gibt es eine Möglichkeit zu vermeiden, alle CPP-Dateien aus dem anderen Projekt aufzulisten?Was sind die Zeilenenable_testing() undadd_test(MyTest test) tun? Ich habe keine Wirkung gesehen. Wie kann ich die Tests von CMake (oder CTest) ausführen?Bisher bin ich nur geranntcmake . im Stammordner, aber dies führte überall zu einem Durcheinander mit temporären Dateien. Wie kann ich die Zusammenstellungsergebnisse in einer vernünftigen Struktur erhalten?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage