Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 #!/usr/bin/env python | 1 #!/usr/bin/env python |
| 2 # Copyright (c) 2012 The Chromium Authors. All rights reserved. | 2 # Copyright (c) 2012 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 """A tool to build chrome, executed by buildbot. | 6 """A tool to build chrome, executed by buildbot. |
| 7 | 7 |
| 8 When this is run, the current directory (cwd) should be the outer build | 8 When this is run, the current directory (cwd) should be the outer build |
| 9 directory (e.g., chrome-release/build/). | 9 directory (e.g., chrome-release/build/). |
| 10 | 10 |
| (...skipping 488 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 499 filter_obj=xcodebuild_filter) | 499 filter_obj=xcodebuild_filter) |
| 500 | 500 |
| 501 goma_teardown(options, env) | 501 goma_teardown(options, env) |
| 502 | 502 |
| 503 return result | 503 return result |
| 504 | 504 |
| 505 | 505 |
| 506 def common_make_settings( | 506 def common_make_settings( |
| 507 command, options, env, crosstool=None, compiler=None): | 507 command, options, env, crosstool=None, compiler=None): |
| 508 """ | 508 """ |
| 509 Sets desirable environment variables and command-line options | 509 Sets desirable environment variables and command-line options that are used |
| 510 that are common to the Make and SCons builds. Used on Linux | 510 in the Make build. |
| 511 and for the mac make build. | |
| 512 """ | 511 """ |
| 513 assert compiler in (None, 'clang', 'goma', 'goma-clang', 'jsonclang') | 512 assert compiler in (None, 'clang', 'goma', 'goma-clang', 'jsonclang') |
| 514 maybe_set_official_build_envvars(options, env) | 513 maybe_set_official_build_envvars(options, env) |
| 515 | 514 |
| 516 # Don't stop at the first error. | 515 # Don't stop at the first error. |
| 517 command.append('-k') | 516 command.append('-k') |
| 518 | 517 |
| 519 # Set jobs parallelization based on number of cores. | 518 # Set jobs parallelization based on number of cores. |
| 520 jobs = os.sysconf('SC_NPROCESSORS_ONLN') | 519 jobs = os.sysconf('SC_NPROCESSORS_ONLN') |
| 521 | 520 |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 570 clang_dir = os.path.join(options.src_dir, | 569 clang_dir = os.path.join(options.src_dir, |
| 571 'third_party', 'llvm-build', 'Release+Asserts', 'bin') | 570 'third_party', 'llvm-build', 'Release+Asserts', 'bin') |
| 572 if options.goma_dir: | 571 if options.goma_dir: |
| 573 env['PATH'] = ':'.join([options.goma_dir, clang_dir, env['PATH']]) | 572 env['PATH'] = ':'.join([options.goma_dir, clang_dir, env['PATH']]) |
| 574 else: | 573 else: |
| 575 env['PATH'] = ':'.join([clang_dir, env['PATH']]) | 574 env['PATH'] = ':'.join([clang_dir, env['PATH']]) |
| 576 | 575 |
| 577 command.append('CC.host=' + env['CC']) | 576 command.append('CC.host=' + env['CC']) |
| 578 command.append('CXX.host=' + env['CXX']) | 577 command.append('CXX.host=' + env['CXX']) |
| 579 | 578 |
| 580 if chromium_utils.IsMac(): | 579 goma_jobs = 50 |
| 581 # The default process limit on 10.6 is 266 (`sysctl kern.maxprocperuid`), | |
|
Lei Zhang
2013/10/09 18:56:37
This seems useful to know. Keep it?
Nico
2013/10/09 19:21:35
This is only true on mac, and this function doesn'
Lei Zhang
2013/10/09 19:33:40
Ah, right.
| |
| 582 # and about 100 processes are used by the system. The webkit bindings | |
| 583 # generation scripts open a preprocessor child process, so building at | |
| 584 # -j100 runs into the process limit. For now, just build with -j50. | |
| 585 goma_jobs = 50 | |
| 586 if options.clobber: | |
| 587 # Disable compiles on local machine. When the goma server-side object | |
| 588 # file cache is warm, this can speed up clobber builds by up to 30%. | |
| 589 env['GOMA_USE_LOCAL'] = '0' | |
| 590 # Temproary hack to try failing fast when the server looks unhealthy. | |
| 591 # 30 seconds is chosen because a local compile is almost certainly | |
| 592 # faster. | |
| 593 # crbug.com/257467 | |
| 594 env['GOMA_RETRY'] = '0' | |
| 595 env['GOMA_COMPILER_PROXY_RPC_TIMEOUT_SECS'] = '30' | |
| 596 else: | |
| 597 goma_jobs = 50 | |
| 598 if jobs < goma_jobs: | 580 if jobs < goma_jobs: |
| 599 jobs = goma_jobs | 581 jobs = goma_jobs |
| 600 command.append('-j%d' % jobs) | 582 command.append('-j%d' % jobs) |
| 601 return | 583 return |
| 602 | 584 |
| 603 if compiler == 'clang': | 585 if compiler == 'clang': |
| 604 clang_dir = os.path.join(options.src_dir, | 586 clang_dir = os.path.join(options.src_dir, |
| 605 'third_party', 'llvm-build', 'Release+Asserts', 'bin') | 587 'third_party', 'llvm-build', 'Release+Asserts', 'bin') |
| 606 env['CC'] = os.path.join(clang_dir, 'clang') | 588 env['CC'] = os.path.join(clang_dir, 'clang') |
| 607 env['CXX'] = os.path.join(clang_dir, 'clang++') | 589 env['CXX'] = os.path.join(clang_dir, 'clang++') |
| (...skipping 27 matching lines...) Expand all Loading... | |
| 635 working_dir = options.build_dir | 617 working_dir = options.build_dir |
| 636 else: | 618 else: |
| 637 # If no solution file (i.e. sub-project *.Makefile) is specified, try to | 619 # If no solution file (i.e. sub-project *.Makefile) is specified, try to |
| 638 # build from <build_dir>/Makefile, or if that doesn't exist, from | 620 # build from <build_dir>/Makefile, or if that doesn't exist, from |
| 639 # the top-level Makefile. | 621 # the top-level Makefile. |
| 640 if os.path.isfile(os.path.join(options.build_dir, 'Makefile')): | 622 if os.path.isfile(os.path.join(options.build_dir, 'Makefile')): |
| 641 working_dir = options.build_dir | 623 working_dir = options.build_dir |
| 642 else: | 624 else: |
| 643 working_dir = options.src_dir | 625 working_dir = options.src_dir |
| 644 | 626 |
| 645 # Lots of test-execution scripts hard-code 'sconsbuild' as the output | |
| 646 # directory. Accomodate them. | |
| 647 # TODO: remove when build_dir is properly parameterized in tests. | |
| 648 sconsbuild = os.path.join(working_dir, 'sconsbuild') | |
| 649 if os.path.islink(sconsbuild): | |
| 650 if os.readlink(sconsbuild) != 'out': | |
| 651 os.remove(sconsbuild) | |
| 652 elif os.path.exists(sconsbuild): | |
| 653 dead = sconsbuild + '.dead' | |
| 654 if os.path.isdir(dead): | |
| 655 shutil.rmtree(dead) | |
| 656 elif os.path.isfile(dead): | |
| 657 os.remove(dead) | |
| 658 os.rename(sconsbuild, sconsbuild+'.dead') | |
| 659 if not os.path.lexists(sconsbuild): | |
| 660 os.symlink('out', sconsbuild) | |
| 661 | |
| 662 os.chdir(working_dir) | 627 os.chdir(working_dir) |
| 663 common_make_settings(command, options, env, options.crosstool, | 628 common_make_settings(command, options, env, options.crosstool, |
| 664 options.compiler) | 629 options.compiler) |
| 665 | 630 |
| 666 # V=1 prints the actual executed command | 631 # V=1 prints the actual executed command |
| 667 if options.verbose: | 632 if options.verbose: |
| 668 command.extend(['V=1']) | 633 command.extend(['V=1']) |
| 669 command.extend(options.build_args + args) | 634 command.extend(options.build_args + args) |
| 670 | 635 |
| 671 # Run the build. | 636 # Run the build. |
| (...skipping 206 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 878 # TODO(maruel): Remove the shell argument as soon as ninja.exe is in PATH. | 843 # TODO(maruel): Remove the shell argument as soon as ninja.exe is in PATH. |
| 879 # At the moment of writing, ninja.bat in depot_tools wraps | 844 # At the moment of writing, ninja.bat in depot_tools wraps |
| 880 # third_party\ninja.exe, which requires shell=True so it is found correctly. | 845 # third_party\ninja.exe, which requires shell=True so it is found correctly. |
| 881 result = chromium_utils.RunCommand( | 846 result = chromium_utils.RunCommand( |
| 882 command, env=env, shell=sys.platform=='win32') | 847 command, env=env, shell=sys.platform=='win32') |
| 883 | 848 |
| 884 goma_teardown(options, env) | 849 goma_teardown(options, env) |
| 885 return result | 850 return result |
| 886 | 851 |
| 887 | 852 |
| 888 def main_scons(options, args): | |
| 889 """Interprets options, clobbers object files, and calls scons. | |
| 890 """ | |
| 891 options.build_dir = os.path.abspath(options.build_dir) | |
| 892 if options.clobber: | |
| 893 print('Removing %s' % options.target_output_dir) | |
| 894 chromium_utils.RemoveDirectory(options.target_output_dir) | |
| 895 | |
| 896 os.chdir(options.build_dir) | |
| 897 | |
| 898 if sys.platform == 'win32': | |
| 899 command = ['hammer.bat'] | |
| 900 else: | |
| 901 command = ['hammer'] | |
| 902 | |
| 903 env = EchoDict(os.environ) | |
| 904 if sys.platform == 'linux2': | |
| 905 common_make_settings(command, options, env) | |
| 906 else: | |
| 907 command.extend(['-k']) | |
| 908 | |
| 909 command.extend([ | |
| 910 # Force scons to always check for dependency changes. | |
| 911 '--implicit-deps-changed', | |
| 912 '--mode=' + options.target, | |
| 913 ]) | |
| 914 | |
| 915 # Here's what you can uncomment if you need to see more info | |
| 916 # about what the build is doing on a slave: | |
| 917 # | |
| 918 # VERBOSE=1 (a setting in our local SCons config) replaces | |
| 919 # the "Compiling ..." and "Linking ..." lines with the | |
| 920 # actual executed command line(s) | |
| 921 # | |
| 922 # --debug=explain (a SCons option) will tell you why SCons | |
| 923 # is deciding to rebuild thing (the target doesn't exist, | |
| 924 # which .h file(s) changed, etc.) | |
| 925 # | |
| 926 #command.extend(['--debug=explain', 'VERBOSE=1']) | |
| 927 command.extend(options.build_args + args) | |
| 928 env.print_overrides() | |
| 929 return chromium_utils.RunCommand(command, env=env) | |
| 930 | |
| 931 | |
| 932 def main_win(options, args): | 853 def main_win(options, args): |
| 933 """Interprets options, clobbers object files, and calls the build tool. | 854 """Interprets options, clobbers object files, and calls the build tool. |
| 934 """ | 855 """ |
| 935 # Prefer the version specified in the .sln. When devenv.com is used at the | 856 # Prefer the version specified in the .sln. When devenv.com is used at the |
| 936 # command line to start a build, it doesn't accept sln file from a different | 857 # command line to start a build, it doesn't accept sln file from a different |
| 937 # version. | 858 # version. |
| 938 if not options.msvs_version: | 859 if not options.msvs_version: |
| 939 sln = open(os.path.join(options.build_dir, options.solution), 'rU') | 860 sln = open(os.path.join(options.build_dir, options.solution), 'rU') |
| 940 header = sln.readline().strip() | 861 header = sln.readline().strip() |
| 941 sln.close() | 862 sln.close() |
| (...skipping 184 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1126 ret = None | 1047 ret = None |
| 1127 if build_tool == 'xcode': | 1048 if build_tool == 'xcode': |
| 1128 ret = os.path.join(src_dir, 'xcodebuild', | 1049 ret = os.path.join(src_dir, 'xcodebuild', |
| 1129 target + ('-iphoneos' if is_iphone else '')) | 1050 target + ('-iphoneos' if is_iphone else '')) |
| 1130 elif build_tool in ['make', 'ninja']: | 1051 elif build_tool in ['make', 'ninja']: |
| 1131 ret = os.path.join(src_dir, 'out', target) | 1052 ret = os.path.join(src_dir, 'out', target) |
| 1132 elif build_tool == 'make-android': | 1053 elif build_tool == 'make-android': |
| 1133 ret = os.path.join(src_dir, 'out') | 1054 ret = os.path.join(src_dir, 'out') |
| 1134 elif build_tool in ['msvs', 'vs', 'ib']: | 1055 elif build_tool in ['msvs', 'vs', 'ib']: |
| 1135 ret = os.path.join(src_dir, 'build', target) | 1056 ret = os.path.join(src_dir, 'build', target) |
| 1136 elif build_tool == 'scons': | |
| 1137 ret = os.path.join(src_dir, 'sconsbuild', target) | |
| 1138 else: | 1057 else: |
| 1139 raise NotImplementedError() | 1058 raise NotImplementedError() |
| 1140 return os.path.abspath(ret) | 1059 return os.path.abspath(ret) |
| 1141 | 1060 |
| 1142 | 1061 |
| 1143 def real_main(): | 1062 def real_main(): |
| 1144 option_parser = optparse.OptionParser() | 1063 option_parser = optparse.OptionParser() |
| 1145 option_parser.add_option('', '--clobber', action='store_true', default=False, | 1064 option_parser.add_option('', '--clobber', action='store_true', default=False, |
| 1146 help='delete the output directory before compiling') | 1065 help='delete the output directory before compiling') |
| 1147 option_parser.add_option('', '--clobber-post-fail', action='store_true', | 1066 option_parser.add_option('', '--clobber-post-fail', action='store_true', |
| (...skipping 15 matching lines...) Expand all Loading... | |
| 1163 help='name of project to build') | 1082 help='name of project to build') |
| 1164 option_parser.add_option('', '--build-dir', default='build', | 1083 option_parser.add_option('', '--build-dir', default='build', |
| 1165 help='path to directory containing solution and in ' | 1084 help='path to directory containing solution and in ' |
| 1166 'which the build output will be placed') | 1085 'which the build output will be placed') |
| 1167 option_parser.add_option('', '--src-dir', default=None, | 1086 option_parser.add_option('', '--src-dir', default=None, |
| 1168 help='path to the root of the source tree') | 1087 help='path to the root of the source tree') |
| 1169 option_parser.add_option('', '--mode', default='dev', | 1088 option_parser.add_option('', '--mode', default='dev', |
| 1170 help='build mode (dev or official) controlling ' | 1089 help='build mode (dev or official) controlling ' |
| 1171 'environment variables set during build') | 1090 'environment variables set during build') |
| 1172 option_parser.add_option('', '--build-tool', default=None, | 1091 option_parser.add_option('', '--build-tool', default=None, |
| 1173 help='specify build tool (ib, vs, scons, xcode)') | 1092 help='specify build tool (ib, vs, xcode)') |
| 1174 option_parser.add_option('', '--build-args', action='append', default=[], | 1093 option_parser.add_option('', '--build-args', action='append', default=[], |
| 1175 help='arguments to pass to the build tool') | 1094 help='arguments to pass to the build tool') |
| 1176 option_parser.add_option('', '--compiler', default=None, | 1095 option_parser.add_option('', '--compiler', default=None, |
| 1177 help='specify alternative compiler (e.g. clang)') | 1096 help='specify alternative compiler (e.g. clang)') |
| 1178 if chromium_utils.IsWindows(): | 1097 if chromium_utils.IsWindows(): |
| 1179 # Windows only. | 1098 # Windows only. |
| 1180 option_parser.add_option('', '--no-ib', action='store_true', default=False, | 1099 option_parser.add_option('', '--no-ib', action='store_true', default=False, |
| 1181 help='use Visual Studio instead of IncrediBuild') | 1100 help='use Visual Studio instead of IncrediBuild') |
| 1182 option_parser.add_option('', '--msvs_version', | 1101 option_parser.add_option('', '--msvs_version', |
| 1183 help='VisualStudio version to use') | 1102 help='VisualStudio version to use') |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1229 else: | 1148 else: |
| 1230 print('Please specify --build-tool.') | 1149 print('Please specify --build-tool.') |
| 1231 return 1 | 1150 return 1 |
| 1232 else: | 1151 else: |
| 1233 build_tool_map = { | 1152 build_tool_map = { |
| 1234 'ib' : main_win, | 1153 'ib' : main_win, |
| 1235 'vs' : main_win, | 1154 'vs' : main_win, |
| 1236 'make' : main_make, | 1155 'make' : main_make, |
| 1237 'make-android' : main_make_android, | 1156 'make-android' : main_make_android, |
| 1238 'ninja' : main_ninja, | 1157 'ninja' : main_ninja, |
| 1239 'scons' : main_scons, | |
| 1240 'xcode' : main_xcode, | 1158 'xcode' : main_xcode, |
| 1241 } | 1159 } |
| 1242 main = build_tool_map.get(options.build_tool) | 1160 main = build_tool_map.get(options.build_tool) |
| 1243 if not main: | 1161 if not main: |
| 1244 sys.stderr.write('Unknown build tool %s.\n' % repr(options.build_tool)) | 1162 sys.stderr.write('Unknown build tool %s.\n' % repr(options.build_tool)) |
| 1245 return 2 | 1163 return 2 |
| 1246 | 1164 |
| 1247 options.target_output_dir = get_target_build_dir(options.build_tool, | 1165 options.target_output_dir = get_target_build_dir(options.build_tool, |
| 1248 options.src_dir, options.target, 'iphoneos' in args) | 1166 options.src_dir, options.target, 'iphoneos' in args) |
| 1249 options.clobber = (options.clobber or | 1167 options.clobber = (options.clobber or |
| 1250 landmines_triggered(options.target_output_dir)) | 1168 landmines_triggered(options.target_output_dir)) |
| 1251 | 1169 |
| 1252 return main(options, args) | 1170 return main(options, args) |
| 1253 | 1171 |
| 1254 | 1172 |
| 1255 if '__main__' == __name__: | 1173 if '__main__' == __name__: |
| 1256 sys.exit(real_main()) | 1174 sys.exit(real_main()) |
| OLD | NEW |