#!/usr/bin/env python3
# Copyright 2018 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.
"""Generate linker version scripts for Chrome on Android shared libraries."""

import argparse
import os

from util import build_utils

_SCRIPT_HEADER = """\
# AUTO-GENERATED FILE.  DO NOT MODIFY.
#
# See: %s

{
  global:
""" % os.path.relpath(__file__, build_utils.DIR_SOURCE_ROOT)

_SCRIPT_FOOTER = """\
  local:
    *;
};
"""


def main():
  parser = argparse.ArgumentParser()
  parser.add_argument(
      '--output',
      required=True,
      help='Path to output linker version script file.')
  parser.add_argument(
      '--export-java-symbols',
      action='store_true',
      help='Export Java_* JNI methods')
  parser.add_argument(
      '--export-symbol-allowlist-file',
      action='append',
      default=[],
      dest='allowlists',
      help='Path to an input file containing an allowlist of extra symbols to '
      'export, one symbol per line. Multiple files may be specified.')
  parser.add_argument(
      '--export-feature-registrations',
      action='store_true',
      help='Export JNI_OnLoad_* methods')
  options = parser.parse_args()

  # JNI_OnLoad is always exported.
  # CrashpadHandlerMain() is the entry point to the Crashpad handler, required
  # for libcrashpad_handler_trampoline.so.
  symbol_list = ['CrashpadHandlerMain', 'JNI_OnLoad']

  if options.export_java_symbols:
    symbol_list.append('Java_*')

  if options.export_feature_registrations:
    symbol_list.append('JNI_OnLoad_*')

  for allowlist in options.allowlists:
    with open(allowlist, 'rt') as f:
      for line in f:
        line = line.strip()
        if not line or line[0] == '#':
          continue
        symbol_list.append(line)

  script_content = [_SCRIPT_HEADER]
  for symbol in symbol_list:
    script_content.append('    %s;\n' % symbol)
  script_content.append(_SCRIPT_FOOTER)

  script = ''.join(script_content)

  with build_utils.AtomicOutput(options.output, mode='w') as f:
    f.write(script)


if __name__ == '__main__':
  main()
