| #!/usr/bin/env python3 |
| # Copyright 2018 The Chromium Authors. All rights reserved. |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| import os |
| import shutil |
| import subprocess |
| import sys |
| import timeit |
| |
| |
| IS_WIN = sys.platform.startswith('win') |
| |
| |
| def RemoveDir(d): |
| if os.path.isdir(d): |
| shutil.rmtree(d) |
| |
| |
| def Trial(gn_path_to_use, save_out_dir=None): |
| bin_path = os.path.join('out', 'gntrial') |
| if not os.path.isdir(bin_path): |
| os.makedirs(bin_path) |
| gn_to_run = os.path.join(bin_path, 'gn' + ('.exe' if IS_WIN else '')) |
| shutil.copy2(gn_path_to_use, gn_to_run) |
| comp_dir = os.path.join('out', 'COMP') |
| subprocess.check_call([gn_to_run, 'gen', comp_dir, '-q', '--check']) |
| if save_out_dir: |
| RemoveDir(save_out_dir) |
| shutil.move(comp_dir, save_out_dir) |
| |
| |
| def main(): |
| if len(sys.argv) < 3 or len(sys.argv) > 4: |
| print 'Usage: full_test.py /chrome/tree/at/762a25542878 rel_gn_path [clean]' |
| return 1 |
| |
| if len(sys.argv) == 4: |
| RemoveDir('out') |
| |
| subprocess.check_call([sys.executable, os.path.join('build', 'gen.py')]) |
| subprocess.check_call(['ninja', '-C', 'out']) |
| subprocess.check_call([os.path.join('out', 'gn_unittests')]) |
| orig_dir = os.getcwd() |
| |
| in_chrome_tree_gn = sys.argv[2] |
| our_gn = os.path.join(orig_dir, 'out', 'gn' + ('.exe' if IS_WIN else '')) |
| |
| os.chdir(sys.argv[1]) |
| |
| # Check in-tree vs. ours. Uses: |
| # - Chromium tree at 762a25542878 in argv[1] (this can be off by a bit, but |
| # is roughly when GN was moved out of the Chrome tree, so matches in case GN |
| # semantics/ordering change after that.) |
| # - relative path to argv[1] built gn binary in argv[2] |
| |
| # First, do a comparison to make sure the output between the two gn binaries |
| # actually matches. |
| print 'Confirming output matches...' |
| dir_a = os.path.join('out', 'a') |
| dir_b = os.path.join('out', 'b') |
| Trial(in_chrome_tree_gn, dir_a) |
| Trial(our_gn, dir_b) |
| subprocess.check_call(['diff', '-r', dir_a, dir_b]) |
| |
| # Then, some time trials. |
| TRIALS = 5 |
| print 'Comparing performance... (takes a while)' |
| time_a = timeit.timeit('Trial("%s")' % in_chrome_tree_gn, number=TRIALS, |
| setup='from __main__ import Trial') |
| time_b = timeit.timeit('Trial("%s")' % our_gn, number=TRIALS, |
| setup='from __main__ import Trial') |
| print 'In-tree gn avg: %.3fs' % (time_a / TRIALS) |
| print 'Our gn avg: %.3fs' % (time_b / TRIALS) |
| |
| return 0 |
| |
| |
| if __name__ == '__main__': |
| sys.exit(main()) |