Browse Source

Merge pull request #31 from aozima/pulls

Pulls
Bernard Xiong 12 years ago
parent
commit
4e7247e072
2 changed files with 114 additions and 1 deletions
  1. 6 1
      tools/building.py
  2. 108 0
      tools/codeblocks.py

+ 6 - 1
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:

+ 108 - 0
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('<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>\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()