GN: Normalize the build directory path
BUG=586906
TEST=ln -s /tmp out_tmp && out/gn/gn gen out_tmp/Release
Review URL: https://codereview.chromium.org/1708513002
Cr-Original-Commit-Position: refs/heads/master@{#375970}
Cr-Mirrored-From: https://chromium.googlesource.com/chromium/src
Cr-Mirrored-Commit: 89d33db3bfd53fbb3d85bb218ad4db8489a4dc34
diff --git a/tools/gn/setup.cc b/tools/gn/setup.cc
index 79814e6..831e4e4 100644
--- a/tools/gn/setup.cc
+++ b/tools/gn/setup.cc
@@ -521,10 +521,23 @@
}
bool Setup::FillBuildDir(const std::string& build_dir, bool require_exists) {
+#if defined(OS_POSIX)
+ // Expand all ./, ../, and symbolic links in build_dir.
+ char realpath_buf[PATH_MAX];
+ if (!realpath(build_dir.c_str(), realpath_buf)) {
+ Err(Location(), "Can't normalize the build directory path.",
+ strerror(errno)) .PrintToStdout();
+ return false;
+ }
+ const std::string build_dir_realpath = realpath_buf;
+#else
+ const std::string& build_dir_realpath = build_dir;
+#endif
+
Err err;
SourceDir resolved =
SourceDirForCurrentDirectory(build_settings_.root_path()).
- ResolveRelativeDir(Value(nullptr, build_dir), &err,
+ ResolveRelativeDir(Value(nullptr, build_dir_realpath), &err,
build_settings_.root_path_utf8());
if (err.has_error()) {
err.PrintToStdout();