#!/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] + ' \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))