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

"""Runs the 'ar' command after removing its output file first.

This script is invoked like:
  python gcc_ar_wrapper.py --ar=$AR --output=$OUT $OP $INPUTS
to do the equivalent of:
  rm -f $OUT && $AR $OP $OUT $INPUTS
"""

import argparse
import os
import subprocess
import sys

import wrapper_utils


def main():
  parser = argparse.ArgumentParser(description=__doc__)
  parser.add_argument('--ar',
                      required=True,
                      help='The ar binary to run',
                      metavar='PATH')
  parser.add_argument('--output',
                      required=True,
                      help='Output archive file',
                      metavar='ARCHIVE')
  parser.add_argument('--plugin',
                      help='Load plugin')
  parser.add_argument('--resource-whitelist',
                      help='Merge all resource whitelists into a single file.',
                      metavar='PATH')
  parser.add_argument('operation',
                      help='Operation on the archive')
  parser.add_argument('inputs', nargs='+',
                      help='Input files')
  args = parser.parse_args()

  # Specifies the type of object file ar should examine.
  # The ar on linux ignores this option.
  object_mode = []
  if sys.platform.startswith('aix'):
    # The @file feature is not available on ar for AIX.
    # For linux (and other posix like systems), the @file_name
    # option reads the contents of file_name as command line arguments.
    # For AIX we must parse these (rsp files) manually.
    # Read rspfile.
    args.inputs  = wrapper_utils.ResolveRspLinks(args.inputs)
    object_mode = ['-X64']
  else:
    if args.resource_whitelist:
      whitelist_candidates = wrapper_utils.ResolveRspLinks(args.inputs)
      wrapper_utils.CombineResourceWhitelists(
          whitelist_candidates, args.resource_whitelist)

  command = [args.ar] + object_mode + args.operation.split()
  if args.plugin is not None:
    command += ['--plugin', args.plugin]
  command.append(args.output)
  command += args.inputs

  # Remove the output file first.
  try:
    os.remove(args.output)
  except OSError as e:
    if e.errno != os.errno.ENOENT:
      raise

  # Now just run the ar command.
  return subprocess.call(wrapper_utils.CommandToRun(command))


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