From: Mikko Rasa Date: Sun, 18 Dec 2022 18:02:17 +0000 (+0200) Subject: Emit configurations in Visual Studio solutions X-Git-Url: http://git.tdb.fi/?a=commitdiff_plain;h=b5a0caaec5b617ecccda6dc116da076eaf662f4e;p=builder.git 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. --- 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; }