1 /* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
2 file Copyright.txt or https://cmake.org/licensing for details. */
5 #include "cmConfigure.h" // IWYU pragma: keep
12 #include <unordered_map>
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;
28 class cmVS10GeneratorOptions;
30 class cmVisualStudio10TargetGenerator
33 cmVisualStudio10TargetGenerator(cmGeneratorTarget* target,
34 cmGlobalVisualStudio10Generator* gg);
35 ~cmVisualStudio10TargetGenerator();
37 cmVisualStudio10TargetGenerator(cmVisualStudio10TargetGenerator const&) =
39 cmVisualStudio10TargetGenerator& operator=(
40 cmVisualStudio10TargetGenerator const&) = delete;
47 cmSourceFile const* SourceFile;
50 struct ToolSources : public std::vector<ToolSource>
54 struct TargetsFileAndConfigs
57 std::vector<std::string> Configs;
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 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);
118 std::vector<std::string> GetIncludes(std::string const& config,
119 std::string const& lang) const;
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);
131 bool ComputeCudaLinkOptions();
132 bool ComputeCudaLinkOptions(std::string const& config);
133 void WriteCudaLinkOptions(Elem& e1, std::string const& config);
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);
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);
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);
192 bool ForceOld(const std::string& source) const;
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);
200 void WriteStdOutEncodingUtf8(Elem& e1);
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;
216 VsProjectType ProjectType;
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;
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;
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;
253 using ToolSourceMap = std::map<std::string, ToolSources>;
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);
264 // .Net SDK-stype project variable and helper functions
265 void WriteClassicMsBuildProjectFile(cmGeneratedFileStream& BuildFileStream);
266 void WriteSdkStyleProjectFile(cmGeneratedFileStream& BuildFileStream);
268 void WriteCommonPropertyGroupGlobals(
269 cmVisualStudio10TargetGenerator::Elem& e1);
271 bool HasCustomCommands() const;
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;