1cb93a386Sopenharmony_ci#!/usr/bin/python 2cb93a386Sopenharmony_ci 3cb93a386Sopenharmony_ci# Copyright 2016 Google Inc. 4cb93a386Sopenharmony_ci# 5cb93a386Sopenharmony_ci# Use of this source code is governed by a BSD-style license that can be 6cb93a386Sopenharmony_ci# found in the LICENSE file. 7cb93a386Sopenharmony_ci 8cb93a386Sopenharmony_ci 9cb93a386Sopenharmony_ci""" 10cb93a386Sopenharmony_ciScript to build the command buffer shared library and copy it to Skia tree 11cb93a386Sopenharmony_ci""" 12cb93a386Sopenharmony_ci 13cb93a386Sopenharmony_ci 14cb93a386Sopenharmony_ciimport argparse 15cb93a386Sopenharmony_ciimport os 16cb93a386Sopenharmony_ciimport shlex 17cb93a386Sopenharmony_ciimport shutil 18cb93a386Sopenharmony_ciimport subprocess 19cb93a386Sopenharmony_ciimport sys 20cb93a386Sopenharmony_ci 21cb93a386Sopenharmony_ci 22cb93a386Sopenharmony_cidef main(): 23cb93a386Sopenharmony_ci parser = argparse.ArgumentParser(description=('Builds command_buffer_gles2 ' 24cb93a386Sopenharmony_ci 'library and copies it')) 25cb93a386Sopenharmony_ci parser.add_argument('-c', '--chrome-dir', required=True, help= 26cb93a386Sopenharmony_ci 'path to Chromium checkout (directory containing .gclient)') 27cb93a386Sopenharmony_ci parser.add_argument('-o', '--output-dir', required=True, 28cb93a386Sopenharmony_ci help='path to copy the command buffer shared library to. Typically this ' 29cb93a386Sopenharmony_ci 'is out/Debug or out/Release in a Skia repository') 30cb93a386Sopenharmony_ci parser.add_argument('--make-output-dir', default=False, action='store_true', 31cb93a386Sopenharmony_ci help='Makes the output directory if it does not already exist.') 32cb93a386Sopenharmony_ci parser.add_argument('--chrome-out-dir', default='CommandBufferForSkia', 33cb93a386Sopenharmony_ci help='Type of name of the gn output directory (e.g. Debug or Release). ' 34cb93a386Sopenharmony_ci 'This is relative to the Chromium src/out directory. Note that this ' 35cb93a386Sopenharmony_ci 'script will reset the gn args in this directory on each run.') 36cb93a386Sopenharmony_ci parser.add_argument('--extra-gn-args', default='', 37cb93a386Sopenharmony_ci help=('Extra GN arguments to use for the output directory used to build' 38cb93a386Sopenharmony_ci 'the command buffer')) 39cb93a386Sopenharmony_ci parser.add_argument('--extra-ninja-args', default='', 40cb93a386Sopenharmony_ci help=('Extra arguments to pass to ninja when building the command ' 41cb93a386Sopenharmony_ci 'buffer shared library')) 42cb93a386Sopenharmony_ci parser.add_argument('--chrome-revision', default='origin/lkgr', 43cb93a386Sopenharmony_ci help='Revision (hash, branch, tag) of Chromium to use.') 44cb93a386Sopenharmony_ci parser.add_argument('--no-sync', action='store_true', default=False, 45cb93a386Sopenharmony_ci help='Don\'t run git fetch or gclient sync in the Chromium tree') 46cb93a386Sopenharmony_ci parser.add_argument('--no-hooks', action='store_true', default=False, 47cb93a386Sopenharmony_ci help='Don\'t run gclient runhooks in the Chromium tree. Implies ' 48cb93a386Sopenharmony_ci '--no-sync') 49cb93a386Sopenharmony_ci args = parser.parse_args() 50cb93a386Sopenharmony_ci 51cb93a386Sopenharmony_ci args.chrome_dir = os.path.abspath(args.chrome_dir) 52cb93a386Sopenharmony_ci args.output_dir = os.path.abspath(args.output_dir) 53cb93a386Sopenharmony_ci 54cb93a386Sopenharmony_ci if args.no_hooks: 55cb93a386Sopenharmony_ci args.no_sync = True 56cb93a386Sopenharmony_ci 57cb93a386Sopenharmony_ci if os.path.isfile(args.chrome_dir): 58cb93a386Sopenharmony_ci sys.exit(args.chrome_dir + ' exists but is a file.') 59cb93a386Sopenharmony_ci 60cb93a386Sopenharmony_ci if os.path.isfile(args.output_dir): 61cb93a386Sopenharmony_ci sys.exit(args.output_dir + ' exists but is a file.') 62cb93a386Sopenharmony_ci 63cb93a386Sopenharmony_ci chrome_src_dir = os.path.join(args.chrome_dir, 'src') 64cb93a386Sopenharmony_ci 65cb93a386Sopenharmony_ci if not os.path.isdir(chrome_src_dir): 66cb93a386Sopenharmony_ci sys.exit(chrome_src_dir + ' is not a directory.') 67cb93a386Sopenharmony_ci 68cb93a386Sopenharmony_ci if os.path.isfile(args.output_dir): 69cb93a386Sopenharmony_ci sys.exit(args.output_dir + ' exists but is a file.') 70cb93a386Sopenharmony_ci elif not os.path.isdir(args.output_dir): 71cb93a386Sopenharmony_ci if args.make_output_dir: 72cb93a386Sopenharmony_ci os.makedirs(args.output_dir) 73cb93a386Sopenharmony_ci else: 74cb93a386Sopenharmony_ci sys.exit(args.output_dir + ' does not exist (specify --make-output-dir ' 75cb93a386Sopenharmony_ci 'to create).') 76cb93a386Sopenharmony_ci 77cb93a386Sopenharmony_ci chrome_target_dir_rel = os.path.join('out', args.chrome_out_dir) 78cb93a386Sopenharmony_ci 79cb93a386Sopenharmony_ci # The command buffer shared library will have a different name on Linux, 80cb93a386Sopenharmony_ci # Mac, and Windows. Also, the name of the gclient executable we call out to 81cb93a386Sopenharmony_ci # has a .bat file extension on Windows. 82cb93a386Sopenharmony_ci platform = sys.platform 83cb93a386Sopenharmony_ci if platform == 'cygwin': 84cb93a386Sopenharmony_ci platform = 'win32' 85cb93a386Sopenharmony_ci 86cb93a386Sopenharmony_ci shared_lib_name = 'libcommand_buffer_gles2.so' 87cb93a386Sopenharmony_ci gclient = 'gclient' 88cb93a386Sopenharmony_ci if platform == 'darwin': 89cb93a386Sopenharmony_ci shared_lib_name = 'libcommand_buffer_gles2.dylib' 90cb93a386Sopenharmony_ci elif platform == 'win32': 91cb93a386Sopenharmony_ci shared_lib_name = 'command_buffer_gles2.dll' 92cb93a386Sopenharmony_ci gclient = 'gclient.bat' 93cb93a386Sopenharmony_ci 94cb93a386Sopenharmony_ci if not args.no_sync: 95cb93a386Sopenharmony_ci try: 96cb93a386Sopenharmony_ci subprocess.check_call(['git', 'fetch'], cwd=chrome_src_dir) 97cb93a386Sopenharmony_ci except subprocess.CalledProcessError as error: 98cb93a386Sopenharmony_ci sys.exit('Error (ret code: %s) calling "%s" in %s' % (error.returncode, 99cb93a386Sopenharmony_ci error.cmd, chrome_src_dir)) 100cb93a386Sopenharmony_ci 101cb93a386Sopenharmony_ci try: 102cb93a386Sopenharmony_ci subprocess.check_call(['git', 'checkout', args.chrome_revision], 103cb93a386Sopenharmony_ci cwd=chrome_src_dir) 104cb93a386Sopenharmony_ci except subprocess.CalledProcessError as error: 105cb93a386Sopenharmony_ci sys.exit('Error (ret code: %s) calling "%s" in %s' % (error.returncode, 106cb93a386Sopenharmony_ci error.cmd, chrome_src_dir)) 107cb93a386Sopenharmony_ci 108cb93a386Sopenharmony_ci try: 109cb93a386Sopenharmony_ci os.environ['GYP_GENERATORS'] = 'ninja' 110cb93a386Sopenharmony_ci subprocess.check_call([gclient, 'sync', '--reset', '--force', 111cb93a386Sopenharmony_ci '--nohooks'], 112cb93a386Sopenharmony_ci cwd=chrome_src_dir) 113cb93a386Sopenharmony_ci except subprocess.CalledProcessError as error: 114cb93a386Sopenharmony_ci sys.exit('Error (ret code: %s) calling "%s" in %s' % (error.returncode, 115cb93a386Sopenharmony_ci error.cmd, chrome_src_dir)) 116cb93a386Sopenharmony_ci 117cb93a386Sopenharmony_ci if not args.no_hooks: 118cb93a386Sopenharmony_ci try: 119cb93a386Sopenharmony_ci subprocess.check_call([gclient, 'runhooks'], cwd=chrome_src_dir) 120cb93a386Sopenharmony_ci except subprocess.CalledProcessError as error: 121cb93a386Sopenharmony_ci sys.exit('Error (ret code: %s) calling "%s" in %s' % ( 122cb93a386Sopenharmony_ci error.returncode, error.cmd, chrome_src_dir)) 123cb93a386Sopenharmony_ci 124cb93a386Sopenharmony_ci gn = 'gn' 125cb93a386Sopenharmony_ci platform = 'linux64' 126cb93a386Sopenharmony_ci if sys.platform == 'darwin': 127cb93a386Sopenharmony_ci platform = 'mac' 128cb93a386Sopenharmony_ci elif sys.platform == 'win32': 129cb93a386Sopenharmony_ci platform = 'win' 130cb93a386Sopenharmony_ci gn = 'gn.exe' 131cb93a386Sopenharmony_ci gn = os.path.join(chrome_src_dir, 'buildtools', platform, gn) 132cb93a386Sopenharmony_ci try: 133cb93a386Sopenharmony_ci gnargs = 'is_component_build=false is_debug=false ' + args.extra_gn_args 134cb93a386Sopenharmony_ci subprocess.check_call([gn, 'gen', chrome_target_dir_rel, '--args='+gnargs], 135cb93a386Sopenharmony_ci cwd=chrome_src_dir) 136cb93a386Sopenharmony_ci except subprocess.CalledProcessError as error: 137cb93a386Sopenharmony_ci sys.exit('Error (ret code: %s) calling "%s" in %s' % ( 138cb93a386Sopenharmony_ci error.returncode, error.cmd, chrome_src_dir)) 139cb93a386Sopenharmony_ci 140cb93a386Sopenharmony_ci try: 141cb93a386Sopenharmony_ci subprocess.check_call(['ninja'] + shlex.split(args.extra_ninja_args) + 142cb93a386Sopenharmony_ci ['-C', chrome_target_dir_rel, 'command_buffer_gles2'], 143cb93a386Sopenharmony_ci cwd=chrome_src_dir) 144cb93a386Sopenharmony_ci except subprocess.CalledProcessError as error: 145cb93a386Sopenharmony_ci sys.exit('Error (ret code: %s) calling "%s" in %s' % (error.returncode, 146cb93a386Sopenharmony_ci error.cmd, chrome_src_dir)) 147cb93a386Sopenharmony_ci 148cb93a386Sopenharmony_ci shared_lib_src_dir = os.path.join(chrome_src_dir, chrome_target_dir_rel) 149cb93a386Sopenharmony_ci 150cb93a386Sopenharmony_ci shared_lib_src = os.path.join(shared_lib_src_dir, shared_lib_name) 151cb93a386Sopenharmony_ci shared_lib_dst = os.path.join(args.output_dir, shared_lib_name) 152cb93a386Sopenharmony_ci 153cb93a386Sopenharmony_ci if not os.path.isfile(shared_lib_src): 154cb93a386Sopenharmony_ci sys.exit('Command buffer shared library not at expected location: ' + 155cb93a386Sopenharmony_ci shared_lib_src) 156cb93a386Sopenharmony_ci 157cb93a386Sopenharmony_ci shutil.copy2(shared_lib_src, shared_lib_dst) 158cb93a386Sopenharmony_ci 159cb93a386Sopenharmony_ci if not os.path.isfile(shared_lib_dst): 160cb93a386Sopenharmony_ci sys.exit('Command buffer library not copied to ' + shared_lib_dst) 161cb93a386Sopenharmony_ci 162cb93a386Sopenharmony_ci print('Command buffer library copied to ' + shared_lib_dst) 163cb93a386Sopenharmony_ci 164cb93a386Sopenharmony_ci 165cb93a386Sopenharmony_ciif __name__ == '__main__': 166cb93a386Sopenharmony_ci main() 167cb93a386Sopenharmony_ci 168