diff --git a/tools/building.py b/tools/building.py index 3b8a91fc023eac463a95dfafc11797ba815ad8e4..0e7718d652e8a690e6ecc0c2c186969b7b886ba6 100644 --- a/tools/building.py +++ b/tools/building.py @@ -91,13 +91,6 @@ def _make_path_relative(origin, dest): # return os.path.join(*segments).replace('\\', '/') return os.path.join(*segments) -def IARProject(target, script): - project = file(target, "wb") - project_path = os.path.dirname(os.path.abspath(target)) - - tree = etree.parse('template.ewp') - tree.write('project.ewp') - def xml_indent(elem, level=0): i = "\n" + level*" " if len(elem): @@ -113,6 +106,100 @@ def xml_indent(elem, level=0): if level and (not elem.tail or not elem.tail.strip()): elem.tail = i +def IARAddGroup(parent, name, files, project_path): + group = SubElement(parent, 'group') + group_name = SubElement(group, 'name') + 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) + + file = SubElement(group, 'file') + file_name = SubElement(file, 'name') + file_name.text = '$PROJ_DIR$\\' + path + +iar_workspace = ''' + + + + $WS_DIR$\%s + + + + + +''' + +def IARWorkspace(target): + # make an workspace + workspace = target.replace('.ewp', '.eww') + out = file(workspace, 'wb') + xml = iar_workspace % target + out.write(xml) + out.close() + +def IARProject(target, script): + project_path = os.path.dirname(os.path.abspath(target)) + + tree = etree.parse('template.ewp') + root = tree.getroot() + + out = file(target, 'wb') + + CPPPATH = [] + CPPDEFINES = [] + LINKFLAGS = '' + CCFLAGS = '' + + # add group + for group in script: + IARAddGroup(root, group['name'], group['src'], project_path) + + # get each include path + if group.has_key('CPPPATH') and group['CPPPATH']: + CPPPATH += group['CPPPATH'] + + # get each group's definitions + if group.has_key('CPPDEFINES') and group['CPPDEFINES']: + CPPDEFINES += group['CPPDEFINES'] + + # get each group's link flags + if group.has_key('LINKFLAGS') and group['LINKFLAGS']: + LINKFLAGS += group['LINKFLAGS'] + + # make relative path + paths = set() + for path in CPPPATH: + inc = _make_path_relative(project_path, os.path.normpath(path)) + paths.add(inc) #.replace('\\', '/') + + # setting options + options = tree.findall('configuration/settings/data/option') + for option in options: + # print option.text + name = option.find('name') + + if name.text == 'CCIncludePath2': + for path in paths: + state = SubElement(option, 'state') + state.text = '$PROJ_DIR$\\' + path + if name.text == 'CCDefines': + for define in CPPDEFINES: + state = SubElement(option, 'state') + state.text = define + + xml_indent(root) + out.write(etree.tostring(root, encoding='utf-8')) + out.close() + + IARWorkspace(target) + def MDK4AddGroup(parent, name, files, project_path): group = SubElement(parent, 'Group') group_name = SubElement(group, 'GroupName') @@ -465,11 +552,20 @@ def EndBuilding(target): import rtconfig Env.AddPostAction(target, rtconfig.POST_ACTION) - if GetOption('target') == 'iar': - IARProject('project.ewp', Projects) - if GetOption('target') == 'mdk': + if rtconfig.CROSS_TOOL != 'keil': + print 'Please use Keil MDK compiler in rtconfig.h' + return MDKProject('project.Uv2', Projects) if GetOption('target') == 'mdk4': + if rtconfig.CROSS_TOOL != 'keil': + print 'Please use Keil MDK compiler in rtconfig.h' + return MDK4Project('project.uvproj', Projects) + + if GetOption('target') == 'iar': + if rtconfig.CROSS_TOOL != 'iar': + print 'Please use IAR compiler in rtconfig.h' + return + IARProject('project.ewp', Projects)