OLD | NEW |
1 #!/usr/bin/env python | 1 #!/usr/bin/env python |
2 | 2 |
3 # Copyright 2016 The Chromium Authors. All rights reserved. | 3 # Copyright 2016 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 import os | 7 import os |
8 import os.path | 8 import os.path |
9 import shutil | 9 import shutil |
10 import subprocess | 10 import subprocess |
(...skipping 13 matching lines...) Expand all Loading... |
24 # removal of the special driver arguments, described below). Then the driver | 24 # removal of the special driver arguments, described below). Then the driver |
25 # performs additional actions, based on these arguments: | 25 # performs additional actions, based on these arguments: |
26 # | 26 # |
27 # -Wcrl,dsym,<dsym_path_prefix> | 27 # -Wcrl,dsym,<dsym_path_prefix> |
28 # After invoking the linker, this will run `dsymutil` on the linker's | 28 # After invoking the linker, this will run `dsymutil` on the linker's |
29 # output, producing a dSYM bundle, stored at dsym_path_prefix. As an | 29 # output, producing a dSYM bundle, stored at dsym_path_prefix. As an |
30 # example, if the linker driver were invoked with: | 30 # example, if the linker driver were invoked with: |
31 # "... -o out/gn/obj/foo/libbar.dylib ... -Wcrl,dsym,out/gn ..." | 31 # "... -o out/gn/obj/foo/libbar.dylib ... -Wcrl,dsym,out/gn ..." |
32 # The resulting dSYM would be out/gn/libbar.dylib.dSYM/. | 32 # The resulting dSYM would be out/gn/libbar.dylib.dSYM/. |
33 # | 33 # |
| 34 # -Wcrl,unstripped,<unstripped_path_prefix> |
| 35 # After invoking the linker, and before strip, this will save a copy of |
| 36 # the unstripped linker output in the directory unstripped_path_prefix. |
| 37 # |
34 # -Wcrl,strip,<strip_arguments> | 38 # -Wcrl,strip,<strip_arguments> |
35 # After invoking the linker, and optionally dsymutil, this will run | 39 # After invoking the linker, and optionally dsymutil, this will run |
36 # the strip command on the linker's output. strip_arguments are | 40 # the strip command on the linker's output. strip_arguments are |
37 # comma-separated arguments to be passed to the strip command. | 41 # comma-separated arguments to be passed to the strip command. |
38 | 42 |
39 def Main(args): | 43 def Main(args): |
40 """Main function for the linker driver. Separates out the arguments for | 44 """Main function for the linker driver. Separates out the arguments for |
41 the main compiler driver and the linker driver, then invokes all the | 45 the main compiler driver and the linker driver, then invokes all the |
42 required tools. | 46 required tools. |
43 | 47 |
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
128 linker_out = _FindLinkerOutput(full_args) | 132 linker_out = _FindLinkerOutput(full_args) |
129 (head, tail) = os.path.split(linker_out) | 133 (head, tail) = os.path.split(linker_out) |
130 dsym_out = os.path.join(dsym_path_prefix, tail + '.dSYM') | 134 dsym_out = os.path.join(dsym_path_prefix, tail + '.dSYM') |
131 | 135 |
132 # Remove old dSYMs before invoking dsymutil. | 136 # Remove old dSYMs before invoking dsymutil. |
133 _RemovePath(dsym_out) | 137 _RemovePath(dsym_out) |
134 subprocess.check_call(['xcrun', 'dsymutil', '-o', dsym_out, linker_out]) | 138 subprocess.check_call(['xcrun', 'dsymutil', '-o', dsym_out, linker_out]) |
135 return [dsym_out] | 139 return [dsym_out] |
136 | 140 |
137 | 141 |
| 142 def RunSaveUnstripped(unstripped_path_prefix, full_args): |
| 143 """Linker driver action for -Wcrl,unstripped,<unstripped_path_prefix>. Copies |
| 144 the linker output to |unstripped_path_prefix| before stripping. |
| 145 |
| 146 Args: |
| 147 unstripped_path_prefix: string, The path at which the unstripped output |
| 148 should be located. |
| 149 full_args: list of string, Full argument list for the linker driver. |
| 150 |
| 151 Returns: |
| 152 list of string, Build step outputs. |
| 153 """ |
| 154 if not len(unstripped_path_prefix): |
| 155 raise ValueError('Unspecified unstripped output file') |
| 156 |
| 157 linker_out = _FindLinkerOutput(full_args) |
| 158 (head, tail) = os.path.split(linker_out) |
| 159 unstripped_out = os.path.join(unstripped_path_prefix, tail + '.unstripped') |
| 160 |
| 161 shutil.copyfile(linker_out, unstripped_out) |
| 162 return [unstripped_out] |
| 163 |
| 164 |
138 def RunStrip(strip_args_string, full_args): | 165 def RunStrip(strip_args_string, full_args): |
139 """Linker driver action for -Wcrl,strip,<strip_arguments>. | 166 """Linker driver action for -Wcrl,strip,<strip_arguments>. |
140 | 167 |
141 Args: | 168 Args: |
142 strip_args_string: string, Comma-separated arguments for `strip`. | 169 strip_args_string: string, Comma-separated arguments for `strip`. |
143 full_args: list of string, Full arguments for the linker driver. | 170 full_args: list of string, Full arguments for the linker driver. |
144 | 171 |
145 Returns: | 172 Returns: |
146 list of string, Build step outputs. | 173 list of string, Build step outputs. |
147 """ | 174 """ |
(...skipping 23 matching lines...) Expand all Loading... |
171 | 198 |
172 | 199 |
173 _LINKER_DRIVER_ARG_PREFIX = '-Wcrl,' | 200 _LINKER_DRIVER_ARG_PREFIX = '-Wcrl,' |
174 | 201 |
175 """List of linker driver actions. The sort order of this list affects the | 202 """List of linker driver actions. The sort order of this list affects the |
176 order in which the actions are invoked. The first item in the tuple is the | 203 order in which the actions are invoked. The first item in the tuple is the |
177 argument's -Wcrl,<sub_argument> and the second is the function to invoke. | 204 argument's -Wcrl,<sub_argument> and the second is the function to invoke. |
178 """ | 205 """ |
179 _LINKER_DRIVER_ACTIONS = [ | 206 _LINKER_DRIVER_ACTIONS = [ |
180 ('dsym,', RunDsymUtil), | 207 ('dsym,', RunDsymUtil), |
| 208 ('unstripped,', RunSaveUnstripped), |
181 ('strip,', RunStrip), | 209 ('strip,', RunStrip), |
182 ] | 210 ] |
183 | 211 |
184 | 212 |
185 if __name__ == '__main__': | 213 if __name__ == '__main__': |
186 Main(sys.argv) | 214 Main(sys.argv) |
187 sys.exit(0) | 215 sys.exit(0) |
OLD | NEW |