Home | History | Annotate | Download | only in ndk
      1 #!/usr/bin/env python
      2 #
      3 # Copyright 2015 Google Inc. All rights reserved.
      4 #
      5 # Licensed under the Apache License, Version 2.0 (the "License");
      6 # you may not use this file except in compliance with the License.
      7 # You may obtain a copy of the License at
      8 #
      9 #     http://www.apache.org/licenses/LICENSE-2.0
     10 #
     11 # Unless required by applicable law or agreed to in writing, software
     12 # distributed under the License is distributed on an "AS IS" BASIS,
     13 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     14 # See the License for the specific language governing permissions and
     15 # limitations under the License.
     16 
     17 import os
     18 
     19 
     20 def local_path(path):
     21     return os.path.normpath(os.path.join(os.path.dirname(__file__), path))
     22 
     23 
     24 def find(path, names):
     25     found = []
     26     for root, _, files in os.walk(path):
     27         for file_name in sorted(files):
     28             if file_name in names:
     29                 abspath = os.path.abspath(os.path.join(root, file_name))
     30                 rel_to_root = abspath.replace(os.path.abspath(path), '')
     31                 found.append(rel_to_root[1:])  # strip leading /
     32     return found
     33 
     34 
     35 def sdk_version_from_path(path):
     36     return int(path.split('/')[0].split('-')[1])
     37 
     38 
     39 def sdk_versions():
     40     versions = []
     41     for sdk in os.listdir(local_path('current/platforms')):
     42         if sdk.startswith('android-'):
     43             versions.append(sdk_version_from_path(sdk))
     44     return sorted(versions)
     45 
     46 
     47 def gen_defaults():
     48     defaults = []
     49     for sdk in sdk_versions():
     50         default = []
     51         arch_flags = []
     52 
     53         for arch in ['arm', 'arm64', 'mips', 'mips64', 'x86', 'x86_64']:
     54             arch_path = local_path(
     55                 'current/platforms/android-{sdk}/arch-{arch}'.format(sdk=sdk, arch=arch))
     56             if not os.path.exists(arch_path):
     57                 arch_flags.append(
     58                     '        {arch}: {{ enabled: false, }},'.format(arch=arch))
     59 
     60         default.append('cc_defaults {{\n'
     61                        '    name: "ndk_{version}_defaults",'.format(version=sdk))
     62         if len(arch_flags) > 0:
     63             default.append('    arch: {{\n{arch_flags}\n'
     64                            '    }},'.format(arch_flags='\n'.join(arch_flags)))
     65         default.append('}')
     66         defaults.append('\n'.join(default))
     67     return defaults
     68 
     69 
     70 def get_prebuilts(names):
     71     prebuilts_path = local_path('current/platforms')
     72     prebuilts = find(prebuilts_path, names)
     73     prebuilts = [p for p in prebuilts if 'arch-arm/' in p]
     74     prebuilts.sort(key=sdk_version_from_path)
     75     return prebuilts
     76 
     77 
     78 def gen_lib_prebuilt(prebuilt, name, version):
     79     platform = os.path.join('current', 'platforms',
     80                             prebuilt.partition('/')[0])
     81     includes = os.path.join(platform, 'arch-{}/usr/include')
     82     arch_flags = []
     83     for arch in ['arm', 'arm64', 'mips', 'mips64', 'x86', 'x86_64']:
     84         inc = includes.format(arch)
     85         if os.path.exists(inc):
     86             arch_flags.append(
     87                 '        {arch}: {{\n'
     88                 '            export_include_dirs: ["{includes}"],\n'
     89                 '        }},'.format(arch=arch, includes=inc))
     90     return ('ndk_prebuilt_library {{\n'
     91             '    name: "ndk_{name}.{version}",\n'
     92             '    defaults: ["ndk_{version}_defaults"],\n'
     93             '    sdk_version: "{version}",\n'
     94             '    arch: {{\n{arch_flags}\n'
     95             '    }},\n'
     96             '}}'.format(name=name, version=version,
     97                         arch_flags='\n'.join(arch_flags)))
     98 
     99 
    100 def gen_crt_prebuilt(_, name, version):
    101     return ('ndk_prebuilt_object {{\n'
    102             '    name: "ndk_{name}.{version}",\n'
    103             '    defaults: ["ndk_{version}_defaults"],\n'
    104             '    sdk_version: "{version}",\n'
    105             '}}'.format(name=name, version=version))
    106 
    107 
    108 def gen_prebuilts(fn, names):
    109     prebuilts = []
    110     for prebuilt in get_prebuilts(names):
    111         name = os.path.splitext(os.path.basename(prebuilt))[0]
    112         version = sdk_version_from_path(prebuilt)
    113         prebuilts.append(fn(prebuilt, name, version))
    114     return prebuilts
    115 
    116 
    117 def main():
    118     blueprints = gen_defaults()
    119     blueprints.extend(gen_prebuilts(gen_lib_prebuilt, ('libc.so', 'libm.so')))
    120     blueprints.extend(gen_prebuilts(gen_crt_prebuilt, (
    121         'crtbegin_so.o',
    122         'crtend_so.o',
    123         'crtbegin_dynamic.o',
    124         'crtbegin_static.o',
    125         'crtend_android.o')))
    126 
    127     with open(local_path('Android.bp'), 'w') as f:
    128         f.write('// THIS FILE IS AUTOGENERATED BY gen-blueprints.py\n')
    129         f.write('// DO NOT EDIT\n')
    130         f.write('\n')
    131         f.write('\n\n'.join(blueprints))
    132         f.write('\n\n')
    133         f.write('build = ["stl.bp"]\n')
    134 
    135 
    136 if __name__ == '__main__':
    137     main()
    138