#!/usr/bin/env python
#
# Copyright 2013 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.

import json
import optparse
import os
import sys

from util import build_utils


def StripLibrary(android_strip, android_strip_args, library_path, output_path):
  if build_utils.IsTimeStale(output_path, [library_path]):
    strip_cmd = ([android_strip] +
                 android_strip_args +
                 ['-o', output_path, library_path])
    build_utils.CheckOutput(strip_cmd)



def main():
  parser = optparse.OptionParser()

  parser.add_option('--android-strip',
      help='Path to the toolchain\'s strip binary')
  parser.add_option('--android-strip-arg', action='append',
      help='Argument to be passed to strip')
  parser.add_option('--libraries-dir',
      help='Directory for un-stripped libraries')
  parser.add_option('--stripped-libraries-dir',
      help='Directory for stripped libraries')
  parser.add_option('--libraries-file',
      help='Path to json file containing list of libraries')
  parser.add_option('--stamp', help='Path to touch on success')


  options, _ = parser.parse_args()

  with open(options.libraries_file, 'r') as libfile:
    libraries = json.load(libfile)

  build_utils.MakeDirectory(options.stripped_libraries_dir)

  for library in libraries:
    library_path = os.path.join(options.libraries_dir, library)
    stripped_library_path = os.path.join(
        options.stripped_libraries_dir, library)
    StripLibrary(options.android_strip, options.android_strip_arg, library_path,
        stripped_library_path)

  if options.stamp:
    build_utils.Touch(options.stamp)


if __name__ == '__main__':
  sys.exit(main())
