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 build_utils.AddDepfileOption(parser) 30 parser.add_argument('--final', action='store_true', help='Use final fields.') 31 parser.add_argument( 32 '--enable-chromium-linker', 33 action='store_true', 34 help='Enable Chromium linker.') 35 parser.add_argument( 36 '--load-library-from-apk', 37 action='store_true', 38 help='Load libaries from APK without uncompressing.') 39 parser.add_argument( 40 '--use-modern-linker', action='store_true', help='To use ModernLinker.') 41 parser.add_argument( 42 '--native-libraries-list', help='File with list of native libraries.') 43 parser.add_argument( 44 '--version-number', 45 default='""', 46 help='Expected version of main library.') 47 parser.add_argument( 48 '--cpu-family', 49 choices={ 50 'CPU_FAMILY_ARM', 'CPU_FAMILY_X86', 'CPU_FAMILY_MIPS', 51 'CPU_FAMILY_UNKNOWN' 52 }, 53 required=True, 54 default='CPU_FAMILY_UNKNOWN', 55 help='CPU family.') 56 parser.add_argument( 57 '--main-component-library', 58 help='If used, the list of native libraries will only contain this ' 59 'library. Dependencies are found in the library\'s "NEEDED" section.') 60 61 parser.add_argument( 62 '--output', required=True, help='Path to the generated srcjar file.') 63 64 options = parser.parse_args(build_utils.ExpandFileArgs(sys.argv[1:])) 65 66 assert (options.enable_chromium_linker or not options.load_library_from_apk) 67 68 native_libraries_list = [] 69 if options.main_component_library: 70 native_libraries_list.append( 71 _FormatLibraryName(options.main_component_library)) 72 elif options.native_libraries_list: 73 with open(options.native_libraries_list) as f: 74 for path in f: 75 path = path.strip() 76 native_libraries_list.append(_FormatLibraryName(path)) 77 78 def bool_str(value): 79 if value: 80 return ' = true' 81 elif options.final: 82 return ' = false' 83 return '' 84 85 format_dict = { 86 'MAYBE_FINAL': 'final ' if options.final else '', 87 'USE_LINKER': bool_str(options.enable_chromium_linker), 88 'USE_LIBRARY_IN_ZIP_FILE': bool_str(options.load_library_from_apk), 89 'USE_MODERN_LINKER': bool_str(options.use_modern_linker), 90 'LIBRARIES': ','.join(native_libraries_list), 91 'VERSION_NUMBER': options.version_number, 92 'CPU_FAMILY': options.cpu_family, 93 } 94 with build_utils.AtomicOutput(options.output) as f: 95 with zipfile.ZipFile(f.name, 'w') as srcjar_file: 96 build_utils.AddToZipHermetic( 97 zip_file=srcjar_file, 98 zip_path='org/chromium/base/library_loader/NativeLibraries.java', 99 data=NATIVE_LIBRARIES_TEMPLATE.format(**format_dict)) 100 101 if options.depfile: 102 assert options.native_libraries_list 103 build_utils.WriteDepfile(options.depfile, 104 options.output, 105 inputs=[options.native_libraries_list]) 106 107 108if __name__ == '__main__': 109 sys.exit(main()) 110