Chromium Code Reviews| 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.", |