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;
}