OLD | NEW |
1 #!/usr/bin/env python | 1 #!/usr/bin/env python |
2 | 2 |
3 # Copyright (c) 2012 The Chromium Authors. All rights reserved. | 3 # Copyright (c) 2012 The Chromium Authors. All rights reserved. |
4 # Use of this source code is governed by a BSD-style license that can be | 4 # Use of this source code is governed by a BSD-style license that can be |
5 # found in the LICENSE file. | 5 # found in the LICENSE file. |
6 | 6 |
7 # This script is wrapper for Chromium that adds some support for how GYP | 7 # This script is wrapper for Chromium that adds some support for how GYP |
8 # is invoked by Chromium beyond what can be done in the gclient hooks. | 8 # is invoked by Chromium beyond what can be done in the gclient hooks. |
9 | 9 |
10 import glob | 10 import glob |
(...skipping 328 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
339 | 339 |
340 | 340 |
341 def GetDesiredVsToolchainHashes(): | 341 def GetDesiredVsToolchainHashes(): |
342 """Load a list of SHA1s corresponding to the toolchains that we want installed | 342 """Load a list of SHA1s corresponding to the toolchains that we want installed |
343 to build with.""" | 343 to build with.""" |
344 sha1path = os.path.join(script_dir, 'toolchain_vs2013.hash') | 344 sha1path = os.path.join(script_dir, 'toolchain_vs2013.hash') |
345 with open(sha1path, 'rb') as f: | 345 with open(sha1path, 'rb') as f: |
346 return f.read().strip().splitlines() | 346 return f.read().strip().splitlines() |
347 | 347 |
348 | 348 |
| 349 def DownloadVsToolChain(): |
| 350 """Download the Visual Studio toolchain on Windows. |
| 351 |
| 352 If on Windows, request that depot_tools install/update the automatic |
| 353 toolchain, and then use it (unless opted-out) and return a tuple containing |
| 354 the x64 and x86 paths. Otherwise return None. |
| 355 """ |
| 356 vs2013_runtime_dll_dirs = None |
| 357 depot_tools_win_toolchain = \ |
| 358 bool(int(os.environ.get('DEPOT_TOOLS_WIN_TOOLCHAIN', '1'))) |
| 359 if sys.platform in ('win32', 'cygwin') and depot_tools_win_toolchain: |
| 360 import find_depot_tools |
| 361 depot_tools_path = find_depot_tools.add_depot_tools_to_path() |
| 362 temp_handle, data_file = tempfile.mkstemp(suffix='.json') |
| 363 os.close(temp_handle) |
| 364 get_toolchain_args = [ |
| 365 sys.executable, |
| 366 os.path.join(depot_tools_path, |
| 367 'win_toolchain', |
| 368 'get_toolchain_if_necessary.py'), |
| 369 '--output-json', data_file, |
| 370 ] + GetDesiredVsToolchainHashes() |
| 371 subprocess.check_call(get_toolchain_args) |
| 372 |
| 373 with open(data_file, 'r') as tempf: |
| 374 toolchain_data = json.load(tempf) |
| 375 os.unlink(data_file) |
| 376 |
| 377 toolchain = toolchain_data['path'] |
| 378 version = toolchain_data['version'] |
| 379 version_is_pro = version[-1] != 'e' |
| 380 win8sdk = toolchain_data['win8sdk'] |
| 381 wdk = toolchain_data['wdk'] |
| 382 # TODO(scottmg): The order unfortunately matters in these. They should be |
| 383 # split into separate keys for x86 and x64. (See CopyVsRuntimeDlls call |
| 384 # below). http://crbug.com/345992 |
| 385 vs2013_runtime_dll_dirs = toolchain_data['runtime_dirs'] |
| 386 |
| 387 os.environ['GYP_MSVS_OVERRIDE_PATH'] = toolchain |
| 388 os.environ['GYP_MSVS_VERSION'] = version |
| 389 # We need to make sure windows_sdk_path is set to the automated |
| 390 # toolchain values in GYP_DEFINES, but don't want to override any |
| 391 # otheroptions.express |
| 392 # values there. |
| 393 gyp_defines_dict = gyp.NameValueListToDict(gyp.ShlexEnv('GYP_DEFINES')) |
| 394 gyp_defines_dict['windows_sdk_path'] = win8sdk |
| 395 os.environ['GYP_DEFINES'] = ' '.join('%s=%s' % (k, pipes.quote(str(v))) |
| 396 for k, v in gyp_defines_dict.iteritems()) |
| 397 os.environ['WINDOWSSDKDIR'] = win8sdk |
| 398 os.environ['WDK_DIR'] = wdk |
| 399 # Include the VS runtime in the PATH in case it's not machine-installed. |
| 400 runtime_path = ';'.join(vs2013_runtime_dll_dirs) |
| 401 os.environ['PATH'] = runtime_path + ';' + os.environ['PATH'] |
| 402 print('Using automatic toolchain in %s (%s edition).' % ( |
| 403 toolchain, 'Pro' if version_is_pro else 'Express')) |
| 404 return vs2013_runtime_dll_dirs |
| 405 |
| 406 |
349 def CopyVsRuntimeDlls(output_dir, runtime_dirs): | 407 def CopyVsRuntimeDlls(output_dir, runtime_dirs): |
350 """Copies the VS runtime DLLs from the given |runtime_dirs| to the output | 408 """Copies the VS runtime DLLs from the given |runtime_dirs| to the output |
351 directory so that even if not system-installed, built binaries are likely to | 409 directory so that even if not system-installed, built binaries are likely to |
352 be able to run. | 410 be able to run. |
353 | 411 |
354 This needs to be run after gyp has been run so that the expected target | 412 This needs to be run after gyp has been run so that the expected target |
355 output directories are already created. | 413 output directories are already created. |
356 """ | 414 """ |
357 assert sys.platform.startswith(('win32', 'cygwin')) | 415 assert sys.platform.startswith(('win32', 'cygwin')) |
358 | 416 |
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
461 # . set the env var only if it hasn't been set yet | 519 # . set the env var only if it hasn't been set yet |
462 # . chromium.gyp_env has been applied to os.environ at this point already | 520 # . chromium.gyp_env has been applied to os.environ at this point already |
463 if sys.platform.startswith('linux') and not os.environ.get('GYP_GENERATORS'): | 521 if sys.platform.startswith('linux') and not os.environ.get('GYP_GENERATORS'): |
464 os.environ['GYP_GENERATORS'] = 'ninja' | 522 os.environ['GYP_GENERATORS'] = 'ninja' |
465 if sys.platform.startswith('win') and not os.environ.get('GYP_GENERATORS'): | 523 if sys.platform.startswith('win') and not os.environ.get('GYP_GENERATORS'): |
466 os.environ['GYP_GENERATORS'] = 'ninja' | 524 os.environ['GYP_GENERATORS'] = 'ninja' |
467 elif sys.platform == 'darwin' and not os.environ.get('GYP_GENERATORS') and \ | 525 elif sys.platform == 'darwin' and not os.environ.get('GYP_GENERATORS') and \ |
468 not 'OS=ios' in os.environ.get('GYP_DEFINES', []): | 526 not 'OS=ios' in os.environ.get('GYP_DEFINES', []): |
469 os.environ['GYP_GENERATORS'] = 'ninja' | 527 os.environ['GYP_GENERATORS'] = 'ninja' |
470 | 528 |
471 # If on Windows, request that depot_tools install/update the automatic | 529 vs2013_runtime_dll_dirs = DownloadVsToolChain() |
472 # toolchain, and then use it (unless opted-out). | |
473 vs2013_runtime_dll_dirs = None | |
474 depot_tools_win_toolchain = \ | |
475 bool(int(os.environ.get('DEPOT_TOOLS_WIN_TOOLCHAIN', '1'))) | |
476 if sys.platform in ('win32', 'cygwin') and depot_tools_win_toolchain: | |
477 import find_depot_tools | |
478 depot_tools_path = find_depot_tools.add_depot_tools_to_path() | |
479 temp_handle, data_file = tempfile.mkstemp(suffix='.json') | |
480 os.close(temp_handle) | |
481 get_toolchain_args = [ | |
482 sys.executable, | |
483 os.path.join(depot_tools_path, | |
484 'win_toolchain', | |
485 'get_toolchain_if_necessary.py'), | |
486 '--output-json', data_file, | |
487 ] + GetDesiredVsToolchainHashes() | |
488 subprocess.check_call(get_toolchain_args) | |
489 | |
490 with open(data_file, 'r') as tempf: | |
491 toolchain_data = json.load(tempf) | |
492 os.unlink(data_file) | |
493 | |
494 toolchain = toolchain_data['path'] | |
495 version = toolchain_data['version'] | |
496 version_is_pro = version[-1] != 'e' | |
497 win8sdk = toolchain_data['win8sdk'] | |
498 wdk = toolchain_data['wdk'] | |
499 # TODO(scottmg): The order unfortunately matters in these. They should be | |
500 # split into separate keys for x86 and x64. (See CopyVsRuntimeDlls call | |
501 # below). http://crbug.com/345992 | |
502 vs2013_runtime_dll_dirs = toolchain_data['runtime_dirs'] | |
503 | |
504 os.environ['GYP_MSVS_OVERRIDE_PATH'] = toolchain | |
505 os.environ['GYP_MSVS_VERSION'] = version | |
506 # We need to make sure windows_sdk_path is set to the automated | |
507 # toolchain values in GYP_DEFINES, but don't want to override any | |
508 # otheroptions.express | |
509 # values there. | |
510 gyp_defines_dict = gyp.NameValueListToDict(gyp.ShlexEnv('GYP_DEFINES')) | |
511 gyp_defines_dict['windows_sdk_path'] = win8sdk | |
512 os.environ['GYP_DEFINES'] = ' '.join('%s=%s' % (k, pipes.quote(str(v))) | |
513 for k, v in gyp_defines_dict.iteritems()) | |
514 os.environ['WINDOWSSDKDIR'] = win8sdk | |
515 os.environ['WDK_DIR'] = wdk | |
516 # Include the VS runtime in the PATH in case it's not machine-installed. | |
517 runtime_path = ';'.join(vs2013_runtime_dll_dirs) | |
518 os.environ['PATH'] = runtime_path + ';' + os.environ['PATH'] | |
519 print('Using automatic toolchain in %s (%s edition).' % ( | |
520 toolchain, 'Pro' if version_is_pro else 'Express')) | |
521 | 530 |
522 # If CHROMIUM_GYP_SYNTAX_CHECK is set to 1, it will invoke gyp with --check | 531 # If CHROMIUM_GYP_SYNTAX_CHECK is set to 1, it will invoke gyp with --check |
523 # to enfore syntax checking. | 532 # to enfore syntax checking. |
524 syntax_check = os.environ.get('CHROMIUM_GYP_SYNTAX_CHECK') | 533 syntax_check = os.environ.get('CHROMIUM_GYP_SYNTAX_CHECK') |
525 if syntax_check and int(syntax_check): | 534 if syntax_check and int(syntax_check): |
526 args.append('--check') | 535 args.append('--check') |
527 | 536 |
528 supplemental_includes = GetSupplementalFiles() | 537 supplemental_includes = GetSupplementalFiles() |
529 gn_vars_dict = GetGypVarsForGN(supplemental_includes) | 538 gn_vars_dict = GetGypVarsForGN(supplemental_includes) |
530 | 539 |
(...skipping 24 matching lines...) Expand all Loading... |
555 print 'Running build/landmines.py...' | 564 print 'Running build/landmines.py...' |
556 subprocess.check_call( | 565 subprocess.check_call( |
557 [sys.executable, os.path.join(script_dir, 'landmines.py')]) | 566 [sys.executable, os.path.join(script_dir, 'landmines.py')]) |
558 | 567 |
559 if vs2013_runtime_dll_dirs: | 568 if vs2013_runtime_dll_dirs: |
560 x64_runtime, x86_runtime = vs2013_runtime_dll_dirs | 569 x64_runtime, x86_runtime = vs2013_runtime_dll_dirs |
561 CopyVsRuntimeDlls(os.path.join(chrome_src, GetOutputDirectory()), | 570 CopyVsRuntimeDlls(os.path.join(chrome_src, GetOutputDirectory()), |
562 (x86_runtime, x64_runtime)) | 571 (x86_runtime, x64_runtime)) |
563 | 572 |
564 sys.exit(gyp_rc) | 573 sys.exit(gyp_rc) |
OLD | NEW |