Chromium Code Reviews| 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 |
| 11 import gyp_helper | 11 import gyp_helper |
| 12 import json | |
| 12 import os | 13 import os |
| 13 import pipes | 14 import pipes |
| 14 import shlex | 15 import shlex |
| 15 import shutil | 16 import shutil |
| 16 import subprocess | 17 import subprocess |
| 17 import string | 18 import string |
| 18 import sys | 19 import sys |
| 20 import tempfile | |
| 19 | 21 |
| 20 script_dir = os.path.dirname(os.path.realpath(__file__)) | 22 script_dir = os.path.dirname(os.path.realpath(__file__)) |
| 21 chrome_src = os.path.abspath(os.path.join(script_dir, os.pardir)) | 23 chrome_src = os.path.abspath(os.path.join(script_dir, os.pardir)) |
| 22 | 24 |
| 23 sys.path.insert(0, os.path.join(chrome_src, 'tools', 'gyp', 'pylib')) | 25 sys.path.insert(0, os.path.join(chrome_src, 'tools', 'gyp', 'pylib')) |
| 24 import gyp | 26 import gyp |
| 25 | 27 |
| 26 # Assume this file is in a one-level-deep subdirectory of the source root. | 28 # Assume this file is in a one-level-deep subdirectory of the source root. |
| 27 SRC_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) | 29 SRC_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) |
| 28 | 30 |
| (...skipping 294 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 323 # Need to pass both the source root (the bots don't run this command from | 325 # Need to pass both the source root (the bots don't run this command from |
| 324 # within the source tree) as well as set the is_gyp value so the BUILD files | 326 # within the source tree) as well as set the is_gyp value so the BUILD files |
| 325 # to know they're being run under GYP. | 327 # to know they're being run under GYP. |
| 326 args = [gnpath, 'gyp', '-q', | 328 args = [gnpath, 'gyp', '-q', |
| 327 '--root=' + chrome_src, | 329 '--root=' + chrome_src, |
| 328 '--args=' + GetArgsStringForGN(vars_dict), | 330 '--args=' + GetArgsStringForGN(vars_dict), |
| 329 '--output=//' + GetOutputDirectory() + '/gn_build/'] | 331 '--output=//' + GetOutputDirectory() + '/gn_build/'] |
| 330 return subprocess.call(args) == 0 | 332 return subprocess.call(args) == 0 |
| 331 | 333 |
| 332 | 334 |
| 335 def GetDesiredVsToolchainHashes(): | |
| 336 """Load a list of SHA1s corresponding to the toolchains that we want installed | |
| 337 to build with.""" | |
| 338 sha1path = os.path.join(script_dir, 'toolchain_vs2013.hash') | |
| 339 with open(sha1path, 'rb') as f: | |
| 340 return f.read().strip().splitlines() | |
| 341 | |
| 342 | |
| 333 def CopyVsRuntimeDlls(output_dir, runtime_dirs): | 343 def CopyVsRuntimeDlls(output_dir, runtime_dirs): |
| 334 """Copies the VS runtime DLLs from the given |runtime_dirs| to the output | 344 """Copies the VS runtime DLLs from the given |runtime_dirs| to the output |
| 335 directory so that even if not system-installed, built binaries are likely to | 345 directory so that even if not system-installed, built binaries are likely to |
| 336 be able to run. | 346 be able to run. |
| 337 | 347 |
| 338 This needs to be run after gyp has been run so that the expected target | 348 This needs to be run after gyp has been run so that the expected target |
| 339 output directories are already created. | 349 output directories are already created. |
| 340 """ | 350 """ |
| 341 assert sys.platform.startswith(('win32', 'cygwin')) | 351 assert sys.platform.startswith(('win32', 'cygwin')) |
| 342 | 352 |
| (...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 431 # . set the env var only if it hasn't been set yet | 441 # . set the env var only if it hasn't been set yet |
| 432 # . chromium.gyp_env has been applied to os.environ at this point already | 442 # . chromium.gyp_env has been applied to os.environ at this point already |
| 433 if sys.platform.startswith('linux') and not os.environ.get('GYP_GENERATORS'): | 443 if sys.platform.startswith('linux') and not os.environ.get('GYP_GENERATORS'): |
| 434 os.environ['GYP_GENERATORS'] = 'ninja' | 444 os.environ['GYP_GENERATORS'] = 'ninja' |
| 435 if sys.platform.startswith('win') and not os.environ.get('GYP_GENERATORS'): | 445 if sys.platform.startswith('win') and not os.environ.get('GYP_GENERATORS'): |
| 436 os.environ['GYP_GENERATORS'] = 'ninja' | 446 os.environ['GYP_GENERATORS'] = 'ninja' |
| 437 elif sys.platform == 'darwin' and not os.environ.get('GYP_GENERATORS') and \ | 447 elif sys.platform == 'darwin' and not os.environ.get('GYP_GENERATORS') and \ |
| 438 not 'OS=ios' in os.environ.get('GYP_DEFINES', []): | 448 not 'OS=ios' in os.environ.get('GYP_DEFINES', []): |
| 439 os.environ['GYP_GENERATORS'] = 'ninja' | 449 os.environ['GYP_GENERATORS'] = 'ninja' |
| 440 | 450 |
| 441 # If on windows, and the automatic toolchain has been installed by | 451 # If on Windows, request that depot_tools install/update the automatic |
| 442 # depot_tools, then use it. | 452 # toolchain, and then use it (unless opted-out). |
| 443 vs2013_runtime_dll_dirs = None | 453 vs2013_runtime_dll_dirs = None |
| 444 # If MSVS_VERSION is explicitly specified to be something other than 2013, | 454 depot_tools_win_toolchain = \ |
| 445 # don't use the automatic toolchain, as it currently only supports VS2013. | 455 bool(int(os.environ.get('DEPOT_TOOLS_WIN_TOOLCHAIN', '1'))) |
| 446 msvs_version = os.environ.get('GYP_MSVS_VERSION', '2013') | 456 if sys.platform in ('win32', 'cygwin') and depot_tools_win_toolchain: |
| 447 if sys.platform in ('win32', 'cygwin') and msvs_version.startswith('2013'): | |
| 448 import find_depot_tools | 457 import find_depot_tools |
| 449 depot_tools_path = find_depot_tools.add_depot_tools_to_path() | 458 depot_tools_path = find_depot_tools.add_depot_tools_to_path() |
| 450 toolchain = os.path.normpath(os.path.join( | 459 with tempfile.NamedTemporaryFile(delete=False, suffix='.json') as tempf: |
|
iannucci
2014/02/22 01:49:41
doesn't this close the tempfile? I guess it doesn'
| |
| 451 depot_tools_path, 'win_toolchain', 'vs2013_files')) | 460 data_file = tempf.name |
| 452 version_file = os.path.join(toolchain, '.version') | 461 get_toolchain_args = [ |
| 453 if os.path.isdir(toolchain) and os.path.isfile(version_file): | 462 sys.executable, |
| 454 os.environ['GYP_MSVS_OVERRIDE_PATH'] = toolchain | 463 os.path.join(depot_tools_path, |
| 455 with open(version_file, 'r') as f: | 464 'win_toolchain', |
| 456 version_is_pro = f.read().strip() == 'pro' | 465 'get_toolchain_if_necessary.py'), |
| 457 vs2013_runtime_dll_dirs = (os.path.join(toolchain, 'sys32'), | 466 '--output-json', data_file, |
| 458 os.path.join(toolchain, 'sys64')) | 467 ] + GetDesiredVsToolchainHashes() |
| 459 os.environ['GYP_MSVS_VERSION'] = '2013' if version_is_pro else '2013e' | 468 subprocess.check_call(get_toolchain_args) |
| 460 # We need to make sure windows_sdk_path is set to the automated | 469 |
| 461 # toolchain values in GYP_DEFINES, but don't want to override any other | 470 with open(data_file, 'r') as tempf: |
| 462 # values there. | 471 toolchain_data = json.load(tempf) |
| 463 gyp_defines_dict = gyp.NameValueListToDict(gyp.ShlexEnv('GYP_DEFINES')) | 472 os.unlink(data_file) |
| 464 win8sdk = os.path.join(toolchain, 'win8sdk') | 473 |
| 465 wdk = os.path.join(toolchain, 'wdk') | 474 toolchain = toolchain_data['path'] |
| 466 gyp_defines_dict['windows_sdk_path'] = win8sdk | 475 version = toolchain_data['version'] |
| 467 os.environ['WINDOWSSDKDIR'] = win8sdk | 476 version_is_pro = version[-1] != 'e' |
| 468 os.environ['WDK_DIR'] = wdk | 477 win8sdk = toolchain_data['win8sdk'] |
| 469 os.environ['GYP_DEFINES'] = ' '.join('%s=%s' % (k, pipes.quote(str(v))) | 478 wdk = toolchain_data['wdk'] |
| 470 for k, v in gyp_defines_dict.iteritems()) | 479 vs2013_runtime_dll_dirs = toolchain_data['runtime_dirs'] |
| 471 # Include the VS runtime in the PATH in case it's not machine-installed. | 480 |
| 472 runtime_path = ';'.join(os.path.normpath(os.path.join(toolchain, s)) | 481 os.environ['GYP_MSVS_OVERRIDE_PATH'] = toolchain |
| 473 for s in ('sys64', 'sys32')) | 482 os.environ['GYP_MSVS_VERSION'] = version |
| 474 os.environ['PATH'] = runtime_path + ';' + os.environ['PATH'] | 483 # We need to make sure windows_sdk_path is set to the automated |
| 475 print('Using automatic toolchain in %s (%s edition).' % ( | 484 # toolchain values in GYP_DEFINES, but don't want to override any |
| 476 toolchain, 'Pro' if version_is_pro else 'Express')) | 485 # otheroptions.express |
| 486 # values there. | |
| 487 gyp_defines_dict = gyp.NameValueListToDict(gyp.ShlexEnv('GYP_DEFINES')) | |
| 488 gyp_defines_dict['windows_sdk_path'] = win8sdk | |
| 489 os.environ['GYP_DEFINES'] = ' '.join('%s=%s' % (k, pipes.quote(str(v))) | |
| 490 for k, v in gyp_defines_dict.iteritems()) | |
| 491 os.environ['WINDOWSSDKDIR'] = win8sdk | |
| 492 os.environ['WDK_DIR'] = wdk | |
| 493 # Include the VS runtime in the PATH in case it's not machine-installed. | |
| 494 runtime_path = ';'.join(vs2013_runtime_dll_dirs) | |
| 495 os.environ['PATH'] = runtime_path + ';' + os.environ['PATH'] | |
|
iannucci
2014/02/22 01:49:41
kinda feel like this env var update should just be
| |
| 496 print('Using automatic toolchain in %s (%s edition).' % ( | |
| 497 toolchain, 'Pro' if version_is_pro else 'Express')) | |
| 477 | 498 |
| 478 # If CHROMIUM_GYP_SYNTAX_CHECK is set to 1, it will invoke gyp with --check | 499 # If CHROMIUM_GYP_SYNTAX_CHECK is set to 1, it will invoke gyp with --check |
| 479 # to enfore syntax checking. | 500 # to enfore syntax checking. |
| 480 syntax_check = os.environ.get('CHROMIUM_GYP_SYNTAX_CHECK') | 501 syntax_check = os.environ.get('CHROMIUM_GYP_SYNTAX_CHECK') |
| 481 if syntax_check and int(syntax_check): | 502 if syntax_check and int(syntax_check): |
| 482 args.append('--check') | 503 args.append('--check') |
| 483 | 504 |
| 484 supplemental_includes = GetSupplementalFiles() | 505 supplemental_includes = GetSupplementalFiles() |
| 485 gn_vars_dict = GetGypVarsForGN(supplemental_includes) | 506 gn_vars_dict = GetGypVarsForGN(supplemental_includes) |
| 486 | 507 |
| (...skipping 23 matching lines...) Expand all Loading... | |
| 510 # from above are picked up. | 531 # from above are picked up. |
| 511 print 'Running build/landmines.py...' | 532 print 'Running build/landmines.py...' |
| 512 subprocess.check_call( | 533 subprocess.check_call( |
| 513 [sys.executable, os.path.join(script_dir, 'landmines.py')]) | 534 [sys.executable, os.path.join(script_dir, 'landmines.py')]) |
| 514 | 535 |
| 515 if vs2013_runtime_dll_dirs: | 536 if vs2013_runtime_dll_dirs: |
| 516 CopyVsRuntimeDlls(os.path.join(chrome_src, GetOutputDirectory()), | 537 CopyVsRuntimeDlls(os.path.join(chrome_src, GetOutputDirectory()), |
| 517 vs2013_runtime_dll_dirs) | 538 vs2013_runtime_dll_dirs) |
| 518 | 539 |
| 519 sys.exit(gyp_rc) | 540 sys.exit(gyp_rc) |
| OLD | NEW |