Skip to content

Commit 4a899cf

Browse files
committed
Feature: Add VisitConfigurations function for walking through configurations.
1 parent 1e40300 commit 4a899cf

7 files changed

Lines changed: 95 additions & 45 deletions

File tree

SolutionProjectModel/Project.cpp

Lines changed: 51 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -126,28 +126,35 @@ void Project::AddConfigurations(std::initializer_list<std::string> _configuratio
126126
const wchar_t* PropertyGroup = L"PropertyGroup";
127127

128128

129-
void Project::PlatformConfigurationsUpdated(initializer_list<string> items, bool bPlatforms, bool bAdd)
129+
vector<string>& Project::GetConfigurationNames()
130130
{
131-
vector<string>* pConfigurations = &configurations;
132-
133-
if (configurations.size() == 0)
131+
if (configurationNames.size() == 0)
134132
{
135133
static vector<string> dummyDefaults;
136134

137-
if (bPlatforms)
135+
if (dummyDefaults.size() == 0)
138136
{
139-
if (dummyDefaults.size() == 0)
140-
{
141-
dummyDefaults.push_back("Debug");
142-
dummyDefaults.push_back("Release");
143-
}
144-
145-
pConfigurations = &dummyDefaults;
137+
dummyDefaults.push_back("Debug");
138+
dummyDefaults.push_back("Release");
146139
}
140+
141+
return dummyDefaults;
142+
}
143+
144+
return configurationNames;
145+
}
146+
147+
148+
void Project::PlatformConfigurationsUpdated(initializer_list<string> items, bool bPlatforms, bool bAdd)
149+
{
150+
vector<string>* pConfigurations = &configurationNames;
151+
152+
if (configurationNames.size() == 0)
153+
{
154+
if (bPlatforms)
155+
pConfigurations = &GetConfigurationNames();
147156
else
148-
{
149157
PlatformConfigurationsUpdated({ "Debug" , "Release" }, false, false);
150-
}
151158
}
152159

153160
vector<string>* listMain = (bPlatforms) ? &platforms : pConfigurations;
@@ -181,7 +188,7 @@ void Project::PlatformConfigurationsUpdated(initializer_list<string> items, bool
181188

182189
for (int j = from; j != to; j += inc)
183190
{
184-
int to;
191+
int to; // Index where to insert / from where to remove within single configuration array
185192
string platform;
186193
string configuration;
187194

@@ -198,7 +205,15 @@ void Project::PlatformConfigurationsUpdated(initializer_list<string> items, bool
198205
configuration = name;
199206
}
200207

201-
if (bAdd) to--;
208+
wstring platformConfiguration = as_wide(configuration + "|" + platform);
209+
210+
if (bAdd)
211+
{
212+
VCConfiguration conf;
213+
conf.ConfigurationPlatfom = platformConfiguration;
214+
configurations.insert(configurations.begin() + to, conf);
215+
to--; //Xml node backshift - previous node after which to insert.
216+
}
202217

203218
//
204219
// <ItemGroup Label="ProjectConfigurations">
@@ -211,8 +226,6 @@ void Project::PlatformConfigurationsUpdated(initializer_list<string> items, bool
211226
if(to != -1)
212227
c = itemGroup.select_nodes(ProjectConfiguration)[to].node();
213228

214-
wstring platformConfiguration = as_wide(configuration + "|" + platform);
215-
216229
if (bAdd)
217230
{
218231
xml_node pc;
@@ -265,18 +278,6 @@ void Project::PlatformConfigurationsUpdated(initializer_list<string> items, bool
265278
} //PlatformConfigurationsUpdated
266279

267280

268-
// Gets list of currently supported configurations, in form "<configuration>|<platform>"
269-
vector<string> Project::GetConfigurations()
270-
{
271-
vector<string> confs;
272-
273-
for (auto p : platforms)
274-
for (auto c : configurations)
275-
confs.push_back(c + "|" + p);
276-
277-
return confs;
278-
}
279-
280281
// Queries for currently selected toolset, if none is selected, tries to determine from visual studio format version
281282
std::string Project::GetToolset()
282283
{
@@ -363,6 +364,26 @@ void Project::AddFile(const wchar_t* file)
363364
files.push_back(p);
364365
}
365366

367+
//
368+
// Visits each project configuration, if configurationName & platformName - uses additional filtering, otherwise visits all configurations.
369+
//
370+
void Project::VisitConfigurations(std::function<void (VCConfiguration&)> visitConf, const char* configurationName, const char* platformName)
371+
{
372+
vector<string>& confNames = GetConfigurationNames();
373+
for (size_t p = 0; p < platforms.size(); p++)
374+
for( size_t c = 0; c < confNames.size(); c++)
375+
{
376+
if(configurationName != nullptr && confNames[c] != configurationName)
377+
continue;
378+
379+
if(platformName != nullptr && platforms[p] != platformName)
380+
continue;
381+
382+
size_t i = platforms.size() * p + c;
383+
visitConf(configurations[i]);
384+
}
385+
}
386+
366387

367388
//
368389
// Clears existing project

SolutionProjectModel/Project.h

Lines changed: 29 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,28 @@
44
#include <vector>
55
#include <list>
66
#include <initializer_list>
7+
#include <functional> //std::functional
78
#include <guiddef.h> //GUID
89

10+
class SPM_DLLEXPORT VCConfiguration
11+
{
12+
public:
13+
// Configuration name, for example L"Debug|x64"
14+
std::wstring ConfigurationPlatfom;
15+
16+
//
17+
// Individual tools settings, depending on project type (static library, dynamic library) individual tool configuration is not necessarily used.
18+
//
19+
REFLECTABLE(VCConfiguration,
20+
(LinkerConf)Linker
21+
);
22+
};
23+
924
//---------------------------------------------------------
1025
// Project
1126
//---------------------------------------------------------
1227
class SPM_DLLEXPORT Project :
13-
pugi::xml_document,
14-
LinkerConf
28+
pugi::xml_document
1529
{
1630
public:
1731
Project();
@@ -61,11 +75,6 @@ class SPM_DLLEXPORT Project :
6175
void AddConfiguration(const char* configuration);
6276
void AddConfigurations(std::initializer_list<std::string> _configuration);
6377

64-
//
65-
// Gets list of currently supported configurations, in form "<configuration>|<platform>"
66-
//
67-
std::vector<std::string> GetConfigurations();
68-
6978
//
7079
// Queries for currently selected toolset, if none is selected, tries to determine from visual studio format version
7180
//
@@ -77,12 +86,11 @@ class SPM_DLLEXPORT Project :
7786
void AddFiles(std::initializer_list<std::wstring> fileList);
7887
void AddFile(const wchar_t* file);
7988

89+
//
90+
// Visits each project configuration, if configurationName & platformName - uses additional filtering, otherwise visits all configurations.
91+
//
92+
void VisitConfigurations( std::function<void (VCConfiguration&)> visitConf, const char* configurationName = nullptr, const char* platformName = nullptr );
8093

81-
LinkerConf& GetLinker() {
82-
return *this;
83-
}
84-
85-
__declspec(property(get = GetLinker)) LinkerConf& linker;
8694

8795
protected:
8896
// Project name, typically used to identify project within solution or specify saved filename if file is not specified during save.
@@ -95,7 +103,15 @@ class SPM_DLLEXPORT Project :
95103
std::vector<std::string> platforms;
96104

97105
// "Debug", "Release", user defined
98-
std::vector<std::string> configurations;
106+
std::vector<std::string> configurationNames;
107+
108+
//
109+
// Gets current configuration names, if not initialized yet, returns default "Debug" / "Release" set.
110+
//
111+
std::vector<std::string>& GetConfigurationNames();
112+
113+
// Project settings
114+
std::vector<VCConfiguration> configurations;
99115

100116
// List of files within a project.
101117
std::list<ProjectFile> files;
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
#include "pch.h"
2+
#include "ProjectFileTypes.h"
3+

SolutionProjectModel/SolutionProjectModel.vcxproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -183,6 +183,7 @@
183183
</ClCompile>
184184
<ClCompile Include="Project.cpp" />
185185
<ClCompile Include="ProjectFile.cpp" />
186+
<ClCompile Include="ProjectFileTypes.cpp" />
186187
<ClCompile Include="Solution.cpp" />
187188
</ItemGroup>
188189
<ItemGroup>

SolutionProjectModel/SolutionProjectModel.vcxproj.filters

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
<ClCompile Include="ProjectFile.cpp" />
1111
<ClCompile Include="CppReflect.cpp" />
1212
<ClCompile Include="pch.cpp" />
13+
<ClCompile Include="ProjectFileTypes.cpp" />
1314
</ItemGroup>
1415
<ItemGroup>
1516
<ClInclude Include="Solution.h" />

SolutionProjectModel/pch.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,4 +9,5 @@
99
#include <memory>
1010
#include <vector>
1111
#include <guiddef.h>
12+
#include <functional>
1213

SolutionProjectModel/testCppApp.cpp

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,15 +12,22 @@ void main(void)
1212

1313
//p.Load(L"testCppApp.vcxproj");
1414
//printf("%s", p.configurations[0].c_str());
15-
p.linker.System.SubSystem = subsystem_Windows;
16-
p.linker.System.SubSystem = subsystem_Console;
1715

1816
p.AddPlatforms( { "Win32" } );
1917
p.AddFiles({ L"Solution.h" });
2018
p.AddFiles({ path(p.GetSaveDirectory()).append(L"Solution.cpp").wstring() });
2119
p.Save();
2220

2321
p.AddPlatforms({ "x64" });
22+
23+
p.VisitConfigurations(
24+
[](VCConfiguration& c)
25+
{
26+
c.Linker.System.SubSystem = subsystem_Console;
27+
}
28+
);
29+
30+
2431
p.Save(L"test2.vcxproj");
2532

2633

0 commit comments

Comments
 (0)