CMake Nightly Date Stamp
[kiteware-cmake.git] / Source / cmVisualStudio10TargetGenerator.h
blob056f42688f5076ced41767c7570c8eb41e38a175
1 /* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
2 file Copyright.txt or https://cmake.org/licensing for details. */
3 #pragma once
5 #include "cmConfigure.h" // IWYU pragma: keep
7 #include <cstddef>
8 #include <map>
9 #include <memory>
10 #include <set>
11 #include <string>
12 #include <unordered_map>
13 #include <utility>
14 #include <vector>
16 #include "cmGeneratorTarget.h"
17 #include "cmVsProjectType.h"
19 class cmComputeLinkInformation;
20 class cmCustomCommand;
21 class cmCustomCommandGenerator;
22 class cmGeneratedFileStream;
23 class cmGlobalVisualStudio10Generator;
24 class cmLocalVisualStudio10Generator;
25 class cmMakefile;
26 class cmSourceFile;
27 class cmSourceGroup;
28 class cmVS10GeneratorOptions;
30 class cmVisualStudio10TargetGenerator
32 public:
33 cmVisualStudio10TargetGenerator(cmGeneratorTarget* target,
34 cmGlobalVisualStudio10Generator* gg);
35 ~cmVisualStudio10TargetGenerator();
37 cmVisualStudio10TargetGenerator(cmVisualStudio10TargetGenerator const&) =
38 delete;
39 cmVisualStudio10TargetGenerator& operator=(
40 cmVisualStudio10TargetGenerator const&) = delete;
42 void Generate();
44 private:
45 struct ToolSource
47 cmSourceFile const* SourceFile;
48 bool RelativePath;
50 struct ToolSources : public std::vector<ToolSource>
54 struct TargetsFileAndConfigs
56 std::string File;
57 std::vector<std::string> Configs;
60 struct Elem;
61 struct OptionsHelper;
63 using ConfigToSettings =
64 std::unordered_map<std::string,
65 std::unordered_map<std::string, std::string>>;
67 std::string ConvertPath(std::string const& path, bool forceRelative);
68 std::string CalcCondition(const std::string& config) const;
69 void WriteProjectConfigurations(Elem& e0);
70 void WriteProjectConfigurationValues(Elem& e0);
71 void WriteMSToolConfigurationValues(Elem& e1, std::string const& config);
72 void WriteCEDebugProjectConfigurationValues(Elem& e0);
73 void WriteMSToolConfigurationValuesManaged(Elem& e1,
74 std::string const& config);
75 void WriteMSToolConfigurationValuesCommon(Elem& e1,
76 std::string const& config);
77 void WriteHeaderSource(Elem& e1, cmSourceFile const* sf,
78 ConfigToSettings const& toolSettings);
79 void WriteExtraSource(Elem& e1, cmSourceFile const* sf,
80 ConfigToSettings& toolSettings);
81 void WriteNsightTegraConfigurationValues(Elem& e1,
82 std::string const& config);
83 void WriteAndroidConfigurationValues(Elem& e1, std::string const& config);
84 void WriteSource(Elem& e2, cmSourceFile const* sf);
85 void FinishWritingSource(Elem& e2, ConfigToSettings const& toolSettings);
86 void WriteExcludeFromBuild(Elem& e2,
87 std::vector<size_t> const& exclude_configs);
88 void WriteAllSources(Elem& e0);
89 void WritePackageReferences(Elem& e0);
90 void WriteDotNetReferences(Elem& e0);
91 void WriteDotNetReference(Elem& e1, std::string const& ref,
92 std::string const& hint,
93 std::string const& config);
94 void WriteDotNetDocumentationFile(Elem& e0);
95 void WriteImports(Elem& e0);
96 void WriteDotNetReferenceCustomTags(Elem& e2, std::string const& ref);
97 void WriteEmbeddedResourceGroup(Elem& e0);
98 void WriteWinRTReferences(Elem& e0);
99 void WriteWinRTPackageCertificateKeyFile(Elem& e0);
100 void WriteXamlFilesGroup(Elem& e0);
101 void WritePathAndIncrementalLinkOptions(Elem& e0);
102 void WritePublicProjectContentOptions(Elem& e0);
103 void WriteItemDefinitionGroups(Elem& e0);
104 void VerifyNecessaryFiles();
105 void WriteMissingFiles(Elem& e1);
106 void WriteMissingFilesWP80(Elem& e1);
107 void WriteMissingFilesWP81(Elem& e1);
108 void WriteMissingFilesWS80(Elem& e1);
109 void WriteMissingFilesWS81(Elem& e1);
110 void WriteMissingFilesWS10_0(Elem& e1);
111 void WritePlatformExtensions(Elem& e1);
112 void WriteSinglePlatformExtension(Elem& e1, std::string const& extension,
113 std::string const& version);
114 void WriteSDKReferences(Elem& e0);
115 void WriteSingleSDKReference(Elem& e1, std::string const& extension,
116 std::string const& version);
117 void WriteCommonMissingFiles(Elem& e1, const std::string& manifestFile);
118 void WriteTargetSpecificReferences(Elem& e0);
119 void WriteTargetsFileReferences(Elem& e1);
121 std::vector<std::string> GetIncludes(std::string const& config,
122 std::string const& lang) const;
123 std::string GetTargetOutputName() const;
125 bool ComputeClOptions();
126 bool ComputeClOptions(std::string const& configName);
127 void WriteClOptions(Elem& e1, std::string const& config);
128 bool ComputeRcOptions();
129 bool ComputeRcOptions(std::string const& config);
130 void WriteRCOptions(Elem& e1, std::string const& config);
131 bool ComputeCudaOptions();
132 bool ComputeCudaOptions(std::string const& config);
133 void WriteCudaOptions(Elem& e1, std::string const& config);
135 bool ComputeCudaLinkOptions();
136 bool ComputeCudaLinkOptions(std::string const& config);
137 void WriteCudaLinkOptions(Elem& e1, std::string const& config);
139 bool ComputeMarmasmOptions();
140 bool ComputeMarmasmOptions(std::string const& config);
141 void WriteMarmasmOptions(Elem& e1, std::string const& config);
142 bool ComputeMasmOptions();
143 bool ComputeMasmOptions(std::string const& config);
144 void WriteMasmOptions(Elem& e1, std::string const& config);
145 bool ComputeNasmOptions();
146 bool ComputeNasmOptions(std::string const& config);
147 void WriteNasmOptions(Elem& e1, std::string const& config);
149 bool ComputeLinkOptions();
150 bool ComputeLinkOptions(std::string const& config);
151 bool ComputeLibOptions();
152 bool ComputeLibOptions(std::string const& config);
153 void WriteLinkOptions(Elem& e1, std::string const& config);
154 void WriteMidlOptions(Elem& e1, std::string const& config);
155 void WriteAntBuildOptions(Elem& e1, std::string const& config);
156 void OutputLinkIncremental(Elem& e1, std::string const& configName);
157 void WriteCustomRule(Elem& e0, cmSourceFile const* source,
158 cmCustomCommand const& command);
159 enum class BuildInParallel
162 Yes,
164 void WriteCustomRuleCpp(Elem& e2, std::string const& config,
165 std::string const& script,
166 std::string const& additional_inputs,
167 std::string const& outputs,
168 std::string const& comment,
169 cmCustomCommandGenerator const& ccg, bool symbolic,
170 BuildInParallel buildInParallel);
171 void WriteCustomRuleCSharp(Elem& e0, std::string const& config,
172 std::string const& commandName,
173 std::string const& script,
174 std::string const& inputs,
175 std::string const& outputs,
176 std::string const& comment,
177 cmCustomCommandGenerator const& ccg);
178 void WriteCustomCommands(Elem& e0);
179 void WriteCustomCommand(Elem& e0, cmSourceFile const* sf);
180 void WriteGroups();
181 void WriteProjectReferences(Elem& e0);
182 void WriteApplicationTypeSettings(Elem& e1);
183 void OutputSourceSpecificFlags(Elem& e2, cmSourceFile const* source);
184 void AddLibraries(const cmComputeLinkInformation& cli,
185 std::vector<std::string>& libVec,
186 std::vector<std::string>& vsTargetVec,
187 const std::string& config);
188 void AddTargetsFileAndConfigPair(std::string const& targetsFile,
189 std::string const& config);
190 void WriteLibOptions(Elem& e1, std::string const& config);
191 void WriteManifestOptions(Elem& e1, std::string const& config);
192 void WriteEvents(Elem& e1, std::string const& configName);
193 void WriteEvent(Elem& e1, std::string const& name,
194 std::vector<cmCustomCommand> const& commands,
195 std::string const& configName);
196 void WriteGroupSources(Elem& e0, std::string const& name,
197 ToolSources const& sources,
198 std::vector<cmSourceGroup>&);
199 void AddMissingSourceGroups(std::set<cmSourceGroup const*>& groupsUsed,
200 const std::vector<cmSourceGroup>& allGroups);
201 bool IsResxHeader(const std::string& headerFile);
202 bool IsXamlHeader(const std::string& headerFile);
203 bool IsXamlSource(const std::string& headerFile);
205 bool ForceOld(const std::string& source) const;
207 void GetCSharpSourceProperties(cmSourceFile const* sf,
208 std::map<std::string, std::string>& tags);
209 void WriteCSharpSourceProperties(
210 Elem& e2, const std::map<std::string, std::string>& tags);
211 std::string GetCSharpSourceLink(cmSourceFile const* source);
213 void WriteStdOutEncodingUtf8(Elem& e1);
214 void UpdateCache();
216 friend class cmVS10GeneratorOptions;
217 using Options = cmVS10GeneratorOptions;
218 using OptionsMap = std::map<std::string, std::unique_ptr<Options>>;
219 OptionsMap ClOptions;
220 OptionsMap RcOptions;
221 OptionsMap CudaOptions;
222 OptionsMap CudaLinkOptions;
223 OptionsMap MarmasmOptions;
224 OptionsMap MasmOptions;
225 OptionsMap NasmOptions;
226 OptionsMap LinkOptions;
227 std::string LangForClCompile;
229 VsProjectType ProjectType;
230 bool InSourceBuild;
231 std::vector<std::string> Configurations;
232 std::vector<TargetsFileAndConfigs> TargetsFileAndConfigsVec;
233 cmGeneratorTarget* const GeneratorTarget;
234 cmMakefile* const Makefile;
235 std::string const Platform;
236 std::string const Name;
237 std::string const GUID;
238 bool MSTools;
239 bool Managed;
240 bool NsightTegra;
241 bool Android;
242 bool HaveCustomCommandDepfile = false;
243 std::map<std::string, bool> ScanSourceForModuleDependencies;
244 unsigned int NsightTegraVersion[4];
245 bool TargetCompileAsWinRT;
246 std::set<std::string> IPOEnabledConfigurations;
247 std::set<std::string> ASanEnabledConfigurations;
248 std::set<std::string> FuzzerEnabledConfigurations;
249 std::map<std::string, std::string> SpectreMitigation;
250 cmGlobalVisualStudio10Generator* const GlobalGenerator;
251 cmLocalVisualStudio10Generator* const LocalGenerator;
252 std::set<std::string> CSharpCustomCommandNames;
253 bool IsMissingFiles;
254 std::vector<std::string> AddedFiles;
255 std::string DefaultArtifactDir;
256 bool AddedDefaultCertificate = false;
257 // managed C++/C# relevant members
258 using DotNetHintReference = std::pair<std::string, std::string>;
259 using DotNetHintReferenceList = std::vector<DotNetHintReference>;
260 using DotNetHintReferenceMap =
261 std::map<std::string, DotNetHintReferenceList>;
262 DotNetHintReferenceMap DotNetHintReferences;
263 using UsingDirectories = std::set<std::string>;
264 using UsingDirectoriesMap = std::map<std::string, UsingDirectories>;
265 UsingDirectoriesMap AdditionalUsingDirectories;
267 using ToolSourceMap = std::map<std::string, ToolSources>;
268 ToolSourceMap Tools;
270 std::set<std::string> ExpectedResxHeaders;
271 std::set<std::string> ExpectedXamlHeaders;
272 std::set<std::string> ExpectedXamlSources;
273 std::vector<cmSourceFile const*> ResxObjs;
274 std::vector<cmSourceFile const*> XamlObjs;
275 void ClassifyAllConfigSources();
276 void ClassifyAllConfigSource(cmGeneratorTarget::AllConfigSource const& acs);
278 // .Net SDK-stype project variable and helper functions
279 void WriteClassicMsBuildProjectFile(cmGeneratedFileStream& BuildFileStream);
280 void WriteSdkStyleProjectFile(cmGeneratedFileStream& BuildFileStream);
282 void WriteCommonPropertyGroupGlobals(
283 cmVisualStudio10TargetGenerator::Elem& e1);
285 bool HasCustomCommands() const;
287 std::unordered_map<std::string, ConfigToSettings> ParsedToolTargetSettings;
288 bool PropertyIsSameInAllConfigs(const ConfigToSettings& toolSettings,
289 const std::string& propName);
290 void ParseSettingsProperty(const std::string& settingsPropertyValue,
291 ConfigToSettings& toolSettings);
292 std::string GetCMakeFilePath(const char* name) const;