From b5a0caaec5b617ecccda6dc116da076eaf662f4e Mon Sep 17 00:00:00 2001 From: Mikko Rasa Date: Sun, 18 Dec 2022 20:02:17 +0200 Subject: [PATCH] Emit configurations in Visual Studio solutions Projects other than the main one are marked as not being built, since builder will build them implicitly as part of the main project. This also seems to be enough for Visual Studio to not complain about the solution being modified when closing it. --- source/vssolutiongenerator.cpp | 40 +++++++++++++++++++++++++++++----- 1 file changed, 35 insertions(+), 5 deletions(-) diff --git a/source/vssolutiongenerator.cpp b/source/vssolutiongenerator.cpp index 90adc69..43ed761 100644 --- a/source/vssolutiongenerator.cpp +++ b/source/vssolutiongenerator.cpp @@ -1,5 +1,7 @@ +#include #include #include +#include "builder.h" #include "sourcepackage.h" #include "vcxprojectfile.h" #include "vssolutionfile.h" @@ -31,18 +33,46 @@ VsSolutionGenerator::Worker::Worker(const VsSolutionFile &t): void VsSolutionGenerator::Worker::main() { + Builder &builder = target.get_package()->get_builder(); + IO::BufferedFile out(target.get_path().str(), IO::M_WRITE); IO::print(out, "Microsoft Visual Studio Solution File, Format Version 12.00\n"); IO::print(out, "MinimumVisualStudioVersion = 10.0.40219.1\n"); const Target::Dependencies &deps = target.get_dependencies(); + vector projects; for(Target::Dependencies::const_iterator i=deps.begin(); i!=deps.end(); ++i) if(const VcxProjectFile *project = dynamic_cast(*i)) - { - const SourcePackage *pkg = project->get_package(); - IO::print(out, "Project(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"%s\", \"%s\", \"{%s}\"\nEndProject\n", - pkg->get_name(), project->get_path(), project->get_guid()); - } + projects.push_back(project); + + for(vector::const_iterator i=projects.begin(); i!=projects.end(); ++i) + { + const SourcePackage *pkg = (*i)->get_package(); + IO::print(out, "Project(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"%s\", \"%s\", \"{%s}\"\nEndProject\n", + pkg->get_name(), (*i)->get_path(), (*i)->get_guid()); + } + + vector build_types = builder.get_build_types(); + const char *platforms[] = { "x86", "x64", 0 }; + + IO::print(out, "Global\n"); + IO::print(out, "\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n"); + for(vector::const_iterator i=build_types.begin(); i!=build_types.end(); ++i) + for(const char **j=platforms; *j; ++j) + IO::print(out, "\t\t%s|%s = %s|%s\n", *i, *j, *i, *j); + IO::print(out, "\tEndGlobalSection\n"); + IO::print(out, "\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n"); + for(vector::const_iterator i=projects.begin(); i!=projects.end(); ++i) + for(vector::const_iterator j=build_types.begin(); j!=build_types.end(); ++j) + for(const char **k=platforms; *k; ++k) + { + const char *project_platform = (!strcmp(*k, "x86") ? "Win32" : *k); + IO::print(out, "\t\t{%s}.%s|%s.ActiveCfg = %s|%s\n", (*i)->get_guid(), *j, *k, *j, project_platform); + if(i==projects.begin()) + IO::print(out, "\t\t{%s}.%s|%s.Build.0 = %s|%s\n", (*i)->get_guid(), *j, *k, *j, project_platform); + } + IO::print(out, "\tEndGlobalSection\n"); + IO::print(out, "EndGlobal\n"); status = Task::SUCCESS; } -- 2.43.0