# # 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 sys import os def 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 parts def _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 `_ 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 = i source_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 False def 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_list def 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_list def 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 proj def VersionCmp(ver1, ver2): la = ver1.split('.') lb = ver2.split('.') 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 as e: if len(la) > len(lb): return 1 else: return -1 return 0 def GCCC99Patch(cflags): import building gcc_version = building.GetDepend('GCC_VERSION') if gcc_version: gcc_version = gcc_version.replace('"', '') if VersionCmp(gcc_version, "4.8.0"): # remove -std=c99 after GCC 4.8.x cflags = cflags.replace('-std=c99', '') return cflags def ReloadModule(module): import sys if sys.version_info.major >= 3: import importlib importlib.reload(module) else: reload(module) return