| 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 """Script to create Chrome Installer archive. | 6 """Script to create Chrome Installer archive. |
| 7 | 7 |
| 8 This script is used to create an archive of all the files required for a | 8 This script is used to create an archive of all the files required for a |
| 9 Chrome install in appropriate directory structure. It reads chrome.release | 9 Chrome install in appropriate directory structure. It reads chrome.release |
| 10 file as input, creates chrome.7z archive, compresses setup.exe and | 10 file as input, creates chrome.7z archive, compresses setup.exe and |
| (...skipping 440 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 451 # https://chromium.googlesource.com/chromium/src/+/master/tools/gn/docs/refe
rence.md#GN-build-language-grammar | 451 # https://chromium.googlesource.com/chromium/src/+/master/tools/gn/docs/refe
rence.md#GN-build-language-grammar |
| 452 m = re.match('^\s*is_debug\s*=\s*false(\s*$|\s*#.*$)', l) | 452 m = re.match('^\s*is_debug\s*=\s*false(\s*$|\s*#.*$)', l) |
| 453 if m: | 453 if m: |
| 454 return 'Release' | 454 return 'Release' |
| 455 | 455 |
| 456 # if is_debug is set to anything other than false, or if it | 456 # if is_debug is set to anything other than false, or if it |
| 457 # does not exist at all, we should use the default value (True). | 457 # does not exist at all, we should use the default value (True). |
| 458 return 'Debug' | 458 return 'Debug' |
| 459 | 459 |
| 460 | 460 |
| 461 # Copy the relevant CRT DLLs to |build_dir|. We copy DLLs from all versions | |
| 462 # of VS installed to make sure we have the correct CRT version, unused DLLs | |
| 463 # should not conflict with the others anyways. | |
| 464 def CopyVisualStudioRuntimeDLLs(target_arch, build_dir): | |
| 465 is_debug = os.path.basename(build_dir).startswith('Debug') | |
| 466 if not is_debug and not os.path.basename(build_dir).startswith('Release'): | |
| 467 gn_type = _read_configuration_from_gn(build_dir) | |
| 468 if gn_type == 'Debug': | |
| 469 is_debug = True | |
| 470 elif gn_type == 'Release': | |
| 471 is_debug = False | |
| 472 else: | |
| 473 print ("Warning: could not determine build configuration from " | |
| 474 "output directory or args.gn, assuming Release build. If " | |
| 475 "setup.exe fails to launch, please check that your build " | |
| 476 "configuration is Release.") | |
| 477 | |
| 478 crt_dlls = [] | |
| 479 sys_dll_dir = None | |
| 480 if is_debug: | |
| 481 crt_dlls = glob.glob( | |
| 482 "C:/Program Files (x86)/Microsoft Visual Studio */VC/redist/" | |
| 483 "Debug_NonRedist/" + target_arch + "/Microsoft.*.DebugCRT/*.dll") | |
| 484 else: | |
| 485 crt_dlls = glob.glob( | |
| 486 "C:/Program Files (x86)/Microsoft Visual Studio */VC/redist/" + | |
| 487 target_arch + "/Microsoft.*.CRT/*.dll") | |
| 488 | |
| 489 # Also handle the case where someone is building using only winsdk and | |
| 490 # doesn't have Visual Studio installed. | |
| 491 if not crt_dlls: | |
| 492 if target_arch == 'x64': | |
| 493 # check we are are on a 64bit system by existence of WOW64 dir | |
| 494 if os.access("C:/Windows/SysWOW64", os.F_OK): | |
| 495 sys_dll_dir = "C:/Windows/System32" | |
| 496 else: | |
| 497 # only support packaging of 64bit installer on 64bit system | |
| 498 # but this just as bad as not finding DLLs at all so we | |
| 499 # don't abort here to mirror behavior below | |
| 500 print ("Warning: could not find x64 CRT DLLs on x86 system.") | |
| 501 else: | |
| 502 # On a 64-bit system, 32-bit dlls are in SysWOW64 (don't ask). | |
| 503 if os.access("C:/Windows/SysWOW64", os.F_OK): | |
| 504 sys_dll_dir = "C:/Windows/SysWOW64" | |
| 505 else: | |
| 506 sys_dll_dir = "C:/Windows/System32" | |
| 507 | |
| 508 if sys_dll_dir is not None: | |
| 509 if is_debug: | |
| 510 crt_dlls = glob.glob(os.path.join(sys_dll_dir, "msvc*0d.dll")) | |
| 511 else: | |
| 512 crt_dlls = glob.glob(os.path.join(sys_dll_dir, "msvc*0.dll")) | |
| 513 | |
| 514 if not crt_dlls: | |
| 515 print ("Warning: could not find CRT DLLs to copy to build dir - target " | |
| 516 "may not run on a system that doesn't have those DLLs.") | |
| 517 | |
| 518 for dll in crt_dlls: | |
| 519 CopyIfChanged(dll, build_dir) | |
| 520 | |
| 521 | |
| 522 # Copies component build DLLs and generates required config files and manifests | 461 # Copies component build DLLs and generates required config files and manifests |
| 523 # in order for chrome.exe and setup.exe to be able to find those DLLs at | 462 # in order for chrome.exe and setup.exe to be able to find those DLLs at |
| 524 # run-time. | 463 # run-time. |
| 525 # This is meant for developer builds only and should never be used to package | 464 # This is meant for developer builds only and should never be used to package |
| 526 # an official build. | 465 # an official build. |
| 527 def DoComponentBuildTasks(staging_dir, build_dir, target_arch, current_version): | 466 def DoComponentBuildTasks(staging_dir, build_dir, target_arch, current_version): |
| 528 # Get the required directories for the upcoming operations. | 467 # Get the required directories for the upcoming operations. |
| 529 chrome_dir = os.path.join(staging_dir, CHROME_DIR) | 468 chrome_dir = os.path.join(staging_dir, CHROME_DIR) |
| 530 version_dir = os.path.join(chrome_dir, current_version) | 469 version_dir = os.path.join(chrome_dir, current_version) |
| 531 installer_dir = os.path.join(version_dir, 'Installer') | 470 installer_dir = os.path.join(version_dir, 'Installer') |
| 532 # |installer_dir| is technically only created post-install, but we need it | 471 # |installer_dir| is technically only created post-install, but we need it |
| 533 # now to add setup.exe's config and manifest to the archive. | 472 # now to add setup.exe's config and manifest to the archive. |
| 534 if not os.path.exists(installer_dir): | 473 if not os.path.exists(installer_dir): |
| 535 os.mkdir(installer_dir) | 474 os.mkdir(installer_dir) |
| 536 | 475 |
| 537 # Copy the VS CRT DLLs to |build_dir|. This must be done before the general | |
| 538 # copy step below to ensure the CRT DLLs are added to the archive and marked | |
| 539 # as a dependency in the exe manifests generated below. | |
| 540 CopyVisualStudioRuntimeDLLs(target_arch, build_dir) | |
| 541 | |
| 542 # Explicitly list the component DLLs setup.exe depends on (this list may | 476 # Explicitly list the component DLLs setup.exe depends on (this list may |
| 543 # contain wildcards). These will be copied to |installer_dir| in the archive. | 477 # contain wildcards). These will be copied to |installer_dir| in the archive. |
| 544 # The use of source sets in gn builds means that references to some extra | 478 # The use of source sets in gn builds means that references to some extra |
| 545 # DLLs get pulled in to setup.exe (base_i18n.dll, ipc.dll, etc.). Unpacking | 479 # DLLs get pulled in to setup.exe (base_i18n.dll, ipc.dll, etc.). Unpacking |
| 546 # these to |installer_dir| is simpler and more robust than switching setup.exe | 480 # these to |installer_dir| is simpler and more robust than switching setup.exe |
| 547 # to use libraries instead of source sets. | 481 # to use libraries instead of source sets. |
| 548 setup_component_dll_globs = [ 'api-ms-win-*.dll', | 482 setup_component_dll_globs = [ 'api-ms-win-*.dll', |
| 549 'base.dll', | 483 'base.dll', |
| 550 'boringssl.dll', | 484 'boringssl.dll', |
| 551 'crcrypto.dll', | 485 'crcrypto.dll', |
| 552 'icui18n.dll', | 486 'icui18n.dll', |
| 553 'icuuc.dll', | 487 'icuuc.dll', |
| 554 'msvc*.dll', | 488 'msvc*.dll', |
| 489 'ucrtbase*.dll', |
| 555 'vcruntime*.dll', | 490 'vcruntime*.dll', |
| 556 # DLLs needed due to source sets. | 491 # DLLs needed due to source sets. |
| 557 'base_i18n.dll', | 492 'base_i18n.dll', |
| 558 'ipc.dll', | 493 'ipc.dll', |
| 559 'net.dll', | 494 'net.dll', |
| 560 'prefs.dll', | 495 'prefs.dll', |
| 561 'protobuf_lite.dll', | 496 'protobuf_lite.dll', |
| 562 'url_lib.dll' ] | 497 'url_lib.dll' ] |
| 563 for setup_component_dll_glob in setup_component_dll_globs: | 498 for setup_component_dll_glob in setup_component_dll_globs: |
| 564 setup_component_dlls = glob.glob(os.path.join(build_dir, | 499 setup_component_dlls = glob.glob(os.path.join(build_dir, |
| (...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 725 MINI_INSTALLER_INPUT_FILE) | 660 MINI_INSTALLER_INPUT_FILE) |
| 726 | 661 |
| 727 return options | 662 return options |
| 728 | 663 |
| 729 | 664 |
| 730 if '__main__' == __name__: | 665 if '__main__' == __name__: |
| 731 options = _ParseOptions() | 666 options = _ParseOptions() |
| 732 if options.verbose: | 667 if options.verbose: |
| 733 print sys.argv | 668 print sys.argv |
| 734 sys.exit(main(options)) | 669 sys.exit(main(options)) |
| OLD | NEW |