#!/usr/bin/env python3 # # Copyright 2019 The Chromium Authors. All rights reserved. # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. """Writes list of native libraries to srcjar file.""" import argparse import os import sys import zipfile from util import build_utils _NATIVE_LIBRARIES_TEMPLATE = """\ // This file is autogenerated by // build/android/gyp/write_native_libraries_java.py // Please do not change its content. package org.chromium.build; public class NativeLibraries {{ public static final int CPU_FAMILY_UNKNOWN = 0; public static final int CPU_FAMILY_ARM = 1; public static final int CPU_FAMILY_MIPS = 2; public static final int CPU_FAMILY_X86 = 3; // Set to true to enable the use of the Chromium Linker. public static {MAYBE_FINAL}boolean sUseLinker{USE_LINKER}; public static {MAYBE_FINAL}boolean sUseLibraryInZipFile{USE_LIBRARY_IN_ZIP_FILE}; public static {MAYBE_FINAL}boolean sUseModernLinker{USE_MODERN_LINKER}; // This is the list of native libraries to be loaded (in the correct order) // by LibraryLoader.java. public static {MAYBE_FINAL}String[] LIBRARIES = {{{LIBRARIES}}}; public static {MAYBE_FINAL}int sCpuFamily = {CPU_FAMILY}; }} """ def _FormatLibraryName(library_name): filename = os.path.split(library_name)[1] assert filename.startswith('lib') assert filename.endswith('.so') # Remove lib prefix and .so suffix. return '"%s"' % filename[3:-3] def main(): parser = argparse.ArgumentParser() build_utils.AddDepfileOption(parser) parser.add_argument('--final', action='store_true', help='Use final fields.') parser.add_argument( '--enable-chromium-linker', action='store_true', help='Enable Chromium linker.') parser.add_argument( '--load-library-from-apk', action='store_true', help='Load libaries from APK without uncompressing.') parser.add_argument( '--use-modern-linker', action='store_true', help='To use ModernLinker.') parser.add_argument( '--native-libraries-list', help='File with list of native libraries.') parser.add_argument( '--cpu-family', choices={ 'CPU_FAMILY_ARM', 'CPU_FAMILY_X86', 'CPU_FAMILY_MIPS', 'CPU_FAMILY_UNKNOWN' }, required=True, default='CPU_FAMILY_UNKNOWN', help='CPU family.') parser.add_argument( '--main-component-library', help='If used, the list of native libraries will only contain this ' 'library. Dependencies are found in the library\'s "NEEDED" section.') parser.add_argument( '--output', required=True, help='Path to the generated srcjar file.') options = parser.parse_args(build_utils.ExpandFileArgs(sys.argv[1:])) assert (options.enable_chromium_linker or not options.load_library_from_apk) native_libraries_list = [] if options.main_component_library: native_libraries_list.append( _FormatLibraryName(options.main_component_library)) elif options.native_libraries_list: with open(options.native_libraries_list) as f: for path in f: path = path.strip() native_libraries_list.append(_FormatLibraryName(path)) def bool_str(value): if value: return ' = true' elif options.final: return ' = false' return '' format_dict = { 'MAYBE_FINAL': 'final ' if options.final else '', 'USE_LINKER': bool_str(options.enable_chromium_linker), 'USE_LIBRARY_IN_ZIP_FILE': bool_str(options.load_library_from_apk), 'USE_MODERN_LINKER': bool_str(options.use_modern_linker), 'LIBRARIES': ','.join(native_libraries_list), 'CPU_FAMILY': options.cpu_family, } with build_utils.AtomicOutput(options.output) as f: with zipfile.ZipFile(f.name, 'w') as srcjar_file: build_utils.AddToZipHermetic( zip_file=srcjar_file, zip_path='org/chromium/build/NativeLibraries.java', data=_NATIVE_LIBRARIES_TEMPLATE.format(**format_dict)) if options.depfile: assert options.native_libraries_list build_utils.WriteDepfile(options.depfile, options.output, inputs=[options.native_libraries_list]) if __name__ == '__main__': sys.exit(main())