| OLD | NEW |
| 1 #!/usr/bin/env python | 1 #!/usr/bin/env python |
| 2 # Copyright 2015 The Chromium Authors. All rights reserved. | 2 # Copyright 2015 The Chromium Authors. All rights reserved. |
| 3 # Use of this source code is governed by a BSD-style license that can be | 3 # Use of this source code is governed by a BSD-style license that can be |
| 4 # found in the LICENSE file. | 4 # found in the LICENSE file. |
| 5 | 5 |
| 6 """MB - the Meta-Build wrapper around GYP and GN | 6 """MB - the Meta-Build wrapper around GYP and GN |
| 7 | 7 |
| 8 MB is a wrapper script for GYP and GN that can be used to generate build files | 8 MB is a wrapper script for GYP and GN that can be used to generate build files |
| 9 for sets of canned configurations and analyze them. | 9 for sets of canned configurations and analyze them. |
| 10 """ | 10 """ |
| (...skipping 27 matching lines...) Expand all Loading... |
| 38 def main(args): | 38 def main(args): |
| 39 mbw = MetaBuildWrapper() | 39 mbw = MetaBuildWrapper() |
| 40 return mbw.Main(args) | 40 return mbw.Main(args) |
| 41 | 41 |
| 42 | 42 |
| 43 class MetaBuildWrapper(object): | 43 class MetaBuildWrapper(object): |
| 44 def __init__(self): | 44 def __init__(self): |
| 45 self.chromium_src_dir = CHROMIUM_SRC_DIR | 45 self.chromium_src_dir = CHROMIUM_SRC_DIR |
| 46 self.default_config = os.path.join(self.chromium_src_dir, 'tools', 'mb', | 46 self.default_config = os.path.join(self.chromium_src_dir, 'tools', 'mb', |
| 47 'mb_config.pyl') | 47 'mb_config.pyl') |
| 48 self.default_isolate_map = os.path.join(self.chromium_src_dir, 'testing', |
| 49 'buildbot', 'gn_isolate_map.pyl') |
| 48 self.executable = sys.executable | 50 self.executable = sys.executable |
| 49 self.platform = sys.platform | 51 self.platform = sys.platform |
| 50 self.sep = os.sep | 52 self.sep = os.sep |
| 51 self.args = argparse.Namespace() | 53 self.args = argparse.Namespace() |
| 52 self.configs = {} | 54 self.configs = {} |
| 53 self.masters = {} | 55 self.masters = {} |
| 54 self.mixins = {} | 56 self.mixins = {} |
| 55 | 57 |
| 56 def Main(self, args): | 58 def Main(self, args): |
| 57 self.ParseArgs(args) | 59 self.ParseArgs(args) |
| (...skipping 20 matching lines...) Expand all Loading... |
| 78 help='master name to look up config from') | 80 help='master name to look up config from') |
| 79 subp.add_argument('-c', '--config', | 81 subp.add_argument('-c', '--config', |
| 80 help='configuration to analyze') | 82 help='configuration to analyze') |
| 81 subp.add_argument('--phase', | 83 subp.add_argument('--phase', |
| 82 help='optional phase name (used when builders ' | 84 help='optional phase name (used when builders ' |
| 83 'do multiple compiles with different ' | 85 'do multiple compiles with different ' |
| 84 'arguments in a single build)') | 86 'arguments in a single build)') |
| 85 subp.add_argument('-f', '--config-file', metavar='PATH', | 87 subp.add_argument('-f', '--config-file', metavar='PATH', |
| 86 default=self.default_config, | 88 default=self.default_config, |
| 87 help='path to config file ' | 89 help='path to config file ' |
| 88 '(default is //tools/mb/mb_config.pyl)') | 90 '(default is %(default)s)') |
| 91 subp.add_argument('-i', '--isolate-map-file', metavar='PATH', |
| 92 default=self.default_isolate_map, |
| 93 help='path to isolate map file ' |
| 94 '(default is %(default)s)') |
| 89 subp.add_argument('-g', '--goma-dir', | 95 subp.add_argument('-g', '--goma-dir', |
| 90 help='path to goma directory') | 96 help='path to goma directory') |
| 91 subp.add_argument('--gyp-script', metavar='PATH', | 97 subp.add_argument('--gyp-script', metavar='PATH', |
| 92 default=self.PathJoin('build', 'gyp_chromium'), | 98 default=self.PathJoin('build', 'gyp_chromium'), |
| 93 help='path to gyp script relative to project root ' | 99 help='path to gyp script relative to project root ' |
| 94 '(default is %(default)s)') | 100 '(default is %(default)s)') |
| 95 subp.add_argument('--android-version-code', | 101 subp.add_argument('--android-version-code', |
| 96 help='Sets GN arg android_default_version_code and ' | 102 help='Sets GN arg android_default_version_code and ' |
| 97 'GYP_DEFINE app_manifest_version_code') | 103 'GYP_DEFINE app_manifest_version_code') |
| 98 subp.add_argument('--android-version-name', | 104 subp.add_argument('--android-version-name', |
| (...skipping 20 matching lines...) Expand all Loading... |
| 119 subp.add_argument('output_path', nargs=1, | 125 subp.add_argument('output_path', nargs=1, |
| 120 help='path to a file containing the output arguments ' | 126 help='path to a file containing the output arguments ' |
| 121 'as a JSON object.') | 127 'as a JSON object.') |
| 122 subp.set_defaults(func=self.CmdAnalyze) | 128 subp.set_defaults(func=self.CmdAnalyze) |
| 123 | 129 |
| 124 subp = subps.add_parser('export', | 130 subp = subps.add_parser('export', |
| 125 help='print out the expanded configuration for' | 131 help='print out the expanded configuration for' |
| 126 'each builder as a JSON object') | 132 'each builder as a JSON object') |
| 127 subp.add_argument('-f', '--config-file', metavar='PATH', | 133 subp.add_argument('-f', '--config-file', metavar='PATH', |
| 128 default=self.default_config, | 134 default=self.default_config, |
| 129 help='path to config file ' | 135 help='path to config file (default is %(default)s)') |
| 130 '(default is //tools/mb/mb_config.pyl)') | |
| 131 subp.add_argument('-g', '--goma-dir', | 136 subp.add_argument('-g', '--goma-dir', |
| 132 help='path to goma directory') | 137 help='path to goma directory') |
| 133 subp.set_defaults(func=self.CmdExport) | 138 subp.set_defaults(func=self.CmdExport) |
| 134 | 139 |
| 135 subp = subps.add_parser('gen', | 140 subp = subps.add_parser('gen', |
| 136 help='generate a new set of build files') | 141 help='generate a new set of build files') |
| 137 AddCommonOptions(subp) | 142 AddCommonOptions(subp) |
| 138 subp.add_argument('--swarming-targets-file', | 143 subp.add_argument('--swarming-targets-file', |
| 139 help='save runtime dependencies for targets listed ' | 144 help='save runtime dependencies for targets listed ' |
| 140 'in file.') | 145 'in file.') |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 196 subp.add_argument('extra_args', nargs='*', | 201 subp.add_argument('extra_args', nargs='*', |
| 197 help=('extra args to pass to the isolate to run. Use ' | 202 help=('extra args to pass to the isolate to run. Use ' |
| 198 '"--" as the first arg if you need to pass ' | 203 '"--" as the first arg if you need to pass ' |
| 199 'switches')) | 204 'switches')) |
| 200 subp.set_defaults(func=self.CmdRun) | 205 subp.set_defaults(func=self.CmdRun) |
| 201 | 206 |
| 202 subp = subps.add_parser('validate', | 207 subp = subps.add_parser('validate', |
| 203 help='validate the config file') | 208 help='validate the config file') |
| 204 subp.add_argument('-f', '--config-file', metavar='PATH', | 209 subp.add_argument('-f', '--config-file', metavar='PATH', |
| 205 default=self.default_config, | 210 default=self.default_config, |
| 206 help='path to config file ' | 211 help='path to config file (default is %(default)s)') |
| 207 '(default is //tools/mb/mb_config.pyl)') | |
| 208 subp.set_defaults(func=self.CmdValidate) | 212 subp.set_defaults(func=self.CmdValidate) |
| 209 | 213 |
| 210 subp = subps.add_parser('audit', | 214 subp = subps.add_parser('audit', |
| 211 help='Audit the config file to track progress') | 215 help='Audit the config file to track progress') |
| 212 subp.add_argument('-f', '--config-file', metavar='PATH', | 216 subp.add_argument('-f', '--config-file', metavar='PATH', |
| 213 default=self.default_config, | 217 default=self.default_config, |
| 214 help='path to config file ' | 218 help='path to config file (default is %(default)s)') |
| 215 '(default is //tools/mb/mb_config.pyl)') | |
| 216 subp.add_argument('-i', '--internal', action='store_true', | 219 subp.add_argument('-i', '--internal', action='store_true', |
| 217 help='check internal masters also') | 220 help='check internal masters also') |
| 218 subp.add_argument('-m', '--master', action='append', | 221 subp.add_argument('-m', '--master', action='append', |
| 219 help='master to audit (default is all non-internal ' | 222 help='master to audit (default is all non-internal ' |
| 220 'masters in file)') | 223 'masters in file)') |
| 221 subp.add_argument('-u', '--url-template', action='store', | 224 subp.add_argument('-u', '--url-template', action='store', |
| 222 default='https://build.chromium.org/p/' | 225 default='https://build.chromium.org/p/' |
| 223 '{master}/json/builders', | 226 '{master}/json/builders', |
| 224 help='URL scheme for JSON APIs to buildbot ' | 227 help='URL scheme for JSON APIs to buildbot ' |
| 225 '(default: %(default)s) ') | 228 '(default: %(default)s) ') |
| (...skipping 438 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 664 contents = ast.literal_eval(self.ReadFile(self.args.config_file)) | 667 contents = ast.literal_eval(self.ReadFile(self.args.config_file)) |
| 665 except SyntaxError as e: | 668 except SyntaxError as e: |
| 666 raise MBErr('Failed to parse config file "%s": %s' % | 669 raise MBErr('Failed to parse config file "%s": %s' % |
| 667 (self.args.config_file, e)) | 670 (self.args.config_file, e)) |
| 668 | 671 |
| 669 self.configs = contents['configs'] | 672 self.configs = contents['configs'] |
| 670 self.masters = contents['masters'] | 673 self.masters = contents['masters'] |
| 671 self.mixins = contents['mixins'] | 674 self.mixins = contents['mixins'] |
| 672 | 675 |
| 673 def ReadIsolateMap(self): | 676 def ReadIsolateMap(self): |
| 674 return ast.literal_eval(self.ReadFile(self.PathJoin( | 677 if not self.Exists(self.args.isolate_map_file): |
| 675 self.chromium_src_dir, 'testing', 'buildbot', 'gn_isolate_map.pyl'))) | 678 raise MBErr('isolate map file not found at %s' % |
| 679 self.args.isolate_map_file) |
| 680 try: |
| 681 return ast.literal_eval(self.ReadFile(self.args.isolate_map_file)) |
| 682 except SyntaxError as e: |
| 683 raise MBErr('Failed to parse isolate map file "%s": %s' % |
| 684 (self.args.isolate_map_file, e)) |
| 676 | 685 |
| 677 def ConfigFromArgs(self): | 686 def ConfigFromArgs(self): |
| 678 if self.args.config: | 687 if self.args.config: |
| 679 if self.args.master or self.args.builder: | 688 if self.args.master or self.args.builder: |
| 680 raise MBErr('Can not specific both -c/--config and -m/--master or ' | 689 raise MBErr('Can not specific both -c/--config and -m/--master or ' |
| 681 '-b/--builder') | 690 '-b/--builder') |
| 682 | 691 |
| 683 return self.args.config | 692 return self.args.config |
| 684 | 693 |
| 685 if not self.args.master or not self.args.builder: | 694 if not self.args.master or not self.args.builder: |
| (...skipping 867 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1553 # Then check to see if the arg contains any metacharacters other than | 1562 # Then check to see if the arg contains any metacharacters other than |
| 1554 # double quotes; if it does, quote everything (including the double | 1563 # double quotes; if it does, quote everything (including the double |
| 1555 # quotes) for safety. | 1564 # quotes) for safety. |
| 1556 if any(a in UNSAFE_FOR_CMD for a in arg): | 1565 if any(a in UNSAFE_FOR_CMD for a in arg): |
| 1557 arg = ''.join('^' + a if a in ALL_META_CHARS else a for a in arg) | 1566 arg = ''.join('^' + a if a in ALL_META_CHARS else a for a in arg) |
| 1558 return arg | 1567 return arg |
| 1559 | 1568 |
| 1560 | 1569 |
| 1561 if __name__ == '__main__': | 1570 if __name__ == '__main__': |
| 1562 sys.exit(main(sys.argv[1:])) | 1571 sys.exit(main(sys.argv[1:])) |
| OLD | NEW |