| #!/usr/bin/python | 
 |  | 
 | # Copyright 2016 Google Inc. | 
 | # | 
 | # Use of this source code is governed by a BSD-style license that can be | 
 | # found in the LICENSE file. | 
 |  | 
 |  | 
 | """ | 
 | Script to build the command buffer shared library and copy it to Skia tree | 
 | """ | 
 |  | 
 |  | 
 | import argparse | 
 | import os | 
 | import shlex | 
 | import shutil | 
 | import subprocess | 
 | import sys | 
 |  | 
 |  | 
 | def main(): | 
 |   parser = argparse.ArgumentParser(description=('Builds command_buffer_gles2 ' | 
 |                                                 'library and copies it')) | 
 |   parser.add_argument('-c', '--chrome-dir', required=True, help= | 
 |       'path to Chromium checkout (directory containing .gclient)') | 
 |   parser.add_argument('-o', '--output-dir', required=True, | 
 |       help='path to copy the command buffer shared library to. Typically this ' | 
 |            'is out/Debug or out/Release in a Skia repository') | 
 |   parser.add_argument('--make-output-dir', default=False, action='store_true', | 
 |       help='Makes the output directory if it does not already exist.') | 
 |   parser.add_argument('--chrome-out-dir', default='CommandBufferForSkia', | 
 |       help='Type of name of the gn output directory (e.g. Debug or Release). ' | 
 |            'This is relative to the Chromium src/out directory. Note that this ' | 
 |            'script will reset the gn args in this directory on each run.') | 
 |   parser.add_argument('--extra-gn-args', default='', | 
 |       help=('Extra GN arguments to use for the output directory used to build' | 
 |             'the command buffer')) | 
 |   parser.add_argument('--extra-ninja-args', default='', | 
 |       help=('Extra arguments to pass to ninja when building the command ' | 
 |             'buffer shared library')) | 
 |   parser.add_argument('--chrome-revision', default='origin/lkgr', | 
 |       help='Revision (hash, branch, tag) of Chromium to use.') | 
 |   parser.add_argument('--no-sync', action='store_true', default=False, | 
 |       help='Don\'t run git fetch or gclient sync in the Chromium tree') | 
 |   parser.add_argument('--no-hooks', action='store_true', default=False, | 
 |       help='Don\'t run gclient runhooks in the Chromium tree. Implies ' | 
 |            '--no-sync') | 
 |   args = parser.parse_args() | 
 |  | 
 |   args.chrome_dir = os.path.abspath(args.chrome_dir) | 
 |   args.output_dir = os.path.abspath(args.output_dir) | 
 |  | 
 |   if args.no_hooks: | 
 |      args.no_sync = True | 
 |  | 
 |   if os.path.isfile(args.chrome_dir): | 
 |     sys.exit(args.chrome_dir + ' exists but is a file.') | 
 |  | 
 |   if os.path.isfile(args.output_dir): | 
 |     sys.exit(args.output_dir + ' exists but is a file.') | 
 |  | 
 |   chrome_src_dir = os.path.join(args.chrome_dir, 'src') | 
 |  | 
 |   if not os.path.isdir(chrome_src_dir): | 
 |     sys.exit(chrome_src_dir + ' is not a directory.') | 
 |  | 
 |   if os.path.isfile(args.output_dir): | 
 |     sys.exit(args.output_dir + ' exists but is a file.') | 
 |   elif not os.path.isdir(args.output_dir): | 
 |     if args.make_output_dir: | 
 |       os.makedirs(args.output_dir) | 
 |     else: | 
 |       sys.exit(args.output_dir + ' does not exist (specify --make-output-dir ' | 
 |           'to create).') | 
 |  | 
 |   chrome_target_dir_rel = os.path.join('out', args.chrome_out_dir) | 
 |  | 
 |   # The command buffer shared library will have a different name on Linux, | 
 |   # Mac, and Windows. Also, the name of the gclient executable we call out to | 
 |   # has a .bat file extension on Windows. | 
 |   platform = sys.platform | 
 |   if platform == 'cygwin': | 
 |     platform = 'win32' | 
 |  | 
 |   shared_lib_name = 'libcommand_buffer_gles2.so' | 
 |   gclient = 'gclient' | 
 |   if platform == 'darwin': | 
 |     shared_lib_name = 'libcommand_buffer_gles2.dylib' | 
 |   elif platform == 'win32': | 
 |     shared_lib_name = 'command_buffer_gles2.dll' | 
 |     gclient = 'gclient.bat' | 
 |  | 
 |   if not args.no_sync: | 
 |     try: | 
 |       subprocess.check_call(['git', 'fetch'], cwd=chrome_src_dir) | 
 |     except subprocess.CalledProcessError as error: | 
 |       sys.exit('Error (ret code: %s) calling "%s" in %s' % (error.returncode, | 
 |           error.cmd, chrome_src_dir)) | 
 |  | 
 |     try: | 
 |       subprocess.check_call(['git', 'checkout', args.chrome_revision], | 
 |           cwd=chrome_src_dir) | 
 |     except subprocess.CalledProcessError as error: | 
 |       sys.exit('Error (ret code: %s) calling "%s" in %s' % (error.returncode, | 
 |           error.cmd, chrome_src_dir)) | 
 |  | 
 |     try: | 
 |       os.environ['GYP_GENERATORS'] = 'ninja' | 
 |       subprocess.check_call([gclient, 'sync', '--reset', '--force', | 
 |                              '--nohooks'], | 
 |           cwd=chrome_src_dir) | 
 |     except subprocess.CalledProcessError as error: | 
 |       sys.exit('Error (ret code: %s) calling "%s" in %s' % (error.returncode, | 
 |           error.cmd, chrome_src_dir)) | 
 |  | 
 |   if not args.no_hooks: | 
 |     try: | 
 |       subprocess.check_call([gclient, 'runhooks'], cwd=chrome_src_dir) | 
 |     except subprocess.CalledProcessError as error: | 
 |       sys.exit('Error (ret code: %s) calling "%s" in %s' % ( | 
 |           error.returncode, error.cmd, chrome_src_dir)) | 
 |  | 
 |   gn = 'gn' | 
 |   platform = 'linux64' | 
 |   if sys.platform == 'darwin': | 
 |     platform = 'mac' | 
 |   elif sys.platform == 'win32': | 
 |     platform = 'win' | 
 |     gn = 'gn.exe' | 
 |   gn = os.path.join(chrome_src_dir, 'buildtools', platform, gn) | 
 |   try: | 
 |     gnargs = 'is_component_build=false is_debug=false ' + args.extra_gn_args | 
 |     subprocess.check_call([gn, 'gen', chrome_target_dir_rel, '--args='+gnargs], | 
 |                           cwd=chrome_src_dir) | 
 |   except subprocess.CalledProcessError as error: | 
 |     sys.exit('Error (ret code: %s) calling "%s" in %s' % ( | 
 |         error.returncode, error.cmd, chrome_src_dir)) | 
 |  | 
 |   try: | 
 |     subprocess.check_call(['ninja'] + shlex.split(args.extra_ninja_args) + | 
 |         ['-C', chrome_target_dir_rel, 'command_buffer_gles2'], | 
 |         cwd=chrome_src_dir) | 
 |   except subprocess.CalledProcessError as error: | 
 |     sys.exit('Error (ret code: %s) calling "%s" in %s' % (error.returncode, | 
 |         error.cmd, chrome_src_dir)) | 
 |  | 
 |   shared_lib_src_dir = os.path.join(chrome_src_dir, chrome_target_dir_rel) | 
 |  | 
 |   shared_lib_src = os.path.join(shared_lib_src_dir, shared_lib_name) | 
 |   shared_lib_dst = os.path.join(args.output_dir, shared_lib_name) | 
 |  | 
 |   if not os.path.isfile(shared_lib_src): | 
 |     sys.exit('Command buffer shared library not at expected location: ' + | 
 |         shared_lib_src) | 
 |  | 
 |   shutil.copy2(shared_lib_src, shared_lib_dst) | 
 |  | 
 |   if not os.path.isfile(shared_lib_dst): | 
 |     sys.exit('Command buffer library not copied to ' + shared_lib_dst) | 
 |  | 
 |   print('Command buffer library copied to ' + shared_lib_dst) | 
 |  | 
 |  | 
 | if __name__ == '__main__': | 
 |   main() | 
 |  |