#!/usr/bin/env python

# Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
#
# Use of this source code is governed by a BSD-style license
# that can be found in the LICENSE file in the root of the source
# tree. An additional intellectual property rights grant can be found
# in the file PATENTS.  All contributing project authors may
# be found in the AUTHORS file in the root of the source tree.

# Searches for libraries or object files on the specified path and merges them
# them into a single library. Assumes ninja is used on all platforms.

import fnmatch
import os
import subprocess
import sys

IGNORE_PATTERNS = ['do_not_use', 'protoc']

def FindFiles(path, pattern):
  """Finds files matching |pattern| under |path|.

  Returns a list of file paths matching |pattern|, by walking the directory tree
  under |path|. Filenames containing the string 'do_not_use' or 'protoc' are
  excluded.

  Args:
    path: The root path for the search.
    pattern: A shell-style wildcard pattern to match filenames against.
        (e.g. '*.a')

  Returns:
    A list of file paths, relative to the current working directory.
  """
  files = []
  for root, _, filenames in os.walk(path):
    for filename in fnmatch.filter(filenames, pattern):
      if all(pattern not in filename for pattern in IGNORE_PATTERNS):
        # We use the relative path here to avoid "argument list too
        # long" errors on Linux.  Note: This doesn't always work, so
        # we use the find command on Linux.
        files.append(os.path.relpath(os.path.join(root, filename)))
  return files


def main(argv):
  if len(argv) != 3:
    sys.stderr.write('Usage: ' + argv[0] + ' <search_path> <output_lib>\n')
    return 1

  search_path = os.path.normpath(argv[1])
  output_lib = os.path.normpath(argv[2])

  if not os.path.exists(search_path):
    sys.stderr.write('search_path does not exist: %s\n' % search_path)
    return 1

  if os.path.isfile(output_lib):
    os.remove(output_lib)

  if sys.platform.startswith('linux'):
    pattern = '*.o'
    cmd = 'ar crs'
  elif sys.platform == 'darwin':
    pattern = '*.a'
    cmd = 'libtool -static -v -o '
  elif sys.platform == 'win32':
    pattern = '*.lib'
    cmd = 'lib /OUT:'
  else:
    sys.stderr.write('Platform not supported: %r\n\n' % sys.platform)
    return 1

  if sys.platform.startswith('linux'):
    cmd = ' '.join(['find', search_path, '-name "' + pattern + '"' +
                    ' -and -not -name ' +
                    ' -and -not -name '.join(IGNORE_PATTERNS) +
                    ' -exec', cmd, output_lib, '{} +'])
  else:
    cmd = ' '.join([cmd + output_lib] + FindFiles(search_path, pattern))
  print cmd
  subprocess.check_call(cmd, shell=True)
  return 0

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