OLD | NEW |
1 #!/usr/bin/env python | 1 #!/usr/bin/env python |
2 # Copyright (c) 2013 The Chromium Authors. All rights reserved. | 2 # Copyright (c) 2013 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 """Performance Test Bisect Tool | 6 """Performance Test Bisect Tool |
7 | 7 |
8 This script bisects a series of changelists using binary search. It starts at | 8 This script bisects a series of changelists using binary search. It starts at |
9 a bad revision where a performance metric has regressed, and asks for a last | 9 a bad revision where a performance metric has regressed, and asks for a last |
10 known-good revision. It will then binary search across this revision range by | 10 known-good revision. It will then binary search across this revision range by |
(...skipping 636 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
647 if IsWindows(): | 647 if IsWindows(): |
648 os.environ['GYP_DEFINES'] = 'component=shared_library '\ | 648 os.environ['GYP_DEFINES'] = 'component=shared_library '\ |
649 'incremental_chrome_dll=1 disable_nacl=1 fastbuild=1 '\ | 649 'incremental_chrome_dll=1 disable_nacl=1 fastbuild=1 '\ |
650 'chromium_win_pch=0' | 650 'chromium_win_pch=0' |
651 elif build_system == 'make': | 651 elif build_system == 'make': |
652 os.environ['GYP_GENERATORS'] = 'make' | 652 os.environ['GYP_GENERATORS'] = 'make' |
653 else: | 653 else: |
654 raise RuntimeError('%s build not supported.' % build_system) | 654 raise RuntimeError('%s build not supported.' % build_system) |
655 | 655 |
656 | 656 |
657 def BuildWithMake(threads, targets): | 657 def BuildWithMake(threads, targets, build_type): |
658 cmd = ['make', 'BUILDTYPE=Release'] | 658 cmd = ['make', 'BUILDTYPE=%s' % build_type] |
659 | 659 |
660 if threads: | 660 if threads: |
661 cmd.append('-j%d' % threads) | 661 cmd.append('-j%d' % threads) |
662 | 662 |
663 cmd += targets | 663 cmd += targets |
664 | 664 |
665 return_code = RunProcess(cmd) | 665 return_code = RunProcess(cmd) |
666 | 666 |
667 return not return_code | 667 return not return_code |
668 | 668 |
669 | 669 |
670 def BuildWithNinja(threads, targets): | 670 def BuildWithNinja(threads, targets, build_type): |
671 cmd = ['ninja', '-C', os.path.join('out', 'Release')] | 671 cmd = ['ninja', '-C', os.path.join('out', build_type)] |
672 | 672 |
673 if threads: | 673 if threads: |
674 cmd.append('-j%d' % threads) | 674 cmd.append('-j%d' % threads) |
675 | 675 |
676 cmd += targets | 676 cmd += targets |
677 | 677 |
678 return_code = RunProcess(cmd) | 678 return_code = RunProcess(cmd) |
679 | 679 |
680 return not return_code | 680 return not return_code |
681 | 681 |
682 | 682 |
683 def BuildWithVisualStudio(targets): | 683 def BuildWithVisualStudio(targets, build_type): |
684 path_to_devenv = os.path.abspath( | 684 path_to_devenv = os.path.abspath( |
685 os.path.join(os.environ['VS100COMNTOOLS'], '..', 'IDE', 'devenv.com')) | 685 os.path.join(os.environ['VS100COMNTOOLS'], '..', 'IDE', 'devenv.com')) |
686 path_to_sln = os.path.join(os.getcwd(), 'chrome', 'chrome.sln') | 686 path_to_sln = os.path.join(os.getcwd(), 'chrome', 'chrome.sln') |
687 cmd = [path_to_devenv, '/build', 'Release', path_to_sln] | 687 cmd = [path_to_devenv, '/build', build_type, path_to_sln] |
688 | 688 |
689 for t in targets: | 689 for t in targets: |
690 cmd.extend(['/Project', t]) | 690 cmd.extend(['/Project', t]) |
691 | 691 |
692 return_code = RunProcess(cmd) | 692 return_code = RunProcess(cmd) |
693 | 693 |
694 return not return_code | 694 return not return_code |
695 | 695 |
696 | 696 |
697 def WriteStringToFile(text, file_name): | 697 def WriteStringToFile(text, file_name): |
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
790 True if build was successful. | 790 True if build was successful. |
791 """ | 791 """ |
792 targets = ['chromium_builder_perf'] | 792 targets = ['chromium_builder_perf'] |
793 | 793 |
794 threads = None | 794 threads = None |
795 if opts.use_goma: | 795 if opts.use_goma: |
796 threads = 64 | 796 threads = 64 |
797 | 797 |
798 build_success = False | 798 build_success = False |
799 if opts.build_preference == 'make': | 799 if opts.build_preference == 'make': |
800 build_success = BuildWithMake(threads, targets) | 800 build_success = BuildWithMake(threads, targets, opts.target_build_type) |
801 elif opts.build_preference == 'ninja': | 801 elif opts.build_preference == 'ninja': |
802 build_success = BuildWithNinja(threads, targets) | 802 build_success = BuildWithNinja(threads, targets, opts.target_build_type) |
803 elif opts.build_preference == 'msvs': | 803 elif opts.build_preference == 'msvs': |
804 assert IsWindows(), 'msvs is only supported on Windows.' | 804 assert IsWindows(), 'msvs is only supported on Windows.' |
805 build_success = BuildWithVisualStudio(targets) | 805 build_success = BuildWithVisualStudio(targets, opts.target_build_type) |
806 else: | 806 else: |
807 assert False, 'No build system defined.' | 807 assert False, 'No build system defined.' |
808 return build_success | 808 return build_success |
809 | 809 |
810 def GetBuildOutputDirectory(self, opts, src_dir=None): | 810 def GetBuildOutputDirectory(self, opts, src_dir=None): |
811 """Returns the path to the build directory, relative to the checkout root. | 811 """Returns the path to the build directory, relative to the checkout root. |
812 | 812 |
813 Assumes that the current working directory is the checkout root. | 813 Assumes that the current working directory is the checkout root. |
814 """ | 814 """ |
815 src_dir = src_dir or 'src' | 815 src_dir = src_dir or 'src' |
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
905 | 905 |
906 if depot != 'cros': | 906 if depot != 'cros': |
907 path_to_chrome = os.path.join(os.getcwd(), '..') | 907 path_to_chrome = os.path.join(os.getcwd(), '..') |
908 cmd += ['--chrome_root=%s' % path_to_chrome] | 908 cmd += ['--chrome_root=%s' % path_to_chrome] |
909 | 909 |
910 cmd += ['--'] | 910 cmd += ['--'] |
911 | 911 |
912 if depot != 'cros': | 912 if depot != 'cros': |
913 cmd += ['CHROME_ORIGIN=LOCAL_SOURCE'] | 913 cmd += ['CHROME_ORIGIN=LOCAL_SOURCE'] |
914 | 914 |
915 cmd += ['BUILDTYPE=Release', './build_packages', | 915 cmd += ['BUILDTYPE=%s' % opts.target_build_type, './build_packages', |
916 '--board=%s' % opts.cros_board] | 916 '--board=%s' % opts.cros_board] |
917 return_code = RunProcess(cmd) | 917 return_code = RunProcess(cmd) |
918 | 918 |
919 return not return_code | 919 return not return_code |
920 | 920 |
921 def BuildImage(self, opts, depot): | 921 def BuildImage(self, opts, depot): |
922 """Builds test image for cros. | 922 """Builds test image for cros. |
923 | 923 |
924 Args: | 924 Args: |
925 opts: Program options containing cros_board. | 925 opts: Program options containing cros_board. |
926 depot: The depot being bisected. | 926 depot: The depot being bisected. |
927 | 927 |
928 Returns: | 928 Returns: |
929 True if successful. | 929 True if successful. |
930 """ | 930 """ |
931 cmd = [CROS_SDK_PATH] | 931 cmd = [CROS_SDK_PATH] |
932 | 932 |
933 if depot != 'cros': | 933 if depot != 'cros': |
934 path_to_chrome = os.path.join(os.getcwd(), '..') | 934 path_to_chrome = os.path.join(os.getcwd(), '..') |
935 cmd += ['--chrome_root=%s' % path_to_chrome] | 935 cmd += ['--chrome_root=%s' % path_to_chrome] |
936 | 936 |
937 cmd += ['--'] | 937 cmd += ['--'] |
938 | 938 |
939 if depot != 'cros': | 939 if depot != 'cros': |
940 cmd += ['CHROME_ORIGIN=LOCAL_SOURCE'] | 940 cmd += ['CHROME_ORIGIN=LOCAL_SOURCE'] |
941 | 941 |
942 cmd += ['BUILDTYPE=Release', '--', './build_image', | 942 cmd += ['BUILDTYPE=%s' % opts.target_build_type, '--', './build_image', |
943 '--board=%s' % opts.cros_board, 'test'] | 943 '--board=%s' % opts.cros_board, 'test'] |
944 | 944 |
945 return_code = RunProcess(cmd) | 945 return_code = RunProcess(cmd) |
946 | 946 |
947 return not return_code | 947 return not return_code |
948 | 948 |
949 def Build(self, depot, opts): | 949 def Build(self, depot, opts): |
950 """Builds targets using options passed into the script. | 950 """Builds targets using options passed into the script. |
951 | 951 |
952 Args: | 952 Args: |
(...skipping 2593 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3546 except OSError, e: | 3546 except OSError, e: |
3547 if e.errno != errno.ENOENT: | 3547 if e.errno != errno.ENOENT: |
3548 return False | 3548 return False |
3549 | 3549 |
3550 if not skip_makedir: | 3550 if not skip_makedir: |
3551 return MaybeMakeDirectory(path_to_dir) | 3551 return MaybeMakeDirectory(path_to_dir) |
3552 | 3552 |
3553 return True | 3553 return True |
3554 | 3554 |
3555 | 3555 |
3556 def RemoveBuildFiles(): | 3556 def RemoveBuildFiles(build_type): |
3557 """Removes build files from previous runs.""" | 3557 """Removes build files from previous runs.""" |
3558 if RmTreeAndMkDir(os.path.join('out', 'Release')): | 3558 if RmTreeAndMkDir(os.path.join('out', build_type)): |
3559 if RmTreeAndMkDir(os.path.join('build', 'Release')): | 3559 if RmTreeAndMkDir(os.path.join('build', build_type)): |
3560 return True | 3560 return True |
3561 return False | 3561 return False |
3562 | 3562 |
3563 | 3563 |
3564 class BisectOptions(object): | 3564 class BisectOptions(object): |
3565 """Options to be used when running bisection.""" | 3565 """Options to be used when running bisection.""" |
3566 def __init__(self): | 3566 def __init__(self): |
3567 super(BisectOptions, self).__init__() | 3567 super(BisectOptions, self).__init__() |
3568 | 3568 |
3569 self.target_platform = 'chromium' | 3569 self.target_platform = 'chromium' |
(...skipping 10 matching lines...) Expand all Loading... |
3580 self.command = None | 3580 self.command = None |
3581 self.output_buildbot_annotations = None | 3581 self.output_buildbot_annotations = None |
3582 self.no_custom_deps = False | 3582 self.no_custom_deps = False |
3583 self.working_directory = None | 3583 self.working_directory = None |
3584 self.extra_src = None | 3584 self.extra_src = None |
3585 self.debug_ignore_build = None | 3585 self.debug_ignore_build = None |
3586 self.debug_ignore_sync = None | 3586 self.debug_ignore_sync = None |
3587 self.debug_ignore_perf_test = None | 3587 self.debug_ignore_perf_test = None |
3588 self.gs_bucket = None | 3588 self.gs_bucket = None |
3589 self.target_arch = 'ia32' | 3589 self.target_arch = 'ia32' |
| 3590 self.target_build_type = 'Release' |
3590 self.builder_host = None | 3591 self.builder_host = None |
3591 self.builder_port = None | 3592 self.builder_port = None |
3592 self.bisect_mode = BISECT_MODE_MEAN | 3593 self.bisect_mode = BISECT_MODE_MEAN |
3593 | 3594 |
3594 def _CreateCommandLineParser(self): | 3595 def _CreateCommandLineParser(self): |
3595 """Creates a parser with bisect options. | 3596 """Creates a parser with bisect options. |
3596 | 3597 |
3597 Returns: | 3598 Returns: |
3598 An instance of optparse.OptionParser. | 3599 An instance of optparse.OptionParser. |
3599 """ | 3600 """ |
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3703 type='str', | 3704 type='str', |
3704 help=('Name of Google Storage bucket to upload or ' | 3705 help=('Name of Google Storage bucket to upload or ' |
3705 'download build. e.g., chrome-perf')) | 3706 'download build. e.g., chrome-perf')) |
3706 group.add_option('--target_arch', | 3707 group.add_option('--target_arch', |
3707 type='choice', | 3708 type='choice', |
3708 choices=['ia32', 'x64', 'arm'], | 3709 choices=['ia32', 'x64', 'arm'], |
3709 default='ia32', | 3710 default='ia32', |
3710 dest='target_arch', | 3711 dest='target_arch', |
3711 help=('The target build architecture. Choices are "ia32" ' | 3712 help=('The target build architecture. Choices are "ia32" ' |
3712 '(default), "x64" or "arm".')) | 3713 '(default), "x64" or "arm".')) |
| 3714 group.add_option('--target_build_type', |
| 3715 type='choice', |
| 3716 choices=['Release', 'Debug'], |
| 3717 default='Release', |
| 3718 help='The target build type. Choices are "Release" ' |
| 3719 '(default), or "Debug".') |
3713 group.add_option('--builder_host', | 3720 group.add_option('--builder_host', |
3714 dest='builder_host', | 3721 dest='builder_host', |
3715 type='str', | 3722 type='str', |
3716 help=('Host address of server to produce build by posting' | 3723 help=('Host address of server to produce build by posting' |
3717 ' try job request.')) | 3724 ' try job request.')) |
3718 group.add_option('--builder_port', | 3725 group.add_option('--builder_port', |
3719 dest='builder_port', | 3726 dest='builder_port', |
3720 type='int', | 3727 type='int', |
3721 help=('HTTP port of the server to produce build by posting' | 3728 help=('HTTP port of the server to produce build by posting' |
3722 ' try job request.')) | 3729 ' try job request.')) |
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3841 _AddAdditionalDepotInfo(extra_src.GetAdditionalDepotInfo()) | 3848 _AddAdditionalDepotInfo(extra_src.GetAdditionalDepotInfo()) |
3842 | 3849 |
3843 if opts.working_directory: | 3850 if opts.working_directory: |
3844 custom_deps = bisect_utils.DEFAULT_GCLIENT_CUSTOM_DEPS | 3851 custom_deps = bisect_utils.DEFAULT_GCLIENT_CUSTOM_DEPS |
3845 if opts.no_custom_deps: | 3852 if opts.no_custom_deps: |
3846 custom_deps = None | 3853 custom_deps = None |
3847 bisect_utils.CreateBisectDirectoryAndSetupDepot(opts, custom_deps) | 3854 bisect_utils.CreateBisectDirectoryAndSetupDepot(opts, custom_deps) |
3848 | 3855 |
3849 os.chdir(os.path.join(os.getcwd(), 'src')) | 3856 os.chdir(os.path.join(os.getcwd(), 'src')) |
3850 | 3857 |
3851 if not RemoveBuildFiles(): | 3858 if not RemoveBuildFiles(opts.target_build_type): |
3852 raise RuntimeError('Something went wrong removing the build files.') | 3859 raise RuntimeError('Something went wrong removing the build files.') |
3853 | 3860 |
3854 if not IsPlatformSupported(opts): | 3861 if not IsPlatformSupported(opts): |
3855 raise RuntimeError("Sorry, this platform isn't supported yet.") | 3862 raise RuntimeError("Sorry, this platform isn't supported yet.") |
3856 | 3863 |
3857 # Check what source control method they're using. Only support git workflow | 3864 # Check what source control method they're using. Only support git workflow |
3858 # at the moment. | 3865 # at the moment. |
3859 source_control = DetermineAndCreateSourceControl(opts) | 3866 source_control = DetermineAndCreateSourceControl(opts) |
3860 | 3867 |
3861 if not source_control: | 3868 if not source_control: |
(...skipping 22 matching lines...) Expand all Loading... |
3884 # The perf dashboard scrapes the "results" step in order to comment on | 3891 # The perf dashboard scrapes the "results" step in order to comment on |
3885 # bugs. If you change this, please update the perf dashboard as well. | 3892 # bugs. If you change this, please update the perf dashboard as well. |
3886 bisect_utils.OutputAnnotationStepStart('Results') | 3893 bisect_utils.OutputAnnotationStepStart('Results') |
3887 print 'Error: %s' % e.message | 3894 print 'Error: %s' % e.message |
3888 if opts.output_buildbot_annotations: | 3895 if opts.output_buildbot_annotations: |
3889 bisect_utils.OutputAnnotationStepClosed() | 3896 bisect_utils.OutputAnnotationStepClosed() |
3890 return 1 | 3897 return 1 |
3891 | 3898 |
3892 if __name__ == '__main__': | 3899 if __name__ == '__main__': |
3893 sys.exit(main()) | 3900 sys.exit(main()) |
OLD | NEW |