private string GenerateSolution()

in Sharpmake.Generators/Generic/Makefile.cs [94:196]


        private string GenerateSolution(
            Builder builder,
            Solution solution,
            List<Solution.Configuration> configurations,
            string solutionPath,
            string solutionFile,
            out bool updated)
        {
            FileInfo solutionFileInfo = new FileInfo(Util.GetCapitalizedPath(solutionPath + Path.DirectorySeparatorChar + solutionFile + MakeExtension));
            bool projectsWereFiltered = false;
            List<Solution.ResolvedProject> solutionProjects = solution.GetResolvedProjects(configurations, out projectsWereFiltered).ToList();
            solutionProjects.Sort((a, b) => string.Compare(a.ProjectName, b.ProjectName)); // Ensure all projects are always in the same order to avoid random shuffles

            if (solutionProjects.Count == 0)
            {
                // Erase solution file if solution has no projects.
                updated = solutionFileInfo.Exists;
                if (updated)
                    Util.TryDeleteFile(solutionFileInfo.FullName);
                return solutionFileInfo.FullName;
            }

            // Write it all in memory to not overwrite if no changes detected.
            var fileGenerator = new FileGenerator();
            using (fileGenerator.Declare("defaultConfig", configurations[0].Name.ToLower()))
            {
                fileGenerator.Write(Template.Solution.Header);
            }

            fileGenerator.WriteVerbatim(Template.Solution.ProjectsVariableBegin);
            foreach (Solution.ResolvedProject resolvedProject in solutionProjects)
            {
                using (fileGenerator.Declare("projectName", resolvedProject.ProjectName))
                {
                    fileGenerator.Write(Template.Solution.ProjectsVariableElement);
                }
            }
            fileGenerator.WriteVerbatim(Template.Solution.ProjectsVariableEnd);

            fileGenerator.WriteVerbatim(Template.Solution.PhonyTargets);

            fileGenerator.WriteVerbatim(Template.Solution.AllRule);

            // Projects rules
            foreach (Solution.ResolvedProject resolvedProject in solutionProjects)
            {
                FileInfo projectFileInfo = new FileInfo(resolvedProject.ProjectFile);
                using (fileGenerator.Declare("projectName", resolvedProject.ProjectName))
                using (fileGenerator.Declare("projectFileDirectory", PathMakeUnix(Util.PathGetRelative(solutionFileInfo.DirectoryName, projectFileInfo.DirectoryName), false)))
                using (fileGenerator.Declare("projectFileName", projectFileInfo.Name))
                {
                    fileGenerator.Write(Template.Solution.ProjectRuleBegin);
                    foreach (Solution.ResolvedProject resolvedDependency in resolvedProject.Dependencies)
                    {
                        using (fileGenerator.Declare("dependencyName", resolvedDependency.ProjectName))
                        {
                            fileGenerator.Write(Template.Solution.ProjectRuleDependency);
                        }
                    }
                    fileGenerator.Write(Template.Solution.ProjectRuleEnd);
                }
            }

            // Clean rule
            fileGenerator.WriteVerbatim(Template.Solution.CleanRuleBegin);
            foreach (Solution.ResolvedProject resolvedProject in solutionProjects)
            {
                FileInfo projectFileInfo = new FileInfo(resolvedProject.ProjectFile);
                using (fileGenerator.Declare("projectFileDirectory", PathMakeUnix(Util.PathGetRelative(solutionFileInfo.DirectoryName, projectFileInfo.DirectoryName), false)))
                using (fileGenerator.Declare("projectFileName", projectFileInfo.Name))
                {
                    fileGenerator.Write(Template.Solution.CleanRuleProject);
                }
            }
            fileGenerator.WriteVerbatim(Template.Solution.CleanRuleEnd);

            // Help rule
            fileGenerator.WriteVerbatim(Template.Solution.HelpRuleBegin);
            foreach (Project.Configuration conf in solutionProjects.First().Configurations)
            {
                // Optimizations enumeration rely on the fact that all projects share the same targets as the solution.
                using (fileGenerator.Declare("optimization", conf.Target.GetOptimization().ToString().ToLower()))
                {
                    fileGenerator.Write(Template.Solution.HelpRuleConfiguration);
                }
            }
            fileGenerator.WriteVerbatim(Template.Solution.HelpRuleTargetsBegin);
            foreach (Solution.ResolvedProject resolvedProject in solutionProjects)
            {
                using (fileGenerator.Declare("projectName", resolvedProject.ProjectName))
                {
                    fileGenerator.Write(Template.Solution.HelpRuleTarget);
                }
            }
            fileGenerator.WriteVerbatim(Template.Solution.HelpRuleEnd);

            // Write the solution file
            updated = builder.Context.WriteGeneratedFile(solution.GetType(), solutionFileInfo, fileGenerator);

            solution.PostGenerationCallback?.Invoke(solutionPath, solutionFile, MakeExtension);

            return solutionFileInfo.FullName;
        }