OLD | NEW |
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "tools/gn/setup.h" | 5 #include "tools/gn/setup.h" |
6 | 6 |
7 #include <stdlib.h> | 7 #include <stdlib.h> |
8 #include <algorithm> | 8 #include <algorithm> |
9 #include <sstream> | 9 #include <sstream> |
10 #include <utility> | 10 #include <utility> |
(...skipping 208 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
219 if (base::PathExists(candidate_bat)) { | 219 if (base::PathExists(candidate_bat)) { |
220 base::FilePath python_exe = PythonBatToExe(candidate_bat); | 220 base::FilePath python_exe = PythonBatToExe(candidate_bat); |
221 if (!python_exe.empty()) | 221 if (!python_exe.empty()) |
222 return python_exe; | 222 return python_exe; |
223 } | 223 } |
224 } | 224 } |
225 return base::FilePath(); | 225 return base::FilePath(); |
226 } | 226 } |
227 #endif | 227 #endif |
228 | 228 |
229 // Expands all ./, ../, and symbolic links in the given path. | |
230 bool NormalizePath(const base::FilePath& path, base::FilePath* out) { | |
231 #if defined(OS_POSIX) | |
232 char buf[PATH_MAX]; | |
233 if (!realpath(path.value().c_str(), buf)) { | |
234 return false; | |
235 } | |
236 *out = base::FilePath(buf); | |
237 #else | |
238 // Do nothing on a non-POSIX system. | |
239 *out = path; | |
240 #endif | |
241 return true; | |
242 } | |
243 | |
244 } // namespace | 229 } // namespace |
245 | 230 |
246 const char Setup::kBuildArgFileName[] = "args.gn"; | 231 const char Setup::kBuildArgFileName[] = "args.gn"; |
247 | 232 |
248 Setup::Setup() | 233 Setup::Setup() |
249 : build_settings_(), | 234 : build_settings_(), |
250 loader_(new LoaderImpl(&build_settings_)), | 235 loader_(new LoaderImpl(&build_settings_)), |
251 builder_(new Builder(loader_.get())), | 236 builder_(new Builder(loader_.get())), |
252 root_build_file_("//BUILD.gn"), | 237 root_build_file_("//BUILD.gn"), |
253 check_public_headers_(false), | 238 check_public_headers_(false), |
(...skipping 267 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
521 if (dotfile_name_.empty()) { | 506 if (dotfile_name_.empty()) { |
522 Err(Location(), "Can't find source root.", | 507 Err(Location(), "Can't find source root.", |
523 "I could not find a \".gn\" file in the current directory or any " | 508 "I could not find a \".gn\" file in the current directory or any " |
524 "parent,\nand the --root command-line argument was not specified.") | 509 "parent,\nand the --root command-line argument was not specified.") |
525 .PrintToStdout(); | 510 .PrintToStdout(); |
526 return false; | 511 return false; |
527 } | 512 } |
528 root_path = dotfile_name_.DirName(); | 513 root_path = dotfile_name_.DirName(); |
529 } | 514 } |
530 | 515 |
531 base::FilePath root_path_normalized; | |
532 if (!NormalizePath(root_path, &root_path_normalized)) { | |
533 Err(Location(), "Can't normalize the root path.", | |
534 "I could not normalize the path \"" + FilePathToUTF8(root_path) + "\".") | |
535 .PrintToStdout(); | |
536 return false; | |
537 } | |
538 if (scheduler_.verbose_logging()) | 516 if (scheduler_.verbose_logging()) |
539 scheduler_.Log("Using source root", FilePathToUTF8(root_path_normalized)); | 517 scheduler_.Log("Using source root", FilePathToUTF8(root_path)); |
540 build_settings_.SetRootPath(root_path_normalized); | 518 build_settings_.SetRootPath(root_path); |
541 | 519 |
542 return true; | 520 return true; |
543 } | 521 } |
544 | 522 |
545 bool Setup::FillBuildDir(const std::string& build_dir, bool require_exists) { | 523 bool Setup::FillBuildDir(const std::string& build_dir, bool require_exists) { |
546 Err err; | 524 Err err; |
547 SourceDir resolved = | 525 SourceDir resolved = |
548 SourceDirForCurrentDirectory(build_settings_.root_path()). | 526 SourceDirForCurrentDirectory(build_settings_.root_path()). |
549 ResolveRelativeDir(Value(nullptr, build_dir), &err, | 527 ResolveRelativeDir(Value(nullptr, build_dir), &err, |
550 build_settings_.root_path_utf8()); | 528 build_settings_.root_path_utf8()); |
551 if (err.has_error()) { | 529 if (err.has_error()) { |
552 err.PrintToStdout(); | 530 err.PrintToStdout(); |
553 return false; | 531 return false; |
554 } | 532 } |
555 | 533 |
556 base::FilePath build_dir_path = build_settings_.GetFullPath(resolved); | |
557 base::FilePath build_dir_path_normalized; | |
558 if (!NormalizePath(build_dir_path, &build_dir_path_normalized)) { | |
559 Err(Location(), "Can't normalize the root path.", | |
560 "I could not normalize the path \"" + FilePathToUTF8(build_dir_path) + | |
561 "\".").PrintToStdout(); | |
562 return false; | |
563 } | |
564 resolved = SourceDirForPath(build_settings_.root_path(), | |
565 build_dir_path_normalized); | |
566 | |
567 if (scheduler_.verbose_logging()) | 534 if (scheduler_.verbose_logging()) |
568 scheduler_.Log("Using build dir", resolved.value()); | 535 scheduler_.Log("Using build dir", resolved.value()); |
569 | 536 |
570 if (require_exists) { | 537 if (require_exists) { |
| 538 base::FilePath build_dir_path = build_settings_.GetFullPath(resolved); |
571 if (!base::PathExists(build_dir_path.Append( | 539 if (!base::PathExists(build_dir_path.Append( |
572 FILE_PATH_LITERAL("build.ninja")))) { | 540 FILE_PATH_LITERAL("build.ninja")))) { |
573 Err(Location(), "Not a build directory.", | 541 Err(Location(), "Not a build directory.", |
574 "This command requires an existing build directory. I interpreted " | 542 "This command requires an existing build directory. I interpreted " |
575 "your input\n\"" + build_dir + "\" as:\n " + | 543 "your input\n\"" + build_dir + "\" as:\n " + |
576 FilePathToUTF8(build_dir_path) + | 544 FilePathToUTF8(build_dir_path) + |
577 "\nwhich doesn't seem to contain a previously-generated build.") | 545 "\nwhich doesn't seem to contain a previously-generated build.") |
578 .PrintToStdout(); | 546 .PrintToStdout(); |
579 return false; | 547 return false; |
580 } | 548 } |
(...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
716 if (err.has_error()) { | 684 if (err.has_error()) { |
717 err.PrintToStdout(); | 685 err.PrintToStdout(); |
718 return false; | 686 return false; |
719 } | 687 } |
720 } | 688 } |
721 build_settings_.set_exec_script_whitelist(std::move(whitelist)); | 689 build_settings_.set_exec_script_whitelist(std::move(whitelist)); |
722 } | 690 } |
723 | 691 |
724 return true; | 692 return true; |
725 } | 693 } |
OLD | NEW |