From 777d3c059bffc9f8b3c5805a97871aae269bae80 Mon Sep 17 00:00:00 2001 From: Bright Pan Date: Wed, 19 Nov 2014 14:57:10 +0800 Subject: [PATCH] Add mdk5 support in SCons tools --- tools/building.py | 14 ++++- tools/keil.py | 147 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 159 insertions(+), 2 deletions(-) diff --git a/tools/building.py b/tools/building.py index acba0474f6..f12452ed7d 100644 --- a/tools/building.py +++ b/tools/building.py @@ -167,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'), @@ -450,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: @@ -459,13 +461,21 @@ 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) diff --git a/tools/keil.py b/tools/keil.py index 0450a1de7e..8f8b926804 100644 --- a/tools/keil.py +++ b/tools/keil.py @@ -162,6 +162,153 @@ def MDK4Project(target, script): 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('\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 = '' + 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) + + # remove repeat path + paths = set() + 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.uvoptx'): + import shutil + shutil.copy2('template.uvoptx', 'project.uvoptx') + def MDKProject(target, script): template = file('template.Uv2', "rb") lines = template.readlines()