| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293 | ## File      : utils.py# This file is part of RT-Thread RTOS# COPYRIGHT (C) 2006 - 2015, RT-Thread Development Team##  This program is free software; you can redistribute it and/or modify#  it under the terms of the GNU General Public License as published by#  the Free Software Foundation; either version 2 of the License, or#  (at your option) any later version.##  This program is distributed in the hope that it will be useful,#  but WITHOUT ANY WARRANTY; without even the implied warranty of#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the#  GNU General Public License for more details.##  You should have received a copy of the GNU General Public License along#  with this program; if not, write to the Free Software Foundation, Inc.,#  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.## Change Logs:# Date           Author       Notes# 2015-01-20     Bernard      Add copyright information#import sysimport osimport redef splitall(loc):    """    Return a list of the path components in loc. (Used by relpath_).    The first item in the list will be  either ``os.curdir``, ``os.pardir``, empty,    or the root directory of loc (for example, ``/`` or ``C:\\).    The other items in the list will be strings.    Adapted from *path.py* by Jason Orendorff.    """    parts = []    while loc != os.curdir and loc != os.pardir:        prev = loc        loc, child = os.path.split(prev)        if loc == prev:            break        parts.append(child)    parts.append(loc)    parts.reverse()    return partsdef _make_path_relative(origin, dest):    """    Return the relative path between origin and dest.    If it's not possible return dest.    If they are identical return ``os.curdir``    Adapted from `path.py <http://www.jorendorff.com/articles/python/path/>`_ by Jason Orendorff.    """    origin = os.path.abspath(origin).replace('\\', '/')    dest = os.path.abspath(dest).replace('\\', '/')    #    orig_list = splitall(os.path.normcase(origin))    # Don't normcase dest!  We want to preserve the case.    dest_list = splitall(dest)    #    if orig_list[0] != os.path.normcase(dest_list[0]):        # Can't get here from there.        return dest    #    # Find the location where the two paths start to differ.    i = 0    for start_seg, dest_seg in zip(orig_list, dest_list):        if start_seg != os.path.normcase(dest_seg):            break        i += 1    #    # Now i is the point where the two paths diverge.    # Need a certain number of "os.pardir"s to work up    # from the origin to the point of divergence.    segments = [os.pardir] * (len(orig_list) - i)    # Need to add the diverging part of dest_list.    segments += dest_list[i:]    if len(segments) == 0:        # If they happen to be identical, use os.curdir.        return os.curdir    else:        # return os.path.join(*segments).replace('\\', '/')        return os.path.join(*segments)def xml_indent(elem, level=0):    i = "\n" + level*"  "    if len(elem):        if not elem.text or not elem.text.strip():            elem.text = i + "  "        if not elem.tail or not elem.tail.strip():            elem.tail = i        for elem in elem:            xml_indent(elem, level+1)        if not elem.tail or not elem.tail.strip():            elem.tail = i    else:        if level and (not elem.tail or not elem.tail.strip()):            elem.tail = isource_ext = ["c", "h", "s", "S", "cpp", "xpm"]source_list = []def walk_children(child):    global source_list    global source_ext    # print child    full_path = child.rfile().abspath    file_type_list  = full_path.rsplit('.',1)    #print file_type    if (len(file_type_list) > 1):        file_type = full_path.rsplit('.',1)[1]        if file_type in source_ext:            if full_path not in source_list:                source_list.append(full_path)    children = child.all_children()    if children != []:        for item in children:            walk_children(item)def PrefixPath(prefix, path):    path = os.path.abspath(path)    prefix = os.path.abspath(prefix)    if sys.platform == 'win32':        prefix = prefix.lower()        path = path.lower()    if path.startswith(prefix):        return True        return Falsedef ListMap(l):    ret_list = []    for item in l:        if type(item) == type(()):            ret = ListMap(item)            ret_list += ret        elif type(item) == type([]):            ret = ListMap(item)            ret_list += ret        else:            ret_list.append(item)    return ret_listdef TargetGetList(env, postfix):    global source_ext    global source_list    target = env['target']    source_ext = postfix    for item in target:        walk_children(item)    source_list.sort()    return source_listdef ProjectInfo(env):    project  = env['project']    RTT_ROOT = env['RTT_ROOT']    BSP_ROOT = env['BSP_ROOT']    FILES       = []    DIRS        = []    HEADERS     = []    CPPPATH     = []    CPPDEFINES  = []    for group in project:        # get each files        if 'src' in group and group['src']:            FILES += group['src']        # get each include path        if 'CPPPATH' in group and group['CPPPATH']:            CPPPATH += group['CPPPATH']    if 'CPPDEFINES' in env:        CPPDEFINES = env['CPPDEFINES']        CPPDEFINES = ListMap(CPPDEFINES)    # process FILES and DIRS    if len(FILES):        # use absolute path         for i in range(len(FILES)):            FILES[i] = os.path.abspath(str(FILES[i]))            DIRS.append(os.path.dirname(FILES[i]))        FILES.sort()        DIRS = list(set(DIRS))        DIRS.sort()    # process HEADERS    HEADERS = TargetGetList(env, ['h'])    # process CPPPATH    if len(CPPPATH):        # use absolute path         for i in range(len(CPPPATH)):            CPPPATH[i] = os.path.abspath(CPPPATH[i])        # remove repeat path        paths = [i for i in set(CPPPATH)]        CPPPATH = []        for path in paths:            if PrefixPath(RTT_ROOT, path):                CPPPATH += [os.path.abspath(path).replace('\\', '/')]            elif PrefixPath(BSP_ROOT, path):                CPPPATH += [os.path.abspath(path).replace('\\', '/')]            else:                CPPPATH += ['"%s",' % path.replace('\\', '/')]        CPPPATH.sort()    # process CPPDEFINES    if len(CPPDEFINES):        CPPDEFINES = [i for i in set(CPPDEFINES)]        CPPDEFINES.sort()    proj = {}    proj['FILES']       = FILES    proj['DIRS']        = DIRS    proj['HEADERS']     = HEADERS    proj['CPPPATH']     = CPPPATH    proj['CPPDEFINES']  = CPPDEFINES    return projdef VersionCmp(ver1, ver2):    la=[]    if ver1:        la = re.split("[. ]", ver1)    lb = re.split("[. ]", ver2)    f = 0    if len(la) > len(lb):        f = len(la)    else:        f = len(lb)    for i in range(f):        try:            if int(la[i]) > int(lb[i]):                return 1            elif int(la[i]) == int(lb[i]):                continue            else:                return -1        except (IndexError, ValueError) as e:            if len(la) > len(lb):                return 1            else:                return -1    return 0def GCCC99Patch(cflags):    import building    gcc_version = building.GetDepend('GCC_VERSION_STR')    if gcc_version:        gcc_version = gcc_version.replace('"', '')    if VersionCmp(gcc_version, "4.8.0") == 1:        # remove -std=c99 after GCC 4.8.x        cflags = cflags.replace('-std=c99', '')    return cflagsdef ReloadModule(module):    import sys    if sys.version_info.major >= 3:        import importlib        importlib.reload(module)    else:        reload(module)    return
 |