| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108 | import osimport sysimport stringimport buildingimport xml.etree.ElementTree as etreefrom xml.etree.ElementTree import SubElementfrom utils import _make_path_relativefrom utils import xml_indentfs_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()
 |