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 """Generates the Android.bp file for prebuilts/ndk.""" 17 import os 18 19 20 def local_path(path): 21 """Returns an abspath to the given path from this file's directory.""" 22 return os.path.normpath(os.path.join(os.path.dirname(__file__), path)) 23 24 25 def find(path, names): 26 """Finds a list of files in a directory that match the given names.""" 27 found = [] 28 for root, _, files in os.walk(path): 29 for file_name in sorted(files): 30 if file_name in names: 31 abspath = os.path.abspath(os.path.join(root, file_name)) 32 rel_to_root = abspath.replace(os.path.abspath(path), '') 33 found.append(rel_to_root[1:]) # strip leading / 34 return found 35 36 37 def sdk_version_from_path(path): 38 """Returns the integer SDK version for the given path.""" 39 return int(path.split('/')[0].split('-')[1]) 40 41 42 def get_prebuilts(names): 43 """Returns a list of prebuilt objects that match the given names.""" 44 prebuilts_path = local_path('current/platforms') 45 prebuilts = find(prebuilts_path, names) 46 prebuilts = [p for p in prebuilts if 'arch-arm/' in p] 47 prebuilts.sort(key=sdk_version_from_path) 48 return prebuilts 49 50 51 def gen_crt_prebuilt(_, name, version): 52 """Generate a module for a CRT prebuilt object.""" 53 return ('ndk_prebuilt_object {{\n' 54 ' name: "ndk_{name}.{version}",\n' 55 ' sdk_version: "{version}",\n' 56 '}}'.format(name=name, version=version)) 57 58 59 def gen_prebuilts(module_generator, names): 60 """Generate blueprints for the given modules.""" 61 prebuilts = [] 62 for prebuilt in get_prebuilts(names): 63 name = os.path.splitext(os.path.basename(prebuilt))[0] 64 version = sdk_version_from_path(prebuilt) 65 if version < 9: 66 # We don't support anything before Gingerbread any more. 67 continue 68 prebuilts.append(module_generator(prebuilt, name, version)) 69 return prebuilts 70 71 72 def main(): 73 """Program entry point.""" 74 blueprints = gen_prebuilts(gen_crt_prebuilt, ( 75 'crtbegin_so.o', 76 'crtend_so.o', 77 'crtbegin_dynamic.o', 78 'crtbegin_static.o', 79 'crtend_android.o')) 80 81 with open(local_path('Android.bp'), 'w') as bpfile: 82 bpfile.write('// THIS FILE IS AUTOGENERATED BY gen-blueprints.py\n') 83 bpfile.write('// DO NOT EDIT\n') 84 bpfile.write('\n') 85 bpfile.write('\n\n'.join(blueprints)) 86 bpfile.write('\n\n') 87 bpfile.write('build = ["cpufeatures.bp", "stl.bp"]') 88 89 90 if __name__ == '__main__': 91 main() 92