build.py revision 40b9f15375c21c4f5daf40b9355e4dd7e6149277
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
21ab6c94ddf7bb67d37c4b3c32e5a7ecbf56c6bc03Courtney Goeltzenleuchterimport subprocess
22ab6c94ddf7bb67d37c4b3c32e5a7ecbf56c6bc03Courtney Goeltzenleuchterimport sys
23fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchterimport shutil
24ab6c94ddf7bb67d37c4b3c32e5a7ecbf56c6bc03Courtney Goeltzenleuchter
25c1c545bff43318821e294b3c32d601bc08485180Courtney Goeltzenleuchterfrom subprocess import PIPE, STDOUT
26c1c545bff43318821e294b3c32d601bc08485180Courtney Goeltzenleuchter
27fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchterdef install_file(file_name, src_dir, dst_dir):
28fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter    src_file = os.path.join(src_dir, file_name)
29fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter    dst_file = os.path.join(dst_dir, file_name)
30fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter
31fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter    print('Copying {} to {}...'.format(src_file, dst_file))
32fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter    if os.path.isdir(src_file):
33fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter        _install_dir(src_file, dst_file)
34fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter    elif os.path.islink(src_file):
35fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter        _install_symlink(src_file, dst_file)
36fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter    else:
37fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter        _install_file(src_file, dst_file)
38fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter
39fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter
40fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchterdef _install_dir(src_dir, dst_dir):
41fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter    parent_dir = os.path.normpath(os.path.join(dst_dir, '..'))
42fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter    if not os.path.exists(parent_dir):
43fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter        os.makedirs(parent_dir)
44fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter    shutil.copytree(src_dir, dst_dir, symlinks=True)
45fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter
46fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter
47fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchterdef _install_symlink(src_file, dst_file):
48fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter    dirname = os.path.dirname(dst_file)
49fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter    if not os.path.exists(dirname):
50fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter        os.makedirs(dirname)
51fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter    link_target = os.readlink(src_file)
52fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter    os.symlink(link_target, dst_file)
53fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter
54fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter
55fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchterdef _install_file(src_file, dst_file):
56fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter    dirname = os.path.dirname(dst_file)
57fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter    if not os.path.exists(dirname):
58fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter        os.makedirs(dirname)
59fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter    # copy2 is just copy followed by copystat (preserves file metadata).
60fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter    shutil.copy2(src_file, dst_file)
61fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter
62d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney GoeltzenleuchterTHIS_DIR = os.path.realpath(os.path.dirname(__file__))
63d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter
64d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney GoeltzenleuchterALL_ARCHITECTURES = (
65d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter  'arm',
66d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter  'arm64',
67d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter  'mips',
68d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter  'mips64',
69d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter  'x86',
70d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter  'x86_64',
71d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter)
72d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter
734d3fcea72c71e8e7fbefd06dc48477cc7d699ddeCourtney Goeltzenleuchter# According to vk_platform.h, armeabi is not supported for Vulkan
744d3fcea72c71e8e7fbefd06dc48477cc7d699ddeCourtney Goeltzenleuchter# so remove it from the abis list.
75d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney GoeltzenleuchterALL_ABIS = (
76d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter  'armeabi-v7a',
77d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter  'arm64-v8a',
78d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter  'mips',
79d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter  'mips64',
80d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter  'x86',
81d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter  'x86_64',
82d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter)
83d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter
84d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchterdef jobs_arg():
85d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter  return '-j{}'.format(multiprocessing.cpu_count() * 2)
86d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter
87d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchterdef arch_to_abis(arch):
88d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter  return {
894d3fcea72c71e8e7fbefd06dc48477cc7d699ddeCourtney Goeltzenleuchter    'arm': ['armeabi-v7a'],
90d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter    'arm64': ['arm64-v8a'],
91d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter    'mips': ['mips'],
92d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter    'mips64': ['mips64'],
93d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter    'x86': ['x86'],
94d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter    'x86_64': ['x86_64'],
95d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter  }[arch]
96d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter
97d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchterclass ArgParser(argparse.ArgumentParser):
98d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter  def __init__(self):
99d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter    super(ArgParser, self).__init__()
100d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter
101d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter    self.add_argument(
102d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter      '--out-dir', help='Directory to place temporary build files.',
103d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter      type=os.path.realpath, default=os.path.join(THIS_DIR, 'out'))
104d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter
105d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter    self.add_argument(
106d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter      '--arch', choices=ALL_ARCHITECTURES,
107d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter      help='Architectures to build. Builds all if not present.')
108d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter
109c048772a229bec939798ae73826a8ac74e52900aCourtney Goeltzenleuchter    self.add_argument('--installdir', dest='installdir', required=True,
110c048772a229bec939798ae73826a8ac74e52900aCourtney Goeltzenleuchter      help='Installation directory. Required.')
111c048772a229bec939798ae73826a8ac74e52900aCourtney Goeltzenleuchter
112d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter    # The default for --dist-dir has to be handled after parsing all
113d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter    # arguments because the default is derived from --out-dir. This is
114d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter    # handled in run().
115d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter    self.add_argument(
116d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter      '--dist-dir', help='Directory to place the packaged artifact.',
117d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter      type=os.path.realpath)
118d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter
119d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter
120ab6c94ddf7bb67d37c4b3c32e5a7ecbf56c6bc03Courtney Goeltzenleuchterdef main():
121d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter  print('THIS_DIR: %s' % THIS_DIR)
122d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter  parser = ArgParser()
123d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter  args = parser.parse_args()
124d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter
125d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter  arches = ALL_ARCHITECTURES
126d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter  if args.arch is not None:
127d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter    arches = [args.arch]
128d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter
129c048772a229bec939798ae73826a8ac74e52900aCourtney Goeltzenleuchter  # Make paths absolute, and ensure directories exist.
130c048772a229bec939798ae73826a8ac74e52900aCourtney Goeltzenleuchter  installdir = os.path.abspath(args.installdir)
131c048772a229bec939798ae73826a8ac74e52900aCourtney Goeltzenleuchter
132fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter  # clean install directory
133fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter  if os.path.exists(installdir):
134fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter    shutil.rmtree(installdir)
135fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter
136fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter  # create install directory
137fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter  os.makedirs(args.installdir)
138fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter
139d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter  abis = []
140d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter  for arch in arches:
141d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter    abis.extend(arch_to_abis(arch))
142d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter
143fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter  shaderc_path = installdir + '/shaderc/android_test'
144fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter  print('shaderc_path = %s' % shaderc_path)
145d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter
146d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter  if os.path.isdir('/buildbot/android-ndk'):
147d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter    ndk_dir = '/buildbot/android-ndk'
148d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter  elif os.path.isdir(os.environ['NDK_PATH']):
149d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter    ndk_dir = os.environ['NDK_PATH'];
150d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter  else:
151d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter    print('Error: No NDK environment found')
152d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter    return
153d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter
154d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter  ndk_build = os.path.join(ndk_dir, 'ndk-build')
155d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter  platforms_root = os.path.join(ndk_dir, 'platforms')
156d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter  toolchains_root = os.path.join(ndk_dir, 'toolchains')
157d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter  build_dir = THIS_DIR
158d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter
159c048772a229bec939798ae73826a8ac74e52900aCourtney Goeltzenleuchter  print('installdir: %s' % installdir)
160d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter  print('ndk_dir: %s' % ndk_dir)
161d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter  print('ndk_build: %s' % ndk_build)
16283e59c6eb31131dae94de0675498ed8b216b31feCourtney Goeltzenleuchter  print('platforms_root: %s' % platforms_root)
163d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter
164d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter  compiler = 'clang'
165d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter  stl = 'gnustl_static'
166d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter  obj_out = os.path.join(THIS_DIR, stl, 'obj')
167d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter  lib_out = os.path.join(THIS_DIR, 'jniLibs')
168d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter
16922e2f107a3a08baf733f37f8dbb3ce8187f01279Courtney Goeltzenleuchter  print('obj_out: %s' % obj_out)
17022e2f107a3a08baf733f37f8dbb3ce8187f01279Courtney Goeltzenleuchter  print('lib_out: %s' % lib_out)
17122e2f107a3a08baf733f37f8dbb3ce8187f01279Courtney Goeltzenleuchter
172fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter  print('Constructing shaderc build tree...')
173fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter  shaderc_root_dir = os.path.join(THIS_DIR, '../../shaderc')
174fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter
175fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter  copies = [
176fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter      {
177fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter          'source_dir': os.path.join(shaderc_root_dir, 'shaderc'),
17840b9f15375c21c4f5daf40b9355e4dd7e6149277Courtney Goeltzenleuchter          'dest_dir': 'third_party/shaderc',
179fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter          'files': [
180fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter              'Android.mk', 'libshaderc/Android.mk',
181fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter              'libshaderc_util/Android.mk',
182fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter              'third_party/Android.mk',
183fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter              'utils/update_build_version.py',
184fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter              'CHANGES',
185fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter          ],
186fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter          'dirs': [
187fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter              'libshaderc/include', 'libshaderc/src',
188fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter              'libshaderc_util/include', 'libshaderc_util/src',
189fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter              'android_test'
190fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter          ],
191fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter      },
192fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter      {
193fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter          'source_dir': os.path.join(shaderc_root_dir, 'spirv-tools'),
19440b9f15375c21c4f5daf40b9355e4dd7e6149277Courtney Goeltzenleuchter          'dest_dir': 'third_party/shaderc/third_party/spirv-tools',
195fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter          'files': [
196fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter              'utils/generate_grammar_tables.py',
197fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter              'utils/update_build_version.py',
198fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter              'CHANGES',
199fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter          ],
200fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter          'dirs': ['include', 'source'],
201fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter      },
202fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter      {
203fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter          'source_dir': os.path.join(shaderc_root_dir, 'spirv-headers'),
204fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter          'dest_dir':
20540b9f15375c21c4f5daf40b9355e4dd7e6149277Courtney Goeltzenleuchter              'third_party/shaderc/third_party/spirv-tools/external/spirv-headers',
206fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter          'dirs': ['include',],
207fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter          'files': [
208fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter              'include/spirv/1.0/spirv.py',
209fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter              'include/spirv/1.1/spirv.py'
210fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter          ],
211fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter      },
212fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter      {
213fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter          'source_dir': os.path.join(shaderc_root_dir, 'glslang'),
21440b9f15375c21c4f5daf40b9355e4dd7e6149277Courtney Goeltzenleuchter          'dest_dir': 'third_party/shaderc/third_party/glslang',
215fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter          'files': ['glslang/OSDependent/osinclude.h'],
216fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter          'dirs': [
217fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter              'SPIRV',
218fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter              'OGLCompilersDLL',
219fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter              'glslang/GenericCodeGen',
220fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter              'hlsl',
221fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter              'glslang/Include',
222fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter              'glslang/MachineIndependent',
223fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter              'glslang/OSDependent/Unix',
224fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter              'glslang/Public',
225fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter          ],
226fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter      },
227fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter  ]
228fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter
229fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter  default_ignore_patterns = shutil.ignore_patterns(
230fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter      "*CMakeLists.txt",
231fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter      "*.py",
232fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter      "*test.h",
233fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter      "*test.cc")
234fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter
235fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter  for properties in copies:
236fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter      source_dir = properties['source_dir']
237fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter      dest_dir = os.path.join(installdir, properties['dest_dir'])
238fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter      for d in properties['dirs']:
239fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter          src = os.path.join(source_dir, d)
240fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter          dst = os.path.join(dest_dir, d)
241fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter          print(src, " -> ", dst)
242fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter          shutil.copytree(src, dst,
243fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter                          ignore=default_ignore_patterns)
244fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter      for f in properties['files']:
245fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter          print(source_dir, ':', dest_dir, ":", f)
246fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter          # Only copy if the source file exists.  That way
247fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter          # we can update this script in anticipation of
248fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter          # source files yet-to-come.
249fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter          if os.path.exists(os.path.join(source_dir, f)):
250fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter              install_file(f, source_dir, dest_dir)
251fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter          else:
252fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter              print(source_dir, ':', dest_dir, ":", f, "SKIPPED")
253fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter
254fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter  print('Constructing Vulkan validation layer source...')
255fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter
25651322c263ec9f1dd06b8c1495469a6d21aedf888Courtney Goeltzenleuchter  build_cmd = [
25751322c263ec9f1dd06b8c1495469a6d21aedf888Courtney Goeltzenleuchter    'bash', THIS_DIR + '/android-generate.sh'
25851322c263ec9f1dd06b8c1495469a6d21aedf888Courtney Goeltzenleuchter  ]
25951322c263ec9f1dd06b8c1495469a6d21aedf888Courtney Goeltzenleuchter  print('Generating generated layers...')
26051322c263ec9f1dd06b8c1495469a6d21aedf888Courtney Goeltzenleuchter  subprocess.check_call(build_cmd)
26151322c263ec9f1dd06b8c1495469a6d21aedf888Courtney Goeltzenleuchter  print('Generation finished')
26251322c263ec9f1dd06b8c1495469a6d21aedf888Courtney Goeltzenleuchter
263d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter  build_cmd = [
264fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter    'bash', ndk_build, '-C', build_dir,
265fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter    jobs_arg(),
266d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter    'APP_ABI=' + ' '.join(abis),
267d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter    # Use the prebuilt platforms and toolchains.
268d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter    'NDK_PLATFORMS_ROOT=' + platforms_root,
269d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter    'NDK_TOOLCHAINS_ROOT=' + toolchains_root,
27040b9f15375c21c4f5daf40b9355e4dd7e6149277Courtney Goeltzenleuchter    'NDK_MODULE_PATH=' + installdir,
271d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter    'GNUSTL_PREFIX=',
272d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter    'APP_STL=' + stl,
27340b9f15375c21c4f5daf40b9355e4dd7e6149277Courtney Goeltzenleuchter    'NDK_TOOLCHAIN_VERSION=' + compiler,
27440b9f15375c21c4f5daf40b9355e4dd7e6149277Courtney Goeltzenleuchter
27540b9f15375c21c4f5daf40b9355e4dd7e6149277Courtney Goeltzenleuchter    # Tell ndk-build where to put the results
276d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter    'NDK_OUT=' + obj_out,
277d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter    'NDK_LIBS_OUT=' + lib_out,
278d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter  ]
279d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter
280d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter  print('Building Vulkan validation layers for ABIs:' +
2811f1c86c76857434391082346d1b7ddff94614868Courtney Goeltzenleuchter    ' {}'.format(', '.join(abis)) + "...")
282fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter  print(' '.join(build_cmd))
283fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter
284d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter  subprocess.check_call(build_cmd)
285d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter
286d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter  print('Finished building Vulkan validation layers')
287c048772a229bec939798ae73826a8ac74e52900aCourtney Goeltzenleuchter  out_package = os.path.join(installdir, 'vulkan_validation_layers.zip')
288234c5410fd0e8eea8ff402c3476a564448f51f97Courtney Goeltzenleuchter  os.chdir(lib_out)
289c048772a229bec939798ae73826a8ac74e52900aCourtney Goeltzenleuchter  build_cmd = [
290234c5410fd0e8eea8ff402c3476a564448f51f97Courtney Goeltzenleuchter      'zip', '-9qr', out_package, "."
291c048772a229bec939798ae73826a8ac74e52900aCourtney Goeltzenleuchter  ]
29206946e63825649a38568faec310b939628050ac9Courtney Goeltzenleuchter
29306946e63825649a38568faec310b939628050ac9Courtney Goeltzenleuchter  print('Packaging Vulkan validation layers')
29406946e63825649a38568faec310b939628050ac9Courtney Goeltzenleuchter  subprocess.check_call(build_cmd)
295c048772a229bec939798ae73826a8ac74e52900aCourtney Goeltzenleuchter  print('Finished Packaging Vulkan validation layers')
296ab6c94ddf7bb67d37c4b3c32e5a7ecbf56c6bc03Courtney Goeltzenleuchter
297fe937d3f8a57279be45c3e6751301440816cf005Courtney Goeltzenleuchter  # clean install directory
29840b9f15375c21c4f5daf40b9355e4dd7e6149277Courtney Goeltzenleuchter  #shutil.rmtree(installdir)
29940b9f15375c21c4f5daf40b9355e4dd7e6149277Courtney Goeltzenleuchter  sleep 600
300ab6c94ddf7bb67d37c4b3c32e5a7ecbf56c6bc03Courtney Goeltzenleuchter
301ab6c94ddf7bb67d37c4b3c32e5a7ecbf56c6bc03Courtney Goeltzenleuchterif __name__ == '__main__':
302d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter  main()
303