OLD | NEW |
1 # Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 # Copyright (c) 2012 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 """Generic utils.""" | 5 """Generic utils.""" |
6 | 6 |
7 import codecs | 7 import codecs |
8 import cStringIO | 8 import cStringIO |
9 import datetime | 9 import datetime |
10 import logging | 10 import logging |
(...skipping 665 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
676 CheckCallAndFilter(["git", "rev-parse", "--show-toplevel"], | 676 CheckCallAndFilter(["git", "rev-parse", "--show-toplevel"], |
677 print_stdout=False, filter_fn=filter_fn) | 677 print_stdout=False, filter_fn=filter_fn) |
678 except Exception: | 678 except Exception: |
679 pass | 679 pass |
680 top_dir = top_dir[0] | 680 top_dir = top_dir[0] |
681 if os.path.exists(os.path.join(top_dir, 'buildtools')): | 681 if os.path.exists(os.path.join(top_dir, 'buildtools')): |
682 return top_dir | 682 return top_dir |
683 return None | 683 return None |
684 | 684 |
685 # Some projects' top directory is not named 'src'. | 685 # Some projects' top directory is not named 'src'. |
686 source_dir_name = GetGClientPrimarySolutionName(gclient_root) or 'src' | 686 solution_dict = _GetGClientPrimarySolution(gclient_root) |
| 687 source_dir_name = solution_dict.get('name', 'src') |
687 return os.path.join(gclient_root, source_dir_name) | 688 return os.path.join(gclient_root, source_dir_name) |
688 | 689 |
689 | 690 |
690 def GetBuildtoolsPath(): | 691 def GetBuildtoolsPath(): |
691 """Returns the full path to the buildtools directory. | 692 """Returns the full path to the buildtools directory. |
692 This is based on the root of the checkout containing the current directory.""" | 693 This is based on the root of the checkout containing the current directory.""" |
693 | 694 |
694 # Overriding the build tools path by environment is highly unsupported and may | 695 # Overriding the build tools path by environment is highly unsupported and may |
695 # break without warning. Do not rely on this for anything important. | 696 # break without warning. Do not rely on this for anything important. |
696 override = os.environ.get('CHROMIUM_BUILDTOOLS_PATH') | 697 override = os.environ.get('CHROMIUM_BUILDTOOLS_PATH') |
697 if override is not None: | 698 if override is not None: |
698 return override | 699 return override |
699 | 700 |
| 701 # Attempt to find buildtools/ by reading the DEPS file. |
| 702 gclient_root = FindGclientRoot(os.getcwd()) |
| 703 if gclient_root: |
| 704 solution_dict = _GetGClientPrimarySolution(gclient_root) |
| 705 deps_dict = _ReadDepsFileForSolution(gclient_root, solution_dict) or {} |
| 706 for sub_path in deps_dict.get('deps', {}): |
| 707 if sub_path.endswith('/buildtools'): |
| 708 return os.path.join(gclient_root, sub_path) |
| 709 |
| 710 # Fall-back to heuristics. |
700 primary_solution = GetPrimarySolutionPath() | 711 primary_solution = GetPrimarySolutionPath() |
701 if not primary_solution: | 712 if not primary_solution: |
702 return None | 713 return None |
703 buildtools_path = os.path.join(primary_solution, 'buildtools') | 714 buildtools_path = os.path.join(primary_solution, 'buildtools') |
704 if not os.path.exists(buildtools_path): | 715 if not os.path.exists(buildtools_path): |
705 # Buildtools may be in the gclient root. | 716 # Buildtools may be in the gclient root. |
706 gclient_root = FindGclientRoot(os.getcwd()) | |
707 buildtools_path = os.path.join(gclient_root, 'buildtools') | 717 buildtools_path = os.path.join(gclient_root, 'buildtools') |
708 return buildtools_path | 718 return buildtools_path |
709 | 719 |
710 | 720 |
711 def GetBuildtoolsPlatformBinaryPath(): | 721 def GetBuildtoolsPlatformBinaryPath(): |
712 """Returns the full path to the binary directory for the current platform.""" | 722 """Returns the full path to the binary directory for the current platform.""" |
713 buildtools_path = GetBuildtoolsPath() | 723 buildtools_path = GetBuildtoolsPath() |
714 if not buildtools_path: | 724 if not buildtools_path: |
715 return None | 725 return None |
716 | 726 |
717 if sys.platform.startswith(('cygwin', 'win')): | 727 if sys.platform.startswith(('cygwin', 'win')): |
718 subdir = 'win' | 728 subdir = 'win' |
719 elif sys.platform == 'darwin': | 729 elif sys.platform == 'darwin': |
720 subdir = 'mac' | 730 subdir = 'mac' |
721 elif sys.platform.startswith('linux'): | 731 elif sys.platform.startswith('linux'): |
722 subdir = 'linux64' | 732 subdir = 'linux64' |
723 else: | 733 else: |
724 raise Error('Unknown platform: ' + sys.platform) | 734 raise Error('Unknown platform: ' + sys.platform) |
725 return os.path.join(buildtools_path, subdir) | 735 return os.path.join(buildtools_path, subdir) |
726 | 736 |
727 | 737 |
728 def GetExeSuffix(): | 738 def GetExeSuffix(): |
729 """Returns '' or '.exe' depending on how executables work on this platform.""" | 739 """Returns '' or '.exe' depending on how executables work on this platform.""" |
730 if sys.platform.startswith(('cygwin', 'win')): | 740 if sys.platform.startswith(('cygwin', 'win')): |
731 return '.exe' | 741 return '.exe' |
732 return '' | 742 return '' |
733 | 743 |
734 | 744 |
735 def GetGClientPrimarySolutionName(gclient_root_dir_path): | 745 def _ReadDepsFileForSolution(gclient_root, solution_dict): |
736 """Returns the name of the primary solution in the .gclient file specified.""" | 746 """Reads the DEPS file for the given solution. |
737 gclient_config_file = os.path.join(gclient_root_dir_path, '.gclient') | 747 |
| 748 This stubs out Var(), as it's not currently required. |
| 749 """ |
| 750 env = {} |
| 751 if 'name' in solution_dict: |
| 752 deps_file = solution_dict.get('deps_file', 'DEPS') |
| 753 deps_path = os.path.join(gclient_root, solution_dict['name'], deps_file) |
| 754 global_scope = { |
| 755 '__builtins__': {'None': None}, |
| 756 'Var': lambda x: '', |
| 757 'deps_os': {}, |
| 758 } |
| 759 execfile(deps_path, global_scope, env) |
| 760 return env |
| 761 |
| 762 |
| 763 def _GetGClientPrimarySolution(gclient_root): |
| 764 """Returns the dict for the primary solution in the given gclient path.""" |
| 765 gclient_config_file = os.path.join(gclient_root, '.gclient') |
738 env = {} | 766 env = {} |
739 execfile(gclient_config_file, env) | 767 execfile(gclient_config_file, env) |
740 solutions = env.get('solutions', []) | 768 solutions = env.get('solutions', []) |
741 if solutions: | 769 if solutions: |
742 return solutions[0].get('name') | 770 return solutions[0] |
743 return None | 771 return {} |
744 | 772 |
745 | 773 |
746 def GetGClientRootAndEntries(path=None): | 774 def GetGClientRootAndEntries(path=None): |
747 """Returns the gclient root and the dict of entries.""" | 775 """Returns the gclient root and the dict of entries.""" |
748 config_file = '.gclient_entries' | 776 config_file = '.gclient_entries' |
749 root = FindFileUpwards(config_file, path) | 777 root = FindFileUpwards(config_file, path) |
750 if not root: | 778 if not root: |
751 print "Can't find %s" % config_file | 779 print "Can't find %s" % config_file |
752 return None | 780 return None |
753 config_path = os.path.join(root, config_file) | 781 config_path = os.path.join(root, config_file) |
(...skipping 454 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1208 # Just incase we have some ~/blah paths. | 1236 # Just incase we have some ~/blah paths. |
1209 target = os.path.abspath(os.path.expanduser(target)) | 1237 target = os.path.abspath(os.path.expanduser(target)) |
1210 if os.path.isfile(target) and os.access(target, os.X_OK): | 1238 if os.path.isfile(target) and os.access(target, os.X_OK): |
1211 return target | 1239 return target |
1212 if sys.platform.startswith('win'): | 1240 if sys.platform.startswith('win'): |
1213 for suffix in ('.bat', '.cmd', '.exe'): | 1241 for suffix in ('.bat', '.cmd', '.exe'): |
1214 alt_target = target + suffix | 1242 alt_target = target + suffix |
1215 if os.path.isfile(alt_target) and os.access(alt_target, os.X_OK): | 1243 if os.path.isfile(alt_target) and os.access(alt_target, os.X_OK): |
1216 return alt_target | 1244 return alt_target |
1217 return None | 1245 return None |
OLD | NEW |