OLD | NEW |
---|---|
1 #!/usr/bin/env python | 1 #!/usr/bin/env python |
2 # | 2 # |
3 # Copyright 2013 The Chromium Authors. All rights reserved. | 3 # Copyright 2013 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 """Writes dependency ordered list of native libraries. | 7 """Writes dependency ordered list of native libraries. |
8 | 8 |
9 The list excludes any Android system libraries, as those are not bundled with | 9 The list excludes any Android system libraries, as those are not bundled with |
10 the APK. | 10 the APK. |
11 | 11 |
12 This list of libraries is used for several steps of building an APK. | 12 This list of libraries is used for several steps of building an APK. |
13 In the component build, the --input-libraries only needs to be the top-level | 13 In the component build, the --input-libraries only needs to be the top-level |
14 library (i.e. libcontent_shell_content_view). This will then use readelf to | 14 library (i.e. libcontent_shell_content_view). This will then use readelf to |
15 inspect the shared libraries and determine the full list of (non-system) | 15 inspect the shared libraries and determine the full list of (non-system) |
16 libraries that should be included in the APK. | 16 libraries that should be included in the APK. |
17 """ | 17 """ |
18 | 18 |
19 # TODO(cjhopman): See if we can expose the list of library dependencies from | 19 # TODO(cjhopman): See if we can expose the list of library dependencies from |
20 # gyp, rather than calculating it ourselves. | 20 # gyp, rather than calculating it ourselves. |
21 # http://crbug.com/225558 | 21 # http://crbug.com/225558 |
22 | 22 |
23 import optparse | 23 import optparse |
24 import os | 24 import os |
25 import re | 25 import re |
26 import sys | 26 import sys |
27 | 27 |
28 from util import build_utils | 28 from util import build_utils |
29 | 29 |
30 _options = None | 30 _readelf = None |
31 _library_dirs = None | |
32 | |
31 _library_re = re.compile( | 33 _library_re = re.compile( |
32 '.*NEEDED.*Shared library: \[(?P<library_name>[\w/.]+)\]') | 34 '.*NEEDED.*Shared library: \[(?P<library_name>[\w/.]+)\]') |
33 | 35 |
34 | 36 |
37 def SetReadelfPath(path): | |
38 global _readelf | |
39 _readelf = path | |
40 | |
41 | |
42 def SetLibraryDirs(dirs): | |
43 global _library_dirs | |
44 _library_dirs = dirs | |
45 | |
46 | |
35 def FullLibraryPath(library_name): | 47 def FullLibraryPath(library_name): |
36 for directory in _options.libraries_dir.split(','): | 48 assert _library_dirs is not None |
49 for directory in _library_dirs: | |
37 path = '%s/%s' % (directory, library_name) | 50 path = '%s/%s' % (directory, library_name) |
38 if os.path.exists(path): | 51 if os.path.exists(path): |
39 return path | 52 return path |
40 return library_name | 53 return library_name |
41 | 54 |
42 | 55 |
43 def IsSystemLibrary(library_name): | 56 def IsSystemLibrary(library_name): |
44 # If the library doesn't exist in the libraries directory, assume that it is | 57 # If the library doesn't exist in the libraries directory, assume that it is |
45 # an Android system library. | 58 # an Android system library. |
46 return not os.path.exists(FullLibraryPath(library_name)) | 59 return not os.path.exists(FullLibraryPath(library_name)) |
47 | 60 |
48 | 61 |
49 def CallReadElf(library_or_executable): | 62 def CallReadElf(library_or_executable): |
50 readelf_cmd = [_options.readelf, | 63 assert _readelf is not None |
64 readelf_cmd = [_readelf, | |
51 '-d', | 65 '-d', |
52 library_or_executable] | 66 FullLibraryPath(library_or_executable)] |
53 return build_utils.CheckOutput(readelf_cmd) | 67 return build_utils.CheckOutput(readelf_cmd) |
54 | 68 |
55 | 69 |
56 def GetDependencies(library_or_executable): | 70 def GetDependencies(library_or_executable): |
57 elf = CallReadElf(library_or_executable) | 71 elf = CallReadElf(library_or_executable) |
58 return set(_library_re.findall(elf)) | 72 return set(_library_re.findall(elf)) |
59 | 73 |
60 | 74 |
61 def GetNonSystemDependencies(library_name): | 75 def GetNonSystemDependencies(library_name): |
62 all_deps = GetDependencies(FullLibraryPath(library_name)) | 76 all_deps = GetDependencies(FullLibraryPath(library_name)) |
(...skipping 21 matching lines...) Expand all Loading... | |
84 parser = optparse.OptionParser() | 98 parser = optparse.OptionParser() |
85 | 99 |
86 parser.add_option('--input-libraries', | 100 parser.add_option('--input-libraries', |
87 help='A list of top-level input libraries.') | 101 help='A list of top-level input libraries.') |
88 parser.add_option('--libraries-dir', | 102 parser.add_option('--libraries-dir', |
89 help='The directory which contains shared libraries.') | 103 help='The directory which contains shared libraries.') |
90 parser.add_option('--readelf', help='Path to the readelf binary.') | 104 parser.add_option('--readelf', help='Path to the readelf binary.') |
91 parser.add_option('--output', help='Path to the generated .json file.') | 105 parser.add_option('--output', help='Path to the generated .json file.') |
92 parser.add_option('--stamp', help='Path to touch on success.') | 106 parser.add_option('--stamp', help='Path to touch on success.') |
93 | 107 |
94 global _options | 108 options, _ = parser.parse_args() |
95 _options, _ = parser.parse_args() | |
96 | 109 |
97 libraries = build_utils.ParseGypList(_options.input_libraries) | 110 SetReadelfPath(options.readelf) |
111 SetLibraryDirs(options.libraries_dir.split(',')) | |
112 | |
113 libraries = build_utils.ParseGypList(options.input_libraries) | |
98 if len(libraries): | 114 if len(libraries): |
99 libraries = GetSortedTransitiveDependenciesForBinaries(libraries) | 115 libraries = GetSortedTransitiveDependenciesForBinaries(libraries) |
100 | 116 |
101 build_utils.WriteJson(libraries, _options.output, only_if_changed=True) | 117 libraries_string = '{%s}' % ','.join(['"%s"' % s[3:-3] for s in libraries]) |
newt (away)
2014/08/11 23:55:23
what are you stripping away here with "s[3:-3]"?
cjhopman
2014/08/18 01:21:12
Done.
| |
102 | 118 |
103 if _options.stamp: | 119 build_utils.WriteJson( |
104 build_utils.Touch(_options.stamp) | 120 {'libraries': libraries, 'java_libraries_list': libraries_string}, |
121 options.output, | |
122 only_if_changed=True) | |
123 | |
124 if options.stamp: | |
125 build_utils.Touch(options.stamp) | |
105 | 126 |
106 | 127 |
107 if __name__ == '__main__': | 128 if __name__ == '__main__': |
108 sys.exit(main()) | 129 sys.exit(main()) |
109 | 130 |
110 | 131 |
OLD | NEW |