1*10465441SEvalZero# 2*10465441SEvalZero# File : vs.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*10465441SEvalZeroimport utils 30*10465441SEvalZero 31*10465441SEvalZeroimport xml.etree.ElementTree as etree 32*10465441SEvalZerofrom xml.etree.ElementTree import SubElement 33*10465441SEvalZerofrom utils import _make_path_relative 34*10465441SEvalZerofrom utils import xml_indent 35*10465441SEvalZerofs_encoding = sys.getfilesystemencoding() 36*10465441SEvalZero 37*10465441SEvalZerodef VS_AddGroup(ProjectFiles, parent, name, files, libs, project_path): 38*10465441SEvalZero Filter = SubElement(parent, 'Filter') 39*10465441SEvalZero Filter.set('Name', name) #set group name to group 40*10465441SEvalZero 41*10465441SEvalZero for f in files: 42*10465441SEvalZero fn = f.rfile() 43*10465441SEvalZero name = fn.name 44*10465441SEvalZero path = os.path.dirname(fn.abspath) 45*10465441SEvalZero 46*10465441SEvalZero path = _make_path_relative(project_path, path) 47*10465441SEvalZero path = os.path.join(path, name) 48*10465441SEvalZero 49*10465441SEvalZero File = SubElement(Filter, 'File') 50*10465441SEvalZero File.set('RelativePath', path.decode(fs_encoding)) 51*10465441SEvalZero 52*10465441SEvalZero for lib in libs: 53*10465441SEvalZero name = os.path.basename(lib) 54*10465441SEvalZero path = os.path.dirname(lib) 55*10465441SEvalZero 56*10465441SEvalZero path = _make_path_relative(project_path, path) 57*10465441SEvalZero path = os.path.join(path, name) 58*10465441SEvalZero 59*10465441SEvalZero File = SubElement(Filter, 'File') 60*10465441SEvalZero File.set('RelativePath', path.decode(fs_encoding)) 61*10465441SEvalZero 62*10465441SEvalZerodef VS_AddHeadFilesGroup(program, elem, project_path): 63*10465441SEvalZero utils.source_ext = [] 64*10465441SEvalZero utils.source_ext = ["h"] 65*10465441SEvalZero for item in program: 66*10465441SEvalZero utils.walk_children(item) 67*10465441SEvalZero utils.source_list.sort() 68*10465441SEvalZero # print utils.source_list 69*10465441SEvalZero 70*10465441SEvalZero for f in utils.source_list: 71*10465441SEvalZero path = _make_path_relative(project_path, f) 72*10465441SEvalZero File = SubElement(elem, 'File') 73*10465441SEvalZero File.set('RelativePath', path.decode(fs_encoding)) 74*10465441SEvalZero 75*10465441SEvalZerodef VSProject(target, script, program): 76*10465441SEvalZero project_path = os.path.dirname(os.path.abspath(target)) 77*10465441SEvalZero 78*10465441SEvalZero tree = etree.parse('template_vs2005.vcproj') 79*10465441SEvalZero root = tree.getroot() 80*10465441SEvalZero 81*10465441SEvalZero out = open(target, 'w') 82*10465441SEvalZero out.write('<?xml version="1.0" encoding="UTF-8"?>\r\n') 83*10465441SEvalZero 84*10465441SEvalZero ProjectFiles = [] 85*10465441SEvalZero 86*10465441SEvalZero # add "*.c" files group 87*10465441SEvalZero for elem in tree.iter(tag='Filter'): 88*10465441SEvalZero if elem.attrib['Name'] == 'Source Files': 89*10465441SEvalZero #print elem.tag, elem.attrib 90*10465441SEvalZero break 91*10465441SEvalZero 92*10465441SEvalZero for group in script: 93*10465441SEvalZero libs = [] 94*10465441SEvalZero if 'LIBS' in group and group['LIBS']: 95*10465441SEvalZero for item in group['LIBS']: 96*10465441SEvalZero lib_path = '' 97*10465441SEvalZero for path_item in group['LIBPATH']: 98*10465441SEvalZero full_path = os.path.join(path_item, item + '.lib') 99*10465441SEvalZero if os.path.isfile(full_path): # has this library 100*10465441SEvalZero lib_path = full_path 101*10465441SEvalZero 102*10465441SEvalZero if lib_path != '': 103*10465441SEvalZero libs.append(lib_path) 104*10465441SEvalZero 105*10465441SEvalZero group_xml = VS_AddGroup(ProjectFiles, elem, group['name'], group['src'], libs, project_path) 106*10465441SEvalZero 107*10465441SEvalZero # add "*.h" files group 108*10465441SEvalZero for elem in tree.iter(tag='Filter'): 109*10465441SEvalZero if elem.attrib['Name'] == 'Header Files': 110*10465441SEvalZero break 111*10465441SEvalZero VS_AddHeadFilesGroup(program, elem, project_path) 112*10465441SEvalZero 113*10465441SEvalZero # write head include path 114*10465441SEvalZero if 'CPPPATH' in building.Env: 115*10465441SEvalZero cpp_path = building.Env['CPPPATH'] 116*10465441SEvalZero paths = set() 117*10465441SEvalZero for path in cpp_path: 118*10465441SEvalZero inc = _make_path_relative(project_path, os.path.normpath(path)) 119*10465441SEvalZero paths.add(inc) #.replace('\\', '/') 120*10465441SEvalZero 121*10465441SEvalZero paths = [i for i in paths] 122*10465441SEvalZero paths.sort() 123*10465441SEvalZero cpp_path = ';'.join(paths) 124*10465441SEvalZero 125*10465441SEvalZero # write include path, definitions 126*10465441SEvalZero for elem in tree.iter(tag='Tool'): 127*10465441SEvalZero if elem.attrib['Name'] == 'VCCLCompilerTool': 128*10465441SEvalZero #print elem.tag, elem.attrib 129*10465441SEvalZero break 130*10465441SEvalZero elem.set('AdditionalIncludeDirectories', cpp_path) 131*10465441SEvalZero 132*10465441SEvalZero # write cppdefinitons flags 133*10465441SEvalZero if 'CPPDEFINES' in building.Env: 134*10465441SEvalZero CPPDEFINES = building.Env['CPPDEFINES'] 135*10465441SEvalZero definitions = [] 136*10465441SEvalZero if type(CPPDEFINES[0]) == type(()): 137*10465441SEvalZero for item in CPPDEFINES: 138*10465441SEvalZero definitions += [i for i in item] 139*10465441SEvalZero definitions = ';'.join(definitions) 140*10465441SEvalZero else: 141*10465441SEvalZero definitions = ';'.join(building.Env['CPPDEFINES']) 142*10465441SEvalZero elem.set('PreprocessorDefinitions', definitions) 143*10465441SEvalZero # write link flags 144*10465441SEvalZero 145*10465441SEvalZero # write lib dependence 146*10465441SEvalZero if 'LIBS' in building.Env: 147*10465441SEvalZero for elem in tree.iter(tag='Tool'): 148*10465441SEvalZero if elem.attrib['Name'] == 'VCLinkerTool': 149*10465441SEvalZero break 150*10465441SEvalZero libs_with_extention = [i+'.lib' for i in building.Env['LIBS']] 151*10465441SEvalZero libs = ' '.join(libs_with_extention) 152*10465441SEvalZero elem.set('AdditionalDependencies', libs) 153*10465441SEvalZero 154*10465441SEvalZero # write lib include path 155*10465441SEvalZero if 'LIBPATH' in building.Env: 156*10465441SEvalZero lib_path = building.Env['LIBPATH'] 157*10465441SEvalZero paths = set() 158*10465441SEvalZero for path in lib_path: 159*10465441SEvalZero inc = _make_path_relative(project_path, os.path.normpath(path)) 160*10465441SEvalZero paths.add(inc) #.replace('\\', '/') 161*10465441SEvalZero 162*10465441SEvalZero paths = [i for i in paths] 163*10465441SEvalZero paths.sort() 164*10465441SEvalZero lib_paths = ';'.join(paths) 165*10465441SEvalZero elem.set('AdditionalLibraryDirectories', lib_paths) 166*10465441SEvalZero 167*10465441SEvalZero xml_indent(root) 168*10465441SEvalZero out.write(etree.tostring(root, encoding='utf-8')) 169*10465441SEvalZero out.close() 170