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