Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(215)

Side by Side Diff: build/android/gyp/write_build_config.py

Issue 2069273002: [NOT FOR COMMIT] Added GN support for Android .AAR packaged libraries (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | build/config/android/internal_rules.gni » ('j') | build/config/android/rules.gni » ('J')
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 21 matching lines...) Expand all
32 import sys 32 import sys
33 import xml.dom.minidom 33 import xml.dom.minidom
34 34
35 from util import build_utils 35 from util import build_utils
36 from util import md5_check 36 from util import md5_check
37 37
38 import write_ordered_libraries 38 import write_ordered_libraries
39 39
40 40
41 # Types that should never be used as a dependency of another build config. 41 # Types that should never be used as a dependency of another build config.
42 _ROOT_TYPES = ('android_apk', 'deps_dex', 'java_binary', 'resource_rewriter') 42 _ROOT_TYPES = ('android_apk', 'deps_dex', 'java_binary', 'resource_rewriter',
43 'android_aar')
43 # Types that should not allow code deps to pass through. 44 # Types that should not allow code deps to pass through.
44 _RESOURCE_TYPES = ('android_assets', 'android_resources') 45 _RESOURCE_TYPES = ('android_assets', 'android_resources', 'android_aar')
agrieve 2016/06/16 02:00:04 aar matches the name here, but not the comment. Th
45 46
46 47
47 class AndroidManifest(object): 48 class AndroidManifest(object):
48 def __init__(self, path): 49 def __init__(self, path):
49 self.path = path 50 self.path = path
50 dom = xml.dom.minidom.parse(path) 51 dom = xml.dom.minidom.parse(path)
51 manifests = dom.getElementsByTagName('manifest') 52 manifests = dom.getElementsByTagName('manifest')
52 assert len(manifests) == 1 53 assert len(manifests) == 1
53 self.manifest = manifests[0] 54 self.manifest = manifests[0]
54 55
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
113 self.all_deps_configs = [ 114 self.all_deps_configs = [
114 GetDepConfig(p) for p in self.all_deps_config_paths] 115 GetDepConfig(p) for p in self.all_deps_config_paths]
115 self.direct_deps_config_paths = direct_deps_config_paths 116 self.direct_deps_config_paths = direct_deps_config_paths
116 117
117 def All(self, wanted_type=None): 118 def All(self, wanted_type=None):
118 if type is None: 119 if type is None:
119 return self.all_deps_configs 120 return self.all_deps_configs
120 return DepsOfType(wanted_type, self.all_deps_configs) 121 return DepsOfType(wanted_type, self.all_deps_configs)
121 122
122 def Direct(self, wanted_type=None): 123 def Direct(self, wanted_type=None):
124 additional_deps = []
123 if wanted_type is None: 125 if wanted_type is None:
124 return self.direct_deps_configs 126 return self.direct_deps_configs
125 return DepsOfType(wanted_type, self.direct_deps_configs) 127 if wanted_type in ['java_library', 'android_resources']:
agrieve 2016/06/16 02:00:03 an android_aar may or may not have resources / ass
128 additional_deps = DepsOfType('android_aar', self.direct_deps_configs)
129 return additional_deps + DepsOfType(wanted_type, self.direct_deps_configs)
126 130
127 def AllConfigPaths(self): 131 def AllConfigPaths(self):
128 return self.all_deps_config_paths 132 return self.all_deps_config_paths
129 133
130 def RemoveNonDirectDep(self, path): 134 def RemoveNonDirectDep(self, path):
131 if path in self.direct_deps_config_paths: 135 if path in self.direct_deps_config_paths:
132 raise Exception('Cannot remove direct dep.') 136 raise Exception('Cannot remove direct dep.')
133 self.all_deps_config_paths.remove(path) 137 self.all_deps_config_paths.remove(path)
134 self.all_deps_configs.remove(GetDepConfig(path)) 138 self.all_deps_configs.remove(GetDepConfig(path))
135 139
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after
251 255
252 if args: 256 if args:
253 parser.error('No positional arguments should be given.') 257 parser.error('No positional arguments should be given.')
254 258
255 required_options_map = { 259 required_options_map = {
256 'java_binary': ['build_config', 'jar_path'], 260 'java_binary': ['build_config', 'jar_path'],
257 'java_library': ['build_config', 'jar_path'], 261 'java_library': ['build_config', 'jar_path'],
258 'android_assets': ['build_config'], 262 'android_assets': ['build_config'],
259 'android_resources': ['build_config', 'resources_zip'], 263 'android_resources': ['build_config', 'resources_zip'],
260 'android_apk': ['build_config', 'jar_path', 'dex_path', 'resources_zip'], 264 'android_apk': ['build_config', 'jar_path', 'dex_path', 'resources_zip'],
265 'android_aar': ['build_config', 'jar_path', 'resources_zip'],
261 'deps_dex': ['build_config', 'dex_path'], 266 'deps_dex': ['build_config', 'dex_path'],
262 'resource_rewriter': ['build_config'], 267 'resource_rewriter': ['build_config'],
263 'group': ['build_config'], 268 'group': ['build_config'],
264 } 269 }
265 required_options = required_options_map.get(options.type) 270 required_options = required_options_map.get(options.type)
266 if not required_options: 271 if not required_options:
267 raise Exception('Unknown type: <%s>' % options.type) 272 raise Exception('Unknown type: <%s>' % options.type)
268 273
269 if options.native_libs: 274 if options.native_libs:
270 required_options.append('readelf_path') 275 required_options.append('readelf_path')
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
327 config = { 332 config = {
328 'deps_info': { 333 'deps_info': {
329 'name': os.path.basename(options.build_config), 334 'name': os.path.basename(options.build_config),
330 'path': options.build_config, 335 'path': options.build_config,
331 'type': options.type, 336 'type': options.type,
332 'deps_configs': direct_deps_config_paths 337 'deps_configs': direct_deps_config_paths
333 } 338 }
334 } 339 }
335 deps_info = config['deps_info'] 340 deps_info = config['deps_info']
336 341
337 if (options.type in ('java_binary', 'java_library') and 342 if (options.type in ('java_binary', 'java_library', 'android_aar') and
338 not options.bypass_platform_checks): 343 not options.bypass_platform_checks):
339 deps_info['requires_android'] = options.requires_android 344 deps_info['requires_android'] = options.requires_android
340 deps_info['supports_android'] = options.supports_android 345 deps_info['supports_android'] = options.supports_android
341 346
342 deps_require_android = (all_resources_deps + 347 deps_require_android = (all_resources_deps +
343 [d['name'] for d in all_library_deps if d['requires_android']]) 348 [d['name'] for d in all_library_deps if d['requires_android']])
344 deps_not_support_android = ( 349 deps_not_support_android = (
345 [d['name'] for d in all_library_deps if not d['supports_android']]) 350 [d['name'] for d in all_library_deps if not d['supports_android']])
346 351
347 if deps_require_android and not options.requires_android: 352 if deps_require_android and not options.requires_android:
348 raise Exception('Some deps require building for the Android platform: ' + 353 raise Exception('Some deps require building for the Android platform: ' +
349 str(deps_require_android)) 354 str(deps_require_android))
350 355
351 if deps_not_support_android and options.supports_android: 356 if deps_not_support_android and options.supports_android:
352 raise Exception('Not all deps support the Android platform: ' + 357 raise Exception('Not all deps support the Android platform: ' +
353 str(deps_not_support_android)) 358 str(deps_not_support_android))
354 359
355 if options.type in ('java_binary', 'java_library', 'android_apk'): 360 if options.type in ('java_binary', 'java_library', 'android_apk',
361 'android_aar'):
356 javac_classpath = [c['jar_path'] for c in direct_library_deps] 362 javac_classpath = [c['jar_path'] for c in direct_library_deps]
357 java_full_classpath = [c['jar_path'] for c in all_library_deps] 363 java_full_classpath = [c['jar_path'] for c in all_library_deps]
358 deps_info['resources_deps'] = [c['path'] for c in all_resources_deps] 364 deps_info['resources_deps'] = [c['path'] for c in all_resources_deps]
359 deps_info['jar_path'] = options.jar_path 365 deps_info['jar_path'] = options.jar_path
360 if options.type == 'android_apk' or options.supports_android: 366 if options.type == 'android_apk' or options.supports_android:
361 deps_info['dex_path'] = options.dex_path 367 deps_info['dex_path'] = options.dex_path
362 if options.type == 'android_apk': 368 if options.type == 'android_apk':
363 deps_info['apk_path'] = options.apk_path 369 deps_info['apk_path'] = options.apk_path
364 deps_info['incremental_apk_path'] = options.incremental_apk_path 370 deps_info['incremental_apk_path'] = options.incremental_apk_path
365 deps_info['incremental_install_script_path'] = ( 371 deps_info['incremental_install_script_path'] = (
366 options.incremental_install_script_path) 372 options.incremental_install_script_path)
367 373
368 # Classpath values filled in below (after applying tested_apk_config). 374 # Classpath values filled in below (after applying tested_apk_config).
369 config['javac'] = {} 375 config['javac'] = {}
370 376
371 if options.type in ('java_binary', 'java_library'): 377 if options.type in ('java_binary', 'java_library', 'android_aar'):
372 # Only resources might have srcjars (normal srcjar targets are listed in 378 # Only resources might have srcjars (normal srcjar targets are listed in
373 # srcjar_deps). A resource's srcjar contains the R.java file for those 379 # srcjar_deps). A resource's srcjar contains the R.java file for those
374 # resources, and (like Android's default build system) we allow a library to 380 # resources, and (like Android's default build system) we allow a library to
375 # refer to the resources in any of its dependents. 381 # refer to the resources in any of its dependents.
376 config['javac']['srcjars'] = [ 382 config['javac']['srcjars'] = [
377 c['srcjar'] for c in direct_resources_deps if 'srcjar' in c] 383 c['srcjar'] for c in direct_resources_deps if 'srcjar' in c]
378 384
379 # Used to strip out R.class for android_prebuilt()s. 385 # Used to strip out R.class for android_prebuilt()s.
380 if options.type == 'java_library': 386 if options.type in ('java_library', 'android_aar'):
381 config['javac']['resource_packages'] = [ 387 config['javac']['resource_packages'] = [
382 c['package_name'] for c in all_resources_deps if 'package_name' in c] 388 c['package_name'] for c in all_resources_deps if 'package_name' in c]
383 389
384 if options.type == 'android_apk': 390 if options.type == 'android_apk':
385 # Apks will get their resources srcjar explicitly passed to the java step. 391 # Apks will get their resources srcjar explicitly passed to the java step.
386 config['javac']['srcjars'] = [] 392 config['javac']['srcjars'] = []
387 393
388 if options.type == 'android_assets': 394 if options.type == 'android_assets':
agrieve 2016/06/16 02:00:03 might want to add a TODO for allowing aars with as
389 all_asset_sources = [] 395 all_asset_sources = []
390 if options.asset_renaming_sources: 396 if options.asset_renaming_sources:
391 all_asset_sources.extend( 397 all_asset_sources.extend(
392 build_utils.ParseGypList(options.asset_renaming_sources)) 398 build_utils.ParseGypList(options.asset_renaming_sources))
393 if options.asset_sources: 399 if options.asset_sources:
394 all_asset_sources.extend(build_utils.ParseGypList(options.asset_sources)) 400 all_asset_sources.extend(build_utils.ParseGypList(options.asset_sources))
395 401
396 deps_info['assets'] = { 402 deps_info['assets'] = {
397 'sources': all_asset_sources 403 'sources': all_asset_sources
398 } 404 }
399 if options.asset_renaming_destinations: 405 if options.asset_renaming_destinations:
400 deps_info['assets']['outputs'] = ( 406 deps_info['assets']['outputs'] = (
401 build_utils.ParseGypList(options.asset_renaming_destinations)) 407 build_utils.ParseGypList(options.asset_renaming_destinations))
402 if options.disable_asset_compression: 408 if options.disable_asset_compression:
403 deps_info['assets']['disable_compression'] = True 409 deps_info['assets']['disable_compression'] = True
404 410
405 if options.type == 'android_resources': 411 if options.type in ('android_resources', 'android_aar'):
agrieve 2016/06/16 02:00:03 Should probably update package_resources.py to not
406 deps_info['resources_zip'] = options.resources_zip 412 deps_info['resources_zip'] = options.resources_zip
407 if options.srcjar: 413 if options.srcjar:
408 deps_info['srcjar'] = options.srcjar 414 deps_info['srcjar'] = options.srcjar
409 if options.android_manifest: 415 if options.android_manifest:
agrieve 2016/06/16 02:00:03 I think you want to pass this flag as well from th
410 manifest = AndroidManifest(options.android_manifest) 416 manifest = AndroidManifest(options.android_manifest)
411 deps_info['package_name'] = manifest.GetPackageName() 417 deps_info['package_name'] = manifest.GetPackageName()
412 if options.package_name: 418 if options.package_name:
413 deps_info['package_name'] = options.package_name 419 deps_info['package_name'] = options.package_name
414 if options.r_text: 420 if options.r_text:
agrieve 2016/06/16 02:00:03 Is this being set for aar?
415 deps_info['r_text'] = options.r_text 421 deps_info['r_text'] = options.r_text
416 if options.is_locale_resource: 422 if options.is_locale_resource:
417 deps_info['is_locale_resource'] = True 423 deps_info['is_locale_resource'] = True
418 424
419 if options.type in ('android_resources','android_apk', 'resource_rewriter'): 425 if options.type in ('android_resources', 'android_apk', 'resource_rewriter',
426 'android_aar'):
420 config['resources'] = {} 427 config['resources'] = {}
421 config['resources']['dependency_zips'] = [ 428 config['resources']['dependency_zips'] = [
422 c['resources_zip'] for c in all_resources_deps] 429 c['resources_zip'] for c in all_resources_deps]
423 config['resources']['extra_package_names'] = [] 430 config['resources']['extra_package_names'] = []
424 config['resources']['extra_r_text_files'] = [] 431 config['resources']['extra_r_text_files'] = []
425 432
426 if options.type == 'android_apk' or options.type == 'resource_rewriter': 433 if options.type == 'android_apk' or options.type == 'resource_rewriter':
427 config['resources']['extra_package_names'] = [ 434 config['resources']['extra_package_names'] = [
428 c['package_name'] for c in all_resources_deps if 'package_name' in c] 435 c['package_name'] for c in all_resources_deps if 'package_name' in c]
429 config['resources']['extra_r_text_files'] = [ 436 config['resources']['extra_r_text_files'] = [
430 c['r_text'] for c in all_resources_deps if 'r_text' in c] 437 c['r_text'] for c in all_resources_deps if 'r_text' in c]
431 438
432 if options.type in ['android_apk', 'deps_dex']: 439 if options.type in ['android_apk', 'deps_dex']:
433 deps_dex_files = [c['dex_path'] for c in all_library_deps] 440 deps_dex_files = [c['dex_path'] for c in all_library_deps]
434 441
435 proguard_enabled = options.proguard_enabled 442 proguard_enabled = options.proguard_enabled
436 if options.type == 'android_apk': 443 if options.type == 'android_apk':
437 deps_info['proguard_enabled'] = proguard_enabled 444 deps_info['proguard_enabled'] = proguard_enabled
438 445
439 if proguard_enabled: 446 if proguard_enabled:
440 deps_info['proguard_info'] = options.proguard_info 447 deps_info['proguard_info'] = options.proguard_info
441 config['proguard'] = {} 448 config['proguard'] = {}
442 proguard_config = config['proguard'] 449 proguard_config = config['proguard']
443 proguard_config['input_paths'] = [options.jar_path] + java_full_classpath 450 proguard_config['input_paths'] = [options.jar_path] + java_full_classpath
agrieve 2016/06/16 02:00:03 Might want to add a TODO here to support adding th
444 451
445 # An instrumentation test apk should exclude the dex files that are in the apk 452 # An instrumentation test apk should exclude the dex files that are in the apk
446 # under test. 453 # under test.
447 if options.type == 'android_apk' and options.tested_apk_config: 454 if options.type == 'android_apk' and options.tested_apk_config:
448 tested_apk_library_deps = tested_apk_deps.All('java_library') 455 tested_apk_library_deps = tested_apk_deps.All('java_library')
449 tested_apk_deps_dex_files = [c['dex_path'] for c in tested_apk_library_deps] 456 tested_apk_deps_dex_files = [c['dex_path'] for c in tested_apk_library_deps]
450 # Include in the classpath classes that are added directly to the apk under 457 # Include in the classpath classes that are added directly to the apk under
451 # test (those that are not a part of a java_library). 458 # test (those that are not a part of a java_library).
452 tested_apk_config = GetDepConfig(options.tested_apk_config) 459 tested_apk_config = GetDepConfig(options.tested_apk_config)
453 javac_classpath.append(tested_apk_config['jar_path']) 460 javac_classpath.append(tested_apk_config['jar_path'])
454 # Exclude dex files from the test apk that exist within the apk under test. 461 # Exclude dex files from the test apk that exist within the apk under test.
455 deps_dex_files = [ 462 deps_dex_files = [
456 p for p in deps_dex_files if not p in tested_apk_deps_dex_files] 463 p for p in deps_dex_files if not p in tested_apk_deps_dex_files]
457 464
458 expected_tested_package = tested_apk_config['package_name'] 465 expected_tested_package = tested_apk_config['package_name']
459 AndroidManifest(options.android_manifest).CheckInstrumentation( 466 AndroidManifest(options.android_manifest).CheckInstrumentation(
460 expected_tested_package) 467 expected_tested_package)
461 if tested_apk_config['proguard_enabled']: 468 if tested_apk_config['proguard_enabled']:
462 assert proguard_enabled, ('proguard must be enabled for instrumentation' 469 assert proguard_enabled, ('proguard must be enabled for instrumentation'
463 ' apks if it\'s enabled for the tested apk') 470 ' apks if it\'s enabled for the tested apk')
464 471
465 # Dependencies for the final dex file of an apk or a 'deps_dex'. 472 # Dependencies for the final dex file of an apk or a 'deps_dex'.
466 if options.type in ['android_apk', 'deps_dex']: 473 if options.type in ['android_apk', 'deps_dex']:
467 config['final_dex'] = {} 474 config['final_dex'] = {}
468 dex_config = config['final_dex'] 475 dex_config = config['final_dex']
469 dex_config['dependency_dex_files'] = deps_dex_files 476 dex_config['dependency_dex_files'] = deps_dex_files
470 477
471 if options.type in ('java_binary', 'java_library', 'android_apk'): 478 if options.type in ('java_binary', 'java_library', 'android_apk',
479 'android_aar'):
472 config['javac']['classpath'] = javac_classpath 480 config['javac']['classpath'] = javac_classpath
473 config['javac']['interface_classpath'] = [ 481 config['javac']['interface_classpath'] = [
474 _AsInterfaceJar(p) for p in javac_classpath] 482 _AsInterfaceJar(p) for p in javac_classpath]
475 config['java'] = { 483 config['java'] = {
476 'full_classpath': java_full_classpath 484 'full_classpath': java_full_classpath
477 } 485 }
478 486
479 if options.type == 'android_apk': 487 if options.type == 'android_apk':
480 dependency_jars = [c['jar_path'] for c in all_library_deps] 488 dependency_jars = [c['jar_path'] for c in all_library_deps]
481 all_interface_jars = [ 489 all_interface_jars = [
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
530 _MergeAssets(deps.All('android_assets'))) 538 _MergeAssets(deps.All('android_assets')))
531 539
532 build_utils.WriteJson(config, options.build_config, only_if_changed=True) 540 build_utils.WriteJson(config, options.build_config, only_if_changed=True)
533 541
534 if options.depfile: 542 if options.depfile:
535 build_utils.WriteDepfile(options.depfile, all_inputs) 543 build_utils.WriteDepfile(options.depfile, all_inputs)
536 544
537 545
538 if __name__ == '__main__': 546 if __name__ == '__main__':
539 sys.exit(main(sys.argv[1:])) 547 sys.exit(main(sys.argv[1:]))
OLDNEW
« no previous file with comments | « no previous file | build/config/android/internal_rules.gni » ('j') | build/config/android/rules.gni » ('J')

Powered by Google App Engine
This is Rietveld 408576698