From 7bec8a242b87d7881b3c28d638db68c553d6d111 Mon Sep 17 00:00:00 2001 From: aozima Date: Thu, 21 Feb 2013 17:37:30 +0800 Subject: [PATCH] update scons: support C::B --- tools/building.py | 7 ++- tools/codeblocks.py | 108 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 114 insertions(+), 1 deletion(-) create mode 100644 tools/codeblocks.py diff --git a/tools/building.py b/tools/building.py index ae1177113e..a1e63f8fa9 100644 --- a/tools/building.py +++ b/tools/building.py @@ -99,7 +99,8 @@ def PrepareBuilding(env, root_directory, has_libcpu=False, remove_components = [ tgt_dict = {'mdk':('keil', 'armcc'), 'mdk4':('keil', 'armcc'), 'iar':('iar', 'iar'), - 'vs':('msvc', 'cl')} + 'vs':('msvc', 'cl'), + 'cb':('keil', 'armcc')} tgt_name = GetOption('target') if tgt_name: SetOption('no_exec', 1) @@ -305,6 +306,7 @@ def EndBuilding(target, program = None): from keil import MDK4Project from iar import IARProject from vs import VSProject + from codeblocks import CBProject Env.AddPostAction(target, rtconfig.POST_ACTION) @@ -328,6 +330,9 @@ def EndBuilding(target, program = None): if GetOption('target') == 'vs': VSProject('project.vcproj', Projects, program) + if GetOption('target') == 'cb': + CBProject('project.cbp', Projects, program) + if GetOption('copy') and program != None: MakeCopy(program) if GetOption('copy-header') and program != None: diff --git a/tools/codeblocks.py b/tools/codeblocks.py new file mode 100644 index 0000000000..f46f0f1f93 --- /dev/null +++ b/tools/codeblocks.py @@ -0,0 +1,108 @@ +import os +import sys +import string +import building + +import xml.etree.ElementTree as etree +from xml.etree.ElementTree import SubElement +from utils import _make_path_relative +from utils import xml_indent +fs_encoding = sys.getfilesystemencoding() + +def CB_AddHeadFiles(program, elem, project_path): + building.source_ext = [] + building.source_ext = ["h"] + for item in program: + building.walk_children(item) + building.source_list.sort() + # print building.source_list + + for f in building.source_list: + path = _make_path_relative(project_path, f) + Unit = SubElement(elem, 'Unit') + Unit.set('filename', path.decode(fs_encoding)) + +def CB_AddCFiles(ProjectFiles, parent, gname, files, project_path): + for f in files: + fn = f.rfile() + name = fn.name + path = os.path.dirname(fn.abspath) + + path = _make_path_relative(project_path, path) + path = os.path.join(path, name) + + Unit = SubElement(parent, 'Unit') + Unit.set('filename', path.decode(fs_encoding)) + Option = SubElement(Unit, 'Option') + Option.set('compilerVar', "CC") + +def CBProject(target, script, program): + project_path = os.path.dirname(os.path.abspath(target)) + + tree = etree.parse('template.cbp') + root = tree.getroot() + + out = file(target, 'wb') + out.write('\n') + + ProjectFiles = [] + + # SECTION 1. add "*.c|*.h" files group + for elem in tree.iter(tag='Project'): + # print elem.tag, elem.attrib + break + # add c files + for group in script: + group_xml = CB_AddCFiles(ProjectFiles, elem, group['name'], group['src'], project_path) + # add h files + CB_AddHeadFiles(program, elem, project_path) + + # SECTION 2. + # write head include path + if building.Env.has_key('CPPPATH'): + cpp_path = building.Env['CPPPATH'] + paths = set() + for path in cpp_path: + inc = _make_path_relative(project_path, os.path.normpath(path)) + paths.add(inc) #.replace('\\', '/') + + paths = [i for i in paths] + paths.sort() + # write include path, definitions + for elem in tree.iter(tag='Compiler'): + break + for path in paths: + Add = SubElement(elem, 'Add') + Add.set('directory', path) + + for macro in building.Env['CPPDEFINES']: + Add = SubElement(elem, 'Add') + Add.set('option', "-D"+macro) + + # write link flags + ''' + # write lib dependence + if building.Env.has_key('LIBS'): + for elem in tree.iter(tag='Tool'): + if elem.attrib['Name'] == 'VCLinkerTool': + break + libs_with_extention = [i+'.lib' for i in building.Env['LIBS']] + libs = ' '.join(libs_with_extention) + elem.set('AdditionalDependencies', libs) + + # write lib include path + if building.Env.has_key('LIBPATH'): + lib_path = building.Env['LIBPATH'] + paths = set() + for path in lib_path: + inc = _make_path_relative(project_path, os.path.normpath(path)) + paths.add(inc) #.replace('\\', '/') + + paths = [i for i in paths] + paths.sort() + lib_paths = ';'.join(paths) + elem.set('AdditionalLibraryDirectories', lib_paths) + ''' + xml_indent(root) + out.write(etree.tostring(root, encoding='utf-8')) + out.close()