1ab6c94ddf7bb67d37c4b3c32e5a7ecbf56c6bc03Courtney Goeltzenleuchter#!/usr/bin/env python
2ab6c94ddf7bb67d37c4b3c32e5a7ecbf56c6bc03Courtney Goeltzenleuchter#
3ab6c94ddf7bb67d37c4b3c32e5a7ecbf56c6bc03Courtney Goeltzenleuchter# Copyright (C) 2015 The Android Open Source Project
4ab6c94ddf7bb67d37c4b3c32e5a7ecbf56c6bc03Courtney Goeltzenleuchter#
5ab6c94ddf7bb67d37c4b3c32e5a7ecbf56c6bc03Courtney Goeltzenleuchter# Licensed under the Apache License, Version 2.0 (the "License");
6ab6c94ddf7bb67d37c4b3c32e5a7ecbf56c6bc03Courtney Goeltzenleuchter# you may not use this file except in compliance with the License.
7ab6c94ddf7bb67d37c4b3c32e5a7ecbf56c6bc03Courtney Goeltzenleuchter# You may obtain a copy of the License at
8ab6c94ddf7bb67d37c4b3c32e5a7ecbf56c6bc03Courtney Goeltzenleuchter#
9ab6c94ddf7bb67d37c4b3c32e5a7ecbf56c6bc03Courtney Goeltzenleuchter#      http://www.apache.org/licenses/LICENSE-2.0
10ab6c94ddf7bb67d37c4b3c32e5a7ecbf56c6bc03Courtney Goeltzenleuchter#
11ab6c94ddf7bb67d37c4b3c32e5a7ecbf56c6bc03Courtney Goeltzenleuchter# Unless required by applicable law or agreed to in writing, software
12ab6c94ddf7bb67d37c4b3c32e5a7ecbf56c6bc03Courtney Goeltzenleuchter# distributed under the License is distributed on an "AS IS" BASIS,
13ab6c94ddf7bb67d37c4b3c32e5a7ecbf56c6bc03Courtney Goeltzenleuchter# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14ab6c94ddf7bb67d37c4b3c32e5a7ecbf56c6bc03Courtney Goeltzenleuchter# See the License for the specific language governing permissions and
15ab6c94ddf7bb67d37c4b3c32e5a7ecbf56c6bc03Courtney Goeltzenleuchter# limitations under the License.
16ab6c94ddf7bb67d37c4b3c32e5a7ecbf56c6bc03Courtney Goeltzenleuchter#
17ab6c94ddf7bb67d37c4b3c32e5a7ecbf56c6bc03Courtney Goeltzenleuchter
18d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchterimport argparse
19d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchterimport multiprocessing
20ab6c94ddf7bb67d37c4b3c32e5a7ecbf56c6bc03Courtney Goeltzenleuchterimport os
21876a920e412edb95cdb1c80e509efd2cab003c2fCourtney Goeltzenleuchterimport shutil
22ab6c94ddf7bb67d37c4b3c32e5a7ecbf56c6bc03Courtney Goeltzenleuchterimport subprocess
23ab6c94ddf7bb67d37c4b3c32e5a7ecbf56c6bc03Courtney Goeltzenleuchterimport sys
24876a920e412edb95cdb1c80e509efd2cab003c2fCourtney Goeltzenleuchterimport time
25ab6c94ddf7bb67d37c4b3c32e5a7ecbf56c6bc03Courtney Goeltzenleuchter
26c1c545bff43318821e294b3c32d601bc08485180Courtney Goeltzenleuchterfrom subprocess import PIPE, STDOUT
27c1c545bff43318821e294b3c32d601bc08485180Courtney Goeltzenleuchter
28fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchterdef install_file(file_name, src_dir, dst_dir):
29fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter    src_file = os.path.join(src_dir, file_name)
30fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter    dst_file = os.path.join(dst_dir, file_name)
31fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter
32fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter    print('Copying {} to {}...'.format(src_file, dst_file))
33fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter    if os.path.isdir(src_file):
34fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter        _install_dir(src_file, dst_file)
35fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter    elif os.path.islink(src_file):
36fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter        _install_symlink(src_file, dst_file)
37fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter    else:
38fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter        _install_file(src_file, dst_file)
39fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter
40fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter
41fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchterdef _install_dir(src_dir, dst_dir):
42fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter    parent_dir = os.path.normpath(os.path.join(dst_dir, '..'))
43fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter    if not os.path.exists(parent_dir):
44fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter        os.makedirs(parent_dir)
45fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter    shutil.copytree(src_dir, dst_dir, symlinks=True)
46fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter
47fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter
48fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchterdef _install_symlink(src_file, dst_file):
49fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter    dirname = os.path.dirname(dst_file)
50fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter    if not os.path.exists(dirname):
51fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter        os.makedirs(dirname)
52fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter    link_target = os.readlink(src_file)
53fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter    os.symlink(link_target, dst_file)
54fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter
55fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter
56fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchterdef _install_file(src_file, dst_file):
57fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter    dirname = os.path.dirname(dst_file)
58fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter    if not os.path.exists(dirname):
59fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter        os.makedirs(dirname)
60fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter    # copy2 is just copy followed by copystat (preserves file metadata).
61fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter    shutil.copy2(src_file, dst_file)
62fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter
63d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney GoeltzenleuchterTHIS_DIR = os.path.realpath(os.path.dirname(__file__))
64d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter
65d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney GoeltzenleuchterALL_ARCHITECTURES = (
66d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter  'arm',
67d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter  'arm64',
68d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter  'mips',
69d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter  'mips64',
70d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter  'x86',
71d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter  'x86_64',
72d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter)
73d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter
744d3fcea72c71e8e7fbefd06dc48477cc7d699ddeCourtney Goeltzenleuchter# According to vk_platform.h, armeabi is not supported for Vulkan
754d3fcea72c71e8e7fbefd06dc48477cc7d699ddeCourtney Goeltzenleuchter# so remove it from the abis list.
76d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney GoeltzenleuchterALL_ABIS = (
77d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter  'armeabi-v7a',
78d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter  'arm64-v8a',
79d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter  'mips',
80d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter  'mips64',
81d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter  'x86',
82d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter  'x86_64',
83d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter)
84d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter
85d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchterdef jobs_arg():
86d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter  return '-j{}'.format(multiprocessing.cpu_count() * 2)
87d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter
88d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchterdef arch_to_abis(arch):
89d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter  return {
904d3fcea72c71e8e7fbefd06dc48477cc7d699ddeCourtney Goeltzenleuchter    'arm': ['armeabi-v7a'],
91d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter    'arm64': ['arm64-v8a'],
92d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter    'mips': ['mips'],
93d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter    'mips64': ['mips64'],
94d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter    'x86': ['x86'],
95d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter    'x86_64': ['x86_64'],
96d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter  }[arch]
97d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter
98d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchterclass ArgParser(argparse.ArgumentParser):
99d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter  def __init__(self):
100d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter    super(ArgParser, self).__init__()
101d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter
102d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter    self.add_argument(
103d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter      '--out-dir', help='Directory to place temporary build files.',
104d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter      type=os.path.realpath, default=os.path.join(THIS_DIR, 'out'))
105d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter
106d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter    self.add_argument(
107d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter      '--arch', choices=ALL_ARCHITECTURES,
108d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter      help='Architectures to build. Builds all if not present.')
109d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter
110c048772a229bec939798ae73826a8ac74e52900aCourtney Goeltzenleuchter    self.add_argument('--installdir', dest='installdir', required=True,
111c048772a229bec939798ae73826a8ac74e52900aCourtney Goeltzenleuchter      help='Installation directory. Required.')
112c048772a229bec939798ae73826a8ac74e52900aCourtney Goeltzenleuchter
113d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter    # The default for --dist-dir has to be handled after parsing all
114d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter    # arguments because the default is derived from --out-dir. This is
115d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter    # handled in run().
116d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter    self.add_argument(
117d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter      '--dist-dir', help='Directory to place the packaged artifact.',
118d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter      type=os.path.realpath)
119d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter
120d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter
121ab6c94ddf7bb67d37c4b3c32e5a7ecbf56c6bc03Courtney Goeltzenleuchterdef main():
122d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter  print('THIS_DIR: %s' % THIS_DIR)
123d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter  parser = ArgParser()
124d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter  args = parser.parse_args()
125d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter
126d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter  arches = ALL_ARCHITECTURES
127d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter  if args.arch is not None:
128d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter    arches = [args.arch]
129d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter
130c048772a229bec939798ae73826a8ac74e52900aCourtney Goeltzenleuchter  # Make paths absolute, and ensure directories exist.
131c048772a229bec939798ae73826a8ac74e52900aCourtney Goeltzenleuchter  installdir = os.path.abspath(args.installdir)
132c048772a229bec939798ae73826a8ac74e52900aCourtney Goeltzenleuchter
133d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter  abis = []
134d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter  for arch in arches:
135d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter    abis.extend(arch_to_abis(arch))
136d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter
137fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter  shaderc_path = installdir + '/shaderc/android_test'
138fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter  print('shaderc_path = %s' % shaderc_path)
139d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter
140d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter  if os.path.isdir('/buildbot/android-ndk'):
141d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter    ndk_dir = '/buildbot/android-ndk'
142d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter  elif os.path.isdir(os.environ['NDK_PATH']):
143d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter    ndk_dir = os.environ['NDK_PATH'];
144d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter  else:
145d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter    print('Error: No NDK environment found')
146d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter    return
147d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter
148d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter  ndk_build = os.path.join(ndk_dir, 'ndk-build')
149d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter  platforms_root = os.path.join(ndk_dir, 'platforms')
150d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter  toolchains_root = os.path.join(ndk_dir, 'toolchains')
151d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter  build_dir = THIS_DIR
152d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter
153c048772a229bec939798ae73826a8ac74e52900aCourtney Goeltzenleuchter  print('installdir: %s' % installdir)
154d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter  print('ndk_dir: %s' % ndk_dir)
155d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter  print('ndk_build: %s' % ndk_build)
15683e59c6eb31131dae94de0675498ed8b216b31feCourtney Goeltzenleuchter  print('platforms_root: %s' % platforms_root)
157d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter
158d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter  compiler = 'clang'
159d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter  stl = 'gnustl_static'
160d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter  obj_out = os.path.join(THIS_DIR, stl, 'obj')
161d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter  lib_out = os.path.join(THIS_DIR, 'jniLibs')
162d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter
16322e2f107a3a08baf733f37f8dbb3ce8187f01279Courtney Goeltzenleuchter  print('obj_out: %s' % obj_out)
16422e2f107a3a08baf733f37f8dbb3ce8187f01279Courtney Goeltzenleuchter  print('lib_out: %s' % lib_out)
16522e2f107a3a08baf733f37f8dbb3ce8187f01279Courtney Goeltzenleuchter
166fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter  print('Constructing shaderc build tree...')
167fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter  shaderc_root_dir = os.path.join(THIS_DIR, '../../shaderc')
168fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter
169fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter  copies = [
170fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter      {
171fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter          'source_dir': os.path.join(shaderc_root_dir, 'shaderc'),
17240b9f15375c21c4f5daf40b9355e4dd7e6149277Courtney Goeltzenleuchter          'dest_dir': 'third_party/shaderc',
173fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter          'files': [
174fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter              'Android.mk', 'libshaderc/Android.mk',
175fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter              'libshaderc_util/Android.mk',
176fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter              'third_party/Android.mk',
177fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter              'utils/update_build_version.py',
178fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter              'CHANGES',
179fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter          ],
180fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter          'dirs': [
181fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter              'libshaderc/include', 'libshaderc/src',
182fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter              'libshaderc_util/include', 'libshaderc_util/src',
183fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter              'android_test'
184fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter          ],
185fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter      },
186fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter      {
187fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter          'source_dir': os.path.join(shaderc_root_dir, 'spirv-tools'),
18840b9f15375c21c4f5daf40b9355e4dd7e6149277Courtney Goeltzenleuchter          'dest_dir': 'third_party/shaderc/third_party/spirv-tools',
189fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter          'files': [
190fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter              'utils/generate_grammar_tables.py',
191ea04d8a697116044ba085f678ec98438883bfc7cDavid Neto              'utils/generate_registry_tables.py',
192fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter              'utils/update_build_version.py',
193fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter              'CHANGES',
194fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter          ],
195fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter          'dirs': ['include', 'source'],
196fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter      },
197fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter      {
198fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter          'source_dir': os.path.join(shaderc_root_dir, 'spirv-headers'),
199fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter          'dest_dir':
20040b9f15375c21c4f5daf40b9355e4dd7e6149277Courtney Goeltzenleuchter              'third_party/shaderc/third_party/spirv-tools/external/spirv-headers',
201fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter          'dirs': ['include',],
202fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter          'files': [
203fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter              'include/spirv/1.0/spirv.py',
204fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter              'include/spirv/1.1/spirv.py'
205fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter          ],
206fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter      },
207fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter      {
208fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter          'source_dir': os.path.join(shaderc_root_dir, 'glslang'),
20940b9f15375c21c4f5daf40b9355e4dd7e6149277Courtney Goeltzenleuchter          'dest_dir': 'third_party/shaderc/third_party/glslang',
210fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter          'files': ['glslang/OSDependent/osinclude.h'],
211fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter          'dirs': [
212fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter              'SPIRV',
213fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter              'OGLCompilersDLL',
214fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter              'glslang/GenericCodeGen',
215fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter              'hlsl',
216fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter              'glslang/Include',
217fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter              'glslang/MachineIndependent',
218fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter              'glslang/OSDependent/Unix',
219fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter              'glslang/Public',
220fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter          ],
221fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter      },
222fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter  ]
223fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter
224fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter  default_ignore_patterns = shutil.ignore_patterns(
225fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter      "*CMakeLists.txt",
226fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter      "*.py",
227fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter      "*test.h",
228fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter      "*test.cc")
229fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter
230fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter  for properties in copies:
231fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter      source_dir = properties['source_dir']
232fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter      dest_dir = os.path.join(installdir, properties['dest_dir'])
233fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter      for d in properties['dirs']:
234fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter          src = os.path.join(source_dir, d)
235fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter          dst = os.path.join(dest_dir, d)
236fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter          print(src, " -> ", dst)
237fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter          shutil.copytree(src, dst,
238fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter                          ignore=default_ignore_patterns)
239fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter      for f in properties['files']:
240fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter          print(source_dir, ':', dest_dir, ":", f)
241fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter          # Only copy if the source file exists.  That way
242fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter          # we can update this script in anticipation of
243fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter          # source files yet-to-come.
244fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter          if os.path.exists(os.path.join(source_dir, f)):
245fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter              install_file(f, source_dir, dest_dir)
246fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter          else:
247fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter              print(source_dir, ':', dest_dir, ":", f, "SKIPPED")
248fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter
249fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter  print('Constructing Vulkan validation layer source...')
250fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter
25151322c263ec9f1dd06b8c1495469a6d21aedf888Courtney Goeltzenleuchter  build_cmd = [
25251322c263ec9f1dd06b8c1495469a6d21aedf888Courtney Goeltzenleuchter    'bash', THIS_DIR + '/android-generate.sh'
25351322c263ec9f1dd06b8c1495469a6d21aedf888Courtney Goeltzenleuchter  ]
25451322c263ec9f1dd06b8c1495469a6d21aedf888Courtney Goeltzenleuchter  print('Generating generated layers...')
25551322c263ec9f1dd06b8c1495469a6d21aedf888Courtney Goeltzenleuchter  subprocess.check_call(build_cmd)
25651322c263ec9f1dd06b8c1495469a6d21aedf888Courtney Goeltzenleuchter  print('Generation finished')
25751322c263ec9f1dd06b8c1495469a6d21aedf888Courtney Goeltzenleuchter
258d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter  build_cmd = [
259fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter    'bash', ndk_build, '-C', build_dir,
260fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter    jobs_arg(),
261d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter    'APP_ABI=' + ' '.join(abis),
262d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter    # Use the prebuilt platforms and toolchains.
263d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter    'NDK_PLATFORMS_ROOT=' + platforms_root,
264d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter    'NDK_TOOLCHAINS_ROOT=' + toolchains_root,
26540b9f15375c21c4f5daf40b9355e4dd7e6149277Courtney Goeltzenleuchter    'NDK_MODULE_PATH=' + installdir,
266d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter    'GNUSTL_PREFIX=',
267d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter    'APP_STL=' + stl,
26840b9f15375c21c4f5daf40b9355e4dd7e6149277Courtney Goeltzenleuchter    'NDK_TOOLCHAIN_VERSION=' + compiler,
26940b9f15375c21c4f5daf40b9355e4dd7e6149277Courtney Goeltzenleuchter
27040b9f15375c21c4f5daf40b9355e4dd7e6149277Courtney Goeltzenleuchter    # Tell ndk-build where to put the results
271d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter    'NDK_OUT=' + obj_out,
272d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter    'NDK_LIBS_OUT=' + lib_out,
273d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter  ]
274d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter
275d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter  print('Building Vulkan validation layers for ABIs:' +
2761f1c86c76857434391082346d1b7ddff94614868Courtney Goeltzenleuchter    ' {}'.format(', '.join(abis)) + "...")
277fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter  print(' '.join(build_cmd))
278fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter
279d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter  subprocess.check_call(build_cmd)
280d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter
281d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter  print('Finished building Vulkan validation layers')
282c048772a229bec939798ae73826a8ac74e52900aCourtney Goeltzenleuchter  out_package = os.path.join(installdir, 'vulkan_validation_layers.zip')
283234c5410fd0e8eea8ff402c3476a564448f51f97Courtney Goeltzenleuchter  os.chdir(lib_out)
284c048772a229bec939798ae73826a8ac74e52900aCourtney Goeltzenleuchter  build_cmd = [
285234c5410fd0e8eea8ff402c3476a564448f51f97Courtney Goeltzenleuchter      'zip', '-9qr', out_package, "."
286c048772a229bec939798ae73826a8ac74e52900aCourtney Goeltzenleuchter  ]
28706946e63825649a38568faec310b939628050ac9Courtney Goeltzenleuchter
28806946e63825649a38568faec310b939628050ac9Courtney Goeltzenleuchter  print('Packaging Vulkan validation layers')
28906946e63825649a38568faec310b939628050ac9Courtney Goeltzenleuchter  subprocess.check_call(build_cmd)
290c048772a229bec939798ae73826a8ac74e52900aCourtney Goeltzenleuchter  print('Finished Packaging Vulkan validation layers')
291ab6c94ddf7bb67d37c4b3c32e5a7ecbf56c6bc03Courtney Goeltzenleuchter
2926f5ea024afee8320a210f2e33882f1f7dbad9741Courtney Goeltzenleuchter  for properties in copies:
2936f5ea024afee8320a210f2e33882f1f7dbad9741Courtney Goeltzenleuchter      dest_dir = os.path.join(installdir, properties['dest_dir'])
2946f5ea024afee8320a210f2e33882f1f7dbad9741Courtney Goeltzenleuchter      for d in properties['dirs']:
2956f5ea024afee8320a210f2e33882f1f7dbad9741Courtney Goeltzenleuchter          dst = os.path.join(dest_dir, d)
2966f5ea024afee8320a210f2e33882f1f7dbad9741Courtney Goeltzenleuchter          print('Remove: %s' % dst)
2976f5ea024afee8320a210f2e33882f1f7dbad9741Courtney Goeltzenleuchter          shutil.rmtree(dst)
2986f5ea024afee8320a210f2e33882f1f7dbad9741Courtney Goeltzenleuchter
299f6dac155e38e027c11ce97d06ebec224b9b0505dCourtney Goeltzenleuchter  return 0
300f6dac155e38e027c11ce97d06ebec224b9b0505dCourtney Goeltzenleuchter
301ab6c94ddf7bb67d37c4b3c32e5a7ecbf56c6bc03Courtney Goeltzenleuchter
302ab6c94ddf7bb67d37c4b3c32e5a7ecbf56c6bc03Courtney Goeltzenleuchterif __name__ == '__main__':
303d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter  main()
304