Index: tools/gn/visual_studio_writer.cc |
diff --git a/tools/gn/visual_studio_writer.cc b/tools/gn/visual_studio_writer.cc |
index 6c364b3f3f9ff24935bc937b7d492fef43697133..54a7bf2e5fee2ad133abf4568fe65743af3ddd1e 100644 |
--- a/tools/gn/visual_studio_writer.cc |
+++ b/tools/gn/visual_studio_writer.cc |
@@ -11,12 +11,15 @@ |
#include "base/logging.h" |
#include "base/memory/scoped_ptr.h" |
+#include "base/strings/string_split.h" |
#include "base/strings/string_util.h" |
#include "base/strings/utf_string_conversions.h" |
#include "tools/gn/builder.h" |
+#include "tools/gn/commands.h" |
#include "tools/gn/config.h" |
#include "tools/gn/config_values_extractors.h" |
#include "tools/gn/filesystem_utils.h" |
+#include "tools/gn/label_pattern.h" |
#include "tools/gn/parse_tree.h" |
#include "tools/gn/path_output.h" |
#include "tools/gn/source_file_type.h" |
@@ -214,8 +217,30 @@ VisualStudioWriter::~VisualStudioWriter() { |
bool VisualStudioWriter::RunAndWriteFiles(const BuildSettings* build_settings, |
Builder* builder, |
Version version, |
+ const std::string& sln_name, |
+ const std::string& dir_filters, |
Err* err) { |
- std::vector<const Target*> targets = builder->GetAllResolvedTargets(); |
+ std::vector<const Target*> targets; |
+ if (dir_filters.empty()) { |
+ targets = builder->GetAllResolvedTargets(); |
+ } else { |
+ std::vector<std::string> tokens = base::SplitString( |
+ dir_filters, ";", base::TRIM_WHITESPACE, base::SPLIT_WANT_NONEMPTY); |
+ SourceDir root_dir = |
+ SourceDirForCurrentDirectory(build_settings->root_path()); |
+ |
+ std::vector<LabelPattern> filters; |
+ for (const std::string& token : tokens) { |
+ LabelPattern pattern = |
+ LabelPattern::GetPattern(root_dir, Value(nullptr, token), err); |
+ if (err->has_error()) |
+ return false; |
+ filters.push_back(pattern); |
+ } |
+ |
+ commands::FilterTargetsByPatterns(builder->GetAllResolvedTargets(), filters, |
+ &targets); |
+ } |
const char* config_platform = "Win32"; |
@@ -259,7 +284,7 @@ bool VisualStudioWriter::RunAndWriteFiles(const BuildSettings* build_settings, |
}); |
writer.ResolveSolutionFolders(); |
- return writer.WriteSolutionFile(err); |
+ return writer.WriteSolutionFile(sln_name, err); |
} |
bool VisualStudioWriter::WriteProjectFiles(const Target* target, Err* err) { |
@@ -590,9 +615,11 @@ void VisualStudioWriter::WriteFiltersFileContents(std::ostream& out, |
project.Text(files_out.str()); |
} |
-bool VisualStudioWriter::WriteSolutionFile(Err* err) { |
+bool VisualStudioWriter::WriteSolutionFile(const std::string& sln_name, |
+ Err* err) { |
+ std::string name = sln_name.empty() ? "all" : sln_name; |
SourceFile sln_file = build_settings_->build_dir().ResolveRelativeFile( |
- Value(nullptr, "all.sln"), err); |
+ Value(nullptr, name + ".sln"), err); |
if (sln_file.is_null()) |
return false; |
@@ -704,7 +731,8 @@ void VisualStudioWriter::ResolveSolutionFolders() { |
else if (root_folder_path_[i] != folder_path[i]) |
break; |
} |
- if (i == max_common_length) |
+ if (i == max_common_length && |
+ (i == folder_path.size() || IsSlash(folder_path[i]))) |
common_prefix_len = max_common_length; |
if (common_prefix_len < root_folder_path_.size()) { |
if (IsSlash(root_folder_path_[common_prefix_len - 1])) |