| OLD | NEW |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "tools/gn/visual_studio_writer.h" | 5 #include "tools/gn/visual_studio_writer.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <map> | 8 #include <map> |
| 9 #include <set> | 9 #include <set> |
| 10 #include <string> | 10 #include <string> |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 72 const char kVersionStringVs2015[] = "Visual Studio 2015"; // Visual Studio 2015 | 72 const char kVersionStringVs2015[] = "Visual Studio 2015"; // Visual Studio 2015 |
| 73 const char kWindowsKitsVersion[] = "10"; // Windows 10 SDK | 73 const char kWindowsKitsVersion[] = "10"; // Windows 10 SDK |
| 74 const char kWindowsKitsIncludeVersion[] = "10.0.10586.0"; // Windows 10 SDK | 74 const char kWindowsKitsIncludeVersion[] = "10.0.10586.0"; // Windows 10 SDK |
| 75 | 75 |
| 76 const char kGuidTypeProject[] = "{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}"; | 76 const char kGuidTypeProject[] = "{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}"; |
| 77 const char kGuidTypeFolder[] = "{2150E333-8FDC-42A3-9474-1A3956D46DE8}"; | 77 const char kGuidTypeFolder[] = "{2150E333-8FDC-42A3-9474-1A3956D46DE8}"; |
| 78 const char kGuidSeedProject[] = "project"; | 78 const char kGuidSeedProject[] = "project"; |
| 79 const char kGuidSeedFolder[] = "folder"; | 79 const char kGuidSeedFolder[] = "folder"; |
| 80 const char kGuidSeedFilter[] = "filter"; | 80 const char kGuidSeedFilter[] = "filter"; |
| 81 | 81 |
| 82 const char kConfigurationName[] = "GN"; |
| 83 |
| 82 std::string GetWindowsKitsIncludeDirs() { | 84 std::string GetWindowsKitsIncludeDirs() { |
| 83 std::string kits_path; | 85 std::string kits_path; |
| 84 | 86 |
| 85 #if defined(OS_WIN) | 87 #if defined(OS_WIN) |
| 86 const base::char16* const subkeys[] = { | 88 const base::char16* const subkeys[] = { |
| 87 L"SOFTWARE\\Microsoft\\Windows Kits\\Installed Roots", | 89 L"SOFTWARE\\Microsoft\\Windows Kits\\Installed Roots", |
| 88 L"SOFTWARE\\Wow6432Node\\Microsoft\\Windows Kits\\Installed Roots"}; | 90 L"SOFTWARE\\Wow6432Node\\Microsoft\\Windows Kits\\Installed Roots"}; |
| 89 | 91 |
| 90 base::string16 value_name = | 92 base::string16 value_name = |
| 91 base::ASCIIToUTF16("KitsRoot") + base::ASCIIToUTF16(kWindowsKitsVersion); | 93 base::ASCIIToUTF16("KitsRoot") + base::ASCIIToUTF16(kWindowsKitsVersion); |
| (...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 171 const std::string& _guid, | 173 const std::string& _guid, |
| 172 const std::string& _label_dir_path, | 174 const std::string& _label_dir_path, |
| 173 const std::string& _config_platform) | 175 const std::string& _config_platform) |
| 174 : SolutionEntry(_name, _path, _guid), | 176 : SolutionEntry(_name, _path, _guid), |
| 175 label_dir_path(_label_dir_path), | 177 label_dir_path(_label_dir_path), |
| 176 config_platform(_config_platform) {} | 178 config_platform(_config_platform) {} |
| 177 | 179 |
| 178 VisualStudioWriter::SolutionProject::~SolutionProject() = default; | 180 VisualStudioWriter::SolutionProject::~SolutionProject() = default; |
| 179 | 181 |
| 180 VisualStudioWriter::VisualStudioWriter(const BuildSettings* build_settings, | 182 VisualStudioWriter::VisualStudioWriter(const BuildSettings* build_settings, |
| 181 bool is_debug_config, | |
| 182 const char* config_platform, | 183 const char* config_platform, |
| 183 Version version) | 184 Version version) |
| 184 : build_settings_(build_settings), | 185 : build_settings_(build_settings), |
| 185 is_debug_config_(is_debug_config), | |
| 186 config_platform_(config_platform), | 186 config_platform_(config_platform), |
| 187 ninja_path_output_(build_settings->build_dir(), | 187 ninja_path_output_(build_settings->build_dir(), |
| 188 build_settings->root_path_utf8(), | 188 build_settings->root_path_utf8(), |
| 189 EscapingMode::ESCAPE_NINJA_COMMAND) { | 189 EscapingMode::ESCAPE_NINJA_COMMAND) { |
| 190 switch (version) { | 190 switch (version) { |
| 191 case Version::Vs2013: | 191 case Version::Vs2013: |
| 192 project_version_ = kProjectVersionVs2013; | 192 project_version_ = kProjectVersionVs2013; |
| 193 toolset_version_ = kToolsetVersionVs2013; | 193 toolset_version_ = kToolsetVersionVs2013; |
| 194 version_string_ = kVersionStringVs2013; | 194 version_string_ = kVersionStringVs2013; |
| 195 break; | 195 break; |
| (...skipping 14 matching lines...) Expand all Loading... |
| 210 STLDeleteContainerPointers(folders_.begin(), folders_.end()); | 210 STLDeleteContainerPointers(folders_.begin(), folders_.end()); |
| 211 } | 211 } |
| 212 | 212 |
| 213 // static | 213 // static |
| 214 bool VisualStudioWriter::RunAndWriteFiles(const BuildSettings* build_settings, | 214 bool VisualStudioWriter::RunAndWriteFiles(const BuildSettings* build_settings, |
| 215 Builder* builder, | 215 Builder* builder, |
| 216 Version version, | 216 Version version, |
| 217 Err* err) { | 217 Err* err) { |
| 218 std::vector<const Target*> targets = builder->GetAllResolvedTargets(); | 218 std::vector<const Target*> targets = builder->GetAllResolvedTargets(); |
| 219 | 219 |
| 220 bool is_debug_config = true; | |
| 221 const char* config_platform = "Win32"; | 220 const char* config_platform = "Win32"; |
| 222 | 221 |
| 223 // Assume the "is_debug" and "target_cpu" variables do not change | 222 // Assume the "target_cpu" variable does not change between different |
| 224 // between different toolchains. | 223 // toolchains. |
| 225 if (!targets.empty()) { | 224 if (!targets.empty()) { |
| 226 const Scope* scope = targets.front()->settings()->base_config(); | 225 const Scope* scope = targets.front()->settings()->base_config(); |
| 227 const Value* is_debug_value = scope->GetValue("is_debug"); | |
| 228 is_debug_config = | |
| 229 is_debug_value == nullptr || is_debug_value->boolean_value(); | |
| 230 const Value* target_cpu_value = scope->GetValue(variables::kTargetCpu); | 226 const Value* target_cpu_value = scope->GetValue(variables::kTargetCpu); |
| 231 if (target_cpu_value != nullptr && | 227 if (target_cpu_value != nullptr && |
| 232 target_cpu_value->string_value() == "x64") | 228 target_cpu_value->string_value() == "x64") |
| 233 config_platform = "x64"; | 229 config_platform = "x64"; |
| 234 } | 230 } |
| 235 | 231 |
| 236 VisualStudioWriter writer(build_settings, is_debug_config, config_platform, | 232 VisualStudioWriter writer(build_settings, config_platform, version); |
| 237 version); | |
| 238 writer.projects_.reserve(targets.size()); | 233 writer.projects_.reserve(targets.size()); |
| 239 writer.folders_.reserve(targets.size()); | 234 writer.folders_.reserve(targets.size()); |
| 240 | 235 |
| 241 for (const Target* target : targets) { | 236 for (const Target* target : targets) { |
| 242 // Skip actions and groups. | 237 // Skip actions and groups. |
| 243 if (target->output_type() == Target::GROUP || | 238 if (target->output_type() == Target::GROUP || |
| 244 target->output_type() == Target::COPY_FILES || | 239 target->output_type() == Target::COPY_FILES || |
| 245 target->output_type() == Target::ACTION || | 240 target->output_type() == Target::ACTION || |
| 246 target->output_type() == Target::ACTION_FOREACH) { | 241 target->output_type() == Target::ACTION_FOREACH) { |
| 247 continue; | 242 continue; |
| (...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 325 out << "<?xml version=\"1.0\" encoding=\"utf-8\"?>" << std::endl; | 320 out << "<?xml version=\"1.0\" encoding=\"utf-8\"?>" << std::endl; |
| 326 XmlElementWriter project( | 321 XmlElementWriter project( |
| 327 out, "Project", | 322 out, "Project", |
| 328 XmlAttributes("DefaultTargets", "Build") | 323 XmlAttributes("DefaultTargets", "Build") |
| 329 .add("ToolsVersion", project_version_) | 324 .add("ToolsVersion", project_version_) |
| 330 .add("xmlns", "http://schemas.microsoft.com/developer/msbuild/2003")); | 325 .add("xmlns", "http://schemas.microsoft.com/developer/msbuild/2003")); |
| 331 | 326 |
| 332 { | 327 { |
| 333 scoped_ptr<XmlElementWriter> configurations = project.SubElement( | 328 scoped_ptr<XmlElementWriter> configurations = project.SubElement( |
| 334 "ItemGroup", XmlAttributes("Label", "ProjectConfigurations")); | 329 "ItemGroup", XmlAttributes("Label", "ProjectConfigurations")); |
| 335 std::string config_name = is_debug_config_ ? "Debug" : "Release"; | |
| 336 scoped_ptr<XmlElementWriter> project_config = configurations->SubElement( | 330 scoped_ptr<XmlElementWriter> project_config = configurations->SubElement( |
| 337 "ProjectConfiguration", | 331 "ProjectConfiguration", |
| 338 XmlAttributes("Include", | 332 XmlAttributes("Include", std::string(kConfigurationName) + '|' + |
| 339 config_name + '|' + solution_project.config_platform)); | 333 solution_project.config_platform)); |
| 340 project_config->SubElement("Configuration")->Text(config_name); | 334 project_config->SubElement("Configuration")->Text(kConfigurationName); |
| 341 project_config->SubElement("Platform") | 335 project_config->SubElement("Platform") |
| 342 ->Text(solution_project.config_platform); | 336 ->Text(solution_project.config_platform); |
| 343 } | 337 } |
| 344 | 338 |
| 345 { | 339 { |
| 346 scoped_ptr<XmlElementWriter> globals = | 340 scoped_ptr<XmlElementWriter> globals = |
| 347 project.SubElement("PropertyGroup", XmlAttributes("Label", "Globals")); | 341 project.SubElement("PropertyGroup", XmlAttributes("Label", "Globals")); |
| 348 globals->SubElement("ProjectGuid")->Text(solution_project.guid); | 342 globals->SubElement("ProjectGuid")->Text(solution_project.guid); |
| 349 globals->SubElement("Keyword")->Text("Win32Proj"); | 343 globals->SubElement("Keyword")->Text("Win32Proj"); |
| 350 globals->SubElement("RootNamespace")->Text(target->label().name()); | 344 globals->SubElement("RootNamespace")->Text(target->label().name()); |
| (...skipping 281 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 632 out << "Project(\"" << kGuidTypeProject << "\") = \"" << project->name | 626 out << "Project(\"" << kGuidTypeProject << "\") = \"" << project->name |
| 633 << "\", \"" << RebasePath(project->path, solution_dir) << "\", \"" | 627 << "\", \"" << RebasePath(project->path, solution_dir) << "\", \"" |
| 634 << project->guid << "\"" << std::endl; | 628 << project->guid << "\"" << std::endl; |
| 635 out << "EndProject" << std::endl; | 629 out << "EndProject" << std::endl; |
| 636 } | 630 } |
| 637 | 631 |
| 638 out << "Global" << std::endl; | 632 out << "Global" << std::endl; |
| 639 | 633 |
| 640 out << "\tGlobalSection(SolutionConfigurationPlatforms) = preSolution" | 634 out << "\tGlobalSection(SolutionConfigurationPlatforms) = preSolution" |
| 641 << std::endl; | 635 << std::endl; |
| 642 const std::string config_mode_prefix = | 636 const std::string config_mode_prefix = std::string(kConfigurationName) + '|'; |
| 643 std::string(is_debug_config_ ? "Debug" : "Release") + '|'; | |
| 644 const std::string config_mode = config_mode_prefix + config_platform_; | 637 const std::string config_mode = config_mode_prefix + config_platform_; |
| 645 out << "\t\t" << config_mode << " = " << config_mode << std::endl; | 638 out << "\t\t" << config_mode << " = " << config_mode << std::endl; |
| 646 out << "\tEndGlobalSection" << std::endl; | 639 out << "\tEndGlobalSection" << std::endl; |
| 647 | 640 |
| 648 out << "\tGlobalSection(ProjectConfigurationPlatforms) = postSolution" | 641 out << "\tGlobalSection(ProjectConfigurationPlatforms) = postSolution" |
| 649 << std::endl; | 642 << std::endl; |
| 650 for (const SolutionProject* project : projects_) { | 643 for (const SolutionProject* project : projects_) { |
| 651 const std::string project_config_mode = | 644 const std::string project_config_mode = |
| 652 config_mode_prefix + project->config_platform; | 645 config_mode_prefix + project->config_platform; |
| 653 out << "\t\t" << project->guid << '.' << config_mode | 646 out << "\t\t" << project->guid << '.' << config_mode |
| (...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 769 } | 762 } |
| 770 } | 763 } |
| 771 | 764 |
| 772 std::string VisualStudioWriter::GetNinjaTarget(const Target* target) { | 765 std::string VisualStudioWriter::GetNinjaTarget(const Target* target) { |
| 773 std::ostringstream ninja_target_out; | 766 std::ostringstream ninja_target_out; |
| 774 DCHECK(!target->dependency_output_file().value().empty()); | 767 DCHECK(!target->dependency_output_file().value().empty()); |
| 775 ninja_path_output_.WriteFile(ninja_target_out, | 768 ninja_path_output_.WriteFile(ninja_target_out, |
| 776 target->dependency_output_file()); | 769 target->dependency_output_file()); |
| 777 return ninja_target_out.str(); | 770 return ninja_target_out.str(); |
| 778 } | 771 } |
| OLD | NEW |