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 <iosfwd>
8 #include <map>
9 #include <memory>
10 #include <set>
11 #include <string>
12 #include <unordered_map>
13 #include <vector>
14 
15 #include "cmGeneratorTarget.h"
16 
17 class cmComputeLinkInformation;
18 class cmCustomCommand;
19 class cmCustomCommandGenerator;
20 class cmGeneratedFileStream;
21 class cmGlobalVisualStudio10Generator;
22 class cmLocalVisualStudio10Generator;
23 class cmMakefile;
24 class cmSourceFile;
25 class cmSourceGroup;
26 class cmVS10GeneratorOptions;
27 
28 class cmVisualStudio10TargetGenerator
29 {
30 public:
31   cmVisualStudio10TargetGenerator(cmGeneratorTarget* target,
32                                   cmGlobalVisualStudio10Generator* gg);
33   ~cmVisualStudio10TargetGenerator();
34 
35   cmVisualStudio10TargetGenerator(cmVisualStudio10TargetGenerator const&) =
36     delete;
37   cmVisualStudio10TargetGenerator& operator=(
38     cmVisualStudio10TargetGenerator const&) = delete;
39 
40   void Generate();
41 
42 private:
43   struct ToolSource
44   {
45     cmSourceFile const* SourceFile;
46     bool RelativePath;
47   };
48   struct ToolSources : public std::vector<ToolSource>
49   {
50   };
51 
52   struct TargetsFileAndConfigs
53   {
54     std::string File;
55     std::vector<std::string> Configs;
56   };
57 
58   struct Elem;
59   struct OptionsHelper;
60 
61   using ConfigToSettings =
62     std::unordered_map<std::string,
63                        std::unordered_map<std::string, std::string>>;
64 
65   std::string ConvertPath(std::string const& path, bool forceRelative);
66   std::string CalcCondition(const std::string& config) const;
67   void WriteProjectConfigurations(Elem& e0);
68   void WriteProjectConfigurationValues(Elem& e0);
69   void WriteMSToolConfigurationValues(Elem& e1, std::string const& config);
70   void WriteCEDebugProjectConfigurationValues(Elem& e0);
71   void WriteMSToolConfigurationValuesManaged(Elem& e1,
72                                              std::string const& config);
73   void WriteHeaderSource(Elem& e1, cmSourceFile const* sf,
74                          ConfigToSettings const& toolSettings);
75   void WriteExtraSource(Elem& e1, cmSourceFile const* sf,
76                         ConfigToSettings& toolSettings);
77   void WriteNsightTegraConfigurationValues(Elem& e1,
78                                            std::string const& config);
79   void WriteAndroidConfigurationValues(Elem& e1, std::string const& config);
80   void WriteSource(Elem& e2, cmSourceFile const* sf);
81   void FinishWritingSource(Elem& e2, ConfigToSettings const& toolSettings);
82   void WriteExcludeFromBuild(Elem& e2,
83                              std::vector<size_t> const& exclude_configs);
84   void WriteAllSources(Elem& e0);
85   void WritePackageReferences(Elem& e0);
86   void WriteDotNetReferences(Elem& e0);
87   void WriteDotNetReference(Elem& e1, std::string const& ref,
88                             std::string const& hint,
89                             std::string const& config);
90   void WriteDotNetDocumentationFile(Elem& e0);
91   void WriteImports(Elem& e0);
92   void WriteDotNetReferenceCustomTags(Elem& e2, std::string const& ref);
93   void WriteEmbeddedResourceGroup(Elem& e0);
94   void WriteWinRTReferences(Elem& e0);
95   void WriteWinRTPackageCertificateKeyFile(Elem& e0);
96   void WriteXamlFilesGroup(Elem& e0);
97   void WritePathAndIncrementalLinkOptions(Elem& e0);
98   void WriteItemDefinitionGroups(Elem& e0);
99   void VerifyNecessaryFiles();
100   void WriteMissingFiles(Elem& e1);
101   void WriteMissingFilesWP80(Elem& e1);
102   void WriteMissingFilesWP81(Elem& e1);
103   void WriteMissingFilesWS80(Elem& e1);
104   void WriteMissingFilesWS81(Elem& e1);
105   void WriteMissingFilesWS10_0(Elem& e1);
106   void WritePlatformExtensions(Elem& e1);
107   void WriteSinglePlatformExtension(Elem& e1, std::string const& extension,
108                                     std::string const& version);
109   void WriteSDKReferences(Elem& e0);
110   void WriteSingleSDKReference(Elem& e1, std::string const& extension,
111                                std::string const& version);
112   void WriteCommonMissingFiles(Elem& e1, const std::string& manifestFile);
113   void WriteTargetSpecificReferences(Elem& e0);
114   void WriteTargetsFileReferences(Elem& e1);
115 
116   std::vector<std::string> GetIncludes(std::string const& config,
117                                        std::string const& lang) const;
118 
119   bool ComputeClOptions();
120   bool ComputeClOptions(std::string const& configName);
121   void WriteClOptions(Elem& e1, std::string const& config);
122   bool ComputeRcOptions();
123   bool ComputeRcOptions(std::string const& config);
124   void WriteRCOptions(Elem& e1, std::string const& config);
125   bool ComputeCudaOptions();
126   bool ComputeCudaOptions(std::string const& config);
127   void WriteCudaOptions(Elem& e1, std::string const& config);
128 
129   bool ComputeCudaLinkOptions();
130   bool ComputeCudaLinkOptions(std::string const& config);
131   void WriteCudaLinkOptions(Elem& e1, std::string const& config);
132 
133   bool ComputeMasmOptions();
134   bool ComputeMasmOptions(std::string const& config);
135   void WriteMasmOptions(Elem& e1, std::string const& config);
136   bool ComputeNasmOptions();
137   bool ComputeNasmOptions(std::string const& config);
138   void WriteNasmOptions(Elem& e1, std::string const& config);
139 
140   bool ComputeLinkOptions();
141   bool ComputeLinkOptions(std::string const& config);
142   bool ComputeLibOptions();
143   bool ComputeLibOptions(std::string const& config);
144   void WriteLinkOptions(Elem& e1, std::string const& config);
145   void WriteMidlOptions(Elem& e1, std::string const& config);
146   void WriteAntBuildOptions(Elem& e1, std::string const& config);
147   void OutputLinkIncremental(Elem& e1, std::string const& configName);
148   void WriteCustomRule(Elem& e0, cmSourceFile const* source,
149                        cmCustomCommand const& command);
150   void WriteCustomRuleCpp(Elem& e2, std::string const& config,
151                           std::string const& script,
152                           std::string const& additional_inputs,
153                           std::string const& outputs,
154                           std::string const& comment,
155                           cmCustomCommandGenerator const& ccg, bool symbolic);
156   void WriteCustomRuleCSharp(Elem& e0, std::string const& config,
157                              std::string const& commandName,
158                              std::string const& script,
159                              std::string const& inputs,
160                              std::string const& outputs,
161                              std::string const& comment,
162                              cmCustomCommandGenerator const& ccg);
163   void WriteCustomCommands(Elem& e0);
164   void WriteCustomCommand(Elem& e0, cmSourceFile const* sf);
165   void WriteGroups();
166   void WriteProjectReferences(Elem& e0);
167   void WriteApplicationTypeSettings(Elem& e1);
168   void OutputSourceSpecificFlags(Elem& e2, cmSourceFile const* source);
169   void AddLibraries(const cmComputeLinkInformation& cli,
170                     std::vector<std::string>& libVec,
171                     std::vector<std::string>& vsTargetVec,
172                     const std::string& config);
173   void AddTargetsFileAndConfigPair(std::string const& targetsFile,
174                                    std::string const& config);
175   void WriteLibOptions(Elem& e1, std::string const& config);
176   void WriteManifestOptions(Elem& e1, std::string const& config);
177   void WriteEvents(Elem& e1, std::string const& configName);
178   void WriteEvent(Elem& e1, std::string const& name,
179                   std::vector<cmCustomCommand> const& commands,
180                   std::string const& configName);
181   void WriteGroupSources(Elem& e0, std::string const& name,
182                          ToolSources const& sources,
183                          std::vector<cmSourceGroup>&);
184   void AddMissingSourceGroups(std::set<cmSourceGroup const*>& groupsUsed,
185                               const std::vector<cmSourceGroup>& allGroups);
186   bool IsResxHeader(const std::string& headerFile);
187   bool IsXamlHeader(const std::string& headerFile);
188   bool IsXamlSource(const std::string& headerFile);
189 
190   bool ForceOld(const std::string& source) const;
191 
192   void GetCSharpSourceProperties(cmSourceFile const* sf,
193                                  std::map<std::string, std::string>& tags);
194   void WriteCSharpSourceProperties(
195     Elem& e2, const std::map<std::string, std::string>& tags);
196   std::string GetCSharpSourceLink(cmSourceFile const* source);
197 
198   void WriteStdOutEncodingUtf8(Elem& e1);
199 
200 private:
201   friend class cmVS10GeneratorOptions;
202   using Options = cmVS10GeneratorOptions;
203   using OptionsMap = std::map<std::string, std::unique_ptr<Options>>;
204   OptionsMap ClOptions;
205   OptionsMap RcOptions;
206   OptionsMap CudaOptions;
207   OptionsMap CudaLinkOptions;
208   OptionsMap MasmOptions;
209   OptionsMap NasmOptions;
210   OptionsMap LinkOptions;
211   std::string LangForClCompile;
212   enum VsProjectType
213   {
214     vcxproj,
215     csproj
216   } 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::map<std::string, std::string> SpectreMitigation;
234   cmGlobalVisualStudio10Generator* const GlobalGenerator;
235   cmLocalVisualStudio10Generator* const LocalGenerator;
236   std::set<std::string> CSharpCustomCommandNames;
237   bool IsMissingFiles;
238   std::vector<std::string> AddedFiles;
239   std::string DefaultArtifactDir;
240   bool AddedDefaultCertificate = false;
241   // managed C++/C# relevant members
242   using DotNetHintReference = std::pair<std::string, std::string>;
243   using DotNetHintReferenceList = std::vector<DotNetHintReference>;
244   using DotNetHintReferenceMap =
245     std::map<std::string, DotNetHintReferenceList>;
246   DotNetHintReferenceMap DotNetHintReferences;
247   using UsingDirectories = std::set<std::string>;
248   using UsingDirectoriesMap = std::map<std::string, UsingDirectories>;
249   UsingDirectoriesMap AdditionalUsingDirectories;
250 
251   using ToolSourceMap = std::map<std::string, ToolSources>;
252   ToolSourceMap Tools;
253 
254   std::set<std::string> ExpectedResxHeaders;
255   std::set<std::string> ExpectedXamlHeaders;
256   std::set<std::string> ExpectedXamlSources;
257   std::vector<cmSourceFile const*> ResxObjs;
258   std::vector<cmSourceFile const*> XamlObjs;
259   void ClassifyAllConfigSources();
260   void ClassifyAllConfigSource(cmGeneratorTarget::AllConfigSource const& acs);
261 
262   std::unordered_map<std::string, ConfigToSettings> ParsedToolTargetSettings;
263   bool PropertyIsSameInAllConfigs(const ConfigToSettings& toolSettings,
264                                   const std::string& propName);
265   void ParseSettingsProperty(const std::string& settingsPropertyValue,
266                              ConfigToSettings& toolSettings);
267   std::string GetCMakeFilePath(const char* name) const;
268 };
269