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