From 821ab3b9aadb6d612e9505306990fc81ac663a4a Mon Sep 17 00:00:00 2001 From: prife Date: Mon, 30 Sep 2013 00:09:06 +0800 Subject: [PATCH] scons script: support to generate vs2012 project xml rename template.vcproj to template_vs2005.vcproj add template_vs2012.vcxproj NOTE: the vs2012.py is ugly, just can work. --- ...template.vcproj => template_vs2005.vcproj} | 0 bsp/simulator/template_vs2012.vcxproj | 61 ++++++ tools/building.py | 6 + tools/vs.py | 2 +- tools/vs2012.py | 190 ++++++++++++++++++ 5 files changed, 258 insertions(+), 1 deletion(-) rename bsp/simulator/{template.vcproj => template_vs2005.vcproj} (100%) create mode 100644 bsp/simulator/template_vs2012.vcxproj create mode 100644 tools/vs2012.py diff --git a/bsp/simulator/template.vcproj b/bsp/simulator/template_vs2005.vcproj similarity index 100% rename from bsp/simulator/template.vcproj rename to bsp/simulator/template_vs2005.vcproj diff --git a/bsp/simulator/template_vs2012.vcxproj b/bsp/simulator/template_vs2012.vcxproj new file mode 100644 index 000000000..85e625e1b --- /dev/null +++ b/bsp/simulator/template_vs2012.vcxproj @@ -0,0 +1,61 @@ + + + + + Debug + Win32 + + + + vs + {4A6BF1B1-C645-4BAD-A9B7-7B6E3DB67B2C} + vs2008 + Win32Proj + + + + Application + v110 + NotSet + + + + + + + + + + <_ProjectFileVersion>11.0.50727.1 + + + $(SolutionDir)$(Configuration)\ + $(Configuration)\ + true + + + + Disabled + .\;..\..\include;..\..\bsp\vs2008;..\..\components\finsh;..\..\components\dfs\include;..\..\components\dfs\filesystems\uffs\src\inc\;..\..\components\dfs\filesystems\uffs;..\..\components\drivers\include;..\..\components\dfs\filesystems\jffs2\src;..\..\components\dfs\filesystems\jffs2\kernel;..\..\components\dfs\filesystems\jffs2\include;..\..\components\dfs\filesystems\jffs2\;..\..\components\dfs\filesystems\jffs2\cyg\compress;..\..\components\init;.\drivers;..\..\components\net\lwip\src\include\;..\..\components\net\lwip\src;..\..\components\net\lwip\src\arch\include;..\..\components\net\lwip\src\include\ipv4;.\pcap\Include;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_CONSOLE;MSVC;_TIME_T_DEFINED;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + + Level3 + EditAndContinue + + + winmm.lib;Packet.lib;wpcap.lib;%(AdditionalDependencies) + .\pcap\Lib;%(AdditionalLibraryDirectories) + true + Console + MachineX86 + + + + + + + + \ No newline at end of file diff --git a/tools/building.py b/tools/building.py index 65bd14d88..acc3a8a21 100644 --- a/tools/building.py +++ b/tools/building.py @@ -139,6 +139,7 @@ def PrepareBuilding(env, root_directory, has_libcpu=False, remove_components = [ 'mdk4':('keil', 'armcc'), 'iar':('iar', 'iar'), 'vs':('msvc', 'cl'), + 'vs2012':('msvc', 'cl'), 'cb':('keil', 'armcc')} tgt_name = GetOption('target') if tgt_name: @@ -347,12 +348,14 @@ def DoBuilding(target, objects): EndBuilding(target, program) + def EndBuilding(target, program = None): import rtconfig from keil import MDKProject from keil import MDK4Project from iar import IARProject from vs import VSProject + from vs2012 import VS2012Project from codeblocks import CBProject Env.AddPostAction(target, rtconfig.POST_ACTION) @@ -377,6 +380,9 @@ def EndBuilding(target, program = None): if GetOption('target') == 'vs': VSProject('project.vcproj', Projects, program) + if GetOption('target') == 'vs2012': + VS2012Project('project.vcxproj', Projects, program) + if GetOption('target') == 'cb': CBProject('project.cbp', Projects, program) diff --git a/tools/vs.py b/tools/vs.py index 1cb0f1a80..1dce0ddaa 100644 --- a/tools/vs.py +++ b/tools/vs.py @@ -40,7 +40,7 @@ def VS_AddHeadFilesGroup(program, elem, project_path): def VSProject(target, script, program): project_path = os.path.dirname(os.path.abspath(target)) - tree = etree.parse('template.vcproj') + tree = etree.parse('template_vs2005.vcproj') root = tree.getroot() out = file(target, 'wb') diff --git a/tools/vs2012.py b/tools/vs2012.py new file mode 100644 index 000000000..3e751e940 --- /dev/null +++ b/tools/vs2012.py @@ -0,0 +1,190 @@ +import os +import sys +import string +import building +import uuid + +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() + +#reference +# http://woodpecker.org.cn/diveintopython3/xml.html +# https://pycoders-weekly-chinese.readthedocs.org/en/latest/issue6/processing-xml-in-python-with-element-tree.html +# http://www.cnblogs.com/ifantastic/archive/2013/04/12/3017110.html + +filter_project = etree.Element('Project', attrib={'ToolsVersion':'4.0'}) +def get_uuid(): + id = uuid.uuid1() # UUID('3e5526c0-2841-11e3-a376-20cf3048bcb3') + idstr = id.get_urn()[9:] #'urn:uuid:3e5526c0-2841-11e3-a376-20cf3048bcb3'[9:] + return '{'+idstr+'}' + +def VS2012_AddGroup(parent, group_name, 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) + + ClCompile = SubElement(parent, 'ClCompile') + ClCompile.set('Include', path.decode(fs_encoding)) + + Filter = SubElement(ClCompile, 'Filter') + Filter.text='Source Files\\'+group_name + +def VS2012_CreateFilter(script, project_path): + c_ItemGroup = SubElement(filter_project, 'ItemGroup') + filter_ItemGroup = SubElement(filter_project, 'ItemGroup') + + Filter = SubElement(filter_ItemGroup, 'Filter') + Filter.set('Include', 'Source Files') + UniqueIdentifier = SubElement(Filter, 'UniqueIdentifier') + UniqueIdentifier.text = get_uuid() + Extensions = SubElement(Filter, 'Extensions') + Extensions.text = 'cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx' + + Filter = SubElement(filter_ItemGroup, 'Filter') + Filter.set('Include', 'Header Files') + UniqueIdentifier = SubElement(Filter, 'UniqueIdentifier') + UniqueIdentifier.text = get_uuid() + Extensions = SubElement(Filter, 'Extensions') + Extensions.text = 'h;hpp;hxx;hm;inl;inc;xsd' + for group in script: + VS2012_AddGroup(c_ItemGroup, group['name'], group['src'], project_path) + Filter = SubElement(filter_ItemGroup, 'Filter') + Filter.set('Include', 'Source Files\\'+group['name']) + UniqueIdentifier = SubElement(Filter, 'UniqueIdentifier') + UniqueIdentifier.text = get_uuid() + +#program: object from scons +# parent: xml node +# file_type: C or H +# files: c/h list +# project_path +def VS_add_ItemGroup(parent, file_type, files, project_path): + file_dict = {'C':"ClCompile", 'H':'ClInclude'} + item_tag = file_dict[file_type] + + ItemGroup = SubElement(parent, 'ItemGroup') + 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) + + File = SubElement(ItemGroup, item_tag) + File.set('Include', path.decode(fs_encoding)) + +def VS_add_HeadFiles(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 + ItemGroup = SubElement(elem, 'ItemGroup') + + filter_h_ItemGroup = SubElement(filter_project, 'ItemGroup') + for f in building.source_list: + path = _make_path_relative(project_path, f) + File = SubElement(ItemGroup, 'ClInclude') + File.set('Include', path.decode(fs_encoding)) + + # add project.vcxproj.filter + ClInclude = SubElement(filter_h_ItemGroup, 'ClInclude') + ClInclude.set('Include', path.decode(fs_encoding)) + Filter = SubElement(ClInclude, 'Filter') + Filter.text='Header Files' + +def VS2012Project(target, script, program): + project_path = os.path.dirname(os.path.abspath(target)) + + tree = etree.parse('template_vs2012.vcxproj') + root = tree.getroot() + elem = root + + out = file(target, 'wb') + out.write('\r\n') + + ProjectFiles = [] + + # add "*.c or *.h" files + + VS2012_CreateFilter(script, project_path) + # add "*.c" files + for group in script: + VS_add_ItemGroup(elem, 'C', group['src'], project_path) + + # add "*.h" files + VS_add_HeadFiles(program, elem, project_path) + + # 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() + cpp_path = ';'.join(paths) + ';%(AdditionalIncludeDirectories)' + + # write include path + for elem in tree.iter(tag='AdditionalIncludeDirectories'): + elem.text = cpp_path + break + + # write cppdefinitons flags + if building.Env.has_key('CPPDEFINES'): + for elem in tree.iter(tag='PreprocessorDefinitions'): + definitions = ';'.join(building.Env['CPPDEFINES']) + ';%(PreprocessorDefinitions)' + elem.text = definitions + break + # write link flags + + # write lib dependence (Link) + if building.Env.has_key('LIBS'): + for elem in tree.iter(tag='AdditionalDependencies'): + libs_with_extention = [i+'.lib' for i in building.Env['LIBS']] + libs = ';'.join(libs_with_extention) + ';%(AdditionalDependencies)' + elem.text = libs + break + + # 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) + + paths = [i for i in paths] + paths.sort() + lib_paths = ';'.join(paths) + ';%(AdditionalLibraryDirectories)' + for elem in tree.iter(tag='AdditionalLibraryDirectories'): + elem.text = lib_paths + break + + xml_indent(root) + vcxproj_string = etree.tostring(root, encoding='utf-8') + root_node=r'' + out.write(r'') + out.write(vcxproj_string[len(root_node):]) + out.close() + + xml_indent(filter_project) + filter_string = etree.tostring(filter_project, encoding='utf-8') + out = file('project.vcxproj.filters', 'wb') + out.write('\r\n') + root_node=r'' + out.write(r'') + out.write(filter_string[len(root_node):]) + out.close() + -- GitLab