|  | #!/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', 'genperf'] | 
|  |  | 
|  | 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)) |