2009-09-28 11:43:28 -04:00
|
|
|
/*============================================================================
|
|
|
|
CMake - Cross Platform Makefile Generator
|
|
|
|
Copyright 2000-2009 Kitware, Inc.
|
2004-09-09 08:41:05 -04:00
|
|
|
|
2009-09-28 11:43:28 -04:00
|
|
|
Distributed under the OSI-approved BSD License (the "License");
|
|
|
|
see accompanying file Copyright.txt for details.
|
2004-09-09 08:41:05 -04:00
|
|
|
|
2009-09-28 11:43:28 -04:00
|
|
|
This software is distributed WITHOUT ANY WARRANTY; without even the
|
|
|
|
implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
|
|
See the License for more information.
|
|
|
|
============================================================================*/
|
2004-09-09 08:41:05 -04:00
|
|
|
|
|
|
|
#ifndef cmCTestCoverageHandler_h
|
|
|
|
#define cmCTestCoverageHandler_h
|
|
|
|
|
|
|
|
|
2005-01-27 11:43:22 -05:00
|
|
|
#include "cmCTestGenericHandler.h"
|
2004-09-09 08:41:05 -04:00
|
|
|
#include "cmListFileCache.h"
|
|
|
|
|
2005-07-14 13:25:40 -04:00
|
|
|
#include <cmsys/RegularExpression.hxx>
|
|
|
|
|
2005-01-27 10:15:01 -05:00
|
|
|
class cmGeneratedFileStream;
|
2010-05-25 09:23:25 -04:00
|
|
|
class cmCTestCoverageHandlerContainer
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
int Error;
|
|
|
|
std::string SourceDir;
|
|
|
|
std::string BinaryDir;
|
|
|
|
typedef std::vector<int> SingleFileCoverageVector;
|
|
|
|
typedef std::map<std::string, SingleFileCoverageVector> TotalCoverageMap;
|
|
|
|
TotalCoverageMap TotalCoverage;
|
|
|
|
std::ostream* OFS;
|
|
|
|
};
|
2004-09-09 08:41:05 -04:00
|
|
|
/** \class cmCTestCoverageHandler
|
|
|
|
* \brief A class that handles coverage computaiton for ctest
|
|
|
|
*
|
|
|
|
*/
|
2005-01-27 11:43:22 -05:00
|
|
|
class cmCTestCoverageHandler : public cmCTestGenericHandler
|
2004-09-09 08:41:05 -04:00
|
|
|
{
|
|
|
|
public:
|
2005-06-17 13:04:56 -04:00
|
|
|
cmTypeMacro(cmCTestCoverageHandler, cmCTestGenericHandler);
|
2004-09-09 08:41:05 -04:00
|
|
|
|
|
|
|
/*
|
|
|
|
* The main entry point for this class
|
|
|
|
*/
|
2005-01-27 15:54:47 -05:00
|
|
|
int ProcessHandler();
|
2006-03-09 11:17:10 -05:00
|
|
|
|
2004-09-09 08:41:05 -04:00
|
|
|
cmCTestCoverageHandler();
|
2006-03-09 11:17:10 -05:00
|
|
|
|
2005-06-17 13:04:56 -04:00
|
|
|
virtual void Initialize();
|
|
|
|
|
2005-07-14 13:25:40 -04:00
|
|
|
/**
|
|
|
|
* This method is called when reading CTest custom file
|
|
|
|
*/
|
|
|
|
void PopulateCustomVectors(cmMakefile *mf);
|
2006-03-09 11:17:10 -05:00
|
|
|
|
2009-03-02 15:33:18 -05:00
|
|
|
/** Report coverage only for sources with these labels. */
|
|
|
|
void SetLabelFilter(std::set<cmStdString> const& labels);
|
|
|
|
|
2004-09-09 08:41:05 -04:00
|
|
|
private:
|
2004-10-17 19:45:36 -04:00
|
|
|
bool ShouldIDoCoverage(const char* file, const char* srcDir,
|
2005-05-31 17:32:40 -04:00
|
|
|
const char* binDir);
|
2009-03-11 12:03:47 -04:00
|
|
|
void CleanCoverageLogFiles(std::ostream& log);
|
2005-06-23 13:04:18 -04:00
|
|
|
bool StartCoverageLogFile(cmGeneratedFileStream& ostr, int logFileCount);
|
|
|
|
void EndCoverageLogFile(cmGeneratedFileStream& ostr, int logFileCount);
|
2004-09-09 08:41:05 -04:00
|
|
|
|
2007-04-27 09:01:22 -04:00
|
|
|
//! Handle coverage using GCC's GCov
|
2007-04-26 23:20:12 -04:00
|
|
|
int HandleGCovCoverage(cmCTestCoverageHandlerContainer* cont);
|
2009-03-09 12:19:56 -04:00
|
|
|
void FindGCovFiles(std::vector<std::string>& files);
|
2007-04-27 09:01:22 -04:00
|
|
|
|
2010-05-25 09:23:25 -04:00
|
|
|
//! Handle coverage using xdebug php coverage
|
|
|
|
int HandlePHPCoverage(cmCTestCoverageHandlerContainer* cont);
|
|
|
|
|
2007-06-01 15:40:07 -04:00
|
|
|
//! Handle coverage using Bullseye
|
|
|
|
int HandleBullseyeCoverage(cmCTestCoverageHandlerContainer* cont);
|
|
|
|
int RunBullseyeSourceSummary(cmCTestCoverageHandlerContainer* cont);
|
|
|
|
int RunBullseyeCoverageBranch(cmCTestCoverageHandlerContainer* cont,
|
2007-06-08 12:29:40 -04:00
|
|
|
std::set<cmStdString>& coveredFileNames,
|
2007-06-01 15:40:07 -04:00
|
|
|
std::vector<std::string>& files,
|
|
|
|
std::vector<std::string>& filesFullPath);
|
2010-04-23 09:16:18 -04:00
|
|
|
|
2007-06-01 15:40:07 -04:00
|
|
|
int RunBullseyeCommand(
|
|
|
|
cmCTestCoverageHandlerContainer* cont,
|
|
|
|
const char* cmd,
|
|
|
|
const char* arg,
|
|
|
|
std::string& outputFile);
|
|
|
|
bool ParseBullsEyeCovsrcLine(
|
|
|
|
std::string const& inputLine,
|
|
|
|
std::string& sourceFile,
|
|
|
|
int& functionsCalled,
|
|
|
|
int& totalFunctions,
|
|
|
|
int& percentFunction,
|
|
|
|
int& branchCovered,
|
|
|
|
int& totalBranches,
|
|
|
|
int& percentBranch);
|
|
|
|
bool GetNextInt(std::string const& inputLine,
|
|
|
|
std::string::size_type& pos,
|
|
|
|
int& value);
|
2007-04-27 09:01:22 -04:00
|
|
|
//! Handle Python coverage using Python's Trace.py
|
2007-04-26 23:20:12 -04:00
|
|
|
int HandleTracePyCoverage(cmCTestCoverageHandlerContainer* cont);
|
|
|
|
|
2007-04-27 09:01:22 -04:00
|
|
|
// Find the source file based on the source and build tree. This is used for
|
|
|
|
// Trace.py mode, since that one does not tell us where the source file is.
|
2007-04-26 23:20:12 -04:00
|
|
|
std::string FindFile(cmCTestCoverageHandlerContainer* cont,
|
|
|
|
std::string fileName);
|
|
|
|
|
2010-04-23 09:16:18 -04:00
|
|
|
std::set<std::string> FindUncoveredFiles(
|
|
|
|
cmCTestCoverageHandlerContainer* cont);
|
2006-03-10 15:03:09 -05:00
|
|
|
std::vector<cmStdString> CustomCoverageExclude;
|
|
|
|
std::vector<cmsys::RegularExpression> CustomCoverageExcludeRegex;
|
2010-04-23 09:16:18 -04:00
|
|
|
std::vector<cmStdString> ExtraCoverageGlobs;
|
2005-07-14 13:25:40 -04:00
|
|
|
|
2009-02-13 15:17:06 -05:00
|
|
|
|
|
|
|
// Map from source file to label ids.
|
|
|
|
class LabelSet: public std::set<int> {};
|
|
|
|
typedef std::map<cmStdString, LabelSet> LabelMapType;
|
|
|
|
LabelMapType SourceLabels;
|
2009-03-09 12:19:56 -04:00
|
|
|
LabelMapType TargetDirs;
|
2009-02-13 15:17:06 -05:00
|
|
|
|
|
|
|
// Map from label name to label id.
|
|
|
|
typedef std::map<cmStdString, int> LabelIdMapType;
|
|
|
|
LabelIdMapType LabelIdMap;
|
|
|
|
std::vector<std::string> Labels;
|
|
|
|
int GetLabelId(std::string const& label);
|
|
|
|
|
2009-03-09 12:19:27 -04:00
|
|
|
// Label reading and writing methods.
|
2009-02-13 15:17:06 -05:00
|
|
|
void LoadLabels();
|
2009-03-09 12:19:27 -04:00
|
|
|
void LoadLabels(const char* dir);
|
2009-02-13 15:17:06 -05:00
|
|
|
void WriteXMLLabels(std::ofstream& os, std::string const& source);
|
2009-03-02 15:33:18 -05:00
|
|
|
|
|
|
|
// Label-based filtering.
|
|
|
|
std::set<int> LabelFilter;
|
2009-03-09 12:19:56 -04:00
|
|
|
bool IntersectsFilter(LabelSet const& labels);
|
2009-03-02 15:33:18 -05:00
|
|
|
bool IsFilteredOut(std::string const& source);
|
2004-09-09 08:41:05 -04:00
|
|
|
};
|
|
|
|
|
|
|
|
#endif
|