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