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