111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#!/usr/bin/env python 211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert# 311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert# Copyright 2015 Google Inc. All rights reserved. 411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert# 511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert# Licensed under the Apache License, Version 2.0 (the "License"); 611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert# you may not use this file except in compliance with the License. 711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert# You may obtain a copy of the License at 811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert# 911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert# http://www.apache.org/licenses/LICENSE-2.0 1011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert# 1111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert# Unless required by applicable law or agreed to in writing, software 1211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert# distributed under the License is distributed on an "AS IS" BASIS, 1311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert# See the License for the specific language governing permissions and 1511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert# limitations under the License. 1611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 1711cd02dfb91661c65134cac258cf5924270e9d2Dan Albertimport os 1811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 1911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 2011cd02dfb91661c65134cac258cf5924270e9d2Dan Albertdef local_path(path): 2111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return os.path.normpath(os.path.join(os.path.dirname(__file__), path)) 2211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 2311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 2411cd02dfb91661c65134cac258cf5924270e9d2Dan Albertdef find(path, names): 2511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert found = [] 2611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert for root, _, files in os.walk(path): 2711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert for file_name in sorted(files): 2811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert if file_name in names: 2911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert abspath = os.path.abspath(os.path.join(root, file_name)) 3011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert rel_to_root = abspath.replace(os.path.abspath(path), '') 3111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert found.append(rel_to_root[1:]) # strip leading / 3211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return found 3311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 3411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 3511cd02dfb91661c65134cac258cf5924270e9d2Dan Albertdef sdk_version_from_path(path): 3611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return int(path.split('/')[0].split('-')[1]) 3711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 3811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 3911cd02dfb91661c65134cac258cf5924270e9d2Dan Albertdef sdk_versions(): 4011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert versions = [] 4111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert for sdk in os.listdir(local_path('current/platforms')): 4211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert if sdk.startswith('android-'): 4311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert versions.append(sdk_version_from_path(sdk)) 4411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return sorted(versions) 4511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 4611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 4711cd02dfb91661c65134cac258cf5924270e9d2Dan Albertdef gen_defaults(): 4811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert defaults = [] 4911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert for sdk in sdk_versions(): 5011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert default = [] 5111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert arch_flags = [] 5211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 5311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert for arch in ['arm', 'arm64', 'mips', 'mips64', 'x86', 'x86_64']: 5411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert arch_path = local_path( 5511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 'current/platforms/android-{sdk}/arch-{arch}/usr/include'.format(sdk=sdk, arch=arch)) 5611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert if os.path.exists(arch_path): 5711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert arch_flags.append( 5811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ' {arch}: {{\n' 5911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ' export_include_dirs: ["{includes}"],\n' 6011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ' }},'.format(arch=arch, includes=arch_path)) 6111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 6211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert default.append('cc_defaults {{\n' 6311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ' name: "ndk_{version}_defaults",\n' 6411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ' sdk_version: "{version}",'.format(version=sdk)) 6511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert if len(arch_flags) > 0: 6611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert default.append(' arch: {{\n{arch_flags}\n' 6711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ' }},'.format(arch_flags='\n'.join(arch_flags))) 6811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert default.append('}') 6911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert defaults.append('\n'.join(default)) 7011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return defaults 7111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 7211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 7311cd02dfb91661c65134cac258cf5924270e9d2Dan Albertdef get_prebuilts(names): 7411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert prebuilts_path = local_path('current/platforms') 7511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert prebuilts = find(prebuilts_path, names) 7611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert prebuilts = [p for p in prebuilts if 'arch-arm/' in p] 7711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert prebuilts.sort(key=sdk_version_from_path) 7811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return prebuilts 7911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 8011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 8111cd02dfb91661c65134cac258cf5924270e9d2Dan Albertdef gen_lib_prebuilt(prebuilt, name, version): 8211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return ('ndk_prebuilt_library {{\n' 8311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ' name: "{name}.ndk.{version}",\n' 8411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ' defaults: ["ndk_{version}_defaults"],\n' 8511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert '}}'.format(name=name, version=version)) 8611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 8711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 8811cd02dfb91661c65134cac258cf5924270e9d2Dan Albertdef gen_crt_prebuilt(_, name, version): 8911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return ('ndk_prebuilt_object {{\n' 9011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ' name: "ndk_{name}.{version}",\n' 9111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ' sdk_version: "{version}",\n' 9211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert '}}'.format(name=name, version=version)) 9311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 9411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 9511cd02dfb91661c65134cac258cf5924270e9d2Dan Albertdef gen_prebuilts(fn, names): 9611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert prebuilts = [] 9711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert for prebuilt in get_prebuilts(names): 9811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert name = os.path.splitext(os.path.basename(prebuilt))[0] 9911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert version = sdk_version_from_path(prebuilt) 10011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert if version < 9: 10111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert # We don't support anything before Gingerbread any more. 10211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert continue 10311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert prebuilts.append(fn(prebuilt, name, version)) 10411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return prebuilts 10511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 10611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 10711cd02dfb91661c65134cac258cf5924270e9d2Dan Albertdef main(): 10811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert blueprints = gen_defaults() 10911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert blueprints.extend(gen_prebuilts(gen_crt_prebuilt, ( 11011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 'crtbegin_so.o', 11111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 'crtend_so.o', 11211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 'crtbegin_dynamic.o', 11311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 'crtbegin_static.o', 11411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 'crtend_android.o'))) 11511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 11611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert with open(local_path('Android.bp'), 'w') as f: 11711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert f.write('// THIS FILE IS AUTOGENERATED BY gen-blueprints.py\n') 11811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert f.write('// DO NOT EDIT\n') 11911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert f.write('\n') 12011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert f.write('\n\n'.join(blueprints)) 12111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert f.write('\n\n') 12211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert f.write('build = ["stl.bp"]\n') 12311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 12411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 12511cd02dfb91661c65134cac258cf5924270e9d2Dan Albertif __name__ == '__main__': 12611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert main() 127