1*10465441SEvalZero# 2*10465441SEvalZero# File : vs2012.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 uuid 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*10465441SEvalZeroimport utils 36*10465441SEvalZero 37*10465441SEvalZerofs_encoding = sys.getfilesystemencoding() 38*10465441SEvalZero 39*10465441SEvalZero#reference 40*10465441SEvalZero# http://woodpecker.org.cn/diveintopython3/xml.html 41*10465441SEvalZero# https://pycoders-weekly-chinese.readthedocs.org/en/latest/issue6/processing-xml-in-python-with-element-tree.html 42*10465441SEvalZero# http://www.cnblogs.com/ifantastic/archive/2013/04/12/3017110.html 43*10465441SEvalZero 44*10465441SEvalZerofilter_project = etree.Element('Project', attrib={'ToolsVersion':'4.0'}) 45*10465441SEvalZerodef get_uuid(): 46*10465441SEvalZero id = uuid.uuid1() # UUID('3e5526c0-2841-11e3-a376-20cf3048bcb3') 47*10465441SEvalZero idstr = id.get_urn()[9:] #'urn:uuid:3e5526c0-2841-11e3-a376-20cf3048bcb3'[9:] 48*10465441SEvalZero return '{'+idstr+'}' 49*10465441SEvalZero 50*10465441SEvalZerodef VS2012_AddGroup(parent, group_name, files, project_path): 51*10465441SEvalZero for f in files: 52*10465441SEvalZero fn = f.rfile() 53*10465441SEvalZero name = fn.name 54*10465441SEvalZero path = os.path.dirname(fn.abspath) 55*10465441SEvalZero 56*10465441SEvalZero path = _make_path_relative(project_path, path) 57*10465441SEvalZero path = os.path.join(path, name) 58*10465441SEvalZero 59*10465441SEvalZero ClCompile = SubElement(parent, 'ClCompile') 60*10465441SEvalZero ClCompile.set('Include', path.decode(fs_encoding)) 61*10465441SEvalZero 62*10465441SEvalZero Filter = SubElement(ClCompile, 'Filter') 63*10465441SEvalZero Filter.text='Source Files\\'+group_name 64*10465441SEvalZero 65*10465441SEvalZerodef VS2012_CreateFilter(script, project_path): 66*10465441SEvalZero c_ItemGroup = SubElement(filter_project, 'ItemGroup') 67*10465441SEvalZero filter_ItemGroup = SubElement(filter_project, 'ItemGroup') 68*10465441SEvalZero 69*10465441SEvalZero Filter = SubElement(filter_ItemGroup, 'Filter') 70*10465441SEvalZero Filter.set('Include', 'Source Files') 71*10465441SEvalZero UniqueIdentifier = SubElement(Filter, 'UniqueIdentifier') 72*10465441SEvalZero UniqueIdentifier.text = get_uuid() 73*10465441SEvalZero Extensions = SubElement(Filter, 'Extensions') 74*10465441SEvalZero Extensions.text = 'cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx' 75*10465441SEvalZero 76*10465441SEvalZero Filter = SubElement(filter_ItemGroup, 'Filter') 77*10465441SEvalZero Filter.set('Include', 'Header Files') 78*10465441SEvalZero UniqueIdentifier = SubElement(Filter, 'UniqueIdentifier') 79*10465441SEvalZero UniqueIdentifier.text = get_uuid() 80*10465441SEvalZero Extensions = SubElement(Filter, 'Extensions') 81*10465441SEvalZero Extensions.text = 'h;hpp;hxx;hm;inl;inc;xsd' 82*10465441SEvalZero for group in script: 83*10465441SEvalZero VS2012_AddGroup(c_ItemGroup, group['name'], group['src'], project_path) 84*10465441SEvalZero Filter = SubElement(filter_ItemGroup, 'Filter') 85*10465441SEvalZero Filter.set('Include', 'Source Files\\'+group['name']) 86*10465441SEvalZero UniqueIdentifier = SubElement(Filter, 'UniqueIdentifier') 87*10465441SEvalZero UniqueIdentifier.text = get_uuid() 88*10465441SEvalZero 89*10465441SEvalZero#program: object from scons 90*10465441SEvalZero# parent: xml node 91*10465441SEvalZero# file_type: C or H 92*10465441SEvalZero# files: c/h list 93*10465441SEvalZero# project_path 94*10465441SEvalZerodef VS_add_ItemGroup(parent, file_type, files, project_path): 95*10465441SEvalZero from building import Rtt_Root 96*10465441SEvalZero RTT_ROOT = os.path.normpath(Rtt_Root) 97*10465441SEvalZero 98*10465441SEvalZero file_dict = {'C':"ClCompile", 'H':'ClInclude'} 99*10465441SEvalZero item_tag = file_dict[file_type] 100*10465441SEvalZero 101*10465441SEvalZero ItemGroup = SubElement(parent, 'ItemGroup') 102*10465441SEvalZero for f in files: 103*10465441SEvalZero fn = f.rfile() 104*10465441SEvalZero name = fn.name 105*10465441SEvalZero path = os.path.dirname(fn.abspath) 106*10465441SEvalZero 107*10465441SEvalZero objpath = path.lower() 108*10465441SEvalZero if len(project_path) >= len(RTT_ROOT) : 109*10465441SEvalZero if objpath.startswith(project_path.lower()) : 110*10465441SEvalZero objpath = ''.join('bsp'+objpath[len(project_path):]) 111*10465441SEvalZero else : 112*10465441SEvalZero objpath = ''.join('kernel'+objpath[len(RTT_ROOT):]) 113*10465441SEvalZero else : 114*10465441SEvalZero if objpath.startswith(RTT_ROOT.lower()) : 115*10465441SEvalZero objpath = ''.join('kernel'+objpath[len(RTT_ROOT):]) 116*10465441SEvalZero else : 117*10465441SEvalZero objpath = ''.join('bsp'+objpath[len(project_path):]) 118*10465441SEvalZero path = _make_path_relative(project_path, path) 119*10465441SEvalZero path = os.path.join(path, name) 120*10465441SEvalZero 121*10465441SEvalZero File = SubElement(ItemGroup, item_tag) 122*10465441SEvalZero File.set('Include', path.decode(fs_encoding)) 123*10465441SEvalZero if file_type == 'C' : 124*10465441SEvalZero ObjName = SubElement(File, 'ObjectFileName') 125*10465441SEvalZero ObjName.text = ''.join('$(IntDir)'+objpath+'\\') 126*10465441SEvalZero 127*10465441SEvalZerodef VS_add_HeadFiles(program, elem, project_path): 128*10465441SEvalZero utils.source_ext = [] 129*10465441SEvalZero utils.source_ext = ["h"] 130*10465441SEvalZero for item in program: 131*10465441SEvalZero utils.walk_children(item) 132*10465441SEvalZero utils.source_list.sort() 133*10465441SEvalZero # print utils.source_list 134*10465441SEvalZero ItemGroup = SubElement(elem, 'ItemGroup') 135*10465441SEvalZero 136*10465441SEvalZero filter_h_ItemGroup = SubElement(filter_project, 'ItemGroup') 137*10465441SEvalZero for f in utils.source_list: 138*10465441SEvalZero path = _make_path_relative(project_path, f) 139*10465441SEvalZero File = SubElement(ItemGroup, 'ClInclude') 140*10465441SEvalZero File.set('Include', path.decode(fs_encoding)) 141*10465441SEvalZero 142*10465441SEvalZero # add project.vcxproj.filter 143*10465441SEvalZero ClInclude = SubElement(filter_h_ItemGroup, 'ClInclude') 144*10465441SEvalZero ClInclude.set('Include', path.decode(fs_encoding)) 145*10465441SEvalZero Filter = SubElement(ClInclude, 'Filter') 146*10465441SEvalZero Filter.text='Header Files' 147*10465441SEvalZero 148*10465441SEvalZerodef VS2012Project(target, script, program): 149*10465441SEvalZero project_path = os.path.dirname(os.path.abspath(target)) 150*10465441SEvalZero 151*10465441SEvalZero tree = etree.parse('template_vs2012.vcxproj') 152*10465441SEvalZero root = tree.getroot() 153*10465441SEvalZero elem = root 154*10465441SEvalZero 155*10465441SEvalZero out = file(target, 'wb') 156*10465441SEvalZero out.write('<?xml version="1.0" encoding="UTF-8"?>\r\n') 157*10465441SEvalZero 158*10465441SEvalZero ProjectFiles = [] 159*10465441SEvalZero 160*10465441SEvalZero # add "*.c or *.h" files 161*10465441SEvalZero 162*10465441SEvalZero VS2012_CreateFilter(script, project_path) 163*10465441SEvalZero # add "*.c" files 164*10465441SEvalZero for group in script: 165*10465441SEvalZero VS_add_ItemGroup(elem, 'C', group['src'], project_path) 166*10465441SEvalZero 167*10465441SEvalZero # add "*.h" files 168*10465441SEvalZero VS_add_HeadFiles(program, elem, project_path) 169*10465441SEvalZero 170*10465441SEvalZero # write head include path 171*10465441SEvalZero if 'CPPPATH' in building.Env: 172*10465441SEvalZero cpp_path = building.Env['CPPPATH'] 173*10465441SEvalZero paths = set() 174*10465441SEvalZero for path in cpp_path: 175*10465441SEvalZero inc = _make_path_relative(project_path, os.path.normpath(path)) 176*10465441SEvalZero paths.add(inc) #.replace('\\', '/') 177*10465441SEvalZero 178*10465441SEvalZero paths = [i for i in paths] 179*10465441SEvalZero paths.sort() 180*10465441SEvalZero cpp_path = ';'.join(paths) + ';%(AdditionalIncludeDirectories)' 181*10465441SEvalZero 182*10465441SEvalZero # write include path 183*10465441SEvalZero for elem in tree.iter(tag='AdditionalIncludeDirectories'): 184*10465441SEvalZero elem.text = cpp_path 185*10465441SEvalZero break 186*10465441SEvalZero 187*10465441SEvalZero # write cppdefinitons flags 188*10465441SEvalZero if 'CPPDEFINES' in building.Env: 189*10465441SEvalZero for elem in tree.iter(tag='PreprocessorDefinitions'): 190*10465441SEvalZero definitions = ';'.join(building.Env['CPPDEFINES']) + ';%(PreprocessorDefinitions)' 191*10465441SEvalZero elem.text = definitions 192*10465441SEvalZero break 193*10465441SEvalZero # write link flags 194*10465441SEvalZero 195*10465441SEvalZero # write lib dependence (Link) 196*10465441SEvalZero if 'LIBS' in building.Env: 197*10465441SEvalZero for elem in tree.iter(tag='AdditionalDependencies'): 198*10465441SEvalZero libs_with_extention = [i+'.lib' for i in building.Env['LIBS']] 199*10465441SEvalZero libs = ';'.join(libs_with_extention) + ';%(AdditionalDependencies)' 200*10465441SEvalZero elem.text = libs 201*10465441SEvalZero break 202*10465441SEvalZero 203*10465441SEvalZero # write lib include path 204*10465441SEvalZero if 'LIBPATH' in building.Env: 205*10465441SEvalZero lib_path = building.Env['LIBPATH'] 206*10465441SEvalZero paths = set() 207*10465441SEvalZero for path in lib_path: 208*10465441SEvalZero inc = _make_path_relative(project_path, os.path.normpath(path)) 209*10465441SEvalZero paths.add(inc) 210*10465441SEvalZero 211*10465441SEvalZero paths = [i for i in paths] 212*10465441SEvalZero paths.sort() 213*10465441SEvalZero lib_paths = ';'.join(paths) + ';%(AdditionalLibraryDirectories)' 214*10465441SEvalZero for elem in tree.iter(tag='AdditionalLibraryDirectories'): 215*10465441SEvalZero elem.text = lib_paths 216*10465441SEvalZero break 217*10465441SEvalZero 218*10465441SEvalZero xml_indent(root) 219*10465441SEvalZero vcxproj_string = etree.tostring(root, encoding='utf-8') 220*10465441SEvalZero root_node=r'<Project DefaultTargets="Build" ToolsVersion="4.0">' 221*10465441SEvalZero out.write(r'<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">') 222*10465441SEvalZero out.write(vcxproj_string[len(root_node):]) 223*10465441SEvalZero out.close() 224*10465441SEvalZero 225*10465441SEvalZero xml_indent(filter_project) 226*10465441SEvalZero filter_string = etree.tostring(filter_project, encoding='utf-8') 227*10465441SEvalZero out = file('project.vcxproj.filters', 'wb') 228*10465441SEvalZero out.write('<?xml version="1.0" encoding="UTF-8"?>\r\n') 229*10465441SEvalZero root_node=r'<Project ToolsVersion="4.0">' 230*10465441SEvalZero out.write(r'<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">') 231*10465441SEvalZero out.write(filter_string[len(root_node):]) 232*10465441SEvalZero out.close() 233*10465441SEvalZero 234