1#!/usr/bin/env python 2# 3# Copyright 2019 The Chromium Authors. All rights reserved. 4# Use of this source code is governed by a BSD-style license that can be 5# found in the LICENSE file. 6 7"""Writes list of native libraries to srcjar file.""" 8 9import argparse 10import os 11import sys 12import zipfile 13 14from native_libraries_template import NATIVE_LIBRARIES_TEMPLATE 15from util import build_utils 16 17 18def _FormatLibraryName(library_name): 19 filename = os.path.split(library_name)[1] 20 assert filename.startswith('lib') 21 assert filename.endswith('.so') 22 # Remove lib prefix and .so suffix. 23 return '"%s"' % filename[3:-3] 24 25 26def main(): 27 parser = argparse.ArgumentParser() 28 29 parser.add_argument('--final', action='store_true', help='Use final fields.') 30 parser.add_argument( 31 '--enable-chromium-linker', 32 action='store_true', 33 help='Enable Chromium linker.') 34 parser.add_argument( 35 '--load-library-from-apk', 36 action='store_true', 37 help='Load libaries from APK without uncompressing.') 38 parser.add_argument( 39 '--use-modern-linker', action='store_true', help='To use ModernLinker.') 40 parser.add_argument( 41 '--native-libraries-list', help='File with list of native libraries.') 42 parser.add_argument( 43 '--version-number', 44 default='""', 45 help='Expected version of main library.') 46 parser.add_argument( 47 '--cpu-family', 48 choices={ 49 'CPU_FAMILY_ARM', 'CPU_FAMILY_X86', 'CPU_FAMILY_MIPS', 50 'CPU_FAMILY_UNKNOWN' 51 }, 52 required=True, 53 default='CPU_FAMILY_UNKNOWN', 54 help='CPU family.') 55 parser.add_argument( 56 '--main-component-library', 57 help='If used, the list of native libraries will only contain this ' 58 'library. Dependencies are found in the library\'s "NEEDED" section.') 59 60 parser.add_argument( 61 '--output', required=True, help='Path to the generated srcjar file.') 62 63 options = parser.parse_args(build_utils.ExpandFileArgs(sys.argv[1:])) 64 65 assert (options.enable_chromium_linker or not options.load_library_from_apk) 66 67 native_libraries_list = [] 68 if options.main_component_library: 69 native_libraries_list.append( 70 _FormatLibraryName(options.main_component_library)) 71 elif options.native_libraries_list: 72 with open(options.native_libraries_list) as f: 73 for path in f: 74 path = path.strip() 75 native_libraries_list.append(_FormatLibraryName(path)) 76 77 def bool_str(value): 78 if value: 79 return ' = true' 80 elif options.final: 81 return ' = false' 82 return '' 83 84 format_dict = { 85 'MAYBE_FINAL': 'final ' if options.final else '', 86 'USE_LINKER': bool_str(options.enable_chromium_linker), 87 'USE_LIBRARY_IN_ZIP_FILE': bool_str(options.load_library_from_apk), 88 'USE_MODERN_LINKER': bool_str(options.use_modern_linker), 89 'LIBRARIES': ','.join(native_libraries_list), 90 'VERSION_NUMBER': options.version_number, 91 'CPU_FAMILY': options.cpu_family, 92 } 93 with build_utils.AtomicOutput(options.output) as f: 94 with zipfile.ZipFile(f.name, 'w') as srcjar_file: 95 build_utils.AddToZipHermetic( 96 zip_file=srcjar_file, 97 zip_path='org/chromium/base/library_loader/NativeLibraries.java', 98 data=NATIVE_LIBRARIES_TEMPLATE.format(**format_dict)) 99 100 101if __name__ == '__main__': 102 sys.exit(main()) 103