Index: tools/gn/filesystem_utils.cc |
diff --git a/tools/gn/filesystem_utils.cc b/tools/gn/filesystem_utils.cc |
index 44de5adaa221492bd11c505317e4d392205be1d6..a3455fdf088b6829e63fa94e2551699694879858 100644 |
--- a/tools/gn/filesystem_utils.cc |
+++ b/tools/gn/filesystem_utils.cc |
@@ -686,6 +686,32 @@ SourceDir GetOutputDirForSourceDir(const Settings* settings, |
settings->toolchain_label(), settings->is_default()); |
} |
+void AppendFixedAbsolutePathSuffix(const BuildSettings* build_settings, |
+ const SourceDir& source_dir, |
+ OutputFile* result) { |
+ const std::string& build_dir = build_settings->build_dir().value(); |
+ |
+ if (base::StartsWith(source_dir.value(), build_dir, |
+ base::CompareCase::SENSITIVE)) { |
+ size_t build_dir_size = build_dir.size(); |
+ result->value().append(&source_dir.value()[build_dir_size], |
+ source_dir.value().size() - build_dir_size); |
+ } else { |
+ result->value().append("ABS_PATH"); |
+#if defined(OS_WIN) |
+ // Windows absolute path contains ':' after drive letter. Remove it to |
+ // avoid inserting ':' in the middle of path (eg. "ABS_PATH/C:/"). |
+ std::string src_dir_value = source_dir.value(); |
+ const auto colon_pos = src_dir_value.find(':'); |
+ if (colon_pos != std::string::npos) |
+ src_dir_value.erase(src_dir_value.begin() + colon_pos); |
+#else |
+ const std::string& src_dir_value = source_dir.value(); |
+#endif |
+ result->value().append(src_dir_value); |
+ } |
+} |
+ |
SourceDir GetOutputDirForSourceDir( |
const BuildSettings* build_settings, |
const SourceDir& source_dir, |
@@ -711,27 +737,7 @@ OutputFile GetOutputDirForSourceDirAsOutputFile( |
source_dir.value().size() - 2); |
} else { |
// System-absolute. |
- const std::string& build_dir = build_settings->build_dir().value(); |
- |
- if (base::StartsWith(source_dir.value(), build_dir, |
- base::CompareCase::SENSITIVE)) { |
- size_t build_dir_size = build_dir.size(); |
- result.value().append(&source_dir.value()[build_dir_size], |
- source_dir.value().size() - build_dir_size); |
- } else { |
- result.value().append("ABS_PATH"); |
-#if defined(OS_WIN) |
- // Windows absolute path contains ':' after drive letter. Remove it to |
- // avoid inserting ':' in the middle of path (eg. "ABS_PATH/C:/"). |
- std::string src_dir_value = source_dir.value(); |
- const auto colon_pos = src_dir_value.find(':'); |
- if (colon_pos != std::string::npos) |
- src_dir_value.erase(src_dir_value.begin() + colon_pos); |
-#else |
- const std::string& src_dir_value = source_dir.value(); |
-#endif |
- result.value().append(src_dir_value); |
- } |
+ AppendFixedAbsolutePathSuffix(build_settings, source_dir, &result); |
} |
return result; |
} |
@@ -759,6 +765,10 @@ OutputFile GetGenDirForSourceDirAsOutputFile(const Settings* settings, |
DCHECK(source_dir.is_source_absolute()); |
result.value().append(&source_dir.value()[2], |
source_dir.value().size() - 2); |
+ } else { |
+ // System-absolute. |
+ AppendFixedAbsolutePathSuffix(settings->build_settings(), source_dir, |
+ &result); |
} |
return result; |
} |