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