summaryrefslogtreecommitdiffstats
path: root/WebKitTools/CodeCoverage/run-generate-coverage-data
diff options
context:
space:
mode:
Diffstat (limited to 'WebKitTools/CodeCoverage/run-generate-coverage-data')
-rw-r--r--WebKitTools/CodeCoverage/run-generate-coverage-data240
1 files changed, 0 insertions, 240 deletions
diff --git a/WebKitTools/CodeCoverage/run-generate-coverage-data b/WebKitTools/CodeCoverage/run-generate-coverage-data
deleted file mode 100644
index a87da1d..0000000
--- a/WebKitTools/CodeCoverage/run-generate-coverage-data
+++ /dev/null
@@ -1,240 +0,0 @@
-#!/usr/bin/env python
-
-# Copyright (C) 2004, 2005, 2006 Nathaniel Smith
-# Copyright (C) 2007 Holger Hans Peter Freyther
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions
-# are met:
-#
-# 1. Redistributions of source code must retain the above copyright
-# notice, this list of conditions and the following disclaimer.
-# 2. Redistributions in binary form must reproduce the above copyright
-# notice, this list of conditions and the following disclaimer in the
-# documentation and/or other materials provided with the distribution.
-# 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of
-# its contributors may be used to endorse or promote products derived
-# from this software without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
-# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-# DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
-# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
-# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
-# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-import os, sys
-
-# from BitBake
-def mkdirhier(dir):
- """Create a directory like 'mkdir -p', but does not complain if
- directory already exists like os.makedirs
- """
- try:
- os.makedirs(dir)
- except OSError, e:
- if e.errno != 17: raise e
-
-def collect_base(src,match_array):
- """
- Collect all files that match the match_array.
- """
-
- sources = []
- for root, dirs, files in os.walk(src):
- if ".svn" in root:
- continue
-
- for file in files:
- base,ext = os.path.splitext(file)
- if ext in match_array:
- sources.append( os.path.join(root, file) )
-
- return sources
-
-def collect_depends(src):
- return collect_base(src, [".d"])
-
-def parse_dependency_file(src, base_dir, black_list):
- """
- Parse the .d files of the gcc
-
- Wow, the first time os.path.join is doing the right thing. We might
- have a relative path in the depends using os.path.join(dirname of .d, dep)
- we will end up in
- """
- file = open(src)
- file = file.read()
- file = file.replace('\\', '').replace('\n', '')
-
- # We now have object: dependencies splitted
- ar = file.split(':', 1)
- obj = ar[0].strip()
- dir = os.path.dirname(obj)
- deps = ar[1].split(' ')
-
- # Remove files outside WebKit, make path absolute
- deps = filter(lambda x: base_dir in x, deps)
- deps = map(lambda x: os.path.abspath(os.path.join(dir, x)), deps)
- return (obj, dir, deps)
-
-def collect_cov(base_path,targets):
- """
- Collect gcov files, collect_sources is not used as it also creates
- dirs and needs to do substituting.
- Actually we will build a mapping from source file to gcov files of
- interest. This is because we could have bytestream.h in many different
- subdirectories. And we would endup with bla.cpp##bytestream.h and we
- do not know which bytestream file was tested
- """
- def find_source_file(root,cov_file):
- """ Find a Source line or crash
-
- '#Users#ich#projekte#src#threadmessage.cpp###space#dports#include#qt3#qstring.h.gcov'
- '#Users#ich#projekte#src#threadmessage.cpp##..#^#src#threadmessage.cpp.gcov'
-
- ### is absolute path
- ##..#^# is relative path... well a gcov bug as well
- ## normal split file in the same directory
- """
- if '###' in cov_file:
- split = cov_file.split('###')
- if not len(split) == 2:
- raise "Unexpected split result"
- filepath = split[1][:-5].replace('#',os.path.sep)
- return os.path.join(os.path.sep,filepath)
- elif '##..#^#' in cov_file:
- split = cov_file.split('##..#^#')
- if not len(split) == 2:
- raise "Unexpected split result"
- filepath = split[1][:-5].replace('#',os.path.sep)
- return os.path.abspath(os.path.join(root,os.path.pardir,os.path.pardir,filepath))
- elif '##' in cov_file:
- split = cov_file.split('##')
- if not len(split) == 2:
- raise "Unexpected split result"
- filepath = split[1][:-5].replace('#',os.path.sep)
- return os.path.abspath(os.path.join(root,filepath))
- elif '#' in cov_file:
- # wow a not broken gcov on OSX
- basename=os.path.basename(cov_file).replace('#',os.path.sep)[:-5]
- return os.path.abspath(os.path.join(root,basename))
-
- else:
- raise "No source found %s" % cov_file
-
- def sanitize_path(path):
- """
- Well fix up paths once again /usr/lib/gcc/i486-linux-gnu/4.1.2/^/^/^/^/include/c++/4.1.2/bits/stl_pair.h
- according to gcov '^' is a relative path, we will now build one from this one. Somehow it depends
- on the gcov version if .. really gets replaced to ^....
- """
- import os
- split = path.split(os.path.sep)
- str = ""
- for part in split:
- if part == '':
- str = os.path.sep
- elif part == '^':
- str = "%s..%s" % (str,os.path.sep)
- else:
- str = "%s%s%s" % (str,part,os.path.sep)
- return os.path.abspath(str)
-
-
- gcov = {}
- for root, dirs, files in os.walk(base_path):
- if ".svn" in root:
- continue
- for file in files:
- base,ext = os.path.splitext(file)
- if ext in [".gcov"]:
- try:
- cov = os.path.join(root, file)
- src = find_source_file( root, cov )
- src = sanitize_path( src )
-
- if not src in gcov:
- gcov[src] = []
- gcov[src].append( cov )
- except Exception,e:
- print "Exception on ", e
- #import sys
- #sys.exit(0)
- pass
-
- #print gcov
- return gcov
-
-def generate_covs(candidates):
- """
- Generate gcov files in the right directory
-
- candidtaes contains the directories we have used when
- building. Each directory contains a set of files we will
- try to generate gcov files for.
- """
- print candidates.keys()
- for dir in candidates.keys():
- print "Trying in %s" % (dir)
- for dep in candidates[dir].keys():
- cmd = "cd %s; gcov -p -l %s" % (dir, dep)
- os.system("%s > /dev/null 2>&1 " % cmd)
-
-
-def analyze_coverage(sources,data,dirs,runid,base):
- """
- sources actual source files relative to src_dir e.g kdelibs/kdecore/klibloader.cpp
- data Where to put the stuff
- dirs Where to take a look for gcov files
- base The base directory for files. All files not inside base will be ignored
- """
- import cov
- print base
- gcov = collect_cov(base,dirs)
- result = cov.analyze_coverage(gcov, sources, runid, data, base)
- print result
-
-if __name__ == "__main__":
- #global targets
- if not len(sys.argv) == 3:
- print "This script needs three parameters"
- print "Call it with generate_cov RUNID ResultsDir"
- sys.exit(-1)
- runid = sys.argv[1]
- results = sys.argv[2]
-
- # create directories for out result
- mkdirhier(results)
-
- print "Collection Sources and preparing data tree"
- base_dir = os.path.abspath(os.path.curdir)
- depends = collect_depends(base_dir)
- candidates = map(lambda x: parse_dependency_file(x,base_dir,[]), depends)
-
- # Build a number of sources from the candidates. This is a Set for the poor
- # Two level dict. One for
- dirs = {}
- files = {}
- for (_,dir,deps) in candidates:
- if not dir in dirs:
- dirs[dir] = {}
- for dep in deps:
- if not dep in dirs[dir]:
- dirs[dir][dep] = dep
- if not dep in files:
- files[dep] = dep
-
- sources = files.keys()
-
- print "Found %d candidates" % (len(sources))
- print "Will run inefficient generation of gcov files now"
- generate_covs(dirs)
-
- print "Analyzing Gcov"
- analyze_coverage(sources, results, dirs.keys(), runid, base_dir)
- print "Done"