Index: tools/gn/setup.cc |
diff --git a/tools/gn/setup.cc b/tools/gn/setup.cc |
index 79814e602fe7a2f14a152ce9dae5d3d361d5f2d7..966150614915aca0f5f177bdcbe25a1bc45377e2 100644 |
--- a/tools/gn/setup.cc |
+++ b/tools/gn/setup.cc |
@@ -226,6 +226,21 @@ base::FilePath FindWindowsPython() { |
} |
#endif |
+// Expands all ./, ../, and symbolic links in the given path. |
+bool GetRealPath(const base::FilePath& path, base::FilePath* out) { |
hashimoto
2016/02/23 10:17:31
Renamed this function to GetRealPath() as filesyst
|
+#if defined(OS_POSIX) |
+ char buf[PATH_MAX]; |
+ if (!realpath(path.value().c_str(), buf)) { |
+ return false; |
+ } |
+ *out = base::FilePath(buf); |
+#else |
+ // Do nothing on a non-POSIX system. |
+ *out = path; |
+#endif |
+ return true; |
+} |
+ |
} // namespace |
const char Setup::kBuildArgFileName[] = "args.gn"; |
@@ -513,9 +528,16 @@ bool Setup::FillSourceDir(const base::CommandLine& cmdline) { |
root_path = dotfile_name_.DirName(); |
} |
+ base::FilePath root_realpath; |
+ if (!GetRealPath(root_path, &root_realpath)) { |
+ Err(Location(), "Can't get the real root path.", |
+ "I could not get the real path of \"" + FilePathToUTF8(root_path) + |
+ "\".").PrintToStdout(); |
+ return false; |
+ } |
if (scheduler_.verbose_logging()) |
- scheduler_.Log("Using source root", FilePathToUTF8(root_path)); |
- build_settings_.SetRootPath(root_path); |
+ scheduler_.Log("Using source root", FilePathToUTF8(root_realpath)); |
+ build_settings_.SetRootPath(root_realpath); |
return true; |
} |
@@ -531,11 +553,27 @@ bool Setup::FillBuildDir(const std::string& build_dir, bool require_exists) { |
return false; |
} |
+ base::FilePath build_dir_path = build_settings_.GetFullPath(resolved); |
+ if (!base::CreateDirectory(build_dir_path)) { |
+ Err(Location(), "Can't create the build dir.", |
+ "I could not create the build dir \"" + FilePathToUTF8(build_dir_path) + |
+ "\".").PrintToStdout(); |
+ return false; |
+ } |
+ base::FilePath build_dir_realpath; |
+ if (!GetRealPath(build_dir_path, &build_dir_realpath)) { |
+ Err(Location(), "Can't get the real build dir path.", |
+ "I could not get the real path of \"" + FilePathToUTF8(build_dir_path) + |
+ "\".").PrintToStdout(); |
+ return false; |
+ } |
+ resolved = SourceDirForPath(build_settings_.root_path(), |
+ build_dir_realpath); |
+ |
if (scheduler_.verbose_logging()) |
scheduler_.Log("Using build dir", resolved.value()); |
if (require_exists) { |
- base::FilePath build_dir_path = build_settings_.GetFullPath(resolved); |
if (!base::PathExists(build_dir_path.Append( |
FILE_PATH_LITERAL("build.ninja")))) { |
Err(Location(), "Not a build directory.", |