⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 run-generate-coverage-data

📁 linux下开源浏览器WebKit的源码,市面上的很多商用浏览器都是移植自WebKit
💻
字号:
#!/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 BitBakedef 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 edef 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 sourcesdef 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 gcovdef 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 resultif __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"

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -