Imported Upstream version 3.25.0
[platform/upstream/cmake.git] / Source / cmVisualStudio10TargetGenerator.h
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
4
5 #include "cmConfigure.h" // IWYU pragma: keep
6
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>
15
16 #include "cmGeneratorTarget.h"
17 #include "cmVsProjectType.h"
18
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;
29
30 class cmVisualStudio10TargetGenerator
31 {
32 public:
33   cmVisualStudio10TargetGenerator(cmGeneratorTarget* target,
34                                   cmGlobalVisualStudio10Generator* gg);
35   ~cmVisualStudio10TargetGenerator();
36
37   cmVisualStudio10TargetGenerator(cmVisualStudio10TargetGenerator const&) =
38     delete;
39   cmVisualStudio10TargetGenerator& operator=(
40     cmVisualStudio10TargetGenerator const&) = delete;
41
42   void Generate();
43
44 private:
45   struct ToolSource
46   {
47     cmSourceFile const* SourceFile;
48     bool RelativePath;
49   };
50   struct ToolSources : public std::vector<ToolSource>
51   {
52   };
53
54   struct TargetsFileAndConfigs
55   {
56     std::string File;
57     std::vector<std::string> Configs;
58   };
59
60   struct Elem;
61   struct OptionsHelper;
62
63   using ConfigToSettings =
64     std::unordered_map<std::string,
65                        std::unordered_map<std::string, std::string>>;
66
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 WriteHeaderSource(Elem& e1, cmSourceFile const* sf,
76                          ConfigToSettings const& toolSettings);
77   void WriteExtraSource(Elem& e1, cmSourceFile const* sf,
78                         ConfigToSettings& toolSettings);
79   void WriteNsightTegraConfigurationValues(Elem& e1,
80                                            std::string const& config);
81   void WriteAndroidConfigurationValues(Elem& e1, std::string const& config);
82   void WriteSource(Elem& e2, cmSourceFile const* sf);
83   void FinishWritingSource(Elem& e2, ConfigToSettings const& toolSettings);
84   void WriteExcludeFromBuild(Elem& e2,
85                              std::vector<size_t> const& exclude_configs);
86   void WriteAllSources(Elem& e0);
87   void WritePackageReferences(Elem& e0);
88   void WriteDotNetReferences(Elem& e0);
89   void WriteDotNetReference(Elem& e1, std::string const& ref,
90                             std::string const& hint,
91                             std::string const& config);
92   void WriteDotNetDocumentationFile(Elem& e0);
93   void WriteImports(Elem& e0);
94   void WriteDotNetReferenceCustomTags(Elem& e2, std::string const& ref);
95   void WriteEmbeddedResourceGroup(Elem& e0);
96   void WriteWinRTReferences(Elem& e0);
97   void WriteWinRTPackageCertificateKeyFile(Elem& e0);
98   void WriteXamlFilesGroup(Elem& e0);
99   void WritePathAndIncrementalLinkOptions(Elem& e0);
100   void WriteItemDefinitionGroups(Elem& e0);
101   void VerifyNecessaryFiles();
102   void WriteMissingFiles(Elem& e1);
103   void WriteMissingFilesWP80(Elem& e1);
104   void WriteMissingFilesWP81(Elem& e1);
105   void WriteMissingFilesWS80(Elem& e1);
106   void WriteMissingFilesWS81(Elem& e1);
107   void WriteMissingFilesWS10_0(Elem& e1);
108   void WritePlatformExtensions(Elem& e1);
109   void WriteSinglePlatformExtension(Elem& e1, std::string const& extension,
110                                     std::string const& version);
111   void WriteSDKReferences(Elem& e0);
112   void WriteSingleSDKReference(Elem& e1, std::string const& extension,
113                                std::string const& version);
114   void WriteCommonMissingFiles(Elem& e1, const std::string& manifestFile);
115   void WriteTargetSpecificReferences(Elem& e0);
116   void WriteTargetsFileReferences(Elem& e1);
117
118   std::vector<std::string> GetIncludes(std::string const& config,
119                                        std::string const& lang) const;
120
121   bool ComputeClOptions();
122   bool ComputeClOptions(std::string const& configName);
123   void WriteClOptions(Elem& e1, std::string const& config);
124   bool ComputeRcOptions();
125   bool ComputeRcOptions(std::string const& config);
126   void WriteRCOptions(Elem& e1, std::string const& config);
127   bool ComputeCudaOptions();
128   bool ComputeCudaOptions(std::string const& config);
129   void WriteCudaOptions(Elem& e1, std::string const& config);
130
131   bool ComputeCudaLinkOptions();
132   bool ComputeCudaLinkOptions(std::string const& config);
133   void WriteCudaLinkOptions(Elem& e1, std::string const& config);
134
135   bool ComputeMasmOptions();
136   bool ComputeMasmOptions(std::string const& config);
137   void WriteMasmOptions(Elem& e1, std::string const& config);
138   bool ComputeNasmOptions();
139   bool ComputeNasmOptions(std::string const& config);
140   void WriteNasmOptions(Elem& e1, std::string const& config);
141
142   bool ComputeLinkOptions();
143   bool ComputeLinkOptions(std::string const& config);
144   bool ComputeLibOptions();
145   bool ComputeLibOptions(std::string const& config);
146   void WriteLinkOptions(Elem& e1, std::string const& config);
147   void WriteMidlOptions(Elem& e1, std::string const& config);
148   void WriteAntBuildOptions(Elem& e1, std::string const& config);
149   void OutputLinkIncremental(Elem& e1, std::string const& configName);
150   void WriteCustomRule(Elem& e0, cmSourceFile const* source,
151                        cmCustomCommand const& command);
152   void WriteCustomRuleCpp(Elem& e2, std::string const& config,
153                           std::string const& script,
154                           std::string const& additional_inputs,
155                           std::string const& outputs,
156                           std::string const& comment,
157                           cmCustomCommandGenerator const& ccg, bool symbolic);
158   void WriteCustomRuleCSharp(Elem& e0, std::string const& config,
159                              std::string const& commandName,
160                              std::string const& script,
161                              std::string const& inputs,
162                              std::string const& outputs,
163                              std::string const& comment,
164                              cmCustomCommandGenerator const& ccg);
165   void WriteCustomCommands(Elem& e0);
166   void WriteCustomCommand(Elem& e0, cmSourceFile const* sf);
167   void WriteGroups();
168   void WriteProjectReferences(Elem& e0);
169   void WriteApplicationTypeSettings(Elem& e1);
170   void OutputSourceSpecificFlags(Elem& e2, cmSourceFile const* source);
171   void AddLibraries(const cmComputeLinkInformation& cli,
172                     std::vector<std::string>& libVec,
173                     std::vector<std::string>& vsTargetVec,
174                     const std::string& config);
175   void AddTargetsFileAndConfigPair(std::string const& targetsFile,
176                                    std::string const& config);
177   void WriteLibOptions(Elem& e1, std::string const& config);
178   void WriteManifestOptions(Elem& e1, std::string const& config);
179   void WriteEvents(Elem& e1, std::string const& configName);
180   void WriteEvent(Elem& e1, std::string const& name,
181                   std::vector<cmCustomCommand> const& commands,
182                   std::string const& configName);
183   void WriteGroupSources(Elem& e0, std::string const& name,
184                          ToolSources const& sources,
185                          std::vector<cmSourceGroup>&);
186   void AddMissingSourceGroups(std::set<cmSourceGroup const*>& groupsUsed,
187                               const std::vector<cmSourceGroup>& allGroups);
188   bool IsResxHeader(const std::string& headerFile);
189   bool IsXamlHeader(const std::string& headerFile);
190   bool IsXamlSource(const std::string& headerFile);
191
192   bool ForceOld(const std::string& source) const;
193
194   void GetCSharpSourceProperties(cmSourceFile const* sf,
195                                  std::map<std::string, std::string>& tags);
196   void WriteCSharpSourceProperties(
197     Elem& e2, const std::map<std::string, std::string>& tags);
198   std::string GetCSharpSourceLink(cmSourceFile const* source);
199
200   void WriteStdOutEncodingUtf8(Elem& e1);
201   void UpdateCache();
202
203 private:
204   friend class cmVS10GeneratorOptions;
205   using Options = cmVS10GeneratorOptions;
206   using OptionsMap = std::map<std::string, std::unique_ptr<Options>>;
207   OptionsMap ClOptions;
208   OptionsMap RcOptions;
209   OptionsMap CudaOptions;
210   OptionsMap CudaLinkOptions;
211   OptionsMap MasmOptions;
212   OptionsMap NasmOptions;
213   OptionsMap LinkOptions;
214   std::string LangForClCompile;
215
216   VsProjectType ProjectType;
217   bool InSourceBuild;
218   std::vector<std::string> Configurations;
219   std::vector<TargetsFileAndConfigs> TargetsFileAndConfigsVec;
220   cmGeneratorTarget* const GeneratorTarget;
221   cmMakefile* const Makefile;
222   std::string const Platform;
223   std::string const Name;
224   std::string const GUID;
225   bool MSTools;
226   bool Managed;
227   bool NsightTegra;
228   bool Android;
229   bool HaveCustomCommandDepfile = false;
230   unsigned int NsightTegraVersion[4];
231   bool TargetCompileAsWinRT;
232   std::set<std::string> IPOEnabledConfigurations;
233   std::set<std::string> ASanEnabledConfigurations;
234   std::set<std::string> FuzzerEnabledConfigurations;
235   std::map<std::string, std::string> SpectreMitigation;
236   cmGlobalVisualStudio10Generator* const GlobalGenerator;
237   cmLocalVisualStudio10Generator* const LocalGenerator;
238   std::set<std::string> CSharpCustomCommandNames;
239   bool IsMissingFiles;
240   std::vector<std::string> AddedFiles;
241   std::string DefaultArtifactDir;
242   bool AddedDefaultCertificate = false;
243   // managed C++/C# relevant members
244   using DotNetHintReference = std::pair<std::string, std::string>;
245   using DotNetHintReferenceList = std::vector<DotNetHintReference>;
246   using DotNetHintReferenceMap =
247     std::map<std::string, DotNetHintReferenceList>;
248   DotNetHintReferenceMap DotNetHintReferences;
249   using UsingDirectories = std::set<std::string>;
250   using UsingDirectoriesMap = std::map<std::string, UsingDirectories>;
251   UsingDirectoriesMap AdditionalUsingDirectories;
252
253   using ToolSourceMap = std::map<std::string, ToolSources>;
254   ToolSourceMap Tools;
255
256   std::set<std::string> ExpectedResxHeaders;
257   std::set<std::string> ExpectedXamlHeaders;
258   std::set<std::string> ExpectedXamlSources;
259   std::vector<cmSourceFile const*> ResxObjs;
260   std::vector<cmSourceFile const*> XamlObjs;
261   void ClassifyAllConfigSources();
262   void ClassifyAllConfigSource(cmGeneratorTarget::AllConfigSource const& acs);
263
264   // .Net SDK-stype project variable and helper functions
265   void WriteClassicMsBuildProjectFile(cmGeneratedFileStream& BuildFileStream);
266   void WriteSdkStyleProjectFile(cmGeneratedFileStream& BuildFileStream);
267
268   void WriteCommonPropertyGroupGlobals(
269     cmVisualStudio10TargetGenerator::Elem& e1);
270
271   bool HasCustomCommands() const;
272
273   std::unordered_map<std::string, ConfigToSettings> ParsedToolTargetSettings;
274   bool PropertyIsSameInAllConfigs(const ConfigToSettings& toolSettings,
275                                   const std::string& propName);
276   void ParseSettingsProperty(const std::string& settingsPropertyValue,
277                              ConfigToSettings& toolSettings);
278   std::string GetCMakeFilePath(const char* name) const;
279 };