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