Home | History | Annotate | Download | only in build
      1 #!/usr/bin/env python
      2 
      3 # Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
      4 #
      5 # Use of this source code is governed by a BSD-style license
      6 # that can be found in the LICENSE file in the root of the source
      7 # tree. An additional intellectual property rights grant can be found
      8 # in the file PATENTS.  All contributing project authors may
      9 # be found in the AUTHORS file in the root of the source tree.
     10 
     11 # Searches for libraries or object files on the specified path and merges them
     12 # them into a single library. Assumes ninja is used on all platforms.
     13 
     14 import fnmatch
     15 import os
     16 import subprocess
     17 import sys
     18 
     19 IGNORE_PATTERNS = ['do_not_use', 'protoc', 'genperf']
     20 
     21 def FindFiles(path, pattern):
     22   """Finds files matching |pattern| under |path|.
     23 
     24   Returns a list of file paths matching |pattern|, by walking the directory tree
     25   under |path|. Filenames containing the string 'do_not_use' or 'protoc' are
     26   excluded.
     27 
     28   Args:
     29     path: The root path for the search.
     30     pattern: A shell-style wildcard pattern to match filenames against.
     31         (e.g. '*.a')
     32 
     33   Returns:
     34     A list of file paths, relative to the current working directory.
     35   """
     36   files = []
     37   for root, _, filenames in os.walk(path):
     38     for filename in fnmatch.filter(filenames, pattern):
     39       if all(pattern not in filename for pattern in IGNORE_PATTERNS):
     40         # We use the relative path here to avoid "argument list too
     41         # long" errors on Linux.  Note: This doesn't always work, so
     42         # we use the find command on Linux.
     43         files.append(os.path.relpath(os.path.join(root, filename)))
     44   return files
     45 
     46 
     47 def main(argv):
     48   if len(argv) != 3:
     49     sys.stderr.write('Usage: ' + argv[0] + ' <search_path> <output_lib>\n')
     50     return 1
     51 
     52   search_path = os.path.normpath(argv[1])
     53   output_lib = os.path.normpath(argv[2])
     54 
     55   if not os.path.exists(search_path):
     56     sys.stderr.write('search_path does not exist: %s\n' % search_path)
     57     return 1
     58 
     59   if os.path.isfile(output_lib):
     60     os.remove(output_lib)
     61 
     62   if sys.platform.startswith('linux'):
     63     pattern = '*.o'
     64     cmd = 'ar crs'
     65   elif sys.platform == 'darwin':
     66     pattern = '*.a'
     67     cmd = 'libtool -static -v -o '
     68   elif sys.platform == 'win32':
     69     pattern = '*.lib'
     70     cmd = 'lib /OUT:'
     71   else:
     72     sys.stderr.write('Platform not supported: %r\n\n' % sys.platform)
     73     return 1
     74 
     75   if sys.platform.startswith('linux'):
     76     cmd = ' '.join(['find', search_path, '-name "' + pattern + '"' +
     77                     ' -and -not -name ' +
     78                     ' -and -not -name '.join(IGNORE_PATTERNS) +
     79                     ' -exec', cmd, output_lib, '{} +'])
     80   else:
     81     cmd = ' '.join([cmd + output_lib] + FindFiles(search_path, pattern))
     82   print cmd
     83   subprocess.check_call(cmd, shell=True)
     84   return 0
     85 
     86 if __name__ == '__main__':
     87   sys.exit(main(sys.argv))
     88