[Libreoffice-commits] core.git: bin/gbuild-to-ide

jan Iversen jani at documentfoundation.org
Thu Jan 26 09:40:33 UTC 2017


 bin/gbuild-to-ide |  564 +++++++++++++++++++++++++++---------------------------
 1 file changed, 288 insertions(+), 276 deletions(-)

New commits:
commit fc68a2677006467455eb064c1ddc3666a660af7c
Author: jan Iversen <jani at documentfoundation.org>
Date:   Thu Jan 26 10:38:32 2017 +0100

    gbuild-to-ide finalized split of maintained code
    
    Added "testIde-ide-integration" to allow test of new vs2013 generator.
    
    Change-Id: Ia7d286f06e287ce97faa0a262ee4f93172d4ed28

diff --git a/bin/gbuild-to-ide b/bin/gbuild-to-ide
index 6d59d6a..3d9460c 100755
--- a/bin/gbuild-to-ide
+++ b/bin/gbuild-to-ide
@@ -75,9 +75,6 @@ class GbuildParser:
         return [cxxflag.strip() for cxxflag in GbuildParser._warningpattern.sub('', '%s %s' % (flagsline, flagslineappend)).split(' ') if len(cxxflag) > 1]
 
 
-
-
-
     def parse(self):
         # Relation between json object and file extension
         jsonSrc = {
@@ -154,6 +151,8 @@ class GbuildParser:
             headersof=[]
         return headersof
 
+
+
 class IdeIntegrationGenerator:
 
     def __init__(self, gbuildparser, ide):
@@ -162,7 +161,9 @@ class IdeIntegrationGenerator:
     def emit(self):
         pass
 
-class testide(IdeIntegrationGenerator):
+
+
+class testWinIde(IdeIntegrationGenerator):
 
     def __init__(self, gbuildparser, ide):
         IdeIntegrationGenerator.__init__(self, gbuildparser, ide)
@@ -415,6 +416,7 @@ class testide(IdeIntegrationGenerator):
         self.write_pretty_xml(proj_node, filters_path)
 
 
+
 class XcodeIntegrationGenerator(IdeIntegrationGenerator):
     def __init__(self, gbuildparser, ide):
         IdeIntegrationGenerator.__init__(self, gbuildparser, ide)
@@ -627,7 +629,281 @@ class XcodeIntegrationGenerator(IdeIntegrationGenerator):
                             'sourceTree': '<group>'}
         return objects
 
-# ---- LO supported ide -------
+
+
+class VisualStudioIntegrationGenerator(IdeIntegrationGenerator):
+
+    def __init__(self, gbuildparser, ide):
+        IdeIntegrationGenerator.__init__(self, gbuildparser, ide)
+        self.toolset = self.retrieve_toolset()
+        self.solution_directory = './windows'
+        self.configurations = {
+            'Build': {
+                'build': self.module_make_command('%(target)s'),
+                'clean': self.module_make_command('%(target)s.clean'),
+                'rebuild': self.module_make_command('%(target)s.clean %(target)s')
+            },
+            'Unit Tests': {
+                'build': self.module_make_command('unitcheck'),
+                'clean': self.module_make_command('clean'),
+                'rebuild': self.module_make_command('clean unitcheck'),
+            },
+            'Integration tests': {
+                'build': self.module_make_command('unitcheck slowcheck screenshot subsequentcheck'),
+                'clean': self.module_make_command('clean'),
+                'rebuild': self.module_make_command('clean unitcheck slowcheck screenshot subsequentcheck')
+            }
+        }
+
+    def retrieve_toolset(self):
+        return {'vs2013': 'v120', 'vs2015': 'v140'}.get(self.ide, None)
+
+    def module_make_command(self, targets):
+        return '%(sh)s -c "PATH=\\"/bin:$PATH\\";BUILDDIR=\\"%(builddir)s\\" %(makecmd)s -rsC %(location)s ' + targets + '"'
+
+    class Project:
+
+        def __init__(self, guid, target, project_path):
+            self.guid = guid
+            self.target = target
+            self.path = project_path
+
+    def emit(self):
+        all_projects = []
+        for module in self.gbuildparser.modules:
+            projects = []
+            module_directory = os.path.join(self.solution_directory, module)
+            if module != 'include': #FIXME
+                for target in self.gbuildparser.modules[module]['targets']:
+                    project_path = os.path.join(module_directory, '%s.vcxproj' % target['target_name'])
+                    project_guid = self.write_project(project_path, target)
+                    p = VisualStudioIntegrationGenerator.Project(project_guid, target, project_path)
+                    projects.append(p)
+                self.write_solution(os.path.join(module_directory, '%s.sln' % module), projects)
+                all_projects += projects
+
+        self.write_solution(os.path.join(self.solution_directory, 'LibreOffice.sln'), all_projects)
+
+    nmake_project_guid = '8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942'
+
+    def get_dependency_libs(self, linked_libs, library_projects):
+        dependency_libs = {}
+        for linked_lib in linked_libs:
+            for library_project in library_projects:
+                if library_project.target['name'] == linked_lib:
+                    dependency_libs[library_project.guid] = library_project
+        return dependency_libs
+
+    def write_solution(self, solution_path, projects):
+        print('Solution %s:' % os.path.splitext(os.path.basename(solution_path))[0], end='')
+        library_projects = [project for project in projects if project.target['build_type'] == 'Library']
+        with open(solution_path, 'w') as f:
+            f.write('Microsoft Visual Studio Solution File, Format Version 12.00\n')
+            for project in projects:
+                target = project.target
+                print(' %s' % target['target_name'], end='')
+                proj_path = os.path.relpath(project.path, os.path.abspath(os.path.dirname(solution_path)))
+                f.write('Project("{%s}") = "%s", "%s", "{%s}"\n' %
+                        (VisualStudioIntegrationGenerator.nmake_project_guid,
+                         target['target_name'], proj_path, project.guid))
+                libs_in_solution = self.get_dependency_libs(target['LINKED_LIBS'], library_projects)
+                if libs_in_solution:
+                    f.write('\tProjectSection(ProjectDependencies) = postProject\n')
+                    for lib_guid in libs_in_solution.keys():
+                        f.write('\t\t{%(guid)s} = {%(guid)s}\n' % {'guid': lib_guid})
+                    f.write('\tEndProjectSection\n')
+                f.write('EndProject\n')
+            f.write('Global\n')
+            platform = 'Win32'
+            f.write('\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n')
+            for cfg in self.configurations:
+                f.write('\t\t%(cfg)s|%(platform)s = %(cfg)s|%(platform)s\n' % {'cfg': cfg, 'platform': platform})
+            f.write('\tEndGlobalSection\n')
+            f.write('\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n')
+            # Specifies project configurations for solution configuration
+            for project in projects:
+                for cfg in self.configurations:
+                    params = {'guid': project.guid, 'sol_cfg': cfg, 'proj_cfg': cfg, 'platform': platform}
+                    f.write('\t\t{%(guid)s}.%(sol_cfg)s|%(platform)s.ActiveCfg = %(proj_cfg)s|%(platform)s\n' % params)
+                    # Build.0 is basically 'Build checkbox' in configuration manager
+                    f.write('\t\t{%(guid)s}.%(sol_cfg)s|%(platform)s.Build.0 = %(proj_cfg)s|%(platform)s\n' % params)
+            f.write('\tEndGlobalSection\n')
+            f.write('EndGlobal\n')
+        print('')
+
+    def write_project(self, project_path, target):
+        # See info at http://blogs.msdn.com/b/visualstudio/archive/2010/05/14/a-guide-to-vcxproj-and-props-file-structure.aspx
+        folder = os.path.dirname(project_path)
+        if not os.path.exists(folder):
+            os.makedirs(folder)
+        project_guid = str(uuid.uuid4()).upper()
+        ns = 'http://schemas.microsoft.com/developer/msbuild/2003'
+        ET.register_namespace('', ns)
+        proj_node = ET.Element('{%s}Project' % ns, DefaultTargets='Build', ToolsVersion='4.0')
+        proj_confs_node = ET.SubElement(proj_node, '{%s}ItemGroup' % ns, Label='ProjectConfigurations')
+        platform = 'Win32'
+        for configuration in self.configurations:
+            proj_conf_node = ET.SubElement(proj_confs_node,
+                                           '{%s}ProjectConfiguration' % ns,
+                                           Include='%s|%s' % (configuration, platform))
+            conf_node = ET.SubElement(proj_conf_node, '{%s}Configuration' % ns)
+            conf_node.text = configuration
+            platform_node = ET.SubElement(proj_conf_node, '{%s}Platform' % ns)
+            platform_node.text = platform
+
+        globals_node = ET.SubElement(proj_node, '{%s}PropertyGroup' % ns, Label='Globals')
+        proj_guid_node = ET.SubElement(globals_node, '{%s}ProjectGuid' % ns)
+        proj_guid_node.text = '{%s}' % project_guid
+        proj_keyword_node = ET.SubElement(globals_node, '{%s}Keyword' % ns)
+        proj_keyword_node.text = 'MakeFileProj'
+        proj_name_node = ET.SubElement(globals_node, '{%s}ProjectName' % ns)
+        proj_name_node.text = target['target_name']
+
+        ET.SubElement(proj_node, '{%s}Import' % ns, Project='$(VCTargetsPath)\Microsoft.Cpp.Default.props')
+        for configuration in self.configurations:
+            conf_node = ET.SubElement(proj_node, '{%s}PropertyGroup' % ns, Label="Configuration",
+                                      Condition="'$(Configuration)|$(Platform)'=='%s|%s'" % (configuration, platform))
+            # Type of project used by the MSBuild to determine build process, see Microsoft.Makefile.targets
+            conf_type_node = ET.SubElement(conf_node, '{%s}ConfigurationType' % ns)
+            conf_type_node.text = 'Makefile'
+            # VS2012: I need to have this otherwise the names of projects will contain text Visual Studio 2010 in the Solution Explorer
+            platform_toolset_node = ET.SubElement(conf_node, '{%s}PlatformToolset' % ns)
+            platform_toolset_node.text = self.toolset
+
+        ET.SubElement(proj_node, '{%s}Import' % ns, Project='$(VCTargetsPath)\Microsoft.Cpp.props')
+        ET.SubElement(proj_node, '{%s}ImportGroup' % ns, Label='ExtensionSettings')
+        for configuration in self.configurations:
+            prop_sheets_node = ET.SubElement(proj_node, '{%s}ImportGroup' % ns, Label='Configuration',
+                                             Condition="'$(Configuration)|$(Platform)'=='%s|%s'" % (configuration, platform))
+            ET.SubElement(prop_sheets_node, '{%s}Import' % ns,
+                          Project='$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props',
+                          Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')",
+                          Label='LocalAppDataPlatform')
+
+        ET.SubElement(proj_node, '{%s}PropertyGroup' % ns, Label='UserMacros')
+        for cfg_name, cfg_targets in self.configurations.items():
+            conf_node = ET.SubElement(proj_node, '{%s}PropertyGroup' % ns,
+                                      Condition="'$(Configuration)|$(Platform)'=='%s|%s'" % (cfg_name, platform))
+            nmake_params = {
+                'sh': os.path.join(self.gbuildparser.binpath, 'dash.exe'),
+                'builddir': self.gbuildparser.builddir,
+                'location': target['location'],
+                'makecmd': self.gbuildparser.makecmd,
+                'target': target['target_name']}
+            nmake_build_node = ET.SubElement(conf_node, '{%s}NMakeBuildCommandLine' % ns)
+            nmake_build_node.text = cfg_targets['build'] % nmake_params
+            nmake_clean_node = ET.SubElement(conf_node, '{%s}NMakeCleanCommandLine' % ns)
+            nmake_clean_node.text = cfg_targets['clean'] % nmake_params
+            nmake_rebuild_node = ET.SubElement(conf_node, '{%s}NMakeReBuildCommandLine' % ns)
+            nmake_rebuild_node.text = cfg_targets['rebuild'] % nmake_params
+            nmake_output_node = ET.SubElement(conf_node, '{%s}NMakeOutput' % ns)
+            nmake_output_node.text = os.path.join(self.gbuildparser.instdir, 'program', 'soffice.exe')
+            nmake_defs_node = ET.SubElement(conf_node, '{%s}NMakePreprocessorDefinitions' % ns)
+            nmake_defs_node.text = ';'.join(list(target['DEFS']) + ['$(NMakePreprocessorDefinitions)'])
+            include_path_node = ET.SubElement(conf_node, '{%s}IncludePath' % ns)
+            include_path_node.text = ';'.join(target['include'] + ['$(IncludePath)'])
+
+        ET.SubElement(proj_node, '{%s}ItemDefinitionGroup' % ns)
+
+        cxxobjects_node = ET.SubElement(proj_node, '{%s}ItemGroup' % ns)
+        for cxxobject in target['CXXOBJECTS']:
+            cxxabspath = os.path.join(self.gbuildparser.srcdir, cxxobject)
+            cxxfile = cxxabspath + '.cxx'
+            if os.path.isfile(cxxfile):
+                ET.SubElement(cxxobjects_node, '{%s}ClCompile' % ns, Include='../../' + cxxobject + '.cxx')
+            else:
+                print('Source %s in project %s does not exist' % (cxxfile, target['target_name']))
+
+        includes_node = ET.SubElement(proj_node, '{%s}ItemGroup' % ns)
+        for cxxobject in target['CXXOBJECTS']:
+            include_abs_path = os.path.join(self.gbuildparser.srcdir, cxxobject)
+            hxxfile = include_abs_path + '.hxx'
+            if os.path.isfile(hxxfile):
+                ET.SubElement(includes_node, '{%s}ClInclude' % ns, Include='../../' + cxxobject + '.hxx')
+            # Few files have corresponding .h files
+            hfile = include_abs_path + '.h'
+            if os.path.isfile(hfile):
+                ET.SubElement(includes_node, '{%s}ClInclude' % ns, Include='../../' + cxxobject + '.h')
+        ET.SubElement(proj_node, '{%s}Import' % ns, Project='$(VCTargetsPath)\Microsoft.Cpp.targets')
+        ET.SubElement(proj_node, '{%s}ImportGroup' % ns, Label='ExtensionTargets')
+        self.write_pretty_xml(proj_node, project_path)
+        self.write_filters(project_path + '.filters',
+                           os.path.join(self.gbuildparser.srcdir, os.path.basename(target['location'])),
+                           [cxx_node.get('Include') for cxx_node in cxxobjects_node.findall('{%s}ClCompile' % ns)],
+                           [include_node.get('Include') for include_node in includes_node.findall('{%s}ClInclude' % ns)])
+        return project_guid
+
+    def get_filter(self, module_dir, proj_file):
+        return '\\'.join(os.path.relpath(proj_file, module_dir).split('/')[:-1])
+
+    def get_subfilters(self, proj_filter):
+        parts = proj_filter.split('\\')
+        subfilters = set([proj_filter])
+        for i in range(1, len(parts)):
+            subfilters.add('\\'.join(parts[:i]))
+        return subfilters
+
+    def write_pretty_xml(self, node, file_path):
+        xml_str = ET.tostring(node, encoding='unicode')
+        pretty_str = minidom.parseString(xml_str).toprettyxml(encoding='utf-8')
+        with open(file_path, 'w') as f:
+            f.write(pretty_str.decode())
+
+    def add_nodes(self, files_node, module_dir, tag, project_files):
+        ns = 'http://schemas.microsoft.com/developer/msbuild/2003'
+        filters = set()
+        for project_file in project_files:
+            file_node = ET.SubElement(files_node, tag, Include=project_file)
+            if os.path.commonprefix([module_dir, project_file]) == module_dir:
+                project_filter = self.get_filter(module_dir, project_file)
+                filter_node = ET.SubElement(file_node, '{%s}Filter' % ns)
+                filter_node.text = project_filter
+                filters |= self.get_subfilters(project_filter)
+        return filters
+
+    def write_filters(self, filters_path, module_dir, compile_files, include_files):
+        ns = 'http://schemas.microsoft.com/developer/msbuild/2003'
+        ET.register_namespace('', ns)
+        proj_node = ET.Element('{%s}Project' % ns, ToolsVersion='4.0')
+        filters = set()
+        compiles_node = ET.SubElement(proj_node, '{%s}ItemGroup' % ns)
+        filters |= self.add_nodes(compiles_node, module_dir, '{%s}ClCompile' % ns, compile_files)
+        include_node = ET.SubElement(proj_node, '{%s}ItemGroup' % ns)
+        filters |= self.add_nodes(include_node, module_dir, '{%s}ClInclude' % ns, include_files)
+
+        filters_node = ET.SubElement(proj_node, '{%s}ItemGroup' % ns)
+        for proj_filter in filters:
+            filter_node = ET.SubElement(filters_node, '{%s}Filter' % ns, Include=proj_filter)
+            filter_id_node = ET.SubElement(filter_node, '{%s}UniqueIdentifier' % ns)
+            filter_id_node.text = '{%s}' % str(uuid.uuid4())
+        self.write_pretty_xml(proj_node, filters_path)
+
+
+class DebugIntegrationGenerator(IdeIntegrationGenerator):
+
+    def __init__(self, gbuildparser, ide):
+        IdeIntegrationGenerator.__init__(self, gbuildparser, ide)
+
+    def emit(self):
+        print(self.gbuildparser.srcdir)
+        print(self.gbuildparser.builddir)
+        for f in self.gbuildparser.modules:
+            for j in self.gbuildparser.modules[f]['targets']:
+                print(j)
+
+        VisualStudioIntegrationGenerator(self.gbuildparser, self.ide).emit()
+        XcodeIntegrationGenerator(self.gbuildparser, self.ide).emit()
+
+        EclipseCDTIntegrationGenerator(self.gbuildparser, self.ide).emit()
+        KdevelopIntegrationGenerator(self.gbuildparser, self.ide).emit()
+        VimIntegrationGenerator(self.gbuildparser, self.ide).emit()
+        QtCreatorIntegrationGenerator(self.gbuildparser, self.ide).emit()
+
+
+
+# ---- Classes below this point are not actively maintained -------
+
+
 
 class EclipseCDTIntegrationGenerator(IdeIntegrationGenerator):
 
@@ -761,27 +1037,8 @@ class EclipseCDTIntegrationGenerator(IdeIntegrationGenerator):
                     self.target_path[path].append([target])
         self.create_include_path()
         self.create_macros()
-        self.create_settings_file()
-
-class DebugIntegrationGenerator(IdeIntegrationGenerator):
-
-    def __init__(self, gbuildparser, ide):
-        IdeIntegrationGenerator.__init__(self, gbuildparser, ide)
-
-    def emit(self):
-        print(self.gbuildparser.srcdir)
-        print(self.gbuildparser.builddir)
-        for f in self.gbuildparser.modules:
-            for j in self.gbuildparser.modules[f]['targets']:
-                print(j)
-
-        VisualStudioIntegrationGenerator(self.gbuildparser, self.ide).emit()
-        XcodeIntegrationGenerator(self.gbuildparser, self.ide).emit()
-
-        EclipseCDTIntegrationGenerator(self.gbuildparser, self.ide).emit()
-        KdevelopIntegrationGenerator(self.gbuildparser, self.ide).emit()
-        VimIntegrationGenerator(self.gbuildparser, self.ide).emit()
-        QtCreatorIntegrationGenerator(self.gbuildparser, self.ide).emit()
+        self.create_settings_file()
+
 
 
 class VimIntegrationGenerator(IdeIntegrationGenerator):
@@ -832,6 +1089,7 @@ class VimIntegrationGenerator(IdeIntegrationGenerator):
         return command
 
 
+
 class KdevelopIntegrationGenerator(IdeIntegrationGenerator):
 
     def encode_int(self, i):
@@ -1008,256 +1266,6 @@ VersionControl=kdevgit
 
 
 
-
-
-class VisualStudioIntegrationGenerator(IdeIntegrationGenerator):
-
-    def __init__(self, gbuildparser, ide):
-        IdeIntegrationGenerator.__init__(self, gbuildparser, ide)
-        self.toolset = self.retrieve_toolset()
-        self.solution_directory = './windows'
-        self.configurations = {
-            'Build': {
-                'build': self.module_make_command('%(target)s'),
-                'clean': self.module_make_command('%(target)s.clean'),
-                'rebuild': self.module_make_command('%(target)s.clean %(target)s')
-            },
-            'Unit Tests': {
-                'build': self.module_make_command('unitcheck'),
-                'clean': self.module_make_command('clean'),
-                'rebuild': self.module_make_command('clean unitcheck'),
-            },
-            'Integration tests': {
-                'build': self.module_make_command('unitcheck slowcheck screenshot subsequentcheck'),
-                'clean': self.module_make_command('clean'),
-                'rebuild': self.module_make_command('clean unitcheck slowcheck screenshot subsequentcheck')
-            }
-        }
-
-    def retrieve_toolset(self):
-        return {'vs2013': 'v120', 'vs2015': 'v140'}.get(self.ide, None)
-
-    def module_make_command(self, targets):
-        return '%(sh)s -c "PATH=\\"/bin:$PATH\\";BUILDDIR=\\"%(builddir)s\\" %(makecmd)s -rsC %(location)s ' + targets + '"'
-
-    class Project:
-
-        def __init__(self, guid, target, project_path):
-            self.guid = guid
-            self.target = target
-            self.path = project_path
-
-    def emit(self):
-        all_projects = []
-        for module in self.gbuildparser.modules:
-            projects = []
-            module_directory = os.path.join(self.solution_directory, module)
-            if module != 'include': #FIXME
-                for target in self.gbuildparser.modules[module]['targets']:
-                    project_path = os.path.join(module_directory, '%s.vcxproj' % target['target_name'])
-                    project_guid = self.write_project(project_path, target)
-                    p = VisualStudioIntegrationGenerator.Project(project_guid, target, project_path)
-                    projects.append(p)
-                self.write_solution(os.path.join(module_directory, '%s.sln' % module), projects)
-                all_projects += projects
-
-        self.write_solution(os.path.join(self.solution_directory, 'LibreOffice.sln'), all_projects)
-
-    nmake_project_guid = '8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942'
-
-    def get_dependency_libs(self, linked_libs, library_projects):
-        dependency_libs = {}
-        for linked_lib in linked_libs:
-            for library_project in library_projects:
-                if library_project.target['name'] == linked_lib:
-                    dependency_libs[library_project.guid] = library_project
-        return dependency_libs
-
-    def write_solution(self, solution_path, projects):
-        print('Solution %s:' % os.path.splitext(os.path.basename(solution_path))[0], end='')
-        library_projects = [project for project in projects if project.target['build_type'] == 'Library']
-        with open(solution_path, 'w') as f:
-            f.write('Microsoft Visual Studio Solution File, Format Version 12.00\n')
-            for project in projects:
-                target = project.target
-                print(' %s' % target['target_name'], end='')
-                proj_path = os.path.relpath(project.path, os.path.abspath(os.path.dirname(solution_path)))
-                f.write('Project("{%s}") = "%s", "%s", "{%s}"\n' %
-                        (VisualStudioIntegrationGenerator.nmake_project_guid,
-                         target['target_name'], proj_path, project.guid))
-                libs_in_solution = self.get_dependency_libs(target['LINKED_LIBS'], library_projects)
-                if libs_in_solution:
-                    f.write('\tProjectSection(ProjectDependencies) = postProject\n')
-                    for lib_guid in libs_in_solution.keys():
-                        f.write('\t\t{%(guid)s} = {%(guid)s}\n' % {'guid': lib_guid})
-                    f.write('\tEndProjectSection\n')
-                f.write('EndProject\n')
-            f.write('Global\n')
-            platform = 'Win32'
-            f.write('\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n')
-            for cfg in self.configurations:
-                f.write('\t\t%(cfg)s|%(platform)s = %(cfg)s|%(platform)s\n' % {'cfg': cfg, 'platform': platform})
-            f.write('\tEndGlobalSection\n')
-            f.write('\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n')
-            # Specifies project configurations for solution configuration
-            for project in projects:
-                for cfg in self.configurations:
-                    params = {'guid': project.guid, 'sol_cfg': cfg, 'proj_cfg': cfg, 'platform': platform}
-                    f.write('\t\t{%(guid)s}.%(sol_cfg)s|%(platform)s.ActiveCfg = %(proj_cfg)s|%(platform)s\n' % params)
-                    # Build.0 is basically 'Build checkbox' in configuration manager
-                    f.write('\t\t{%(guid)s}.%(sol_cfg)s|%(platform)s.Build.0 = %(proj_cfg)s|%(platform)s\n' % params)
-            f.write('\tEndGlobalSection\n')
-            f.write('EndGlobal\n')
-        print('')
-
-    def write_project(self, project_path, target):
-        # See info at http://blogs.msdn.com/b/visualstudio/archive/2010/05/14/a-guide-to-vcxproj-and-props-file-structure.aspx
-        folder = os.path.dirname(project_path)
-        if not os.path.exists(folder):
-            os.makedirs(folder)
-        project_guid = str(uuid.uuid4()).upper()
-        ns = 'http://schemas.microsoft.com/developer/msbuild/2003'
-        ET.register_namespace('', ns)
-        proj_node = ET.Element('{%s}Project' % ns, DefaultTargets='Build', ToolsVersion='4.0')
-        proj_confs_node = ET.SubElement(proj_node, '{%s}ItemGroup' % ns, Label='ProjectConfigurations')
-        platform = 'Win32'
-        for configuration in self.configurations:
-            proj_conf_node = ET.SubElement(proj_confs_node,
-                                           '{%s}ProjectConfiguration' % ns,
-                                           Include='%s|%s' % (configuration, platform))
-            conf_node = ET.SubElement(proj_conf_node, '{%s}Configuration' % ns)
-            conf_node.text = configuration
-            platform_node = ET.SubElement(proj_conf_node, '{%s}Platform' % ns)
-            platform_node.text = platform
-
-        globals_node = ET.SubElement(proj_node, '{%s}PropertyGroup' % ns, Label='Globals')
-        proj_guid_node = ET.SubElement(globals_node, '{%s}ProjectGuid' % ns)
-        proj_guid_node.text = '{%s}' % project_guid
-        proj_keyword_node = ET.SubElement(globals_node, '{%s}Keyword' % ns)
-        proj_keyword_node.text = 'MakeFileProj'
-        proj_name_node = ET.SubElement(globals_node, '{%s}ProjectName' % ns)
-        proj_name_node.text = target['target_name']
-
-        ET.SubElement(proj_node, '{%s}Import' % ns, Project='$(VCTargetsPath)\Microsoft.Cpp.Default.props')
-        for configuration in self.configurations:
-            conf_node = ET.SubElement(proj_node, '{%s}PropertyGroup' % ns, Label="Configuration",
-                                      Condition="'$(Configuration)|$(Platform)'=='%s|%s'" % (configuration, platform))
-            # Type of project used by the MSBuild to determine build process, see Microsoft.Makefile.targets
-            conf_type_node = ET.SubElement(conf_node, '{%s}ConfigurationType' % ns)
-            conf_type_node.text = 'Makefile'
-            # VS2012: I need to have this otherwise the names of projects will contain text Visual Studio 2010 in the Solution Explorer
-            platform_toolset_node = ET.SubElement(conf_node, '{%s}PlatformToolset' % ns)
-            platform_toolset_node.text = self.toolset
-
-        ET.SubElement(proj_node, '{%s}Import' % ns, Project='$(VCTargetsPath)\Microsoft.Cpp.props')
-        ET.SubElement(proj_node, '{%s}ImportGroup' % ns, Label='ExtensionSettings')
-        for configuration in self.configurations:
-            prop_sheets_node = ET.SubElement(proj_node, '{%s}ImportGroup' % ns, Label='Configuration',
-                                             Condition="'$(Configuration)|$(Platform)'=='%s|%s'" % (configuration, platform))
-            ET.SubElement(prop_sheets_node, '{%s}Import' % ns,
-                          Project='$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props',
-                          Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')",
-                          Label='LocalAppDataPlatform')
-
-        ET.SubElement(proj_node, '{%s}PropertyGroup' % ns, Label='UserMacros')
-        for cfg_name, cfg_targets in self.configurations.items():
-            conf_node = ET.SubElement(proj_node, '{%s}PropertyGroup' % ns,
-                                      Condition="'$(Configuration)|$(Platform)'=='%s|%s'" % (cfg_name, platform))
-            nmake_params = {
-                'sh': os.path.join(self.gbuildparser.binpath, 'dash.exe'),
-                'builddir': self.gbuildparser.builddir,
-                'location': target['location'],
-                'makecmd': self.gbuildparser.makecmd,
-                'target': target['target_name']}
-            nmake_build_node = ET.SubElement(conf_node, '{%s}NMakeBuildCommandLine' % ns)
-            nmake_build_node.text = cfg_targets['build'] % nmake_params
-            nmake_clean_node = ET.SubElement(conf_node, '{%s}NMakeCleanCommandLine' % ns)
-            nmake_clean_node.text = cfg_targets['clean'] % nmake_params
-            nmake_rebuild_node = ET.SubElement(conf_node, '{%s}NMakeReBuildCommandLine' % ns)
-            nmake_rebuild_node.text = cfg_targets['rebuild'] % nmake_params
-            nmake_output_node = ET.SubElement(conf_node, '{%s}NMakeOutput' % ns)
-            nmake_output_node.text = os.path.join(self.gbuildparser.instdir, 'program', 'soffice.exe')
-            nmake_defs_node = ET.SubElement(conf_node, '{%s}NMakePreprocessorDefinitions' % ns)
-            nmake_defs_node.text = ';'.join(list(target['DEFS']) + ['$(NMakePreprocessorDefinitions)'])
-            include_path_node = ET.SubElement(conf_node, '{%s}IncludePath' % ns)
-            include_path_node.text = ';'.join(target['include'] + ['$(IncludePath)'])
-
-        ET.SubElement(proj_node, '{%s}ItemDefinitionGroup' % ns)
-
-        cxxobjects_node = ET.SubElement(proj_node, '{%s}ItemGroup' % ns)
-        for cxxobject in target['CXXOBJECTS']:
-            cxxabspath = os.path.join(self.gbuildparser.srcdir, cxxobject)
-            cxxfile = cxxabspath + '.cxx'
-            if os.path.isfile(cxxfile):
-                ET.SubElement(cxxobjects_node, '{%s}ClCompile' % ns, Include='../../' + cxxobject + '.cxx')
-            else:
-                print('Source %s in project %s does not exist' % (cxxfile, target['target_name']))
-
-        includes_node = ET.SubElement(proj_node, '{%s}ItemGroup' % ns)
-        for cxxobject in target['CXXOBJECTS']:
-            include_abs_path = os.path.join(self.gbuildparser.srcdir, cxxobject)
-            hxxfile = include_abs_path + '.hxx'
-            if os.path.isfile(hxxfile):
-                ET.SubElement(includes_node, '{%s}ClInclude' % ns, Include='../../' + cxxobject + '.hxx')
-            # Few files have corresponding .h files
-            hfile = include_abs_path + '.h'
-            if os.path.isfile(hfile):
-                ET.SubElement(includes_node, '{%s}ClInclude' % ns, Include='../../' + cxxobject + '.h')
-        ET.SubElement(proj_node, '{%s}Import' % ns, Project='$(VCTargetsPath)\Microsoft.Cpp.targets')
-        ET.SubElement(proj_node, '{%s}ImportGroup' % ns, Label='ExtensionTargets')
-        self.write_pretty_xml(proj_node, project_path)
-        self.write_filters(project_path + '.filters',
-                           os.path.join(self.gbuildparser.srcdir, os.path.basename(target['location'])),
-                           [cxx_node.get('Include') for cxx_node in cxxobjects_node.findall('{%s}ClCompile' % ns)],
-                           [include_node.get('Include') for include_node in includes_node.findall('{%s}ClInclude' % ns)])
-        return project_guid
-
-    def get_filter(self, module_dir, proj_file):
-        return '\\'.join(os.path.relpath(proj_file, module_dir).split('/')[:-1])
-
-    def get_subfilters(self, proj_filter):
-        parts = proj_filter.split('\\')
-        subfilters = set([proj_filter])
-        for i in range(1, len(parts)):
-            subfilters.add('\\'.join(parts[:i]))
-        return subfilters
-
-    def write_pretty_xml(self, node, file_path):
-        xml_str = ET.tostring(node, encoding='unicode')
-        pretty_str = minidom.parseString(xml_str).toprettyxml(encoding='utf-8')
-        with open(file_path, 'w') as f:
-            f.write(pretty_str.decode())
-
-    def add_nodes(self, files_node, module_dir, tag, project_files):
-        ns = 'http://schemas.microsoft.com/developer/msbuild/2003'
-        filters = set()
-        for project_file in project_files:
-            file_node = ET.SubElement(files_node, tag, Include=project_file)
-            if os.path.commonprefix([module_dir, project_file]) == module_dir:
-                project_filter = self.get_filter(module_dir, project_file)
-                filter_node = ET.SubElement(file_node, '{%s}Filter' % ns)
-                filter_node.text = project_filter
-                filters |= self.get_subfilters(project_filter)
-        return filters
-
-    def write_filters(self, filters_path, module_dir, compile_files, include_files):
-        ns = 'http://schemas.microsoft.com/developer/msbuild/2003'
-        ET.register_namespace('', ns)
-        proj_node = ET.Element('{%s}Project' % ns, ToolsVersion='4.0')
-        filters = set()
-        compiles_node = ET.SubElement(proj_node, '{%s}ItemGroup' % ns)
-        filters |= self.add_nodes(compiles_node, module_dir, '{%s}ClCompile' % ns, compile_files)
-        include_node = ET.SubElement(proj_node, '{%s}ItemGroup' % ns)
-        filters |= self.add_nodes(include_node, module_dir, '{%s}ClInclude' % ns, include_files)
-
-        filters_node = ET.SubElement(proj_node, '{%s}ItemGroup' % ns)
-        for proj_filter in filters:
-            filter_node = ET.SubElement(filters_node, '{%s}Filter' % ns, Include=proj_filter)
-            filter_id_node = ET.SubElement(filter_node, '{%s}UniqueIdentifier' % ns)
-            filter_id_node.text = '{%s}' % str(uuid.uuid4())
-        self.write_pretty_xml(proj_node, filters_path)
-
-
 class QtCreatorIntegrationGenerator(IdeIntegrationGenerator):
 
     def __init__(self, gbuildparser, ide):
@@ -1895,6 +1903,8 @@ DEFINES += %(defines)s
 SUBDIRS = %(subdirs)s
 """
 
+
+
 class CodeliteIntegrationGenerator(IdeIntegrationGenerator):
 
     def __init__(self, gbuildparser, ide):
@@ -1974,6 +1984,7 @@ def get_options():
     return parser.parse_args()
 
 
+
 if __name__ == '__main__':
     args = get_options()
     # FIXME: Hack
@@ -1988,6 +1999,7 @@ if __name__ == '__main__':
         'vs2013': VisualStudioIntegrationGenerator,
         'xcode': XcodeIntegrationGenerator,
         'debug': DebugIntegrationGenerator,
+        'testIde': testWinIde,
 
         # Old platforms
         'eclipsecdt': EclipseCDTIntegrationGenerator,


More information about the Libreoffice-commits mailing list