GN: Use source root as base for gn gen filters When running gn gen with filters for the IDE output from ninja, the gn gen command used the working directory (//out/foo) as the base for resolving the filters, rather than "//" as is done when running gn gen directly. This CL fixes that by always using "//" as the root_dir. It also fixes filter labels that have had the leading "/" in "//" removed by Git Bash. R=dpranke@chromium.org Change-Id: I6c6e6f5e720d50b325d8b368f94ee1b3b5931627 Reviewed-on: https://chromium-review.googlesource.com/941209 Reviewed-by: Dirk Pranke <dpranke@chromium.org> Commit-Queue: Yngve Pettersen <yngve@vivaldi.com> Cr-Original-Commit-Position: refs/heads/master@{#548215} Cr-Mirrored-From: https://chromium.googlesource.com/chromium/src Cr-Mirrored-Commit: f7ccdc763eb515b93850db40cc6ea44c02e2015a
diff --git a/tools/gn/commands.cc b/tools/gn/commands.cc index c47f1b1..59d2391 100644 --- a/tools/gn/commands.cc +++ b/tools/gn/commands.cc
@@ -338,6 +338,35 @@ } } +#if defined(OS_WIN) +// Git bash will remove the first "/" in "//" paths +// This also happens for labels assigned to command line parameters, e.g. +// --filters +// Fix "//" paths, but not absolute and relative paths +inline std::string FixGitBashLabelEdit(const std::string& label) { + static std::unique_ptr<base::Environment> git_bash_env; + if (!git_bash_env) + git_bash_env = base::Environment::Create(); + + std::string temp_label(label); + + if (git_bash_env->HasVar( + "MSYSTEM") && // Only for MinGW based shells like Git Bash + temp_label[0] == '/' && // Only fix for //foo paths, not /f:oo paths + (temp_label.length() < 2 || + (temp_label[1] != '/' && + (temp_label.length() < 3 || temp_label[1] != ':')))) + temp_label.insert(0, "/"); + return temp_label; +} +#else +// Only repair on Windows +inline std::string FixGitBashLabelEdit(const std::string& label) { + return label; +} +#endif + + } // namespace CommandInfo::CommandInfo() @@ -383,22 +412,8 @@ Setup* setup, const std::string& label_string) { // Need to resolve the label after we know the default toolchain. - std::string temp_label = label_string; -#if defined(OS_WIN) - // Git bash will remove the first "/" in "//" paths - // Fix "//" paths, but not absolute and relative paths - std::unique_ptr<base::Environment> env(base::Environment::Create()); - - if (env->HasVar("MSYSTEM") && // Only for MinGW based shells like Git Bash - temp_label[0] == '/' && // Only fix for //foo paths, not /f:oo paths - (temp_label.length() < 2 || - (temp_label[1] != '/' && (temp_label.length() < 3 || - temp_label[1] != ':' )))) - temp_label.insert(0, "/"); -#endif - Label default_toolchain = setup->loader()->default_toolchain_label(); - Value arg_value(nullptr, temp_label); + Value arg_value(nullptr, FixGitBashLabelEdit(label_string)); Err err; Label label = Label::Resolve(SourceDirForCurrentDirectory( setup->build_settings().root_path()), @@ -485,13 +500,12 @@ Err* err) { std::vector<std::string> tokens = base::SplitString( label_list_string, ";", base::TRIM_WHITESPACE, base::SPLIT_WANT_NONEMPTY); - SourceDir root_dir = - SourceDirForCurrentDirectory(build_settings->root_path()); + SourceDir root_dir("//"); filters->reserve(tokens.size()); for (const std::string& token : tokens) { - LabelPattern pattern = - LabelPattern::GetPattern(root_dir, Value(nullptr, token), err); + LabelPattern pattern = LabelPattern::GetPattern( + root_dir, Value(nullptr, FixGitBashLabelEdit(token)), err); if (err->has_error()) return false; filters->push_back(pattern);