| OLD | NEW |
| 1 #!/usr/bin/env python | 1 #!/usr/bin/env python |
| 2 # Copyright 2016 The Chromium Authors. All rights reserved. | 2 # Copyright 2016 The Chromium Authors. All rights reserved. |
| 3 # Use of this source code is governed by a BSD-style license that can be | 3 # Use of this source code is governed by a BSD-style license that can be |
| 4 # found in the LICENSE file. | 4 # found in the LICENSE file. |
| 5 | 5 |
| 6 """Generates an Android Studio project from a GN target.""" | 6 """Generates an Android Studio project from a GN target.""" |
| 7 | 7 |
| 8 import argparse | 8 import argparse |
| 9 import codecs | 9 import codecs |
| 10 import logging | 10 import logging |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 70 def _WriteFile(path, data): | 70 def _WriteFile(path, data): |
| 71 """Writes |data| to |path|, constucting parent directories if necessary.""" | 71 """Writes |data| to |path|, constucting parent directories if necessary.""" |
| 72 logging.info('Writing %s', path) | 72 logging.info('Writing %s', path) |
| 73 dirname = os.path.dirname(path) | 73 dirname = os.path.dirname(path) |
| 74 if not os.path.exists(dirname): | 74 if not os.path.exists(dirname): |
| 75 os.makedirs(dirname) | 75 os.makedirs(dirname) |
| 76 with codecs.open(path, 'w', 'utf-8') as output_file: | 76 with codecs.open(path, 'w', 'utf-8') as output_file: |
| 77 output_file.write(data) | 77 output_file.write(data) |
| 78 | 78 |
| 79 | 79 |
| 80 def _ReadBuildVars(output_dir): |
| 81 with open(os.path.join(output_dir, 'build_vars.txt')) as f: |
| 82 return dict(l.rstrip().split('=', 1) for l in f) |
| 83 |
| 84 |
| 80 def _RunNinja(output_dir, args): | 85 def _RunNinja(output_dir, args): |
| 81 cmd = ['ninja', '-C', output_dir, '-j50'] | 86 cmd = ['ninja', '-C', output_dir, '-j50'] |
| 82 cmd.extend(args) | 87 cmd.extend(args) |
| 83 logging.info('Running: %r', cmd) | 88 logging.info('Running: %r', cmd) |
| 84 subprocess.check_call(cmd) | 89 subprocess.check_call(cmd) |
| 85 | 90 |
| 86 | 91 |
| 87 def _QueryForAllGnTargets(output_dir): | 92 def _QueryForAllGnTargets(output_dir): |
| 88 # Query ninja rather than GN since it's faster. | 93 # Query ninja rather than GN since it's faster. |
| 89 cmd = ['ninja', '-C', output_dir, '-t', 'targets'] | 94 cmd = ['ninja', '-C', output_dir, '-t', 'targets'] |
| (...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 227 | 232 |
| 228 | 233 |
| 229 def _GenerateLocalProperties(sdk_dir): | 234 def _GenerateLocalProperties(sdk_dir): |
| 230 """Returns the data for project.properties as a string.""" | 235 """Returns the data for project.properties as a string.""" |
| 231 return '\n'.join([ | 236 return '\n'.join([ |
| 232 '# Generated by //build/android/gradle/generate_gradle.py', | 237 '# Generated by //build/android/gradle/generate_gradle.py', |
| 233 'sdk.dir=%s' % sdk_dir, | 238 'sdk.dir=%s' % sdk_dir, |
| 234 '']) | 239 '']) |
| 235 | 240 |
| 236 | 241 |
| 237 def _GenerateGradleFile(build_config, config_json, java_dirs, relativize, | 242 def _GenerateGradleFile(build_config, build_vars, java_dirs, relativize, |
| 238 use_gradle_process_resources, jinja_processor): | 243 use_gradle_process_resources, jinja_processor): |
| 239 """Returns the data for a project's build.gradle.""" | 244 """Returns the data for a project's build.gradle.""" |
| 240 deps_info = build_config['deps_info'] | 245 deps_info = build_config['deps_info'] |
| 241 gradle = build_config['gradle'] | 246 gradle = build_config['gradle'] |
| 242 | 247 |
| 243 if deps_info['type'] == 'android_apk': | 248 if deps_info['type'] == 'android_apk': |
| 244 target_type = 'android_apk' | 249 target_type = 'android_apk' |
| 245 elif deps_info['type'] == 'java_library' and not deps_info['is_prebuilt']: | 250 elif deps_info['type'] == 'java_library' and not deps_info['is_prebuilt']: |
| 246 if deps_info['requires_android']: | 251 if deps_info['requires_android']: |
| 247 target_type = 'android_library' | 252 target_type = 'android_library' |
| 248 else: | 253 else: |
| 249 target_type = 'java_library' | 254 target_type = 'java_library' |
| 250 else: | 255 else: |
| 251 return None | 256 return None |
| 252 | 257 |
| 253 variables = {} | 258 variables = {} |
| 254 variables['template_type'] = target_type | 259 variables['template_type'] = target_type |
| 255 variables['use_gradle_process_resources'] = use_gradle_process_resources | 260 variables['use_gradle_process_resources'] = use_gradle_process_resources |
| 256 variables['build_tools_version'] = config_json['build_tools_version'] | 261 variables['build_tools_version'] = ( |
| 257 variables['compile_sdk_version'] = config_json['compile_sdk_version'] | 262 build_vars['android_sdk_build_tools_version']) |
| 263 variables['compile_sdk_version'] = build_vars['android_sdk_version'] |
| 258 android_manifest = gradle.get('android_manifest', | 264 android_manifest = gradle.get('android_manifest', |
| 259 _DEFAULT_ANDROID_MANIFEST_PATH) | 265 _DEFAULT_ANDROID_MANIFEST_PATH) |
| 260 variables['android_manifest'] = relativize(android_manifest) | 266 variables['android_manifest'] = relativize(android_manifest) |
| 261 variables['java_dirs'] = relativize(java_dirs) | 267 variables['java_dirs'] = relativize(java_dirs) |
| 262 variables['prebuilts'] = relativize(gradle['dependent_prebuilt_jars']) | 268 variables['prebuilts'] = relativize(gradle['dependent_prebuilt_jars']) |
| 263 deps = [_ProjectEntry.FromBuildConfigPath(p) | 269 deps = [_ProjectEntry.FromBuildConfigPath(p) |
| 264 for p in gradle['dependent_android_projects']] | 270 for p in gradle['dependent_android_projects']] |
| 265 | 271 |
| 266 variables['android_project_deps'] = [d.ProjectName() for d in deps] | 272 variables['android_project_deps'] = [d.ProjectName() for d in deps] |
| 267 deps = [_ProjectEntry.FromBuildConfigPath(p) | 273 deps = [_ProjectEntry.FromBuildConfigPath(p) |
| (...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 379 # There are many unused libraries, so restrict to those that are actually used | 385 # There are many unused libraries, so restrict to those that are actually used |
| 380 # when using --all. | 386 # when using --all. |
| 381 if args.all: | 387 if args.all: |
| 382 main_entries = [e for e in main_entries if e.GetType() == 'android_apk'] | 388 main_entries = [e for e in main_entries if e.GetType() == 'android_apk'] |
| 383 | 389 |
| 384 all_entries = _FindAllProjectEntries(main_entries) | 390 all_entries = _FindAllProjectEntries(main_entries) |
| 385 logging.info('Found %d dependent build_config targets.', len(all_entries)) | 391 logging.info('Found %d dependent build_config targets.', len(all_entries)) |
| 386 | 392 |
| 387 logging.warning('Writing .gradle files...') | 393 logging.warning('Writing .gradle files...') |
| 388 jinja_processor = jinja_template.JinjaProcessor(host_paths.DIR_SOURCE_ROOT) | 394 jinja_processor = jinja_template.JinjaProcessor(host_paths.DIR_SOURCE_ROOT) |
| 389 config_json = build_utils.ReadJson( | 395 build_vars = _ReadBuildVars(output_dir) |
| 390 os.path.join(output_dir, 'gradle', 'config.json')) | |
| 391 project_entries = [] | 396 project_entries = [] |
| 392 srcjar_tuples = [] | 397 srcjar_tuples = [] |
| 393 for entry in all_entries: | 398 for entry in all_entries: |
| 394 if entry.GetType() not in ('android_apk', 'java_library'): | 399 if entry.GetType() not in ('android_apk', 'java_library'): |
| 395 continue | 400 continue |
| 396 | 401 |
| 397 entry_output_dir = os.path.join(gradle_output_dir, entry.GradleSubdir()) | 402 entry_output_dir = os.path.join(gradle_output_dir, entry.GradleSubdir()) |
| 398 relativize = lambda x, d=entry_output_dir: _RebasePath(x, d) | 403 relativize = lambda x, d=entry_output_dir: _RebasePath(x, d) |
| 399 build_config = entry.BuildConfig() | 404 build_config = entry.BuildConfig() |
| 400 | 405 |
| 401 srcjars = _RebasePath(build_config['gradle'].get('bundled_srcjars', [])) | 406 srcjars = _RebasePath(build_config['gradle'].get('bundled_srcjars', [])) |
| 402 if not args.use_gradle_process_resources: | 407 if not args.use_gradle_process_resources: |
| 403 srcjars += _RebasePath(build_config['javac']['srcjars']) | 408 srcjars += _RebasePath(build_config['javac']['srcjars']) |
| 404 | 409 |
| 405 java_sources_file = build_config['gradle'].get('java_sources_file') | 410 java_sources_file = build_config['gradle'].get('java_sources_file') |
| 406 if java_sources_file: | 411 if java_sources_file: |
| 407 java_sources_file = _RebasePath(java_sources_file) | 412 java_sources_file = _RebasePath(java_sources_file) |
| 408 | 413 |
| 409 java_dirs = _CreateJavaSourceDir(output_dir, entry_output_dir, | 414 java_dirs = _CreateJavaSourceDir(output_dir, entry_output_dir, |
| 410 java_sources_file) | 415 java_sources_file) |
| 411 if srcjars: | 416 if srcjars: |
| 412 java_dirs.append(os.path.join(entry_output_dir, _SRCJARS_SUBDIR)) | 417 java_dirs.append(os.path.join(entry_output_dir, _SRCJARS_SUBDIR)) |
| 413 | 418 |
| 414 data = _GenerateGradleFile(build_config, config_json, java_dirs, relativize, | 419 data = _GenerateGradleFile(build_config, build_vars, java_dirs, relativize, |
| 415 args.use_gradle_process_resources, | 420 args.use_gradle_process_resources, |
| 416 jinja_processor) | 421 jinja_processor) |
| 417 if data: | 422 if data: |
| 418 project_entries.append(entry) | 423 project_entries.append(entry) |
| 419 srcjar_tuples.extend( | 424 srcjar_tuples.extend( |
| 420 (s, os.path.join(entry_output_dir, _SRCJARS_SUBDIR)) for s in srcjars) | 425 (s, os.path.join(entry_output_dir, _SRCJARS_SUBDIR)) for s in srcjars) |
| 421 _WriteFile(os.path.join(entry_output_dir, 'build.gradle'), data) | 426 _WriteFile(os.path.join(entry_output_dir, 'build.gradle'), data) |
| 422 | 427 |
| 423 _WriteFile(os.path.join(gradle_output_dir, 'build.gradle'), | 428 _WriteFile(os.path.join(gradle_output_dir, 'build.gradle'), |
| 424 _GenerateRootGradle(jinja_processor)) | 429 _GenerateRootGradle(jinja_processor)) |
| 425 | 430 |
| 426 _WriteFile(os.path.join(gradle_output_dir, 'settings.gradle'), | 431 _WriteFile(os.path.join(gradle_output_dir, 'settings.gradle'), |
| 427 _GenerateSettingsGradle(project_entries)) | 432 _GenerateSettingsGradle(project_entries)) |
| 428 | 433 |
| 429 sdk_path = _RebasePath(config_json['android_sdk_root']) | 434 sdk_path = _RebasePath(build_vars['android_sdk_root']) |
| 430 _WriteFile(os.path.join(gradle_output_dir, 'local.properties'), | 435 _WriteFile(os.path.join(gradle_output_dir, 'local.properties'), |
| 431 _GenerateLocalProperties(sdk_path)) | 436 _GenerateLocalProperties(sdk_path)) |
| 432 | 437 |
| 433 if srcjar_tuples: | 438 if srcjar_tuples: |
| 434 logging.warning('Building all .srcjar files...') | 439 logging.warning('Building all .srcjar files...') |
| 435 targets = _RebasePath([s[0] for s in srcjar_tuples], output_dir) | 440 targets = _RebasePath([s[0] for s in srcjar_tuples], output_dir) |
| 436 _RunNinja(output_dir, targets) | 441 _RunNinja(output_dir, targets) |
| 437 _ExtractSrcjars(gradle_output_dir, srcjar_tuples) | 442 _ExtractSrcjars(gradle_output_dir, srcjar_tuples) |
| 438 logging.warning('Project created! (%d subprojects)', len(project_entries)) | 443 logging.warning('Project created! (%d subprojects)', len(project_entries)) |
| 439 logging.warning('Generated projects work best with Android Studio 2.2') | 444 logging.warning('Generated projects work best with Android Studio 2.2') |
| 440 logging.warning('For more tips: https://chromium.googlesource.com/chromium' | 445 logging.warning('For more tips: https://chromium.googlesource.com/chromium' |
| 441 '/src.git/+/master/docs/android_studio.md') | 446 '/src.git/+/master/docs/android_studio.md') |
| 442 | 447 |
| 443 | 448 |
| 444 if __name__ == '__main__': | 449 if __name__ == '__main__': |
| 445 main() | 450 main() |
| OLD | NEW |