build.py revision d1718641a097fea0c7e4025d2f511255dbd0cadf
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
23ab6c94ddf7bb67d37c4b3c32e5a7ecbf56c6bc03Courtney Goeltzenleuchter
24d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney GoeltzenleuchterTHIS_DIR = os.path.realpath(os.path.dirname(__file__))
25d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter
26d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney GoeltzenleuchterALL_ARCHITECTURES = (
27d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter  'arm',
28d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter  'arm64',
29d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter  'mips',
30d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter  'mips64',
31d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter  'x86',
32d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter  'x86_64',
33d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter)
34d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter
35d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney GoeltzenleuchterALL_ABIS = (
36d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter  'armeabi',
37d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter  'armeabi-v7a',
38d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter  'arm64-v8a',
39d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter  'mips',
40d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter  'mips64',
41d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter  'x86',
42d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter  'x86_64',
43d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter)
44d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter
45d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchterdef jobs_arg():
46d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter  return '-j{}'.format(multiprocessing.cpu_count() * 2)
47d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter
48d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchterdef arch_to_abis(arch):
49d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter  return {
50d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter    'arm': ['armeabi', 'armeabi-v7a'],
51d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter    'arm64': ['arm64-v8a'],
52d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter    'mips': ['mips'],
53d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter    'mips64': ['mips64'],
54d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter    'x86': ['x86'],
55d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter    'x86_64': ['x86_64'],
56d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter  }[arch]
57d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter
58d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchterclass ArgParser(argparse.ArgumentParser):
59d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter  def __init__(self):
60d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter    super(ArgParser, self).__init__()
61d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter
62d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter    self.add_argument(
63d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter      '--out-dir', help='Directory to place temporary build files.',
64d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter      type=os.path.realpath, default=os.path.join(THIS_DIR, 'out'))
65d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter
66d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter    self.add_argument(
67d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter      '--arch', choices=ALL_ARCHITECTURES,
68d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter      help='Architectures to build. Builds all if not present.')
69d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter
70d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter    # The default for --dist-dir has to be handled after parsing all
71d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter    # arguments because the default is derived from --out-dir. This is
72d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter    # handled in run().
73d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter    self.add_argument(
74d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter      '--dist-dir', help='Directory to place the packaged artifact.',
75d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter      type=os.path.realpath)
76d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter
77d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter
78ab6c94ddf7bb67d37c4b3c32e5a7ecbf56c6bc03Courtney Goeltzenleuchterdef main():
79d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter  print('Constructing Vulkan validation layer source...')
80d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter
81d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter  print('THIS_DIR: %s' % THIS_DIR)
82d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter  parser = ArgParser()
83d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter  args = parser.parse_args()
84d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter
85d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter  arches = ALL_ARCHITECTURES
86d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter  if args.arch is not None:
87d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter    arches = [args.arch]
88d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter
89d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter  abis = []
90d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter  for arch in arches:
91d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter    abis.extend(arch_to_abis(arch))
92d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter
93d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter  # According to vk_platform.h, armeabi is not supported for Vulkan
94d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter  # so remove it from the abis list.
95d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter  abis.remove('armeabi')
96d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter
97d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter  build_cmd = [
98d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter    'bash', THIS_DIR + '/android-generate.sh'
99d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter  ]
100d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter  print('Generating generated layers...')
101d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter  subprocess.check_call(build_cmd)
102d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter  print('Generation finished')
103d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter
104d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter  if os.path.isdir('/buildbot/android-ndk'):
105d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter    ndk_dir = '/buildbot/android-ndk'
106d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter  elif os.path.isdir(os.environ['NDK_PATH']):
107d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter    ndk_dir = os.environ['NDK_PATH'];
108d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter  else:
109d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter    print('Error: No NDK environment found')
110d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter    return
111d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter
112d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter  ndk_build = os.path.join(ndk_dir, 'ndk-build')
113d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter  platforms_root = os.path.join(ndk_dir, 'platforms')
114d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter  toolchains_root = os.path.join(ndk_dir, 'toolchains')
115d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter  build_dir = THIS_DIR
116d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter
117d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter  print('ndk_dir: %s' % ndk_dir)
118d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter  print('ndk_build: %s' % ndk_build)
119d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter
120d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter  compiler = 'clang'
121d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter  stl = 'gnustl_static'
122d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter  obj_out = os.path.join(THIS_DIR, stl, 'obj')
123d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter  lib_out = os.path.join(THIS_DIR, 'jniLibs')
124d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter
125d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter  build_cmd = [
126d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter    'bash', ndk_build, '-C', build_dir, jobs_arg(),
127d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter    'APP_ABI=' + ' '.join(abis),
128d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter    # Use the prebuilt platforms and toolchains.
129d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter    'NDK_PLATFORMS_ROOT=' + platforms_root,
130d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter    'NDK_TOOLCHAINS_ROOT=' + toolchains_root,
131d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter    'GNUSTL_PREFIX=',
132d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter
133d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter    # Tell ndk-build where all of our makefiles are and where outputs
134d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter    # should go. The defaults in ndk-build are only valid if we have a
135d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter    # typical ndk-build layout with a jni/{Android,Application}.mk.
136d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter    'NDK_PROJECT_PATH=null',
137d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter    'NDK_TOOLCHAIN_VERSION=' + compiler,
138d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter    'APP_BUILD_SCRIPT=' + os.path.join(build_dir, 'jni', 'Android.mk'),
139d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter    'APP_STL=' + stl,
140d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter    'NDK_APPLICATION_MK=' + os.path.join(build_dir, 'jni', 'Application.mk'),
141d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter    'NDK_OUT=' + obj_out,
142d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter    'NDK_LIBS_OUT=' + lib_out,
143d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter    'THIRD_PARTY_PATH=',
144d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter
145d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter    # Put armeabi-v7a-hard in its own directory.
146d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter    '_NDK_TESTING_ALL_=yes'
147d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter  ]
148d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter
149d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter  print('Building Vulkan validation layers for ABIs:' +
150d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter    ' {}'.format(', '.join(abis)))
151d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter  subprocess.check_call(build_cmd)
152d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter
153d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter  print('Finished building Vulkan validation layers')
154ab6c94ddf7bb67d37c4b3c32e5a7ecbf56c6bc03Courtney Goeltzenleuchter
155ab6c94ddf7bb67d37c4b3c32e5a7ecbf56c6bc03Courtney Goeltzenleuchter
156ab6c94ddf7bb67d37c4b3c32e5a7ecbf56c6bc03Courtney Goeltzenleuchterif __name__ == '__main__':
157d1718641a097fea0c7e4025d2f511255dbd0cadfCourtney Goeltzenleuchter  main()
158