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 """Entry point for both build and try bots | 6 """Entry point for both build and try bots |
7 | 7 |
8 This script is invoked from XXX, usually without arguments | 8 This script is invoked from XXX, usually without arguments |
9 to package an SDK. It automatically determines whether | 9 to package an SDK. It automatically determines whether |
10 this SDK is for mac, win, linux. | 10 this SDK is for mac, win, linux. |
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
109 def GetToolchainNaClLib(tcname, tcpath, arch, xarch): | 109 def GetToolchainNaClLib(tcname, tcpath, arch, xarch): |
110 if arch == 'x86': | 110 if arch == 'x86': |
111 if tcname == 'pnacl': | 111 if tcname == 'pnacl': |
112 return os.path.join(tcpath, 'newlib', 'sdk', 'lib') | 112 return os.path.join(tcpath, 'newlib', 'sdk', 'lib') |
113 if str(xarch) == '32': | 113 if str(xarch) == '32': |
114 return os.path.join(tcpath, 'x86_64-nacl', 'lib32') | 114 return os.path.join(tcpath, 'x86_64-nacl', 'lib32') |
115 if str(xarch) == '64': | 115 if str(xarch) == '64': |
116 return os.path.join(tcpath, 'x86_64-nacl', 'lib') | 116 return os.path.join(tcpath, 'x86_64-nacl', 'lib') |
117 buildbot_common.ErrorExit('Unknown architecture.') | 117 buildbot_common.ErrorExit('Unknown architecture.') |
118 | 118 |
| 119 |
119 def GetPNaClNativeLib(tcpath, arch): | 120 def GetPNaClNativeLib(tcpath, arch): |
120 if arch not in ['arm', 'x86-32', 'x86-64']: | 121 if arch not in ['arm', 'x86-32', 'x86-64']: |
121 buildbot_common.ErrorExit('Unknown architecture %s.' % arch) | 122 buildbot_common.ErrorExit('Unknown architecture %s.' % arch) |
122 return os.path.join(tcpath, 'lib-' + arch) | 123 return os.path.join(tcpath, 'lib-' + arch) |
123 | 124 |
| 125 |
124 def GetBuildArgs(tcname, tcpath, outdir, arch, xarch=None): | 126 def GetBuildArgs(tcname, tcpath, outdir, arch, xarch=None): |
125 """Return list of scons build arguments to generate user libraries.""" | 127 """Return list of scons build arguments to generate user libraries.""" |
126 scons = GetScons() | 128 scons = GetScons() |
127 mode = '--mode=opt-host,nacl' | 129 mode = '--mode=opt-host,nacl' |
128 arch_name = GetArchName(arch, xarch) | 130 arch_name = GetArchName(arch, xarch) |
129 plat = 'platform=' + arch_name | 131 plat = 'platform=' + arch_name |
130 bin = 'bindir=' + os.path.join(outdir, 'tools') | 132 bin = 'bindir=' + os.path.join(outdir, 'tools') |
131 lib = 'libdir=' + GetToolchainNaClLib(tcname, tcpath, arch, xarch) | 133 lib = 'libdir=' + GetToolchainNaClLib(tcname, tcpath, arch, xarch) |
132 args = [scons, mode, plat, bin, lib, '-j10', | 134 args = [scons, mode, plat, bin, lib, '-j10', |
133 'install_bin', 'install_lib'] | 135 'install_bin', 'install_lib'] |
134 if tcname == 'glibc': | 136 if tcname == 'glibc': |
135 args.append('--nacl_glibc') | 137 args.append('--nacl_glibc') |
136 | 138 |
137 if tcname == 'pnacl': | 139 if tcname == 'pnacl': |
138 args.append('bitcode=1') | 140 args.append('bitcode=1') |
139 | 141 |
140 print "Building %s (%s): %s" % (tcname, arch, ' '.join(args)) | 142 print "Building %s (%s): %s" % (tcname, arch, ' '.join(args)) |
141 return args | 143 return args |
142 | 144 |
143 | 145 |
| 146 def BuildStepBuildToolsTests(): |
| 147 buildbot_common.BuildStep('Run build_tools tests') |
| 148 buildbot_common.Run([sys.executable, |
| 149 os.path.join(SDK_SRC_DIR, 'build_tools', 'tests', 'test_all.py')]) |
| 150 |
| 151 |
| 152 def BuildStepDownloadToolchains(platform): |
| 153 buildbot_common.BuildStep('Rerun hooks to get toolchains') |
| 154 buildbot_common.Run(['gclient', 'runhooks'], |
| 155 cwd=SRC_DIR, shell=(platform=='win')) |
| 156 |
| 157 |
| 158 def BuildStepCleanPepperDirs(pepperdir, pepperdir_old): |
| 159 buildbot_common.BuildStep('Clean Pepper Dirs') |
| 160 buildbot_common.RemoveDir(pepperdir_old) |
| 161 buildbot_common.RemoveDir(pepperdir) |
| 162 buildbot_common.MakeDir(pepperdir) |
| 163 |
| 164 |
| 165 def BuildStepMakePepperDirs(pepperdir, subdirs): |
| 166 for subdir in subdirs: |
| 167 buildbot_common.MakeDir(os.path.join(pepperdir, subdir)) |
| 168 |
| 169 |
| 170 def BuildStepCopyTextFiles(pepperdir, pepper_ver, revision): |
| 171 buildbot_common.BuildStep('Add Text Files') |
| 172 files = ['AUTHORS', 'COPYING', 'LICENSE', 'NOTICE'] |
| 173 files = [os.path.join(SDK_SRC_DIR, filename) for filename in files] |
| 174 oshelpers.Copy(['-v'] + files + [pepperdir]) |
| 175 |
| 176 # Replace a few placeholders in README |
| 177 readme_text = open(os.path.join(SDK_SRC_DIR, 'README'), 'rt').read() |
| 178 readme_text = readme_text.replace('${VERSION}', pepper_ver) |
| 179 readme_text = readme_text.replace('${REVISION}', revision) |
| 180 |
| 181 # Year/Month/Day Hour:Minute:Second |
| 182 time_format = '%Y/%m/%d %H:%M:%S' |
| 183 readme_text = readme_text.replace('${DATE}', |
| 184 datetime.datetime.now().strftime(time_format)) |
| 185 |
| 186 open(os.path.join(pepperdir, 'README'), 'wt').write(readme_text) |
| 187 |
| 188 |
| 189 def BuildStepUntarToolchains(pepperdir, platform, arch, toolchains): |
| 190 buildbot_common.BuildStep('Untar Toolchains') |
| 191 tcname = platform + '_' + arch |
| 192 tmpdir = os.path.join(SRC_DIR, 'out', 'tc_temp') |
| 193 buildbot_common.RemoveDir(tmpdir) |
| 194 buildbot_common.MakeDir(tmpdir) |
| 195 |
| 196 if 'newlib' in toolchains: |
| 197 # Untar the newlib toolchains |
| 198 tarfile = GetNewlibToolchain(platform, arch) |
| 199 buildbot_common.Run([sys.executable, CYGTAR, '-C', tmpdir, '-xf', tarfile], |
| 200 cwd=NACL_DIR) |
| 201 |
| 202 # Then rename/move it to the pepper toolchain directory |
| 203 srcdir = os.path.join(tmpdir, 'sdk', 'nacl-sdk') |
| 204 newlibdir = os.path.join(pepperdir, 'toolchain', tcname + '_newlib') |
| 205 buildbot_common.Move(srcdir, newlibdir) |
| 206 |
| 207 if 'glibc' in toolchains: |
| 208 # Untar the glibc toolchains |
| 209 tarfile = GetGlibcToolchain(platform, arch) |
| 210 buildbot_common.Run([sys.executable, CYGTAR, '-C', tmpdir, '-xf', tarfile], |
| 211 cwd=NACL_DIR) |
| 212 |
| 213 # Then rename/move it to the pepper toolchain directory |
| 214 srcdir = os.path.join(tmpdir, 'toolchain', tcname) |
| 215 glibcdir = os.path.join(pepperdir, 'toolchain', tcname + '_glibc') |
| 216 buildbot_common.Move(srcdir, glibcdir) |
| 217 |
| 218 # Untar the pnacl toolchains |
| 219 if 'pnacl' in toolchains: |
| 220 tmpdir = os.path.join(tmpdir, 'pnacl') |
| 221 buildbot_common.RemoveDir(tmpdir) |
| 222 buildbot_common.MakeDir(tmpdir) |
| 223 tarfile = GetPNaClToolchain(platform, arch) |
| 224 buildbot_common.Run([sys.executable, CYGTAR, '-C', tmpdir, '-xf', tarfile], |
| 225 cwd=NACL_DIR) |
| 226 |
| 227 # Then rename/move it to the pepper toolchain directory |
| 228 pnacldir = os.path.join(pepperdir, 'toolchain', tcname + '_pnacl') |
| 229 buildbot_common.Move(tmpdir, pnacldir) |
| 230 |
| 231 |
144 HEADER_MAP = { | 232 HEADER_MAP = { |
145 'newlib': { | 233 'newlib': { |
146 'pthread.h': 'src/untrusted/pthread/pthread.h', | 234 'pthread.h': 'src/untrusted/pthread/pthread.h', |
147 'semaphore.h': 'src/untrusted/pthread/semaphore.h', | 235 'semaphore.h': 'src/untrusted/pthread/semaphore.h', |
148 'nacl/dynamic_annotations.h': | 236 'nacl/dynamic_annotations.h': |
149 'src/untrusted/valgrind/dynamic_annotations.h', | 237 'src/untrusted/valgrind/dynamic_annotations.h', |
150 'nacl/nacl_dyncode.h': 'src/untrusted/nacl/nacl_dyncode.h', | 238 'nacl/nacl_dyncode.h': 'src/untrusted/nacl/nacl_dyncode.h', |
151 'nacl/nacl_startup.h': 'src/untrusted/nacl/nacl_startup.h', | 239 'nacl/nacl_startup.h': 'src/untrusted/nacl/nacl_startup.h', |
152 'nacl/nacl_thread.h': 'src/untrusted/nacl/nacl_thread.h', | 240 'nacl/nacl_thread.h': 'src/untrusted/nacl/nacl_thread.h', |
153 'pnacl.h': 'src/untrusted/nacl/pnacl.h', | 241 'pnacl.h': 'src/untrusted/nacl/pnacl.h', |
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
241 buildbot_common.MakeDir(os.path.join(tc_dst_inc, 'KHR')) | 329 buildbot_common.MakeDir(os.path.join(tc_dst_inc, 'KHR')) |
242 buildbot_common.CopyDir( | 330 buildbot_common.CopyDir( |
243 os.path.join(PPAPI_DIR,'lib','gl','include','KHR', '*.h'), | 331 os.path.join(PPAPI_DIR,'lib','gl','include','KHR', '*.h'), |
244 os.path.join(tc_dst_inc, 'KHR')) | 332 os.path.join(tc_dst_inc, 'KHR')) |
245 | 333 |
246 # Copy the lib files | 334 # Copy the lib files |
247 buildbot_common.CopyDir(os.path.join(PPAPI_DIR,'lib'), | 335 buildbot_common.CopyDir(os.path.join(PPAPI_DIR,'lib'), |
248 os.path.join(tc_dst_inc, 'ppapi')) | 336 os.path.join(tc_dst_inc, 'ppapi')) |
249 | 337 |
250 | 338 |
251 def UntarToolchains(pepperdir, platform, arch, toolchains): | 339 def BuildStepBuildToolchains(pepperdir, platform, arch, pepper_ver, toolchains): |
252 buildbot_common.BuildStep('Untar Toolchains') | |
253 tcname = platform + '_' + arch | |
254 tmpdir = os.path.join(SRC_DIR, 'out', 'tc_temp') | |
255 buildbot_common.RemoveDir(tmpdir) | |
256 buildbot_common.MakeDir(tmpdir) | |
257 | |
258 if 'newlib' in toolchains: | |
259 # Untar the newlib toolchains | |
260 tarfile = GetNewlibToolchain(platform, arch) | |
261 buildbot_common.Run([sys.executable, CYGTAR, '-C', tmpdir, '-xf', tarfile], | |
262 cwd=NACL_DIR) | |
263 | |
264 # Then rename/move it to the pepper toolchain directory | |
265 srcdir = os.path.join(tmpdir, 'sdk', 'nacl-sdk') | |
266 newlibdir = os.path.join(pepperdir, 'toolchain', tcname + '_newlib') | |
267 buildbot_common.Move(srcdir, newlibdir) | |
268 | |
269 if 'glibc' in toolchains: | |
270 # Untar the glibc toolchains | |
271 tarfile = GetGlibcToolchain(platform, arch) | |
272 buildbot_common.Run([sys.executable, CYGTAR, '-C', tmpdir, '-xf', tarfile], | |
273 cwd=NACL_DIR) | |
274 | |
275 # Then rename/move it to the pepper toolchain directory | |
276 srcdir = os.path.join(tmpdir, 'toolchain', tcname) | |
277 glibcdir = os.path.join(pepperdir, 'toolchain', tcname + '_glibc') | |
278 buildbot_common.Move(srcdir, glibcdir) | |
279 | |
280 # Untar the pnacl toolchains | |
281 if 'pnacl' in toolchains: | |
282 tmpdir = os.path.join(tmpdir, 'pnacl') | |
283 buildbot_common.RemoveDir(tmpdir) | |
284 buildbot_common.MakeDir(tmpdir) | |
285 tarfile = GetPNaClToolchain(platform, arch) | |
286 buildbot_common.Run([sys.executable, CYGTAR, '-C', tmpdir, '-xf', tarfile], | |
287 cwd=NACL_DIR) | |
288 | |
289 # Then rename/move it to the pepper toolchain directory | |
290 pnacldir = os.path.join(pepperdir, 'toolchain', tcname + '_pnacl') | |
291 buildbot_common.Move(tmpdir, pnacldir) | |
292 | |
293 | |
294 def BuildToolchains(pepperdir, platform, arch, pepper_ver, toolchains): | |
295 buildbot_common.BuildStep('SDK Items') | 340 buildbot_common.BuildStep('SDK Items') |
296 | 341 |
297 tcname = platform + '_' + arch | 342 tcname = platform + '_' + arch |
298 newlibdir = os.path.join(pepperdir, 'toolchain', tcname + '_newlib') | 343 newlibdir = os.path.join(pepperdir, 'toolchain', tcname + '_newlib') |
299 glibcdir = os.path.join(pepperdir, 'toolchain', tcname + '_glibc') | 344 glibcdir = os.path.join(pepperdir, 'toolchain', tcname + '_glibc') |
300 pnacldir = os.path.join(pepperdir, 'toolchain', tcname + '_pnacl') | 345 pnacldir = os.path.join(pepperdir, 'toolchain', tcname + '_pnacl') |
301 | 346 |
302 # Run scons TC build steps | 347 # Run scons TC build steps |
303 if arch == 'x86': | 348 if arch == 'x86': |
304 if 'newlib' in toolchains: | 349 if 'newlib' in toolchains: |
(...skipping 30 matching lines...) Expand all Loading... |
335 buildbot_common.Move( | 380 buildbot_common.Move( |
336 os.path.join(GetToolchainNaClLib('pnacl', pnacldir, 'x86', '64'), | 381 os.path.join(GetToolchainNaClLib('pnacl', pnacldir, 'x86', '64'), |
337 'libpnacl_irt_shim.a'), | 382 'libpnacl_irt_shim.a'), |
338 GetPNaClNativeLib(pnacldir, 'x86-64')) | 383 GetPNaClNativeLib(pnacldir, 'x86-64')) |
339 InstallHeaders(GetToolchainNaClInclude('pnacl', pnacldir, 'x86'), | 384 InstallHeaders(GetToolchainNaClInclude('pnacl', pnacldir, 'x86'), |
340 pepper_ver, | 385 pepper_ver, |
341 'newlib') | 386 'newlib') |
342 else: | 387 else: |
343 buildbot_common.ErrorExit('Missing arch %s' % arch) | 388 buildbot_common.ErrorExit('Missing arch %s' % arch) |
344 | 389 |
| 390 |
| 391 def BuildStepCopyBuildHelpers(pepperdir, platform): |
| 392 buildbot_common.BuildStep('Copy build helpers') |
| 393 buildbot_common.CopyDir(os.path.join(SDK_SRC_DIR, 'tools', '*.py'), |
| 394 os.path.join(pepperdir, 'tools')) |
| 395 if platform == 'win': |
| 396 buildbot_common.BuildStep('Add MAKE') |
| 397 http_download.HttpDownload(GSTORE + MAKE, |
| 398 os.path.join(pepperdir, 'tools' ,'make.exe')) |
| 399 rename_list = ['ncval_x86_32', 'ncval_x86_64', |
| 400 'sel_ldr_x86_32', 'sel_ldr_x86_64'] |
| 401 tools = os.path.join(pepperdir, 'tools') |
| 402 for name in rename_list: |
| 403 src = os.path.join(pepperdir, 'tools', name) |
| 404 dst = os.path.join(pepperdir, 'tools', name + '.exe') |
| 405 buildbot_common.Move(src, dst) |
| 406 |
| 407 |
345 EXAMPLE_LIST = [ | 408 EXAMPLE_LIST = [ |
346 'debugging', | 409 'debugging', |
347 'file_histogram', | 410 'file_histogram', |
348 'file_io', | 411 'file_io', |
349 'fullscreen_tumbler', | 412 'fullscreen_tumbler', |
350 'gamepad', | 413 'gamepad', |
351 'geturl', | 414 'geturl', |
352 'hello_world_interactive', | 415 'hello_world_interactive', |
353 'hello_world', | 416 'hello_world', |
354 'hello_world_gles', | 417 'hello_world_gles', |
(...skipping 13 matching lines...) Expand all Loading... |
368 'ppapi_cpp', | 431 'ppapi_cpp', |
369 'ppapi_gles2', | 432 'ppapi_gles2', |
370 ] | 433 ] |
371 | 434 |
372 LIB_DICT = { | 435 LIB_DICT = { |
373 'linux': [], | 436 'linux': [], |
374 'mac': [], | 437 'mac': [], |
375 'win': ['x86_32'] | 438 'win': ['x86_32'] |
376 } | 439 } |
377 | 440 |
378 def CopyExamples(pepperdir, toolchains): | 441 def BuildStepCopyExamples(pepperdir, toolchains): |
379 buildbot_common.BuildStep('Copy examples') | 442 buildbot_common.BuildStep('Copy examples') |
380 | 443 |
381 if not os.path.exists(os.path.join(pepperdir, 'tools')): | 444 if not os.path.exists(os.path.join(pepperdir, 'tools')): |
382 buildbot_common.ErrorExit('Examples depend on missing tools.') | 445 buildbot_common.ErrorExit('Examples depend on missing tools.') |
383 if not os.path.exists(os.path.join(pepperdir, 'toolchain')): | 446 if not os.path.exists(os.path.join(pepperdir, 'toolchain')): |
384 buildbot_common.ErrorExit('Examples depend on missing toolchains.') | 447 buildbot_common.ErrorExit('Examples depend on missing toolchains.') |
385 | 448 |
386 exampledir = os.path.join(pepperdir, 'examples') | 449 exampledir = os.path.join(pepperdir, 'examples') |
387 buildbot_common.RemoveDir(exampledir) | 450 buildbot_common.RemoveDir(exampledir) |
388 buildbot_common.MakeDir(exampledir) | 451 buildbot_common.MakeDir(exampledir) |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
456 stdout, _ = process.communicate() | 519 stdout, _ = process.communicate() |
457 | 520 |
458 # Parse environment from "set" command above. | 521 # Parse environment from "set" command above. |
459 # It looks like this: | 522 # It looks like this: |
460 # KEY1=VALUE1\r\n | 523 # KEY1=VALUE1\r\n |
461 # KEY2=VALUE2\r\n | 524 # KEY2=VALUE2\r\n |
462 # ... | 525 # ... |
463 return dict(line.split('=') for line in stdout.split('\r\n')[:-1]) | 526 return dict(line.split('=') for line in stdout.split('\r\n')[:-1]) |
464 | 527 |
465 | 528 |
| 529 def BuildStepBuildLibraries(pepperdir, platform): |
| 530 buildbot_common.BuildStep('Build Libraries') |
| 531 src_dir = os.path.join(pepperdir, 'src') |
| 532 makefile = os.path.join(src_dir, 'Makefile') |
| 533 if os.path.isfile(makefile): |
| 534 print "\n\nMake: " + src_dir |
| 535 if platform == 'win': |
| 536 # We need to modify the environment to build host on Windows. |
| 537 env = GetWindowsEnvironment() |
| 538 else: |
| 539 env = os.environ |
| 540 |
| 541 buildbot_common.Run(['make', '-j8'], |
| 542 cwd=os.path.abspath(src_dir), shell=True, env=env) |
| 543 # Clean to remove temporary files but keep the built libraries. |
| 544 buildbot_common.Run(['make', '-j8', 'clean'], |
| 545 cwd=os.path.abspath(src_dir), shell=True) |
| 546 |
| 547 |
| 548 def BuildStepTarBundle(pepper_ver, tarfile): |
| 549 buildbot_common.BuildStep('Tar Pepper Bundle') |
| 550 buildbot_common.MakeDir(os.path.dirname(tarfile)) |
| 551 buildbot_common.Run([sys.executable, CYGTAR, '-C', OUT_DIR, '-cjf', tarfile, |
| 552 'pepper_' + pepper_ver], cwd=NACL_DIR) |
| 553 |
| 554 |
| 555 def GetManifestBundle(pepper_ver, revision, tarfile, archive_url): |
| 556 with open(tarfile, 'rb') as tarfile_stream: |
| 557 archive_sha1, archive_size = manifest_util.DownloadAndComputeHash( |
| 558 tarfile_stream) |
| 559 |
| 560 archive = manifest_util.Archive(manifest_util.GetHostOS()) |
| 561 archive.url = archive_url |
| 562 archive.size = archive_size |
| 563 archive.checksum = archive_sha1 |
| 564 |
| 565 bundle = manifest_util.Bundle('pepper_' + pepper_ver) |
| 566 bundle.revision = int(revision) |
| 567 bundle.repath = 'pepper_' + pepper_ver |
| 568 bundle.version = int(pepper_ver) |
| 569 bundle.description = 'Chrome %s bundle, revision %s' % ( |
| 570 pepper_ver, revision), |
| 571 bundle.stability = 'dev' |
| 572 bundle.recommended = 'no' |
| 573 bundle.archives = [archive] |
| 574 return bundle |
| 575 |
| 576 |
| 577 def BuildStepTestUpdater(platform, pepper_ver, revision, tarfile): |
| 578 tarname = os.path.basename(tarfile) |
| 579 server = None |
| 580 try: |
| 581 buildbot_common.BuildStep('Run local server') |
| 582 server = test_server.LocalHTTPServer(SERVER_DIR) |
| 583 |
| 584 buildbot_common.BuildStep('Generate manifest') |
| 585 bundle = GetManifestBundle(pepper_ver, revision, tarfile, |
| 586 server.GetURL(tarname)) |
| 587 |
| 588 manifest = manifest_util.SDKManifest() |
| 589 manifest.SetBundle(bundle) |
| 590 manifest_name = 'naclsdk_manifest2.json' |
| 591 with open(os.path.join(SERVER_DIR, manifest_name), 'wb') as \ |
| 592 manifest_stream: |
| 593 manifest_stream.write(manifest.GetDataAsString()) |
| 594 |
| 595 # use newly built sdk updater to pull this bundle |
| 596 buildbot_common.BuildStep('Update from local server') |
| 597 naclsdk_sh = os.path.join(OUT_DIR, 'nacl_sdk', 'naclsdk') |
| 598 if platform == 'win': |
| 599 naclsdk_sh += '.bat' |
| 600 buildbot_common.Run([naclsdk_sh, '-U', |
| 601 server.GetURL(manifest_name), 'update', 'pepper_' + pepper_ver]) |
| 602 |
| 603 # Return the new pepper directory as the one inside the downloaded SDK. |
| 604 return os.path.join(OUT_DIR, 'nacl_sdk', 'pepper_' + pepper_ver) |
| 605 |
| 606 # kill server |
| 607 finally: |
| 608 if server: |
| 609 server.Shutdown() |
| 610 |
| 611 |
| 612 def BuildStepBuildExamples(pepperdir, platform): |
| 613 buildbot_common.BuildStep('Build Examples') |
| 614 example_dir = os.path.join(pepperdir, 'examples') |
| 615 makefile = os.path.join(example_dir, 'Makefile') |
| 616 if os.path.isfile(makefile): |
| 617 print "\n\nMake: " + example_dir |
| 618 if platform == 'win': |
| 619 # We need to modify the environment to build host on Windows. |
| 620 env = GetWindowsEnvironment() |
| 621 else: |
| 622 env = os.environ |
| 623 |
| 624 buildbot_common.Run(['make', '-j8'], |
| 625 cwd=os.path.abspath(example_dir), shell=True, env=env) |
| 626 |
| 627 |
| 628 def BuildStepTestExamples(pepperdir, platform, pepper_ver): |
| 629 buildbot_common.BuildStep('Test Examples') |
| 630 env = copy.copy(os.environ) |
| 631 env['PEPPER_VER'] = pepper_ver |
| 632 env['NACL_SDK_ROOT'] = pepperdir |
| 633 |
| 634 pyauto_script = os.path.join(SRC_DIR, 'chrome', 'test', 'functional', |
| 635 'nacl_sdk.py') |
| 636 pyauto_script_args = ['nacl_sdk.NaClSDKTest.NaClSDKExamples'] |
| 637 |
| 638 if platform == 'linux' and buildbot_common.IsSDKBuilder(): |
| 639 # linux buildbots need to run the pyauto tests through xvfb. Running |
| 640 # using runtest.py does this. |
| 641 #env['PYTHON_PATH'] = '.:' + env.get('PYTHON_PATH', '.') |
| 642 build_dir = os.path.dirname(SRC_DIR) |
| 643 runtest_py = os.path.join(build_dir, '..', '..', '..', 'scripts', 'slave', |
| 644 'runtest.py') |
| 645 buildbot_common.Run([sys.executable, runtest_py, '--target', 'Release', |
| 646 '--build-dir', 'src/build', sys.executable, |
| 647 pyauto_script] + pyauto_script_args, |
| 648 cwd=build_dir, env=env) |
| 649 else: |
| 650 buildbot_common.Run([sys.executable, 'nacl_sdk.py', |
| 651 'nacl_sdk.NaClSDKTest.NaClSDKExamples'], |
| 652 cwd=os.path.dirname(pyauto_script), |
| 653 env=env) |
| 654 |
| 655 |
| 656 def BuildStepArchiveBundle(pepper_ver, revision, tarfile): |
| 657 buildbot_common.BuildStep('Archive build') |
| 658 bucket_path = 'nativeclient-mirror/nacl/nacl_sdk/%s' % ( |
| 659 build_utils.ChromeVersion(),) |
| 660 tarname = os.path.basename(tarfile) |
| 661 tarfile_dir = os.path.dirname(tarfile) |
| 662 buildbot_common.Archive(tarname, bucket_path, tarfile_dir) |
| 663 |
| 664 # generate "manifest snippet" for this archive. |
| 665 archive_url = GSTORE + 'nacl_sdk/%s/%s' % ( |
| 666 build_utils.ChromeVersion(), tarname) |
| 667 bundle = GetManifestBundle(pepper_ver, revision, tarfile, archive_url) |
| 668 |
| 669 manifest_snippet_file = os.path.join(OUT_DIR, tarname + '.json') |
| 670 with open(manifest_snippet_file, 'wb') as manifest_snippet_stream: |
| 671 manifest_snippet_stream.write(bundle.GetDataAsString()) |
| 672 |
| 673 buildbot_common.Archive(tarname + '.json', bucket_path, OUT_DIR, |
| 674 step_link=False) |
| 675 |
| 676 |
| 677 def BuildStepArchiveSDKTools(): |
| 678 # Only push up sdk_tools.tgz on the linux buildbot. |
| 679 builder_name = os.getenv('BUILDBOT_BUILDERNAME','') |
| 680 if builder_name == 'linux-sdk-multi': |
| 681 buildbot_common.BuildStep('Archive SDK Tools') |
| 682 bucket_path = 'nativeclient-mirror/nacl/nacl_sdk/%s' % ( |
| 683 build_utils.ChromeVersion(),) |
| 684 buildbot_common.Archive('sdk_tools.tgz', bucket_path, OUT_DIR, |
| 685 step_link=False) |
| 686 |
| 687 |
466 def main(args): | 688 def main(args): |
467 parser = optparse.OptionParser() | 689 parser = optparse.OptionParser() |
468 parser.add_option('--pnacl', help='Enable pnacl build.', | 690 parser.add_option('--pnacl', help='Enable pnacl build.', |
469 action='store_true', dest='pnacl', default=False) | 691 action='store_true', dest='pnacl', default=False) |
470 parser.add_option('--examples', help='Only build the examples.', | 692 parser.add_option('--examples', help='Only build the examples.', |
471 action='store_true', dest='only_examples', default=False) | 693 action='store_true', dest='only_examples', default=False) |
472 parser.add_option('--update', help='Only build the updater.', | 694 parser.add_option('--update', help='Only build the updater.', |
473 action='store_true', dest='only_updater', default=False) | 695 action='store_true', dest='only_updater', default=False) |
474 parser.add_option('--test-examples', | 696 parser.add_option('--test-examples', |
475 help='Run the pyauto tests for examples.', action='store_true', | 697 help='Run the pyauto tests for examples.', action='store_true', |
(...skipping 22 matching lines...) Expand all Loading... |
498 # TODO(binji) for now, only test examples on non-trybots. Trybots don't build | 720 # TODO(binji) for now, only test examples on non-trybots. Trybots don't build |
499 # pyauto Chrome. | 721 # pyauto Chrome. |
500 if buildbot_common.IsSDKBuilder(): | 722 if buildbot_common.IsSDKBuilder(): |
501 options.test_examples = True | 723 options.test_examples = True |
502 | 724 |
503 if options.pnacl: | 725 if options.pnacl: |
504 toolchains = ['pnacl'] | 726 toolchains = ['pnacl'] |
505 else: | 727 else: |
506 toolchains = ['newlib', 'glibc', 'host'] | 728 toolchains = ['newlib', 'glibc', 'host'] |
507 print 'Building: ' + ' '.join(toolchains) | 729 print 'Building: ' + ' '.join(toolchains) |
508 skip = options.only_examples or options.only_updater | |
509 | |
510 skip_examples = skip and not options.only_examples | |
511 skip_update = skip and not options.only_updater | |
512 skip_untar = skip | |
513 skip_build = skip | |
514 skip_test_updater = skip | |
515 skip_test_examples = skip_examples or not options.test_examples | |
516 skip_test_build_tools = skip | |
517 skip_tar = skip or options.skip_tar | |
518 | 730 |
519 if options.archive and (options.only_examples or options.skip_tar): | 731 if options.archive and (options.only_examples or options.skip_tar): |
520 parser.error('Incompatible arguments with archive.') | 732 parser.error('Incompatible arguments with archive.') |
521 | 733 |
522 pepper_ver = str(int(build_utils.ChromeMajorVersion())) | 734 pepper_ver = str(int(build_utils.ChromeMajorVersion())) |
523 pepper_old = str(int(build_utils.ChromeMajorVersion()) - 1) | 735 pepper_old = str(int(build_utils.ChromeMajorVersion()) - 1) |
| 736 pepperdir = os.path.join(SRC_DIR, 'out', 'pepper_' + pepper_ver) |
| 737 pepperdir_old = os.path.join(SRC_DIR, 'out', 'pepper_' + pepper_old) |
524 clnumber = build_utils.ChromeRevision() | 738 clnumber = build_utils.ChromeRevision() |
| 739 tarname = 'naclsdk_' + platform + '.tar.bz2' |
| 740 if 'pnacl' in toolchains: |
| 741 tarname = 'p' + tarname |
| 742 tarfile = os.path.join(SERVER_DIR, tarname) |
| 743 |
525 if options.release: | 744 if options.release: |
526 pepper_ver = options.release | 745 pepper_ver = options.release |
527 print 'Building PEPPER %s at %s' % (pepper_ver, clnumber) | 746 print 'Building PEPPER %s at %s' % (pepper_ver, clnumber) |
528 | 747 |
529 if not skip_build: | 748 if options.only_examples: |
530 buildbot_common.BuildStep('Rerun hooks to get toolchains') | 749 BuildStepCopyExamples(pepperdir, toolchains) |
531 buildbot_common.Run(['gclient', 'runhooks'], | 750 BuildStepBuildExamples(pepperdir, platform) |
532 cwd=SRC_DIR, shell=(platform=='win')) | 751 if options.test_examples: |
| 752 BuildStepTestExamples(pepperdir, platform, pepper_ver) |
| 753 elif options.only_updater: |
| 754 build_updater.BuildUpdater(OUT_DIR) |
| 755 else: # Build everything. |
| 756 BuildStepBuildToolsTests() |
533 | 757 |
534 buildbot_common.BuildStep('Clean Pepper Dirs') | 758 BuildStepDownloadToolchains(platform) |
535 pepperdir = os.path.join(SRC_DIR, 'out', 'pepper_' + pepper_ver) | 759 BuildStepCleanPepperDirs(pepperdir, pepperdir_old) |
536 pepperold = os.path.join(SRC_DIR, 'out', 'pepper_' + pepper_old) | 760 BuildStepMakePepperDirs(pepperdir, ['include', 'toolchain', 'tools']) |
537 buildbot_common.RemoveDir(pepperold) | 761 BuildStepCopyTextFiles(pepperdir, pepper_ver, clnumber) |
538 if not skip_untar: | 762 BuildStepUntarToolchains(pepperdir, platform, arch, toolchains) |
539 buildbot_common.RemoveDir(pepperdir) | 763 BuildStepBuildToolchains(pepperdir, platform, arch, pepper_ver, toolchains) |
540 buildbot_common.MakeDir(os.path.join(pepperdir, 'include')) | 764 InstallHeaders(os.path.join(pepperdir, 'include'), None, 'libs') |
541 buildbot_common.MakeDir(os.path.join(pepperdir, 'toolchain')) | 765 BuildStepCopyBuildHelpers(pepperdir, platform) |
542 buildbot_common.MakeDir(os.path.join(pepperdir, 'tools')) | 766 BuildStepCopyExamples(pepperdir, toolchains) |
543 else: | |
544 buildbot_common.MakeDir(pepperdir) | |
545 | 767 |
546 if not skip_build: | 768 # Ship with libraries prebuilt, so run that first. |
547 buildbot_common.BuildStep('Add Text Files') | 769 BuildStepBuildLibraries(pepperdir, platform) |
548 files = ['AUTHORS', 'COPYING', 'LICENSE', 'NOTICE'] | |
549 files = [os.path.join(SDK_SRC_DIR, filename) for filename in files] | |
550 oshelpers.Copy(['-v'] + files + [pepperdir]) | |
551 | 770 |
552 # Replace a few placeholders in README | 771 if not options.skip_tar: |
553 readme_text = open(os.path.join(SDK_SRC_DIR, 'README'), 'rt').read() | 772 BuildStepTarBundle(pepper_ver, tarfile) |
554 readme_text = readme_text.replace('${VERSION}', pepper_ver) | 773 build_updater.BuildUpdater(OUT_DIR) |
555 readme_text = readme_text.replace('${REVISION}', clnumber) | |
556 | 774 |
557 # Year/Month/Day Hour:Minute:Second | 775 # BuildStepTestUpdater downloads the bundle to its own directory. Build |
558 time_format = '%Y/%m/%d %H:%M:%S' | 776 # the examples and test from this directory instead of the original. |
559 readme_text = readme_text.replace('${DATE}', | 777 pepperdir = BuildStepTestUpdater(platform, pepper_ver, clnumber, tarfile) |
560 datetime.datetime.now().strftime(time_format)) | 778 BuildStepBuildExamples(pepperdir, platform) |
| 779 if options.test_examples: |
| 780 BuildStepTestExamples(pepperdir, platform, pepper_ver) |
561 | 781 |
562 open(os.path.join(pepperdir, 'README'), 'wt').write(readme_text) | 782 # Archive on non-trybots. |
563 | 783 if options.archive or buildbot_common.IsSDKBuilder(): |
564 # Clean out the temporary toolchain untar directory | 784 BuildStepArchiveBundle(pepper_ver, clnumber, tarfile) |
565 if not skip_untar: | 785 BuildStepArchiveSDKTools() |
566 UntarToolchains(pepperdir, platform, arch, toolchains) | |
567 | |
568 if not skip_build: | |
569 BuildToolchains(pepperdir, platform, arch, pepper_ver, toolchains) | |
570 InstallHeaders(os.path.join(pepperdir, 'include'), None, 'libs') | |
571 | |
572 if not skip_build: | |
573 buildbot_common.BuildStep('Copy make OS helpers') | |
574 buildbot_common.CopyDir(os.path.join(SDK_SRC_DIR, 'tools', '*.py'), | |
575 os.path.join(pepperdir, 'tools')) | |
576 if platform == 'win': | |
577 buildbot_common.BuildStep('Add MAKE') | |
578 http_download.HttpDownload(GSTORE + MAKE, | |
579 os.path.join(pepperdir, 'tools' ,'make.exe')) | |
580 rename_list = ['ncval_x86_32', 'ncval_x86_64', | |
581 'sel_ldr_x86_32', 'sel_ldr_x86_64'] | |
582 tools = os.path.join(pepperdir, 'tools') | |
583 for name in rename_list: | |
584 src = os.path.join(pepperdir, 'tools', name) | |
585 dst = os.path.join(pepperdir, 'tools', name + '.exe') | |
586 buildbot_common.Move(src, dst) | |
587 | |
588 if not skip_examples: | |
589 CopyExamples(pepperdir, toolchains) | |
590 | |
591 tarname = 'naclsdk_' + platform + '.tar.bz2' | |
592 if 'pnacl' in toolchains: | |
593 tarname = 'p' + tarname | |
594 tarfile = os.path.join(OUT_DIR, tarname) | |
595 | |
596 # Ship with libraries prebuilt, so run that first | |
597 buildbot_common.BuildStep('Build Libraries') | |
598 src_dir = os.path.join(pepperdir, 'src') | |
599 makefile = os.path.join(src_dir, 'Makefile') | |
600 if os.path.isfile(makefile): | |
601 print "\n\nMake: " + src_dir | |
602 if platform == 'win': | |
603 # We need to modify the environment to build host on Windows. | |
604 env = GetWindowsEnvironment() | |
605 else: | |
606 env = os.environ | |
607 | |
608 buildbot_common.Run(['make', '-j8'], | |
609 cwd=os.path.abspath(src_dir), shell=True, env=env) | |
610 buildbot_common.Run(['make', '-j8', 'clean'], | |
611 cwd=os.path.abspath(src_dir), shell=True) | |
612 | |
613 if not skip_tar: | |
614 buildbot_common.BuildStep('Tar Pepper Bundle') | |
615 buildbot_common.Run([sys.executable, CYGTAR, '-C', OUT_DIR, '-cjf', tarfile, | |
616 'pepper_' + pepper_ver], cwd=NACL_DIR) | |
617 | |
618 # Run build tests | |
619 if not skip_test_build_tools: | |
620 buildbot_common.BuildStep('Run build_tools tests') | |
621 buildbot_common.Run([sys.executable, | |
622 os.path.join(SDK_SRC_DIR, 'build_tools', 'tests', 'test_all.py')]) | |
623 | |
624 # build sdk update | |
625 if not skip_update: | |
626 build_updater.BuildUpdater(OUT_DIR) | |
627 | |
628 # start local server sharing a manifest + the new bundle | |
629 if not skip_test_updater and not skip_tar: | |
630 buildbot_common.BuildStep('Move bundle to localserver dir') | |
631 buildbot_common.MakeDir(SERVER_DIR) | |
632 buildbot_common.Move(tarfile, SERVER_DIR) | |
633 tarfile = os.path.join(SERVER_DIR, tarname) | |
634 | |
635 server = None | |
636 try: | |
637 buildbot_common.BuildStep('Run local server') | |
638 server = test_server.LocalHTTPServer(SERVER_DIR) | |
639 | |
640 buildbot_common.BuildStep('Generate manifest') | |
641 with open(tarfile, 'rb') as tarfile_stream: | |
642 archive_sha1, archive_size = manifest_util.DownloadAndComputeHash( | |
643 tarfile_stream) | |
644 archive = manifest_util.Archive(manifest_util.GetHostOS()) | |
645 archive.CopyFrom({'url': server.GetURL(tarname), | |
646 'size': archive_size, | |
647 'checksum': {'sha1': archive_sha1}}) | |
648 bundle = manifest_util.Bundle('pepper_' + pepper_ver) | |
649 bundle.CopyFrom({ | |
650 'revision': int(clnumber), | |
651 'repath': 'pepper_' + pepper_ver, | |
652 'version': int(pepper_ver), | |
653 'description': 'Chrome %s bundle, revision %s' % ( | |
654 pepper_ver, clnumber), | |
655 'stability': 'dev', | |
656 'recommended': 'no', | |
657 'archives': [archive]}) | |
658 manifest = manifest_util.SDKManifest() | |
659 manifest.SetBundle(bundle) | |
660 manifest_name = 'naclsdk_manifest2.json' | |
661 with open(os.path.join(SERVER_DIR, manifest_name), 'wb') as \ | |
662 manifest_stream: | |
663 manifest_stream.write(manifest.GetDataAsString()) | |
664 | |
665 # use newly built sdk updater to pull this bundle | |
666 buildbot_common.BuildStep('Update from local server') | |
667 naclsdk_sh = os.path.join(OUT_DIR, 'nacl_sdk', 'naclsdk') | |
668 if platform == 'win': | |
669 naclsdk_sh += '.bat' | |
670 buildbot_common.Run([naclsdk_sh, '-U', | |
671 server.GetURL(manifest_name), 'update', 'pepper_' + pepper_ver]) | |
672 | |
673 # If we are testing examples, do it in the newly pulled directory. | |
674 pepperdir = os.path.join(OUT_DIR, 'nacl_sdk', 'pepper_' + pepper_ver) | |
675 | |
676 # kill server | |
677 finally: | |
678 if server: | |
679 server.Shutdown() | |
680 | |
681 # Build Examples (libraries built previously). | |
682 if not skip_examples: | |
683 buildbot_common.BuildStep('Build Examples') | |
684 example_dir = os.path.join(pepperdir, 'examples') | |
685 makefile = os.path.join(example_dir, 'Makefile') | |
686 if os.path.isfile(makefile): | |
687 print "\n\nMake: " + example_dir | |
688 if platform == 'win': | |
689 # We need to modify the environment to build host on Windows. | |
690 env = GetWindowsEnvironment() | |
691 else: | |
692 env = os.environ | |
693 | |
694 buildbot_common.Run(['make', '-j8'], | |
695 cwd=os.path.abspath(example_dir), shell=True, env=env) | |
696 | |
697 # Test examples. | |
698 if not skip_examples and not skip_test_examples: | |
699 buildbot_common.BuildStep('Test Examples') | |
700 env = copy.copy(os.environ) | |
701 env['PEPPER_VER'] = pepper_ver | |
702 env['NACL_SDK_ROOT'] = pepperdir | |
703 | |
704 pyauto_script = os.path.join(SRC_DIR, 'chrome', 'test', 'functional', | |
705 'nacl_sdk.py') | |
706 pyauto_script_args = ['nacl_sdk.NaClSDKTest.NaClSDKExamples'] | |
707 | |
708 if platform == 'linux' and buildbot_common.IsSDKBuilder(): | |
709 # linux buildbots need to run the pyauto tests through xvfb. Running | |
710 # using runtest.py does this. | |
711 #env['PYTHON_PATH'] = '.:' + env.get('PYTHON_PATH', '.') | |
712 build_dir = os.path.dirname(SRC_DIR) | |
713 runtest_py = os.path.join(build_dir, '..', '..', '..', 'scripts', 'slave', | |
714 'runtest.py') | |
715 buildbot_common.Run([sys.executable, runtest_py, '--target', 'Release', | |
716 '--build-dir', 'src/build', sys.executable, | |
717 pyauto_script] + pyauto_script_args, | |
718 cwd=build_dir, env=env) | |
719 else: | |
720 buildbot_common.Run([sys.executable, 'nacl_sdk.py', | |
721 'nacl_sdk.NaClSDKTest.NaClSDKExamples'], | |
722 cwd=os.path.dirname(pyauto_script), | |
723 env=env) | |
724 | |
725 # Archive on non-trybots. | |
726 if options.archive or buildbot_common.IsSDKBuilder(): | |
727 buildbot_common.BuildStep('Archive build') | |
728 bucket_path = 'nativeclient-mirror/nacl/nacl_sdk/%s' % \ | |
729 build_utils.ChromeVersion() | |
730 buildbot_common.Archive(tarname, bucket_path, os.path.dirname(tarfile)) | |
731 | |
732 if not skip_update: | |
733 # Only push up sdk_tools.tgz on the linux buildbot. | |
734 if builder_name == 'linux-sdk-multi': | |
735 sdk_tools = os.path.join(OUT_DIR, 'sdk_tools.tgz') | |
736 buildbot_common.Archive('sdk_tools.tgz', bucket_path, OUT_DIR, | |
737 step_link=False) | |
738 | |
739 # generate "manifest snippet" for this archive. | |
740 if not skip_test_updater: | |
741 archive = bundle.GetArchive(manifest_util.GetHostOS()) | |
742 archive.url = 'https://commondatastorage.googleapis.com/' \ | |
743 'nativeclient-mirror/nacl/nacl_sdk/%s/%s' % ( | |
744 build_utils.ChromeVersion(), tarname) | |
745 manifest_snippet_file = os.path.join(OUT_DIR, tarname + '.json') | |
746 with open(manifest_snippet_file, 'wb') as manifest_snippet_stream: | |
747 manifest_snippet_stream.write(bundle.GetDataAsString()) | |
748 | |
749 buildbot_common.Archive(tarname + '.json', bucket_path, OUT_DIR, | |
750 step_link=False) | |
751 | 786 |
752 return 0 | 787 return 0 |
753 | 788 |
754 | 789 |
755 if __name__ == '__main__': | 790 if __name__ == '__main__': |
756 sys.exit(main(sys.argv)) | 791 sys.exit(main(sys.argv)) |
OLD | NEW |