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();