#!/usr/bin/env python3 # # Copyright 2019 The Chromium Authors # 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 re import sys import zipfile from util import build_utils import action_helpers # build_utils adds //build to sys.path. import zip_helpers _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; public static final int CPU_FAMILY_RISCV = 4; // Set to true to enable the use of the Chromium Linker. public static {MAYBE_FINAL}boolean sUseLinker{USE_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}; public static {MAYBE_FINAL}boolean sSupport32Bit{SUPPORT_32_BIT}; public static {MAYBE_FINAL}boolean sSupport64Bit{SUPPORT_64_BIT}; }} """ def _FormatLibraryName(library_name): filename = os.path.split(library_name)[1] assert filename.startswith('lib') and filename.endswith('.so'), filename # Remove lib prefix and .so suffix. return '"%s"' % filename[3:-3] def main(): parser = argparse.ArgumentParser() action_helpers.add_depfile_arg(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( '--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_RISCV', 'CPU_FAMILY_UNKNOWN' }, required=True, default='CPU_FAMILY_UNKNOWN', help='CPU family.') parser.add_argument( '--output', required=True, help='Path to the generated srcjar file.') parser.add_argument('--native-lib-32-bit', action='store_true', help='32-bit binaries.') parser.add_argument('--native-lib-64-bit', action='store_true', help='64-bit binaries.') options = parser.parse_args(build_utils.ExpandFileArgs(sys.argv[1:])) native_libraries = [] if options.native_libraries_list: with open(options.native_libraries_list) as f: native_libraries.extend(l.strip() for l in f) if options.enable_chromium_linker and len(native_libraries) > 1: sys.stderr.write( 'Multiple libraries not supported when using chromium linker. Found:\n') sys.stderr.write('\n'.join(native_libraries)) sys.stderr.write('\n') sys.exit(1) # When building for robolectric in component buildS, OS=linux causes # "libmirprotobuf.so.9" to be a dep. This script, as well as # System.loadLibrary("name") require libraries to end with ".so", so just # filter it out. native_libraries = [ f for f in native_libraries if not re.search(r'\.so\.\d+$', f) ] def bool_str(value): if value: return ' = true' if options.final: return ' = false' return '' format_dict = { 'MAYBE_FINAL': 'final ' if options.final else '', 'USE_LINKER': bool_str(options.enable_chromium_linker), 'LIBRARIES': ','.join(_FormatLibraryName(n) for n in native_libraries), 'CPU_FAMILY': options.cpu_family, 'SUPPORT_32_BIT': bool_str(options.native_lib_32_bit), 'SUPPORT_64_BIT': bool_str(options.native_lib_64_bit), } with action_helpers.atomic_output(options.output) as f: with zipfile.ZipFile(f.name, 'w') as srcjar_file: zip_helpers.add_to_zip_hermetic( 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 action_helpers.write_depfile(options.depfile, options.output, inputs=[options.native_libraries_list]) if __name__ == '__main__': sys.exit(main())