diff options
| author | Bernard Xiong <[email protected]> | 2014-11-19 18:43:40 +0800 |
|---|---|---|
| committer | Bernard Xiong <[email protected]> | 2014-11-19 18:43:40 +0800 |
| commit | 9ecd18411fc1344e3d080d844b60c7070c3fb4d8 (patch) | |
| tree | 465af1aa4e8f392219ceb63273a86cd4b5ef56d6 /tools | |
| parent | d324c8876743ec623b93321d791fe9882c1f0d13 (diff) | |
| parent | 3c65a522fdfc6c1516804096785bf6433a24feb4 (diff) | |
Merge pull request #381 from bright-pan/master
Add mdk5 building
Diffstat (limited to 'tools')
| -rw-r--r-- | tools/building.py | 80 | ||||
| -rw-r--r-- | tools/keil.py | 171 |
2 files changed, 204 insertions, 47 deletions
diff --git a/tools/building.py b/tools/building.py index 0bdaa8696b..f12452ed7d 100644 --- a/tools/building.py +++ b/tools/building.py @@ -67,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' @@ -102,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', @@ -148,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') @@ -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'), @@ -240,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') @@ -268,7 +269,7 @@ def GetDepend(depend): building = False elif BuildOptions[depend] != '': return BuildOptions[depend] - + return building # for list type depend @@ -345,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) @@ -369,14 +370,14 @@ def DefineGroup(name, src, depend, **parameters): 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 @@ -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,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 @@ -485,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: @@ -515,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() @@ -561,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 @@ -574,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"] @@ -607,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: @@ -633,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, '') @@ -645,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: @@ -659,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')) @@ -707,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 64afedfb65..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,16 +93,16 @@ 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: @@ -110,28 +110,28 @@ def MDK4Project(target, script): 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 = '' @@ -161,7 +161,154 @@ def MDK4Project(target, script): 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 = '' + 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() |
