| #!/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() | |