2012-08-13 12 views
6

Ich verwende Waf, um ein C-Projekt zu erstellen, und gcov, um einige Testcodeabdeckung zu haben. Allerdings ruft Waf gcc in einer Weise, die foo.c.1.o von Quelldatei foo.c die gcov verwirrt bei der Suche nach den erzeugten Dateien erzeugt:Wie verhindert man, dass Waf Objektdateien umbenennt?

$ gcov foo.c 
$ foo.gcno:cannot open graph file 

Glücklicherweise gcov hat die -o Option, mit dem es möglich ist, die entsprechende Objektdatei angeben . Dies ist jedoch nicht bequem und die Ausführung lcov schlägt immer noch fehl. Daher sind meine Fragen:

  1. Warum benennt Waf die Objektdateien?
  2. Wie kann dieses Verhalten deaktiviert werden oder ...
  3. Wie kann gcov/lcov dieses Problem umgehen?

Antwort

6

Sie gcovr verwenden können, anstatt direkt ausgeführt gcov versucht zu ändern.

gcovr verlässt sich nicht auf Dateinamenszauber, sondern analysiert die Coverage-Dateien gcov.
Es ruft dann gcov mit den entsprechenden Parametern auf.
Dies funktioniert hervorragend mit Wafs Objektdateiumbenennung.

Sie können build Unterverzeichnis gcovr von Waf Lauf:

cd build 
gcovr --root=$(pwd) --keep 
lcov --capture --directory $(pwd) --base-directory $(pwd) --output-file coverage.info 
genhtml coverage.info --output-directory out 

Die --root Option entfernt das aktuelle Verzeichnis Präfix
Die --keep Option gcov ‚s temporäre Dateien hält, verwendet von lcov/genhtml.

Sie können auch die gcovr--xml Option verwenden, um Cobertura-kompatible XML-Ausgabe zu produzieren.
Es kann dann von verschiedenen Formatierer (ich verwende es mit Jenkins 'Cobertura Plugin)

+0

Das war wirklich schwierig zu arbeiten trotz der klaren Antwort. Anscheinend gibt es einen Fehler in der Hauptversion von gcovr, der bewirkt, dass jedes Zeichen des Arguments --root als separater Pfad in einer Liste gelesen wird. Da $ (pwd) mit '/' beginnt, beginnt es mit der Suche im gesamten Dateisystem nach .gcno-Dateien und hängt. Ich habe die Zeile 1828 geändert, wo get_datafiles aufgerufen wird, um stattdessen "[options.root]" zu übergeben und es zum Laufen zu bringen. – flodin

+0

@flodin Der Fehler "[options.root]" wurde in gcovr 3.2 behoben. –

0

Haben Sie Waf Konfiguration mit so etwas wie

bld.program(
    obj_ext = '.o', 
    source = 'test.c', 
    target = 'test1') 
+3

Wie auch immer, von Waf's F.A.Q: 'Q: warum kompiliert foo.cpp zu foo.cpp. .o wo ist eine Nummer? A: Sonst könnten dieselben Dateien in verschiedenen Kontexten kompiliert und überschrieben werden. – Eregrith

+0

Leider hilft das Hinzufügen von 'obj_ext' nicht. Aber danke, dass Sie mich auf die unbefriedigende Erklärung aus der FAQ hingewiesen haben (ich frage mich, warum sie diese wichtige Information nicht in das Waf-Buch aufgenommen haben). – matthias