OLD | NEW |
---|---|
1 #!/usr/bin/env python | 1 #!/usr/bin/env python |
2 # | 2 # |
3 # Copyright 2014 The Chromium Authors. All rights reserved. | 3 # Copyright 2014 The Chromium Authors. All rights reserved. |
4 # Use of this source code is governed by a BSD-style license that can be | 4 # Use of this source code is governed by a BSD-style license that can be |
5 # found in the LICENSE file. | 5 # found in the LICENSE file. |
6 | 6 |
7 """Links the deps of a binary into a static library. | 7 """Links the deps of a binary into a static library. |
8 | 8 |
9 Run with a working directory, the name of a binary target, and the name of the | 9 Run with a working directory, the name of a binary target, and the name of the |
10 static library that should be produced. For example: | 10 static library that should be produced. For example: |
11 | 11 |
12 $ link_dependencies.py out/Release-iphoneos \ | 12 $ link_dependencies.py out/Release-iphoneos \ |
13 crnet_consumer.app/crnet_consumer \ | 13 crnet_consumer.app/crnet_consumer \ |
14 out/Release-iphoneos/crnet_standalone.a | 14 out/Release-iphoneos/crnet_standalone.a |
15 """ | 15 """ |
16 | 16 |
17 import argparse | 17 import argparse |
18 import os | 18 import os |
19 import re | |
19 import subprocess | 20 import subprocess |
21 import sys | |
20 | 22 |
21 | 23 |
22 class SubprocessError(Exception): | 24 class SubprocessError(Exception): |
23 pass | 25 pass |
24 | 26 |
25 | 27 |
26 def extract_inputs(query_result, prefix=''): | 28 def extract_inputs(query_result, prefix=''): |
27 """Extracts inputs from ninja query output. | 29 """Extracts inputs from ninja query output. |
28 | 30 |
29 Given 'ninja -t query' output for a target, extracts all the inputs of that | 31 Given 'ninja -t query' output for a target, extracts all the inputs of that |
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
119 return deps | 121 return deps |
120 | 122 |
121 | 123 |
122 def link(output, inputs): | 124 def link(output, inputs): |
123 """Links output from inputs using libtool. | 125 """Links output from inputs using libtool. |
124 | 126 |
125 Args: | 127 Args: |
126 output: file system path to desired output library | 128 output: file system path to desired output library |
127 inputs: list of file system paths to input libraries | 129 inputs: list of file system paths to input libraries |
128 """ | 130 """ |
129 p = subprocess.Popen(['libtool', '-o', output] + inputs) | 131 libtool_re = re.compile(r'^.*libtool: (?:for architecture: \S* )?' |
130 p.communicate() | 132 r'file: .* has no symbols$') |
133 p = subprocess.Popen( | |
134 ['libtool', '-o', output] + inputs, stderr=subprocess.PIPE) | |
135 _, err = p.communicate() | |
136 for line in err.splitlines(): | |
137 if not libtool_re.match(line) and not libtool_re5.match(line): | |
droger
2016/02/05 09:08:50
Where is libtool_re5 defined? Do we need to import
sdefresne
2016/02/05 09:58:56
Ooops. Removed.
| |
138 print >>sys.stderr, line | |
droger
2016/02/05 09:08:50
Missing whitespace after >>
sdefresne
2016/02/05 09:58:56
No, this is the syntax to write to a file using pr
| |
131 if p.returncode != 0: | 139 if p.returncode != 0: |
132 message = "subprocess libtool returned {0}".format(p.returncode) | 140 message = "subprocess libtool returned {0}".format(p.returncode) |
133 raise SubprocessError(message) | 141 raise SubprocessError(message) |
134 | 142 |
135 | 143 |
136 def main(): | 144 def main(): |
137 parser = argparse.ArgumentParser( | 145 parser = argparse.ArgumentParser( |
138 description='Link dependencies of a ninja target into a static library') | 146 description='Link dependencies of a ninja target into a static library') |
139 parser.add_argument('workdir', nargs=1, help='ninja working directory') | 147 parser.add_argument('workdir', nargs=1, help='ninja working directory') |
140 parser.add_argument('target', nargs=1, help='target to query for deps') | 148 parser.add_argument('target', nargs=1, help='target to query for deps') |
141 parser.add_argument('output', nargs=1, help='path to output static library') | 149 parser.add_argument('output', nargs=1, help='path to output static library') |
142 args = parser.parse_args() | 150 args = parser.parse_args() |
143 | 151 |
144 inputs = query_ninja(args.target[0], args.workdir[0]) | 152 inputs = query_ninja(args.target[0], args.workdir[0]) |
145 link(args.output[0], list(library_deps(inputs, args.workdir[0]))) | 153 link(args.output[0], list(library_deps(inputs, args.workdir[0]))) |
146 | 154 |
147 | 155 |
148 if __name__ == '__main__': | 156 if __name__ == '__main__': |
149 main() | 157 main() |
OLD | NEW |