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 =