| OLD | NEW |
| 1 #!/usr/bin/python | 1 #!/usr/bin/python |
| 2 # Copyright (c) 2012 The Native Client Authors. All rights reserved. | 2 # Copyright (c) 2012 The Native Client 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 import optparse | 6 import optparse |
| 7 import os.path | 7 import os.path |
| 8 import shutil | 8 import shutil |
| 9 import subprocess | 9 import subprocess |
| 10 import stat | 10 import stat |
| 11 import sys | 11 import sys |
| 12 import time | 12 import time |
| 13 import traceback | 13 import traceback |
| 14 | 14 |
| 15 | 15 |
| 16 ARCH_MAP = { | 16 ARCH_MAP = { |
| 17 '32': { | 17 '32': { |
| 18 'gyp_arch': 'ia32', | 18 'gn_arch': 'x86', |
| 19 'scons_platform': 'x86-32', | 19 'scons_platform': 'x86-32', |
| 20 }, | 20 }, |
| 21 '64': { | 21 '64': { |
| 22 'gyp_arch': 'x64', | 22 'gn_arch': 'x64', |
| 23 'scons_platform': 'x86-64', | 23 'scons_platform': 'x86-64', |
| 24 }, | 24 }, |
| 25 'arm': { | 25 'arm': { |
| 26 'gyp_arch': 'arm', | 26 'gn_arch': 'arm', |
| 27 'scons_platform': 'arm', | 27 'scons_platform': 'arm', |
| 28 }, | 28 }, |
| 29 'mips32': { | 29 'mips32': { |
| 30 'gyp_arch': 'mips32', | 30 'gn_arch': 'mipsel', |
| 31 'scons_platform': 'mips32', | 31 'scons_platform': 'mips32', |
| 32 }, | 32 }, |
| 33 } | 33 } |
| 34 | 34 |
| 35 | 35 |
| 36 def GNArch(arch): |
| 37 return ARCH_MAP[arch]['gn_arch'] |
| 38 |
| 39 |
| 36 def RunningOnBuildbot(): | 40 def RunningOnBuildbot(): |
| 37 return os.environ.get('BUILDBOT_SLAVE_TYPE') is not None | 41 return os.environ.get('BUILDBOT_SLAVE_TYPE') is not None |
| 38 | 42 |
| 39 | 43 |
| 40 def GetHostPlatform(): | 44 def GetHostPlatform(): |
| 41 sys_platform = sys.platform.lower() | 45 sys_platform = sys.platform.lower() |
| 42 if sys_platform.startswith('linux'): | 46 if sys_platform.startswith('linux'): |
| 43 return 'linux' | 47 return 'linux' |
| 44 elif sys_platform in ('win', 'win32', 'windows', 'cygwin'): | 48 elif sys_platform in ('win', 'win32', 'windows', 'cygwin'): |
| 45 return 'win' | 49 return 'win' |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 113 # The end slash is needed because the batch files expect it. | 117 # The end slash is needed because the batch files expect it. |
| 114 context.SetEnv(comntools_var, comntools + '\\') | 118 context.SetEnv(comntools_var, comntools + '\\') |
| 115 | 119 |
| 116 # This environment variable will SCons to print debug info while it searches | 120 # This environment variable will SCons to print debug info while it searches |
| 117 # for MSVC. | 121 # for MSVC. |
| 118 context.SetEnv('SCONS_MSCOMMON_DEBUG', '-') | 122 context.SetEnv('SCONS_MSCOMMON_DEBUG', '-') |
| 119 | 123 |
| 120 # Needed for finding devenv. | 124 # Needed for finding devenv. |
| 121 context['msvc'] = msvc | 125 context['msvc'] = msvc |
| 122 | 126 |
| 123 SetupGyp(context, []) | |
| 124 | |
| 125 | |
| 126 def SetupGyp(context, extra_vars=[]): | |
| 127 if RunningOnBuildbot(): | |
| 128 goma_opts = [ | |
| 129 'use_goma=1', | |
| 130 'gomadir=/b/build/goma', | |
| 131 ] | |
| 132 else: | |
| 133 goma_opts = [] | |
| 134 context.SetEnv('GYP_DEFINES', ' '.join( | |
| 135 context['gyp_vars'] + goma_opts + extra_vars)) | |
| 136 | |
| 137 | 127 |
| 138 def SetupLinuxEnvironment(context): | 128 def SetupLinuxEnvironment(context): |
| 139 if context['arch'] == 'mips32': | 129 if context['arch'] == 'mips32': |
| 140 # Ensure the trusted mips toolchain is installed. | 130 # Ensure the trusted mips toolchain is installed. |
| 141 cmd = ['build/package_version/package_version.py', '--packages', | 131 cmd = ['build/package_version/package_version.py', '--packages', |
| 142 'linux_x86/mips_trusted', 'sync', '-x'] | 132 'linux_x86/mips_trusted', 'sync', '-x'] |
| 143 Command(context, cmd) | 133 Command(context, cmd) |
| 144 | 134 |
| 145 SetupGyp(context, ['target_arch='+context['gyp_arch']]) | |
| 146 | |
| 147 | |
| 148 def SetupMacEnvironment(context): | |
| 149 SetupGyp(context, ['target_arch='+context['gyp_arch']]) | |
| 150 | |
| 151 | |
| 152 def SetupAndroidEnvironment(context): | |
| 153 SetupGyp(context, ['OS=android', 'target_arch='+context['gyp_arch']]) | |
| 154 context.SetEnv('GYP_CROSSCOMPILE', '1') | |
| 155 | |
| 156 | 135 |
| 157 def ParseStandardCommandLine(context): | 136 def ParseStandardCommandLine(context): |
| 158 """ | 137 """ |
| 159 The standard buildbot scripts require 3 arguments to run. The first | 138 The standard buildbot scripts require 3 arguments to run. The first |
| 160 argument (dbg/opt) controls if the build is a debug or a release build. The | 139 argument (dbg/opt) controls if the build is a debug or a release build. The |
| 161 second argument (32/64) controls the machine architecture being targeted. | 140 second argument (32/64) controls the machine architecture being targeted. |
| 162 The third argument (newlib/glibc) controls which c library we're using for | 141 The third argument (newlib/glibc) controls which c library we're using for |
| 163 the nexes. Different buildbots may have different sets of arguments. | 142 the nexes. Different buildbots may have different sets of arguments. |
| 164 """ | 143 """ |
| 165 | 144 |
| (...skipping 12 matching lines...) Expand all Loading... |
| 178 help='Build and test for code coverage.') | 157 help='Build and test for code coverage.') |
| 179 parser.add_option('--validator', dest='validator', default=False, | 158 parser.add_option('--validator', dest='validator', default=False, |
| 180 action='store_true', | 159 action='store_true', |
| 181 help='Only run validator regression test') | 160 help='Only run validator regression test') |
| 182 parser.add_option('--asan', dest='asan', default=False, | 161 parser.add_option('--asan', dest='asan', default=False, |
| 183 action='store_true', help='Build trusted code with ASan.') | 162 action='store_true', help='Build trusted code with ASan.') |
| 184 parser.add_option('--scons-args', dest='scons_args', default =[], | 163 parser.add_option('--scons-args', dest='scons_args', default =[], |
| 185 action='append', help='Extra scons arguments.') | 164 action='append', help='Extra scons arguments.') |
| 186 parser.add_option('--step-suffix', metavar='SUFFIX', default='', | 165 parser.add_option('--step-suffix', metavar='SUFFIX', default='', |
| 187 help='Append SUFFIX to buildbot step names.') | 166 help='Append SUFFIX to buildbot step names.') |
| 188 parser.add_option('--no-gyp', dest='no_gyp', default=False, | 167 parser.add_option('--no-gn', dest='no_gn', default=False, |
| 189 action='store_true', help='Do not run the gyp build') | 168 action='store_true', help='Do not run the GN build') |
| 190 parser.add_option('--no-goma', dest='no_goma', default=False, | 169 parser.add_option('--no-goma', dest='no_goma', default=False, |
| 191 action='store_true', help='Do not run with goma') | 170 action='store_true', help='Do not run with goma') |
| 192 parser.add_option('--use-breakpad-tools', dest='use_breakpad_tools', | 171 parser.add_option('--use-breakpad-tools', dest='use_breakpad_tools', |
| 193 default=False, action='store_true', | 172 default=False, action='store_true', |
| 194 help='Use breakpad tools for testing') | 173 help='Use breakpad tools for testing') |
| 195 parser.add_option('--skip-build', dest='skip_build', default=False, | 174 parser.add_option('--skip-build', dest='skip_build', default=False, |
| 196 action='store_true', | 175 action='store_true', |
| 197 help='Skip building steps in buildbot_pnacl') | 176 help='Skip building steps in buildbot_pnacl') |
| 198 parser.add_option('--skip-run', dest='skip_run', default=False, | 177 parser.add_option('--skip-run', dest='skip_run', default=False, |
| 199 action='store_true', | 178 action='store_true', |
| (...skipping 20 matching lines...) Expand all Loading... |
| 220 | 199 |
| 221 context['platform'] = platform | 200 context['platform'] = platform |
| 222 context['mode'] = mode | 201 context['mode'] = mode |
| 223 context['arch'] = arch | 202 context['arch'] = arch |
| 224 context['android'] = options.android | 203 context['android'] = options.android |
| 225 # ASan is Clang, so set the flag to simplify other checks. | 204 # ASan is Clang, so set the flag to simplify other checks. |
| 226 context['clang'] = options.clang or options.asan | 205 context['clang'] = options.clang or options.asan |
| 227 context['validator'] = options.validator | 206 context['validator'] = options.validator |
| 228 context['asan'] = options.asan | 207 context['asan'] = options.asan |
| 229 # TODO(ncbray) turn derived values into methods. | 208 # TODO(ncbray) turn derived values into methods. |
| 230 context['gyp_mode'] = { | |
| 231 'opt': 'Release', | |
| 232 'dbg': 'Debug', | |
| 233 'coverage': 'Debug'}[mode] | |
| 234 context['gn_is_debug'] = { | 209 context['gn_is_debug'] = { |
| 235 'opt': 'false', | 210 'opt': 'false', |
| 236 'dbg': 'true', | 211 'dbg': 'true', |
| 237 'coverage': 'true'}[mode] | 212 'coverage': 'true'}[mode] |
| 238 context['gyp_arch'] = ARCH_MAP[arch]['gyp_arch'] | 213 context['gn_arch'] = GNArch(arch) |
| 239 context['gyp_vars'] = [] | |
| 240 if context['clang']: | |
| 241 context['gyp_vars'].append('clang=1') | |
| 242 if context['asan']: | |
| 243 context['gyp_vars'].append('asan=1') | |
| 244 context['default_scons_platform'] = ARCH_MAP[arch]['scons_platform'] | 214 context['default_scons_platform'] = ARCH_MAP[arch]['scons_platform'] |
| 245 context['default_scons_mode'] = ['nacl'] | 215 context['default_scons_mode'] = ['nacl'] |
| 246 # Only Linux can build trusted code on ARM. | 216 # Only Linux can build trusted code on ARM. |
| 247 # TODO(mcgrathr): clean this up somehow | 217 # TODO(mcgrathr): clean this up somehow |
| 248 if arch != 'arm' or platform == 'linux': | 218 if arch != 'arm' or platform == 'linux': |
| 249 context['default_scons_mode'] += [mode + '-host'] | 219 context['default_scons_mode'] += [mode + '-host'] |
| 250 context['use_glibc'] = toolchain == 'glibc' | 220 context['use_glibc'] = toolchain == 'glibc' |
| 251 context['pnacl'] = toolchain == 'pnacl' | 221 context['pnacl'] = toolchain == 'pnacl' |
| 252 context['nacl_clang'] = toolchain == 'nacl_clang' | 222 context['nacl_clang'] = toolchain == 'nacl_clang' |
| 253 context['max_jobs'] = 8 | 223 context['max_jobs'] = 8 |
| 254 context['dry_run'] = options.dry_run | 224 context['dry_run'] = options.dry_run |
| 255 context['inside_toolchain'] = options.inside_toolchain | 225 context['inside_toolchain'] = options.inside_toolchain |
| 256 context['step_suffix'] = options.step_suffix | 226 context['step_suffix'] = options.step_suffix |
| 257 context['no_gyp'] = options.no_gyp | 227 context['no_gn'] = options.no_gn |
| 258 context['no_goma'] = options.no_goma | 228 context['no_goma'] = options.no_goma |
| 259 context['coverage'] = options.coverage | 229 context['coverage'] = options.coverage |
| 260 context['use_breakpad_tools'] = options.use_breakpad_tools | 230 context['use_breakpad_tools'] = options.use_breakpad_tools |
| 261 context['scons_args'] = options.scons_args | 231 context['scons_args'] = options.scons_args |
| 262 context['skip_build'] = options.skip_build | 232 context['skip_build'] = options.skip_build |
| 263 context['skip_run'] = options.skip_run | 233 context['skip_run'] = options.skip_run |
| 264 # Don't run gyp on coverage builds. | |
| 265 if context['coverage']: | |
| 266 context['no_gyp'] = True | |
| 267 | 234 |
| 268 for key, value in sorted(context.config.items()): | 235 for key, value in sorted(context.config.items()): |
| 269 print '%s=%s' % (key, value) | 236 print '%s=%s' % (key, value) |
| 270 | 237 |
| 271 | 238 |
| 272 def EnsureDirectoryExists(path): | 239 def EnsureDirectoryExists(path): |
| 273 """ | 240 """ |
| 274 Create a directory if it does not already exist. | 241 Create a directory if it does not already exist. |
| 275 Does not mask failures, but there really shouldn't be any. | 242 Does not mask failures, but there really shouldn't be any. |
| 276 """ | 243 """ |
| (...skipping 406 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 683 # Otherwise these go back to the preamble. | 650 # Otherwise these go back to the preamble. |
| 684 with Step('summary', status): | 651 with Step('summary', status): |
| 685 if status.ever_failed: | 652 if status.ever_failed: |
| 686 print 'There were failed stages.' | 653 print 'There were failed stages.' |
| 687 else: | 654 else: |
| 688 print 'Success.' | 655 print 'Success.' |
| 689 # Display a summary of the build. | 656 # Display a summary of the build. |
| 690 status.DisplayBuildStatus() | 657 status.DisplayBuildStatus() |
| 691 | 658 |
| 692 sys.exit(status.ReturnValue()) | 659 sys.exit(status.ReturnValue()) |
| OLD | NEW |