Index: tools/gn/filesystem_utils.cc |
diff --git a/tools/gn/filesystem_utils.cc b/tools/gn/filesystem_utils.cc |
index ca4562574df561a23ba4f6ecefdecfba422e8404..17fec9f4fb6187d30d73750883896a80ba5b13e3 100644 |
--- a/tools/gn/filesystem_utils.cc |
+++ b/tools/gn/filesystem_utils.cc |
@@ -11,6 +11,7 @@ |
#include "base/strings/string_util.h" |
#include "base/strings/utf_string_conversions.h" |
#include "build/build_config.h" |
+#include "tools/gn/file_template.h" |
#include "tools/gn/location.h" |
#include "tools/gn/settings.h" |
#include "tools/gn/source_dir.h" |
@@ -334,23 +335,28 @@ base::StringPiece FindLastDirComponent(const SourceDir& dir) { |
bool EnsureStringIsInOutputDir(const SourceDir& dir, |
const std::string& str, |
const Value& originating, |
+ bool allow_templates, |
Err* err) { |
- // The last char of the dir will be a slash. We don't care if the input ends |
- // in a slash or not, so just compare up until there. |
- // |
// This check will be wrong for all proper prefixes "e.g. "/output" will |
// match "/out" but we don't really care since this is just a sanity check. |
const std::string& dir_str = dir.value(); |
- if (str.compare(0, dir_str.length() - 1, dir_str, 0, dir_str.length() - 1) |
- != 0) { |
- *err = Err(originating, "File is not inside output directory.", |
- "The given file should be in the output directory. Normally you would " |
- "specify\n\"$target_out_dir/foo\" or " |
- "\"$target_gen_dir/foo\". I interpreted this as\n\"" |
- + str + "\"."); |
- return false; |
+ if (str.compare(0, dir_str.length(), dir_str, 0, dir_str.length()) == 0) |
+ return true; // Output directory is hardcoded. |
+ |
+ if (allow_templates) { |
+ // Allow the string to begin with any source expansion inside the output |
+ // directory. |
+ if (StartsWithASCII(str, FileTemplate::kSourceGenDir, true) || |
+ StartsWithASCII(str, FileTemplate::kSourceOutDir, true)) |
+ return true; |
} |
- return true; |
+ |
+ *err = Err(originating, "File is not inside output directory.", |
+ "The given file should be in the output directory. Normally you would " |
+ "specify\n\"$target_out_dir/foo\" or " |
+ "\"$target_gen_dir/foo\". I interpreted this as\n\"" |
+ + str + "\"."); |
+ return false; |
} |
bool IsPathAbsolute(const base::StringPiece& path) { |