| #!/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()) |