CMake: Projekt-Struktur mit unit-tests
Ich versuche, Struktur mein Projekt umfasst die Produktion Quellen (in src
Unterordner) und tests (in test
Unterordner). Ich bin mit CMake zu bauen. Als minimal-Beispiel habe ich die folgenden 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, ist eigentlich egal,
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:
- Macht dieser Aufbau Sinn? Was sind die besten Praktiken bei der Strukturierung dieser code? (Ich komme von C# und java, und da ist es leichter, in einem gewissen Sinn)
- Ich weiß nicht, wie die Tatsache, dass ich die Liste aller Dateien von der
src
Ordner in dertest/CMakeLists.txt
- Datei. Wenn dies war ein Bibliothek-Projekt, ich würde einfach ein link in die Bibliothek. Gibt es eine Möglichkeit zu vermeiden, mit der Auflistung aller cpp-Dateien aus dem anderen Projekt? - Was sind die Linien
enable_testing()
undadd_test(MyTest test)
tun? Ich habe nicht gesehen, keine Wirkung. Wie kann ich die tests von CMake (oder CTest)? - So weit ich lief einfach
cmake .
im root-Ordner, aber dadurch entstand ein Durcheinander mit temporären Dateien überall. Wie bekomme ich die Zusammenstellung der Ergebnisse in einer vernünftigen Struktur?
InformationsquelleAutor der Frage Grzenio | 2013-01-21
Du musst angemeldet sein, um einen Kommentar abzugeben.
Fragen 1 & 2, ich würde empfehlen, machen eine Bibliothek aus Ihrem nicht-test-Dateien ohne main.cpp (in diesem Fall nur src/sqr.cpp und src/sqr.h), und dann können Sie vermeiden (und vor allem re-kompilieren) alle Quellen zweimal.
Zur Frage 3 diese Befehle fügen Sie einen test namens "MyTest", die unter Berufung auf die ausführbare Datei "test" ohne weitere Argumente. Jedoch, da Sie Hinzugefügt haben, die folgenden Befehle an test/CMakeLists.txt und nicht Ihr top-Niveau CMakeLists.txt Sie können nur auf das testen von im "test" Unterverzeichnis Ihrer build-tree (versuchen
cd test && ctest -N
). Wenn Sie möchten, dass der test ausführbar von Ihrer top-level-build-Verzeichnis, müssten Sie nennenadd_test
aus der top-Ebene CMakeLists.txt. Dies bedeutet auch, Sie haben die Verwendung der ausführlicheren form deradd_test
seit Ihrem test exe ist nicht definiert in der gleichen CMakeLists.txtIn Ihrem Fall, da Sie ausführen, cmake in den root-Ordner, Ihre Bau-Baum und den Quell-Baum sind ein und dasselbe. Dies ist bekannt als eine Quelle bauen, und ist nicht ideal, und das führt zur Frage 4.
Die bevorzugte Methode für die Generierung der build-tree ist eine out-of-source build, d.h. erstellen Sie ein Verzeichnis irgendwo außerhalb von deinem source-tree und ausführen cmake von dort. Auch die Schaffung eines "build" - Verzeichnis in die root Ihres Projekt und Ausführung
cmake ..
wäre eine saubere Struktur, die nicht stören, mit deinen source-tree.Einen letzten Punkt ist zu vermeiden, dass aufrufen von ausführbaren Dateien "test" (case-sensitive). Für Gründe, warum, siehe diese Antwort.
Zur Erreichung dieser Veränderungen, würde ich Folgendes tun:
CMakeLists.txt:
src/CMakeLists.txt:
test/CMakeLists.txt:
InformationsquelleAutor der Antwort Fraser
Ich mag das Beispiel von @Fraser aber würde die add_test Befehl in der test/CMakeLists.txt und verwenden enable_testing vor add_subdirectory(test).
Diese Weise können Sie führen Sie Ihre tests aus der top-level-build-Verzeichnis unter Angabe Ihres tests in der test/CMakeLists.txt.
Das Ergebnis würde dann so Aussehen (ich wiederverwendet das Beispiel von @Fraser):
CMakeLists.txt
src/CMakeLists.txt
test/CMakeLists.txt
InformationsquelleAutor der Antwort Mathias