diff options
| author | Arda <[email protected]> | 2014-11-24 11:57:31 +0800 |
|---|---|---|
| committer | Arda <[email protected]> | 2014-11-24 11:57:31 +0800 |
| commit | 143d3b82244b977735649e7d7c201d2affe67460 (patch) | |
| tree | 61503d3a150cef8d8184c858efc139b146b50cf6 /tools | |
| parent | bc2a890ab08d163ccea323f7e719c4fdf53050cd (diff) | |
| parent | 9ecd18411fc1344e3d080d844b60c7070c3fb4d8 (diff) | |
Merge pull request #2 from RT-Thread/master
update from official source
Diffstat (limited to 'tools')
| -rw-r--r-- | tools/building.py | 101 | ||||
| -rw-r--r-- | tools/keil.py | 175 |
2 files changed, 208 insertions, 68 deletions
diff --git a/tools/building.py b/tools/building.py index 3572daabbe..f12452ed7d 100644 --- a/tools/building.py +++ b/tools/building.py @@ -27,11 +27,9 @@ class Win32Spawn: newargs = string.join(args[1:], ' ') cmdline = cmd + " " + newargs - startupinfo = subprocess.STARTUPINFO() - startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW # Make sure the env is constructed by strings - _e = {k: str(v) for k, v in env.items()} + _e = dict([(k, str(v)) for k, v in env.items()]) # Windows(tm) CreateProcess does not use the env passed to it to find # the executables. So we have to modify our own PATH to make Popen @@ -40,8 +38,7 @@ class Win32Spawn: os.environ['PATH'] = _e['PATH'] try: - proc = subprocess.Popen(cmdline, env=_e, - startupinfo=startupinfo, shell=False) + proc = subprocess.Popen(cmdline, env=_e, shell=False) except Exception as e: print 'Error in calling:\n%s' % cmdline print 'Exception: %s: %s' % (e, os.strerror(e.errno)) @@ -70,7 +67,7 @@ def PrepareBuilding(env, root_directory, has_libcpu=False, remove_components = [ rtconfig.EXEC_PATH = rtconfig.EXEC_PATH.replace('bin40', 'armcc/bin') Env['LINKFLAGS']=Env['LINKFLAGS'].replace('RV31', 'armcc') - # reset AR command flags + # reset AR command flags env['ARCOM'] = '$AR --create $TARGET $SOURCES' env['LIBPREFIX'] = '' env['LIBSUFFIX'] = '.lib' @@ -105,7 +102,7 @@ def PrepareBuilding(env, root_directory, has_libcpu=False, remove_components = [ PreProcessor.process_contents(contents) BuildOptions = PreProcessor.cpp_namespace - # add copy option + # add copy option AddOption('--copy', dest='copy', action='store_true', @@ -151,12 +148,12 @@ def PrepareBuilding(env, root_directory, has_libcpu=False, remove_components = [ rtconfig.POST_ACTION = '' # add build library option - AddOption('--buildlib', - dest='buildlib', + AddOption('--buildlib', + dest='buildlib', type='string', help='building library of a component') - AddOption('--cleanlib', - dest='cleanlib', + AddOption('--cleanlib', + dest='cleanlib', action='store_true', default=False, help='clean up the library by --buildlib') @@ -170,6 +167,7 @@ def PrepareBuilding(env, root_directory, has_libcpu=False, remove_components = [ #{target_name:(CROSS_TOOL, PLATFORM)} tgt_dict = {'mdk':('keil', 'armcc'), 'mdk4':('keil', 'armcc'), + 'mdk5':('keil', 'armcc'), 'iar':('iar', 'iar'), 'vs':('msvc', 'cl'), 'vs2012':('msvc', 'cl'), @@ -243,13 +241,13 @@ def PrepareModuleBuilding(env, root_directory): Env = env Rtt_Root = root_directory - # add build/clean library option for library checking - AddOption('--buildlib', - dest='buildlib', + # add build/clean library option for library checking + AddOption('--buildlib', + dest='buildlib', type='string', help='building library of a component') - AddOption('--cleanlib', - dest='cleanlib', + AddOption('--cleanlib', + dest='cleanlib', action='store_true', default=False, help='clean up the library by --buildlib') @@ -271,7 +269,7 @@ def GetDepend(depend): building = False elif BuildOptions[depend] != '': return BuildOptions[depend] - + return building # for list type depend @@ -348,7 +346,7 @@ def DefineGroup(name, src, depend, **parameters): if group.has_key('LINKFLAGS'): Env.Append(LINKFLAGS = group['LINKFLAGS']) - # check whether to clean up library + # check whether to clean up library if GetOption('cleanlib') and os.path.exists(os.path.join(group['path'], GroupLibFullName(name, Env))): if group['src'] != []: print 'Remove library:', GroupLibFullName(name, Env) @@ -367,18 +365,19 @@ def DefineGroup(name, src, depend, **parameters): if group.has_key('LIBPATH'): Env.Append(LIBPATH = group['LIBPATH']) - objs = Env.Object(group['src']) if group.has_key('LIBRARY'): - objs = Env.Library(name, objs) + objs = Env.Library(name, group['src']) + else: + objs = group['src'] - # merge group + # merge group for g in Projects: if g['name'] == name: # merge to this group MergeGroup(g, group) return objs - # add a new group + # add a new group Projects.append(group) return objs @@ -440,12 +439,6 @@ def DoBuilding(target, objects): break else: - # merge the repeated items in the Env - if Env.has_key('CPPPATH') : Env['CPPPATH'] = list(set(Env['CPPPATH'])) - if Env.has_key('CPPDEFINES'): Env['CPPDEFINES'] = list(set(Env['CPPDEFINES'])) - if Env.has_key('LIBPATH') : Env['LIBPATH'] = list(set(Env['LIBPATH'])) - if Env.has_key('LIBS') : Env['LIBS'] = list(set(Env['LIBS'])) - program = Env.Program(target, objects) EndBuilding(target, program) @@ -458,6 +451,7 @@ def EndBuilding(target, program = None): if GetOption('target') == 'mdk': from keil import MDKProject from keil import MDK4Project + from keil import MDK5Project template = os.path.isfile('template.Uv2') if template: @@ -467,16 +461,24 @@ def EndBuilding(target, program = None): if template: MDK4Project('project.uvproj', Projects) else: - print 'No template project file found.' + template = os.path.isfile('template.uvprojx') + if template: + MDK5Project('project.uvprojx', Projects) + else: + print 'No template project file found.' + if GetOption('target') == 'mdk4': - from keil import MDKProject from keil import MDK4Project MDK4Project('project.uvproj', Projects) + if GetOption('target') == 'mdk5': + from keil import MDK5Project + MDK5Project('project.uvprojx', Projects) + if GetOption('target') == 'iar': from iar import IARProject - IARProject('project.ewp', Projects) + IARProject('project.ewp', Projects) if GetOption('target') == 'vs': from vs import VSProject @@ -493,7 +495,7 @@ def EndBuilding(target, program = None): if GetOption('target') == 'ua': from ua import PrepareUA PrepareUA(Projects, Rtt_Root, str(Dir('#'))) - + if GetOption('copy') and program != None: MakeCopy(program) if GetOption('copy-header') and program != None: @@ -504,6 +506,9 @@ def EndBuilding(target, program = None): CscopeDatabase(Projects) def SrcRemove(src, remove): + if not src: + return + if type(src[0]) == type('str'): for item in src: if os.path.basename(item) in remove: @@ -520,7 +525,7 @@ def GetVersion(): rtdef = os.path.join(Rtt_Root, 'include', 'rtdef.h') - # parse rtdef.h to get RT-Thread version + # parse rtdef.h to get RT-Thread version prepcessor = SCons.cpp.PreProcessor() f = file(rtdef, 'r') contents = f.read() @@ -566,9 +571,9 @@ def do_rm_file(src): def do_copy_file(src, dst): import shutil - # check source file + # check source file if not os.path.exists(src): - return + return path = os.path.dirname(dst) # mkdir if path not exist @@ -579,13 +584,13 @@ def do_copy_file(src, dst): def do_copy_folder(src_dir, dst_dir): import shutil - # check source directory + # check source directory if not os.path.exists(src_dir): return - + if os.path.exists(dst_dir): shutil.rmtree(dst_dir) - + shutil.copytree(src_dir, dst_dir) source_ext = ["c", "h", "s", "S", "cpp", "xpm"] @@ -612,22 +617,22 @@ def MakeCopy(program): global source_list global Rtt_Root global Env - + target_path = os.path.join(Dir('#').abspath, 'rt-thread') - + if Env['PLATFORM'] == 'win32': RTT_ROOT = Rtt_Root.lower() else: RTT_ROOT = Rtt_Root - + if target_path.startswith(RTT_ROOT): return for item in program: walk_children(item) - + source_list.sort() - + # filte source file in RT-Thread target_list = [] for src in source_list: @@ -638,7 +643,7 @@ def MakeCopy(program): target_list.append(src) source_list = target_list - # get source path + # get source path src_dir = [] for src in source_list: src = src.replace(RTT_ROOT, '') @@ -650,10 +655,10 @@ def MakeCopy(program): full_path = RTT_ROOT for item in sub_path: full_path = os.path.join(full_path, item) - if full_path not in src_dir: + if full_path not in src_dir: src_dir.append(full_path) - for item in src_dir: + for item in src_dir: source_list.append(os.path.join(item, 'SConscript')) for src in source_list: @@ -664,7 +669,7 @@ def MakeCopy(program): dst = os.path.join(target_path, dst) do_copy_file(src, dst) - # copy tools directory + # copy tools directory print "=> tools" do_copy_folder(os.path.join(RTT_ROOT, "tools"), os.path.join(target_path, "tools")) do_copy_file(os.path.join(RTT_ROOT, 'AUTHORS'), os.path.join(target_path, 'AUTHORS')) @@ -712,7 +717,7 @@ def MakeCopyHeader(program): dst = os.path.join(target_path, dst) do_copy_file(src, dst) - # copy tools directory + # copy tools directory print "=> tools" do_copy_folder(os.path.join(RTT_ROOT, "tools"), os.path.join(target_path, "tools")) do_copy_file(os.path.join(RTT_ROOT, 'AUTHORS'), os.path.join(target_path, 'AUTHORS')) diff --git a/tools/keil.py b/tools/keil.py index ef0dece3f8..8f8b926804 100644 --- a/tools/keil.py +++ b/tools/keil.py @@ -49,11 +49,11 @@ def MDK4AddGroupForFN(ProjectFiles, parent, name, filename, project_path): file_type = SubElement(file, 'FileType') file_type.text = '%d' % _get_filetype(name) file_path = SubElement(file, 'FilePath') - + file_path.text = path.decode(fs_encoding) def MDK4AddGroup(ProjectFiles, parent, name, files, project_path): - # don't add an empty group + # don't add an empty group if len(files) == 0: return @@ -69,7 +69,7 @@ def MDK4AddGroup(ProjectFiles, parent, name, files, project_path): basename = os.path.basename(path) path = _make_path_relative(project_path, path) path = os.path.join(path, name) - + files = SubElement(group, 'Files') file = SubElement(files, 'File') file_name = SubElement(file, 'FileName') @@ -81,7 +81,7 @@ def MDK4AddGroup(ProjectFiles, parent, name, files, project_path): file_type = SubElement(file, 'FileType') file_type.text = '%d' % _get_filetype(name) file_path = SubElement(file, 'FilePath') - + file_path.text = path.decode(fs_encoding) def MDK4Project(target, script): @@ -93,44 +93,179 @@ def MDK4Project(target, script): tree = etree.parse('template.uvproj') root = tree.getroot() - + out = file(target, 'wb') out.write('<?xml version="1.0" encoding="UTF-8" standalone="no" ?>\n') - + CPPPATH = [] CPPDEFINES = [] LINKFLAGS = '' CCFLAGS = '' ProjectFiles = [] - + # add group groups = tree.find('Targets/Target/Groups') if groups is None: groups = SubElement(tree.find('Targets/Target'), 'Groups') + groups.clear() # clean old groups for group in script: group_xml = MDK4AddGroup(ProjectFiles, groups, group['name'], group['src'], project_path) - + # get each include path if group.has_key('CPPPATH') and group['CPPPATH']: if CPPPATH: CPPPATH += group['CPPPATH'] else: CPPPATH += group['CPPPATH'] - + # get each group's definitions if group.has_key('CPPDEFINES') and group['CPPDEFINES']: if CPPDEFINES: CPPDEFINES += group['CPPDEFINES'] else: CPPDEFINES += group['CPPDEFINES'] - + # get each group's link flags if group.has_key('LINKFLAGS') and group['LINKFLAGS']: if LINKFLAGS: LINKFLAGS += ' ' + group['LINKFLAGS'] else: LINKFLAGS += group['LINKFLAGS'] - + + if group.has_key('LIBS') and group['LIBS']: + for item in group['LIBS']: + lib_path = '' + for path_item in group['LIBPATH']: + full_path = os.path.join(path_item, item + '.lib') + if os.path.isfile(full_path): # has this library + lib_path = full_path + + if lib_path != '': + MDK4AddGroupForFN(ProjectFiles, groups, group['name'], lib_path, project_path) + + # write include path, definitions and link flags + IncludePath = tree.find('Targets/Target/TargetOption/TargetArmAds/Cads/VariousControls/IncludePath') + IncludePath.text = ';'.join([_make_path_relative(project_path, os.path.normpath(i)) for i in CPPPATH]) + + Define = tree.find('Targets/Target/TargetOption/TargetArmAds/Cads/VariousControls/Define') + Define.text = ', '.join(set(CPPDEFINES)) + + Misc = tree.find('Targets/Target/TargetOption/TargetArmAds/LDads/Misc') + Misc.text = LINKFLAGS + + xml_indent(root) + out.write(etree.tostring(root, encoding='utf-8')) + out.close() + + # copy uvopt file + if os.path.exists('template.uvopt'): + import shutil + shutil.copy2('template.uvopt', 'project.uvopt') + +def MDK5AddGroupForFN(ProjectFiles, parent, name, filename, project_path): + group = SubElement(parent, 'Group') + group_name = SubElement(group, 'GroupName') + group_name.text = name + + name = os.path.basename(filename) + path = os.path.dirname (filename) + + basename = os.path.basename(path) + path = _make_path_relative(project_path, path) + path = os.path.join(path, name) + files = SubElement(group, 'Files') + file = SubElement(files, 'File') + file_name = SubElement(file, 'FileName') + name = os.path.basename(path) + if ProjectFiles.count(name): + name = basename + '_' + name + ProjectFiles.append(name) + file_name.text = name.decode(fs_encoding) + file_type = SubElement(file, 'FileType') + file_type.text = '%d' % _get_filetype(name) + file_path = SubElement(file, 'FilePath') + + file_path.text = path.decode(fs_encoding) + +def MDK5AddGroup(ProjectFiles, parent, name, files, project_path): + # don't add an empty group + if len(files) == 0: + return + + group = SubElement(parent, 'Group') + group_name = SubElement(group, 'GroupName') + group_name.text = name + + for f in files: + fn = f.rfile() + name = fn.name + path = os.path.dirname(fn.abspath) + + basename = os.path.basename(path) + path = _make_path_relative(project_path, path) + path = os.path.join(path, name) + + files = SubElement(group, 'Files') + file = SubElement(files, 'File') + file_name = SubElement(file, 'FileName') + name = os.path.basename(path) + if ProjectFiles.count(name): + name = basename + '_' + name + ProjectFiles.append(name) + file_name.text = name.decode(fs_encoding) + file_type = SubElement(file, 'FileType') + file_type.text = '%d' % _get_filetype(name) + file_path = SubElement(file, 'FilePath') + + file_path.text = path.decode(fs_encoding) + +def MDK5Project(target, script): + project_path = os.path.dirname(os.path.abspath(target)) + + project_uvopt = os.path.abspath(target).replace('uvprojx', 'uvoptx') + if os.path.isfile(project_uvopt): + os.unlink(project_uvopt) + + tree = etree.parse('template.uvprojx') + root = tree.getroot() + + out = file(target, 'wb') + out.write('<?xml version="1.0" encoding="UTF-8" standalone="no" ?>\n') + + CPPPATH = [] + CPPDEFINES = [] + LINKFLAGS = '' + CCFLAGS = '' + ProjectFiles = [] + + # add group + groups = tree.find('Targets/Target/Groups') + if groups is None: + groups = SubElement(tree.find('Targets/Target'), 'Groups') + for group in script: + group_xml = MDK4AddGroup(ProjectFiles, groups, group['name'], group['src'], project_path) + + # get each include path + if group.has_key('CPPPATH') and group['CPPPATH']: + if CPPPATH: + CPPPATH += group['CPPPATH'] + else: + CPPPATH += group['CPPPATH'] + + # get each group's definitions + if group.has_key('CPPDEFINES') and group['CPPDEFINES']: + if CPPDEFINES: + CPPDEFINES += group['CPPDEFINES'] + else: + CPPDEFINES += group['CPPDEFINES'] + + # get each group's link flags + if group.has_key('LINKFLAGS') and group['LINKFLAGS']: + if LINKFLAGS: + LINKFLAGS += ' ' + group['LINKFLAGS'] + else: + LINKFLAGS += group['LINKFLAGS'] + if group.has_key('LIBS') and group['LIBS']: for item in group['LIBS']: lib_path = '' @@ -147,33 +282,33 @@ def MDK4Project(target, script): for path in CPPPATH: inc = _make_path_relative(project_path, os.path.normpath(path)) paths.add(inc) #.replace('\\', '/') - + paths = [i for i in paths] paths.sort() CPPPATH = string.join(paths, ';') - + definitions = [i for i in set(CPPDEFINES)] CPPDEFINES = string.join(definitions, ', ') - + # write include path, definitions and link flags IncludePath = tree.find('Targets/Target/TargetOption/TargetArmAds/Cads/VariousControls/IncludePath') IncludePath.text = CPPPATH - + Define = tree.find('Targets/Target/TargetOption/TargetArmAds/Cads/VariousControls/Define') Define.text = CPPDEFINES Misc = tree.find('Targets/Target/TargetOption/TargetArmAds/LDads/Misc') Misc.text = LINKFLAGS - + xml_indent(root) out.write(etree.tostring(root, encoding='utf-8')) out.close() - + # copy uvopt file - if os.path.exists('template.uvopt'): + if os.path.exists('template.uvoptx'): import shutil - shutil.copy2('template.uvopt', 'project.uvopt') - + shutil.copy2('template.uvoptx', 'project.uvoptx') + def MDKProject(target, script): template = file('template.Uv2', "rb") lines = template.readlines() |
