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

Side by Side Diff: tools/gn/visual_studio_writer.cc

Issue 1718093006: Limit the set of Visual Studio projects generated by GN (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebase onto current master + review and comment fix Created 4 years, 10 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 unified diff | Download patch
« no previous file with comments | « tools/gn/visual_studio_writer.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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>
11 11
12 #include "base/logging.h" 12 #include "base/logging.h"
13 #include "base/memory/scoped_ptr.h" 13 #include "base/memory/scoped_ptr.h"
14 #include "base/strings/string_split.h"
14 #include "base/strings/string_util.h" 15 #include "base/strings/string_util.h"
15 #include "base/strings/utf_string_conversions.h" 16 #include "base/strings/utf_string_conversions.h"
16 #include "tools/gn/builder.h" 17 #include "tools/gn/builder.h"
18 #include "tools/gn/commands.h"
17 #include "tools/gn/config.h" 19 #include "tools/gn/config.h"
18 #include "tools/gn/config_values_extractors.h" 20 #include "tools/gn/config_values_extractors.h"
19 #include "tools/gn/filesystem_utils.h" 21 #include "tools/gn/filesystem_utils.h"
22 #include "tools/gn/label_pattern.h"
20 #include "tools/gn/parse_tree.h" 23 #include "tools/gn/parse_tree.h"
21 #include "tools/gn/path_output.h" 24 #include "tools/gn/path_output.h"
22 #include "tools/gn/source_file_type.h" 25 #include "tools/gn/source_file_type.h"
23 #include "tools/gn/standard_out.h" 26 #include "tools/gn/standard_out.h"
24 #include "tools/gn/target.h" 27 #include "tools/gn/target.h"
25 #include "tools/gn/variables.h" 28 #include "tools/gn/variables.h"
26 #include "tools/gn/visual_studio_utils.h" 29 #include "tools/gn/visual_studio_utils.h"
27 #include "tools/gn/xml_element_writer.h" 30 #include "tools/gn/xml_element_writer.h"
28 31
29 #if defined(OS_WIN) 32 #if defined(OS_WIN)
(...skipping 177 matching lines...) Expand 10 before | Expand all | Expand 10 after
207 210
208 VisualStudioWriter::~VisualStudioWriter() { 211 VisualStudioWriter::~VisualStudioWriter() {
209 STLDeleteContainerPointers(projects_.begin(), projects_.end()); 212 STLDeleteContainerPointers(projects_.begin(), projects_.end());
210 STLDeleteContainerPointers(folders_.begin(), folders_.end()); 213 STLDeleteContainerPointers(folders_.begin(), folders_.end());
211 } 214 }
212 215
213 // static 216 // static
214 bool VisualStudioWriter::RunAndWriteFiles(const BuildSettings* build_settings, 217 bool VisualStudioWriter::RunAndWriteFiles(const BuildSettings* build_settings,
215 Builder* builder, 218 Builder* builder,
216 Version version, 219 Version version,
220 const std::string& sln_name,
221 const std::string& dir_filters,
217 Err* err) { 222 Err* err) {
218 std::vector<const Target*> targets = builder->GetAllResolvedTargets(); 223 std::vector<const Target*> targets;
224 if (dir_filters.empty()) {
225 targets = builder->GetAllResolvedTargets();
226 } else {
227 std::vector<std::string> tokens = base::SplitString(
228 dir_filters, ";", base::TRIM_WHITESPACE, base::SPLIT_WANT_NONEMPTY);
229 SourceDir root_dir =
230 SourceDirForCurrentDirectory(build_settings->root_path());
231
232 std::vector<LabelPattern> filters;
233 for (const std::string& token : tokens) {
234 LabelPattern pattern =
235 LabelPattern::GetPattern(root_dir, Value(nullptr, token), err);
236 if (err->has_error())
237 return false;
238 filters.push_back(pattern);
239 }
240
241 commands::FilterTargetsByPatterns(builder->GetAllResolvedTargets(), filters,
242 &targets);
243 }
219 244
220 const char* config_platform = "Win32"; 245 const char* config_platform = "Win32";
221 246
222 // Assume the "target_cpu" variable does not change between different 247 // Assume the "target_cpu" variable does not change between different
223 // toolchains. 248 // toolchains.
224 if (!targets.empty()) { 249 if (!targets.empty()) {
225 const Scope* scope = targets.front()->settings()->base_config(); 250 const Scope* scope = targets.front()->settings()->base_config();
226 const Value* target_cpu_value = scope->GetValue(variables::kTargetCpu); 251 const Value* target_cpu_value = scope->GetValue(variables::kTargetCpu);
227 if (target_cpu_value != nullptr && 252 if (target_cpu_value != nullptr &&
228 target_cpu_value->string_value() == "x64") 253 target_cpu_value->string_value() == "x64")
(...skipping 23 matching lines...) Expand all
252 } 277 }
253 278
254 // Sort projects so they appear always in the same order in solution file. 279 // Sort projects so they appear always in the same order in solution file.
255 // Otherwise solution file is rewritten and reloaded by Visual Studio. 280 // Otherwise solution file is rewritten and reloaded by Visual Studio.
256 std::sort(writer.projects_.begin(), writer.projects_.end(), 281 std::sort(writer.projects_.begin(), writer.projects_.end(),
257 [](const SolutionEntry* a, const SolutionEntry* b) { 282 [](const SolutionEntry* a, const SolutionEntry* b) {
258 return a->path < b->path; 283 return a->path < b->path;
259 }); 284 });
260 285
261 writer.ResolveSolutionFolders(); 286 writer.ResolveSolutionFolders();
262 return writer.WriteSolutionFile(err); 287 return writer.WriteSolutionFile(sln_name, err);
263 } 288 }
264 289
265 bool VisualStudioWriter::WriteProjectFiles(const Target* target, Err* err) { 290 bool VisualStudioWriter::WriteProjectFiles(const Target* target, Err* err) {
266 std::string project_name = target->label().name(); 291 std::string project_name = target->label().name();
267 const char* project_config_platform = config_platform_; 292 const char* project_config_platform = config_platform_;
268 if (!target->settings()->is_default()) { 293 if (!target->settings()->is_default()) {
269 project_name += "_" + target->toolchain()->label().name(); 294 project_name += "_" + target->toolchain()->label().name();
270 const Value* value = 295 const Value* value =
271 target->settings()->base_config()->GetValue(variables::kCurrentCpu); 296 target->settings()->base_config()->GetValue(variables::kCurrentCpu);
272 if (value != nullptr && value->string_value() == "x64") 297 if (value != nullptr && value->string_value() == "x64")
(...skipping 310 matching lines...) Expand 10 before | Expand all | Expand 10 after
583 } 608 }
584 cl_item->SubElement("Filter")->Text(filter_path); 609 cl_item->SubElement("Filter")->Text(filter_path);
585 } 610 }
586 } 611 }
587 } 612 }
588 } 613 }
589 614
590 project.Text(files_out.str()); 615 project.Text(files_out.str());
591 } 616 }
592 617
593 bool VisualStudioWriter::WriteSolutionFile(Err* err) { 618 bool VisualStudioWriter::WriteSolutionFile(const std::string& sln_name,
619 Err* err) {
620 std::string name = sln_name.empty() ? "all" : sln_name;
594 SourceFile sln_file = build_settings_->build_dir().ResolveRelativeFile( 621 SourceFile sln_file = build_settings_->build_dir().ResolveRelativeFile(
595 Value(nullptr, "all.sln"), err); 622 Value(nullptr, name + ".sln"), err);
596 if (sln_file.is_null()) 623 if (sln_file.is_null())
597 return false; 624 return false;
598 625
599 base::FilePath sln_path = build_settings_->GetFullPath(sln_file); 626 base::FilePath sln_path = build_settings_->GetFullPath(sln_file);
600 627
601 std::stringstream string_out; 628 std::stringstream string_out;
602 WriteSolutionFileContents(string_out, sln_path.DirName()); 629 WriteSolutionFileContents(string_out, sln_path.DirName());
603 630
604 // Only write the content to the file if it's different. That is 631 // Only write the content to the file if it's different. That is
605 // both a performance optimization and more importantly, prevents 632 // both a performance optimization and more importantly, prevents
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after
697 size_t common_prefix_len = 0; 724 size_t common_prefix_len = 0;
698 size_t max_common_length = 725 size_t max_common_length =
699 std::min(root_folder_path_.size(), folder_path.size()); 726 std::min(root_folder_path_.size(), folder_path.size());
700 size_t i; 727 size_t i;
701 for (i = common_prefix_len; i < max_common_length; ++i) { 728 for (i = common_prefix_len; i < max_common_length; ++i) {
702 if (IsSlash(root_folder_path_[i]) && IsSlash(folder_path[i])) 729 if (IsSlash(root_folder_path_[i]) && IsSlash(folder_path[i]))
703 common_prefix_len = i + 1; 730 common_prefix_len = i + 1;
704 else if (root_folder_path_[i] != folder_path[i]) 731 else if (root_folder_path_[i] != folder_path[i])
705 break; 732 break;
706 } 733 }
707 if (i == max_common_length) 734 if (i == max_common_length &&
735 (i == folder_path.size() || IsSlash(folder_path[i])))
708 common_prefix_len = max_common_length; 736 common_prefix_len = max_common_length;
709 if (common_prefix_len < root_folder_path_.size()) { 737 if (common_prefix_len < root_folder_path_.size()) {
710 if (IsSlash(root_folder_path_[common_prefix_len - 1])) 738 if (IsSlash(root_folder_path_[common_prefix_len - 1]))
711 --common_prefix_len; 739 --common_prefix_len;
712 root_folder_path_ = root_folder_path_.substr(0, common_prefix_len); 740 root_folder_path_ = root_folder_path_.substr(0, common_prefix_len);
713 } 741 }
714 } 742 }
715 } 743 }
716 } 744 }
717 745
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
762 } 790 }
763 } 791 }
764 792
765 std::string VisualStudioWriter::GetNinjaTarget(const Target* target) { 793 std::string VisualStudioWriter::GetNinjaTarget(const Target* target) {
766 std::ostringstream ninja_target_out; 794 std::ostringstream ninja_target_out;
767 DCHECK(!target->dependency_output_file().value().empty()); 795 DCHECK(!target->dependency_output_file().value().empty());
768 ninja_path_output_.WriteFile(ninja_target_out, 796 ninja_path_output_.WriteFile(ninja_target_out,
769 target->dependency_output_file()); 797 target->dependency_output_file());
770 return ninja_target_out.str(); 798 return ninja_target_out.str();
771 } 799 }
OLDNEW
« no previous file with comments | « tools/gn/visual_studio_writer.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698