1*10465441SEvalZero# 2*10465441SEvalZero# File : codeblocks.py 3*10465441SEvalZero# This file is part of RT-Thread RTOS 4*10465441SEvalZero# COPYRIGHT (C) 2006 - 2015, RT-Thread Development Team 5*10465441SEvalZero# 6*10465441SEvalZero# This program is free software; you can redistribute it and/or modify 7*10465441SEvalZero# it under the terms of the GNU General Public License as published by 8*10465441SEvalZero# the Free Software Foundation; either version 2 of the License, or 9*10465441SEvalZero# (at your option) any later version. 10*10465441SEvalZero# 11*10465441SEvalZero# This program is distributed in the hope that it will be useful, 12*10465441SEvalZero# but WITHOUT ANY WARRANTY; without even the implied warranty of 13*10465441SEvalZero# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14*10465441SEvalZero# GNU General Public License for more details. 15*10465441SEvalZero# 16*10465441SEvalZero# You should have received a copy of the GNU General Public License along 17*10465441SEvalZero# with this program; if not, write to the Free Software Foundation, Inc., 18*10465441SEvalZero# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 19*10465441SEvalZero# 20*10465441SEvalZero# Change Logs: 21*10465441SEvalZero# Date Author Notes 22*10465441SEvalZero# 2015-01-20 Bernard Add copyright information 23*10465441SEvalZero# 24*10465441SEvalZero 25*10465441SEvalZeroimport os 26*10465441SEvalZeroimport sys 27*10465441SEvalZeroimport string 28*10465441SEvalZeroimport building 29*10465441SEvalZero 30*10465441SEvalZeroimport xml.etree.ElementTree as etree 31*10465441SEvalZerofrom xml.etree.ElementTree import SubElement 32*10465441SEvalZerofrom utils import _make_path_relative 33*10465441SEvalZerofrom utils import xml_indent 34*10465441SEvalZero 35*10465441SEvalZeroimport utils 36*10465441SEvalZero 37*10465441SEvalZerofs_encoding = sys.getfilesystemencoding() 38*10465441SEvalZero 39*10465441SEvalZerodef CB_AddHeadFiles(program, elem, project_path): 40*10465441SEvalZero utils.source_ext = [] 41*10465441SEvalZero utils.source_ext = ["h"] 42*10465441SEvalZero for item in program: 43*10465441SEvalZero utils.walk_children(item) 44*10465441SEvalZero utils.source_list.sort() 45*10465441SEvalZero # print utils.source_list 46*10465441SEvalZero 47*10465441SEvalZero for f in utils.source_list: 48*10465441SEvalZero path = _make_path_relative(project_path, f) 49*10465441SEvalZero Unit = SubElement(elem, 'Unit') 50*10465441SEvalZero Unit.set('filename', path.decode(fs_encoding)) 51*10465441SEvalZero 52*10465441SEvalZerodef CB_AddCFiles(ProjectFiles, parent, gname, files, project_path): 53*10465441SEvalZero for f in files: 54*10465441SEvalZero fn = f.rfile() 55*10465441SEvalZero name = fn.name 56*10465441SEvalZero path = os.path.dirname(fn.abspath) 57*10465441SEvalZero 58*10465441SEvalZero path = _make_path_relative(project_path, path) 59*10465441SEvalZero path = os.path.join(path, name) 60*10465441SEvalZero 61*10465441SEvalZero Unit = SubElement(parent, 'Unit') 62*10465441SEvalZero Unit.set('filename', path.decode(fs_encoding)) 63*10465441SEvalZero Option = SubElement(Unit, 'Option') 64*10465441SEvalZero Option.set('compilerVar', "CC") 65*10465441SEvalZero 66*10465441SEvalZerodef CBProject(target, script, program): 67*10465441SEvalZero project_path = os.path.dirname(os.path.abspath(target)) 68*10465441SEvalZero 69*10465441SEvalZero if os.path.isfile('template.cbp'): 70*10465441SEvalZero tree = etree.parse('template.cbp') 71*10465441SEvalZero else: 72*10465441SEvalZero tree = etree.parse(os.path.join(os.path.dirname(__file__), 'template.cbp')) 73*10465441SEvalZero 74*10465441SEvalZero root = tree.getroot() 75*10465441SEvalZero 76*10465441SEvalZero out = open(target, 'w') 77*10465441SEvalZero out.write('<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>\n') 78*10465441SEvalZero 79*10465441SEvalZero ProjectFiles = [] 80*10465441SEvalZero 81*10465441SEvalZero # SECTION 1. add "*.c|*.h" files group 82*10465441SEvalZero for elem in tree.iter(tag='Project'): 83*10465441SEvalZero # print elem.tag, elem.attrib 84*10465441SEvalZero break 85*10465441SEvalZero # add c files 86*10465441SEvalZero for group in script: 87*10465441SEvalZero group_xml = CB_AddCFiles(ProjectFiles, elem, group['name'], group['src'], project_path) 88*10465441SEvalZero # add h files 89*10465441SEvalZero CB_AddHeadFiles(program, elem, project_path) 90*10465441SEvalZero 91*10465441SEvalZero # SECTION 2. 92*10465441SEvalZero # write head include path 93*10465441SEvalZero if 'CPPPATH' in building.Env: 94*10465441SEvalZero cpp_path = building.Env['CPPPATH'] 95*10465441SEvalZero paths = set() 96*10465441SEvalZero for path in cpp_path: 97*10465441SEvalZero inc = _make_path_relative(project_path, os.path.normpath(path)) 98*10465441SEvalZero paths.add(inc) #.replace('\\', '/') 99*10465441SEvalZero 100*10465441SEvalZero paths = [i for i in paths] 101*10465441SEvalZero paths.sort() 102*10465441SEvalZero # write include path, definitions 103*10465441SEvalZero for elem in tree.iter(tag='Compiler'): 104*10465441SEvalZero break 105*10465441SEvalZero for path in paths: 106*10465441SEvalZero Add = SubElement(elem, 'Add') 107*10465441SEvalZero Add.set('directory', path) 108*10465441SEvalZero 109*10465441SEvalZero for macro in building.Env.get('CPPDEFINES', []): 110*10465441SEvalZero Add = SubElement(elem, 'Add') 111*10465441SEvalZero for d in macro: 112*10465441SEvalZero Add.set('option', "-D"+d) 113*10465441SEvalZero 114*10465441SEvalZero # write link flags 115*10465441SEvalZero ''' 116*10465441SEvalZero # write lib dependence 117*10465441SEvalZero if 'LIBS' in building.Env: 118*10465441SEvalZero for elem in tree.iter(tag='Tool'): 119*10465441SEvalZero if elem.attrib['Name'] == 'VCLinkerTool': 120*10465441SEvalZero break 121*10465441SEvalZero libs_with_extention = [i+'.lib' for i in building.Env['LIBS']] 122*10465441SEvalZero libs = ' '.join(libs_with_extention) 123*10465441SEvalZero elem.set('AdditionalDependencies', libs) 124*10465441SEvalZero 125*10465441SEvalZero # write lib include path 126*10465441SEvalZero if 'LIBPATH' in building.Env: 127*10465441SEvalZero lib_path = building.Env['LIBPATH'] 128*10465441SEvalZero paths = set() 129*10465441SEvalZero for path in lib_path: 130*10465441SEvalZero inc = _make_path_relative(project_path, os.path.normpath(path)) 131*10465441SEvalZero paths.add(inc) #.replace('\\', '/') 132*10465441SEvalZero 133*10465441SEvalZero paths = [i for i in paths] 134*10465441SEvalZero paths.sort() 135*10465441SEvalZero lib_paths = ';'.join(paths) 136*10465441SEvalZero elem.set('AdditionalLibraryDirectories', lib_paths) 137*10465441SEvalZero ''' 138*10465441SEvalZero xml_indent(root) 139*10465441SEvalZero out.write(etree.tostring(root, encoding='utf-8')) 140*10465441SEvalZero out.close() 141