GN: Fix CPU detection in Visual Studio generator The previous version assumed that if there is no build override for "current_cpu" then it means "x86". R=brettw@chromium.org, tmoniuszko@opera.com BUG= Review URL: https://codereview.chromium.org/1733023002 Cr-Original-Commit-Position: refs/heads/master@{#377577} Cr-Mirrored-From: https://chromium.googlesource.com/chromium/src Cr-Mirrored-Commit: 5dd34fc85aab35792d7034ac3caf3a8f9f38ba8a
diff --git a/tools/gn/visual_studio_writer.cc b/tools/gn/visual_studio_writer.cc index a404461..2c454d2 100644 --- a/tools/gn/visual_studio_writer.cc +++ b/tools/gn/visual_studio_writer.cc
@@ -178,18 +178,15 @@ VisualStudioWriter::SolutionProject::~SolutionProject() = default; VisualStudioWriter::VisualStudioWriter(const BuildSettings* build_settings, + bool is_debug_config, + const char* config_platform, Version version) : build_settings_(build_settings), + is_debug_config_(is_debug_config), + config_platform_(config_platform), ninja_path_output_(build_settings->build_dir(), build_settings->root_path_utf8(), EscapingMode::ESCAPE_NINJA_COMMAND) { - const Value* value = build_settings->build_args().GetArgOverride("is_debug"); - is_debug_config_ = value == nullptr || value->boolean_value(); - config_platform_ = "Win32"; - value = build_settings->build_args().GetArgOverride(variables::kTargetCpu); - if (value != nullptr && value->string_value() == "x64") - config_platform_ = "x64"; - switch (version) { case Version::Vs2013: project_version_ = kProjectVersionVs2013; @@ -220,7 +217,24 @@ Err* err) { std::vector<const Target*> targets = builder->GetAllResolvedTargets(); - VisualStudioWriter writer(build_settings, version); + bool is_debug_config = true; + const char* config_platform = "Win32"; + + // Assume the "is_debug" and "target_cpu" variables do not change + // between different toolchains. + if (!targets.empty()) { + const Scope* scope = targets.front()->settings()->base_config(); + const Value* is_debug_value = scope->GetValue("is_debug"); + is_debug_config = + is_debug_value == nullptr || is_debug_value->boolean_value(); + const Value* target_cpu_value = scope->GetValue(variables::kTargetCpu); + if (target_cpu_value != nullptr && + target_cpu_value->string_value() == "x64") + config_platform = "x64"; + } + + VisualStudioWriter writer(build_settings, is_debug_config, config_platform, + version); writer.projects_.reserve(targets.size()); writer.folders_.reserve(targets.size()); @@ -255,16 +269,14 @@ bool VisualStudioWriter::WriteProjectFiles(const Target* target, Err* err) { std::string project_name = target->label().name(); - std::string project_config_platform = config_platform_; + const char* project_config_platform = config_platform_; if (!target->settings()->is_default()) { project_name += "_" + target->toolchain()->label().name(); - project_config_platform = target->toolchain() - ->settings() - ->build_settings() - ->build_args() - .GetArgOverride(variables::kCurrentCpu) - ->string_value(); - if (project_config_platform == "x86") + const Value* value = + target->settings()->base_config()->GetValue(variables::kCurrentCpu); + if (value != nullptr && value->string_value() == "x64") + project_config_platform = "x64"; + else project_config_platform = "Win32"; }
diff --git a/tools/gn/visual_studio_writer.h b/tools/gn/visual_studio_writer.h index 8ca92fb..e9f2658 100644 --- a/tools/gn/visual_studio_writer.h +++ b/tools/gn/visual_studio_writer.h
@@ -75,6 +75,8 @@ using SolutionFolders = std::vector<SolutionEntry*>; explicit VisualStudioWriter(const BuildSettings* build_settings, + bool is_debug_config, + const char* config_platform, Version version); ~VisualStudioWriter(); @@ -110,7 +112,7 @@ // Platform for solution configuration (Win32, x64). Some projects may be // configured for different platform. - std::string config_platform_; + const char* config_platform_; // All projects contained by solution. SolutionProjects projects_;
diff --git a/tools/gn/visual_studio_writer_unittest.cc b/tools/gn/visual_studio_writer_unittest.cc index 1675e4f..e8ad75a 100644 --- a/tools/gn/visual_studio_writer_unittest.cc +++ b/tools/gn/visual_studio_writer_unittest.cc
@@ -26,7 +26,7 @@ } // namespace TEST_F(VisualStudioWriterTest, ResolveSolutionFolders) { - VisualStudioWriter writer(setup_.build_settings(), + VisualStudioWriter writer(setup_.build_settings(), true, "Win32", VisualStudioWriter::Version::Vs2015); std::string path = @@ -80,7 +80,7 @@ } TEST_F(VisualStudioWriterTest, ResolveSolutionFolders_AbsPath) { - VisualStudioWriter writer(setup_.build_settings(), + VisualStudioWriter writer(setup_.build_settings(), true, "Win32", VisualStudioWriter::Version::Vs2015); std::string path =