• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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,
9optionally removing some of the object files in the input libs by regular
10expression matching.
11For usage information, run the script with a --help argument.
12'''
13import optparse
14import os
15import re
16import subprocess
17import sys
18
19
20def 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
34def 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
48def 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
64USAGE = '''usage: %prog [options] <lib or obj>+
65
66Combines input libraries or objects into an output library, while removing
67any object file (in the input libraries) that matches a given regular
68expression.
69'''
70
71def 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
81def 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
115if __name__ == '__main__':
116  sys.exit(Main())
117