Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(21)

Unified Diff: tools/gn/visual_studio_writer.cc

Issue 1667773002: Support different project toolchains (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « tools/gn/visual_studio_writer.h ('k') | tools/gn/visual_studio_writer_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: tools/gn/visual_studio_writer.cc
diff --git a/tools/gn/visual_studio_writer.cc b/tools/gn/visual_studio_writer.cc
index 968e046b72fb129979ea276b5fe8cb0f5cc0aabb..faf391fe6b18b90e883e5ce2b568bbfa94d698d0 100644
--- a/tools/gn/visual_studio_writer.cc
+++ b/tools/gn/visual_studio_writer.cc
@@ -182,6 +182,18 @@ VisualStudioWriter::SolutionEntry::SolutionEntry(const std::string& _name,
VisualStudioWriter::SolutionEntry::~SolutionEntry() = default;
+VisualStudioWriter::SolutionProject::SolutionProject(
+ const std::string& _name,
+ const std::string& _path,
+ const std::string& _guid,
+ const std::string& _label_dir_path,
+ const std::string& _config_platform)
+ : SolutionEntry(_name, _path, _guid),
+ label_dir_path(_label_dir_path),
+ config_platform(_config_platform) {}
+
+VisualStudioWriter::SolutionProject::~SolutionProject() = default;
+
VisualStudioWriter::VisualStudioWriter(const BuildSettings* build_settings)
: build_settings_(build_settings) {
const Value* value = build_settings->build_args().GetArgOverride("is_debug");
@@ -209,14 +221,7 @@ bool VisualStudioWriter::RunAndWriteFiles(const BuildSettings* build_settings,
writer.projects_.reserve(targets.size());
writer.folders_.reserve(targets.size());
- std::set<std::string> processed_targets;
for (const Target* target : targets) {
- // Skip targets which are duplicated in vector.
- std::string target_path =
- target->label().dir().value() + target->label().name();
- if (processed_targets.find(target_path) != processed_targets.end())
- continue;
-
// Skip actions and groups.
if (target->output_type() == Target::GROUP ||
target->output_type() == Target::COPY_FILES ||
@@ -227,8 +232,6 @@ bool VisualStudioWriter::RunAndWriteFiles(const BuildSettings* build_settings,
if (!writer.WriteProjectFiles(target, err))
return false;
-
- processed_targets.insert(target_path);
}
if (writer.projects_.empty()) {
@@ -241,19 +244,33 @@ bool VisualStudioWriter::RunAndWriteFiles(const BuildSettings* build_settings,
}
bool VisualStudioWriter::WriteProjectFiles(const Target* target, Err* err) {
+ std::string project_name = target->label().name();
+ std::string 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")
+ project_config_platform = "Win32";
+ }
+
SourceFile target_file = GetTargetOutputDir(target).ResolveRelativeFile(
- Value(nullptr, target->label().name() + ".vcxproj"), err);
+ Value(nullptr, project_name + ".vcxproj"), err);
if (target_file.is_null())
return false;
base::FilePath vcxproj_path = build_settings_->GetFullPath(target_file);
std::string vcxproj_path_str = FilePathToUTF8(vcxproj_path);
- projects_.push_back(
- new SolutionEntry(target->label().name(), vcxproj_path_str,
- MakeGuid(vcxproj_path_str, kGuidSeedProject)));
- projects_.back()->label_dir_path =
- FilePathToUTF8(build_settings_->GetFullPath(target->label().dir()));
+ projects_.push_back(new SolutionProject(
+ project_name, vcxproj_path_str,
+ MakeGuid(vcxproj_path_str, kGuidSeedProject),
+ FilePathToUTF8(build_settings_->GetFullPath(target->label().dir())),
+ project_config_platform));
std::stringstream vcxproj_string_out;
if (!WriteProjectFileContents(vcxproj_string_out, *projects_.back(), target,
@@ -295,7 +312,7 @@ bool VisualStudioWriter::WriteProjectFiles(const Target* target, Err* err) {
bool VisualStudioWriter::WriteProjectFileContents(
std::ostream& out,
- const SolutionEntry& solution_project,
+ const SolutionProject& solution_project,
const Target* target,
Err* err) {
PathOutput path_output(GetTargetOutputDir(target),
@@ -315,9 +332,11 @@ bool VisualStudioWriter::WriteProjectFileContents(
std::string config_name = is_debug_config_ ? "Debug" : "Release";
scoped_ptr<XmlElementWriter> project_config = configurations->SubElement(
"ProjectConfiguration",
- XmlAttributes("Include", config_name + '|' + config_platform_));
+ XmlAttributes("Include",
+ config_name + '|' + solution_project.config_platform));
project_config->SubElement("Configuration")->Text(config_name);
- project_config->SubElement("Platform")->Text(config_platform_);
+ project_config->SubElement("Platform")
+ ->Text(solution_project.config_platform);
}
{
@@ -625,19 +644,21 @@ void VisualStudioWriter::WriteSolutionFileContents(
out << "\tGlobalSection(SolutionConfigurationPlatforms) = preSolution"
<< std::endl;
- const std::string config_mode =
- std::string(is_debug_config_ ? "Debug" : "Release") + '|' +
- config_platform_;
+ const std::string config_mode_prefix =
+ std::string(is_debug_config_ ? "Debug" : "Release") + '|';
+ const std::string config_mode = config_mode_prefix + config_platform_;
out << "\t\t" << config_mode << " = " << config_mode << std::endl;
out << "\tEndGlobalSection" << std::endl;
out << "\tGlobalSection(ProjectConfigurationPlatforms) = postSolution"
<< std::endl;
- for (const SolutionEntry* project : projects_) {
+ for (const SolutionProject* project : projects_) {
+ const std::string project_config_mode =
+ config_mode_prefix + project->config_platform;
out << "\t\t" << project->guid << '.' << config_mode
- << ".ActiveCfg = " << config_mode << std::endl;
+ << ".ActiveCfg = " << project_config_mode << std::endl;
out << "\t\t" << project->guid << '.' << config_mode
- << ".Build.0 = " << config_mode << std::endl;
+ << ".Build.0 = " << project_config_mode << std::endl;
}
out << "\tEndGlobalSection" << std::endl;
@@ -666,7 +687,7 @@ void VisualStudioWriter::ResolveSolutionFolders() {
// Get all project directories. Create solution folder for each directory.
std::map<base::StringPiece, SolutionEntry*> processed_paths;
- for (SolutionEntry* project : projects_) {
+ for (SolutionProject* project : projects_) {
base::StringPiece folder_path = project->label_dir_path;
if (IsSlash(folder_path[folder_path.size() - 1]))
folder_path = folder_path.substr(0, folder_path.size() - 1);
@@ -707,7 +728,7 @@ void VisualStudioWriter::ResolveSolutionFolders() {
}
// Create also all parent folders up to |root_folder_path_|.
- SolutionEntries additional_folders;
+ SolutionFolders additional_folders;
for (SolutionEntry* folder : folders_) {
if (folder->path == root_folder_path_)
continue;
@@ -738,7 +759,7 @@ void VisualStudioWriter::ResolveSolutionFolders() {
// Match subfolders with their parents. Since |folders_| are sorted by path we
// know that parent folder always precedes its children in vector.
- SolutionEntries parents;
+ SolutionFolders parents;
for (SolutionEntry* folder : folders_) {
while (!parents.empty()) {
if (base::StartsWith(folder->path, parents.back()->path,
« no previous file with comments | « tools/gn/visual_studio_writer.h ('k') | tools/gn/visual_studio_writer_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698