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 """Writes a build_config file. | 7 """Writes a build_config file. |
8 | 8 |
9 The build_config file for a target is a json file containing information about | 9 The build_config file for a target is a json file containing information about |
10 how to build that target based on the target's dependencies. This includes | 10 how to build that target based on the target's dependencies. This includes |
(...skipping 14 matching lines...) Expand all Loading... |
25 a. inputs/deps ensure that the action runs whenever one of the files changes | 25 a. inputs/deps ensure that the action runs whenever one of the files changes |
26 b. the files are added to the action's depfile | 26 b. the files are added to the action's depfile |
27 """ | 27 """ |
28 | 28 |
29 import optparse | 29 import optparse |
30 import os | 30 import os |
31 import sys | 31 import sys |
32 import xml.dom.minidom | 32 import xml.dom.minidom |
33 | 33 |
34 from util import build_utils | 34 from util import build_utils |
| 35 from util import md5_check |
35 | 36 |
36 import write_ordered_libraries | 37 import write_ordered_libraries |
37 | 38 |
38 class AndroidManifest(object): | 39 class AndroidManifest(object): |
39 def __init__(self, path): | 40 def __init__(self, path): |
40 self.path = path | 41 self.path = path |
41 dom = xml.dom.minidom.parse(path) | 42 dom = xml.dom.minidom.parse(path) |
42 manifests = dom.getElementsByTagName('manifest') | 43 manifests = dom.getElementsByTagName('manifest') |
43 assert len(manifests) == 1 | 44 assert len(manifests) == 1 |
44 self.manifest = manifests[0] | 45 self.manifest = manifests[0] |
(...skipping 271 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
316 c['jar_path'] for c in all_library_deps | 317 c['jar_path'] for c in all_library_deps |
317 ] | 318 ] |
318 } | 319 } |
319 manifest = AndroidManifest(options.android_manifest) | 320 manifest = AndroidManifest(options.android_manifest) |
320 deps_info['package_name'] = manifest.GetPackageName() | 321 deps_info['package_name'] = manifest.GetPackageName() |
321 if not options.tested_apk_config and manifest.GetInstrumentation(): | 322 if not options.tested_apk_config and manifest.GetInstrumentation(): |
322 # This must then have instrumentation only for itself. | 323 # This must then have instrumentation only for itself. |
323 manifest.CheckInstrumentation(manifest.GetPackageName()) | 324 manifest.CheckInstrumentation(manifest.GetPackageName()) |
324 | 325 |
325 library_paths = [] | 326 library_paths = [] |
326 java_libraries_list = [] | 327 java_libraries_list_holder = [None] |
327 if options.native_libs: | 328 libraries = build_utils.ParseGypList(options.native_libs or '[]') |
328 libraries = build_utils.ParseGypList(options.native_libs) | 329 if libraries: |
329 if libraries: | 330 def recompute_ordered_libraries(): |
330 libraries_dir = os.path.dirname(libraries[0]) | 331 libraries_dir = os.path.dirname(libraries[0]) |
331 write_ordered_libraries.SetReadelfPath(options.readelf_path) | 332 write_ordered_libraries.SetReadelfPath(options.readelf_path) |
332 write_ordered_libraries.SetLibraryDirs([libraries_dir]) | 333 write_ordered_libraries.SetLibraryDirs([libraries_dir]) |
333 all_native_library_deps = ( | 334 all_deps = ( |
334 write_ordered_libraries.GetSortedTransitiveDependenciesForBinaries( | 335 write_ordered_libraries.GetSortedTransitiveDependenciesForBinaries( |
335 libraries)) | 336 libraries)) |
336 # Create a java literal array with the "base" library names: | 337 # Create a java literal array with the "base" library names: |
337 # e.g. libfoo.so -> foo | 338 # e.g. libfoo.so -> foo |
338 java_libraries_list = '{%s}' % ','.join( | 339 java_libraries_list_holder[0] = ('{%s}' % ','.join( |
339 ['"%s"' % s[3:-3] for s in all_native_library_deps]) | 340 ['"%s"' % s[3:-3] for s in all_deps])) |
340 library_paths = map( | 341 library_paths.extend( |
341 write_ordered_libraries.FullLibraryPath, all_native_library_deps) | 342 write_ordered_libraries.FullLibraryPath(x) for x in all_deps) |
342 | 343 |
343 config['native'] = { | 344 # This step takes about 600ms on a z620 for chrome_apk, so it's worth |
344 'libraries': library_paths, | 345 # caching. |
345 'java_libraries_list': java_libraries_list | 346 md5_check.CallAndRecordIfStale( |
346 } | 347 recompute_ordered_libraries, |
| 348 record_path=options.build_config + '.nativelibs.md5.stamp', |
| 349 input_paths=libraries, |
| 350 output_paths=[options.build_config]) |
| 351 if not library_paths: |
| 352 prev_config = build_utils.ReadJson(options.build_config) |
| 353 java_libraries_list_holder[0] = ( |
| 354 prev_config['native']['java_libraries_list']) |
| 355 library_paths.extend(prev_config['native']['libraries']) |
| 356 |
| 357 config['native'] = { |
| 358 'libraries': library_paths, |
| 359 'java_libraries_list': java_libraries_list_holder[0], |
| 360 } |
347 | 361 |
348 build_utils.WriteJson(config, options.build_config, only_if_changed=True) | 362 build_utils.WriteJson(config, options.build_config, only_if_changed=True) |
349 | 363 |
350 if options.depfile: | 364 if options.depfile: |
351 build_utils.WriteDepfile( | 365 build_utils.WriteDepfile( |
352 options.depfile, | 366 options.depfile, |
353 deps.AllConfigPaths() + build_utils.GetPythonDependencies()) | 367 deps.AllConfigPaths() + build_utils.GetPythonDependencies()) |
354 | 368 |
355 | 369 |
356 if __name__ == '__main__': | 370 if __name__ == '__main__': |
357 sys.exit(main(sys.argv[1:])) | 371 sys.exit(main(sys.argv[1:])) |
OLD | NEW |