| OLD | NEW |
| (Empty) |
| 1 #!/usr/bin/env python | |
| 2 # Copyright (c) 2011 The Chromium Authors. All rights reserved. | |
| 3 # Use of this source code is governed by a BSD-style license that can be | |
| 4 # found in the LICENSE file. | |
| 5 | |
| 6 # TODO(slightlyoff): move to using shared version of this script. | |
| 7 | |
| 8 '''This script makes it easy to combine libs and object files to a new lib, | |
| 9 optionally removing some of the object files in the input libs by regular | |
| 10 expression matching. | |
| 11 For usage information, run the script with a --help argument. | |
| 12 ''' | |
| 13 import optparse | |
| 14 import os | |
| 15 import re | |
| 16 import subprocess | |
| 17 import sys | |
| 18 | |
| 19 | |
| 20 def Shell(*args): | |
| 21 '''Runs the program and args in args, returns the output from the program.''' | |
| 22 process = subprocess.Popen(args, | |
| 23 stdin = None, | |
| 24 stdout = subprocess.PIPE, | |
| 25 stderr = subprocess.STDOUT) | |
| 26 output = process.stdout.readlines() | |
| 27 process.wait() | |
| 28 retcode = process.returncode | |
| 29 if retcode != 0: | |
| 30 raise RuntimeError('%s exited with status %d' % (args[0], retcode)) | |
| 31 return output | |
| 32 | |
| 33 | |
| 34 def CollectRemovals(remove_re, inputs): | |
| 35 '''Returns a list of all object files in inputs that match remove_re.''' | |
| 36 removals = [] | |
| 37 for input in inputs: | |
| 38 output = Shell('lib.exe', '/list', input) | |
| 39 | |
| 40 for line in output: | |
| 41 line = line.rstrip() | |
| 42 if remove_re.search(line): | |
| 43 removals.append(line) | |
| 44 | |
| 45 return removals | |
| 46 | |
| 47 | |
| 48 def CombineLibraries(output, remove_re, inputs): | |
| 49 '''Combines all the libraries and objects in inputs, while removing any | |
| 50 object files that match remove_re. | |
| 51 ''' | |
| 52 removals = [] | |
| 53 if remove_re: | |
| 54 removals = CollectRemovals(remove_re, inputs) | |
| 55 | |
| 56 print removals | |
| 57 | |
| 58 args = ['lib.exe', '/out:%s' % output] | |
| 59 args += ['/remove:%s' % obj for obj in removals] | |
| 60 args += inputs | |
| 61 Shell(*args) | |
| 62 | |
| 63 | |
| 64 USAGE = '''usage: %prog [options] <lib or obj>+ | |
| 65 | |
| 66 Combines input libraries or objects into an output library, while removing | |
| 67 any object file (in the input libraries) that matches a given regular | |
| 68 expression. | |
| 69 ''' | |
| 70 | |
| 71 def GetOptionParser(): | |
| 72 parser = optparse.OptionParser(USAGE) | |
| 73 parser.add_option('-o', '--output', dest = 'output', | |
| 74 help = 'write to this output library') | |
| 75 parser.add_option('-r', '--remove', dest = 'remove', | |
| 76 help = 'object files matching this regexp will be removed ' | |
| 77 'from the output library') | |
| 78 return parser | |
| 79 | |
| 80 | |
| 81 def Main(): | |
| 82 '''Main function for this script''' | |
| 83 parser = GetOptionParser() | |
| 84 (opt, args) = parser.parse_args() | |
| 85 output = opt.output | |
| 86 remove = opt.remove | |
| 87 if not output: | |
| 88 parser.error('You must specify an output file') | |
| 89 | |
| 90 if not args: | |
| 91 parser.error('You must specify at least one object or library') | |
| 92 | |
| 93 output = output.strip() | |
| 94 remove = remove.strip() | |
| 95 | |
| 96 if remove: | |
| 97 try: | |
| 98 remove_re = re.compile(opt.remove) | |
| 99 except: | |
| 100 parser.error('%s is not a valid regular expression' % opt.remove) | |
| 101 else: | |
| 102 remove_re = None | |
| 103 | |
| 104 if sys.platform != 'win32' and sys.platform != 'cygwin': | |
| 105 parser.error('this script only works on Windows for now') | |
| 106 | |
| 107 # If this is set, we can't capture lib.exe's output. | |
| 108 if 'VS_UNICODE_OUTPUT' in os.environ: | |
| 109 del os.environ['VS_UNICODE_OUTPUT'] | |
| 110 | |
| 111 CombineLibraries(output, remove_re, args) | |
| 112 return 0 | |
| 113 | |
| 114 | |
| 115 if __name__ == '__main__': | |
| 116 sys.exit(Main()) | |
| OLD | NEW |