2016-06-22 10 views
1

Ich bin mit Schwierigkeiten nach dieser Anleitung verwenden gcov über die Angelegenheit https://github.com/bilke/cmake-modules/blob/master/CodeCoverage.cmakeWie mit Cmake

First (dass ich auf einen anderen Posten empfohlen zu sehen):

Kopieren Sie diese Datei in Ihrem Cmake Module Pfad.

Woher weiß ich, was mein CMake-Modulpfad ist?

die Funktion SETUP_TARGET_FOR_COVERAGE Verwenden Sie eine benutzerdefinierte machen Ziel

Was bedeutet es genau zu schaffen? Wie mache ich das? Insbesondere was muss ich tippen und wo?

Ich bin gezwungen, die Anwendung mit cmake zu kompilieren, sonst würde ich es mit gcc tun.

+0

CMake Module Pfad ist '/ usr/share/cmake/Module' oder ähnlich. Sie können es aus der Liste der installierten Dateien mit cmake-Paket ableiten: Es gibt eine Menge '.cmake'-Module in diesem Verzeichnis. Wie bei anderen Fragen lesen Sie den Abschnitt "USAGE" in der Datei, auf die Sie sich beziehen. Kurz gesagt, ein Ziel, das mit 'SETUP_TARGET_FOR_COVERAGE' erstellt wurde, führt eine gewisse * Arbeitslast * aus und sammelt die Abdeckung, die von der ausführbaren Datei in diesem Verzeichnis erzeugt wird.Wenn Sie Ihre ausführbare Datei nur mit der gcov-Unterstützung kompilieren möchten, ist Schritt 3 (Compiler-Flags setzen) allein ausreichend. – Tsyvarev

Antwort

4

Sie setzen den Cmake Modulpfad durch set(CMAKE_MODULE_PATH <path>)

Die Cmake Modulpfad Einstellung teilt Cmake Aufruf wo für cmake Module wie die aussehen, die durch die include Makro enthalten sind.

Zum Beispiel sind die Schritte, die ich nahm CodeCoverage.cmake zu verwenden sind:

  1. Kopieren CodeCoverage.cmake in meinem Quellordner auf 'scripts/cmake'.
  2. Fügen Sie die folgenden meiner CMakeLists.txt:

    set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/scripts/cmake) 
    
    if (CMAKE_BUILD_TYPE STREQUAL "Coverage") 
        include(CodeCoverage) 
        setup_target_for_coverage(${PROJECT_NAME}_coverage ${TEST_TARGET} coverage) 
    
        SET(CMAKE_CXX_FLAGS "-g -O0 -fprofile-arcs -ftest-coverage") 
        SET(CMAKE_C_FLAGS "-g -O0 -fprofile-arcs -ftest-coverage") 
    endif() #CMAKE_BUILD_TYPE STREQUAL "Coverage" 
    
  3. Run cmake mit -DCMAKE_BUILD_TYPE=Coverage

  4. Run make

  5. Run make <coverage_target>

Beachten Sie, dass:

  • ${TEST_TARGET} eine Variable I mit dem Namen meines Unit-Tests Ziel gesetzt, die ich früher in dem Skript erstellen.
  • <coverage_target> ist eine beliebige Zeichenfolge, die von ${PROJECT_NAME}_coverage generiert wird.
  • Sie müssen nicht die Coverage-Erstellung mit der if wie ich habe wickeln.
  • Da ich AppleClang verwende, musste ich das CodeCoverage.cmake-Skript reparieren, um es zu ermöglichen. Die Art, wie es jetzt geschrieben ist, erlaubt nur gcc und clang 3.0.0 oder neuer.