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 16 matching lines...) Expand all Loading... | |
27 from util import build_utils | 27 from util import build_utils |
28 | 28 |
29 | 29 |
30 _DEFAULT_ANDROID_MANIFEST_PATH = os.path.join( | 30 _DEFAULT_ANDROID_MANIFEST_PATH = os.path.join( |
31 host_paths.DIR_SOURCE_ROOT, 'build', 'android', 'AndroidManifest.xml') | 31 host_paths.DIR_SOURCE_ROOT, 'build', 'android', 'AndroidManifest.xml') |
32 _JINJA_TEMPLATE_PATH = os.path.join( | 32 _JINJA_TEMPLATE_PATH = os.path.join( |
33 os.path.dirname(__file__), 'build.gradle.jinja') | 33 os.path.dirname(__file__), 'build.gradle.jinja') |
34 | 34 |
35 _JAVA_SUBDIR = 'symlinked-java' | 35 _JAVA_SUBDIR = 'symlinked-java' |
36 _SRCJARS_SUBDIR = 'extracted-srcjars' | 36 _SRCJARS_SUBDIR = 'extracted-srcjars' |
37 _JNI_LIBS_SUBDIR = 'symlinked-libs' | |
38 _ARMEABI_SUBDIR = 'armeabi' | |
37 | 39 |
38 _DEFAULT_TARGETS = [ | 40 _DEFAULT_TARGETS = [ |
39 # TODO(agrieve): Requires alternate android.jar to compile. | 41 # TODO(agrieve): Requires alternate android.jar to compile. |
40 # '//android_webview:system_webview_apk', | 42 # '//android_webview:system_webview_apk', |
41 '//android_webview/test:android_webview_apk', | 43 '//android_webview/test:android_webview_apk', |
42 '//android_webview/test:android_webview_test_apk', | 44 '//android_webview/test:android_webview_test_apk', |
43 '//base:base_junit_tests', | 45 '//base:base_junit_tests', |
44 '//chrome/android:chrome_junit_tests', | 46 '//chrome/android:chrome_junit_tests', |
45 '//chrome/android:chrome_public_apk', | 47 '//chrome/android:chrome_public_apk', |
46 '//chrome/android:chrome_public_test_apk', | 48 '//chrome/android:chrome_public_test_apk', |
(...skipping 183 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
230 | 232 |
231 if unwanted_java_files: | 233 if unwanted_java_files: |
232 logging.debug('Target requires .java symlinks: %s', entry_output_dir) | 234 logging.debug('Target requires .java symlinks: %s', entry_output_dir) |
233 _CreateSymlinkTree(entry_output_dir, symlink_dir, java_files, java_dirs) | 235 _CreateSymlinkTree(entry_output_dir, symlink_dir, java_files, java_dirs) |
234 java_dirs = [symlink_dir] | 236 java_dirs = [symlink_dir] |
235 | 237 |
236 if missing_java_files: | 238 if missing_java_files: |
237 logging.warning('Some java files were not found: %s', missing_java_files) | 239 logging.warning('Some java files were not found: %s', missing_java_files) |
238 | 240 |
239 return java_dirs | 241 return java_dirs |
240 | 242 |
agrieve
2017/01/11 20:10:09
nit: py style is for 2 blank lines between top-lev
| |
243 def _CreateJniLibsDir(output_dir, entry_output_dir, so_files): | |
244 """Creates directory with symlinked .so files if necessary. | |
245 | |
246 Returns list of JNI libs directories.""" | |
247 | |
248 if so_files: | |
249 symlink_dir = os.path.join(entry_output_dir, _JNI_LIBS_SUBDIR) | |
250 shutil.rmtree(symlink_dir, True) | |
251 abi_dir = os.path.join(symlink_dir, _ARMEABI_SUBDIR) | |
252 if not os.path.exists(abi_dir): | |
253 os.makedirs(abi_dir) | |
254 for so_file in so_files: | |
255 target_path = os.path.join(output_dir, so_file) | |
256 symlinked_path = os.path.join(abi_dir, so_file) | |
257 relpath = os.path.relpath(target_path, abi_dir) | |
agrieve
2017/01/11 20:10:09
nit: Could you extract these 3 lines into helper m
| |
258 logging.debug('Creating symlink %s -> %s', symlinked_path, relpath) | |
259 os.symlink(relpath, symlinked_path) | |
260 | |
261 return [symlink_dir] | |
262 | |
263 return [] | |
241 | 264 |
242 def _GenerateLocalProperties(sdk_dir): | 265 def _GenerateLocalProperties(sdk_dir): |
243 """Returns the data for project.properties as a string.""" | 266 """Returns the data for project.properties as a string.""" |
244 return '\n'.join([ | 267 return '\n'.join([ |
245 '# Generated by //build/android/gradle/generate_gradle.py', | 268 '# Generated by //build/android/gradle/generate_gradle.py', |
246 'sdk.dir=%s' % sdk_dir, | 269 'sdk.dir=%s' % sdk_dir, |
247 '']) | 270 '']) |
248 | 271 |
249 | 272 |
250 def _GenerateGradleFile(build_config, build_vars, java_dirs, relativize, | 273 def _GenerateGradleFile(build_config, build_vars, java_dirs, jni_libs, |
251 use_gradle_process_resources, jinja_processor): | 274 relativize, use_gradle_process_resources, |
275 jinja_processor): | |
252 """Returns the data for a project's build.gradle.""" | 276 """Returns the data for a project's build.gradle.""" |
253 deps_info = build_config['deps_info'] | 277 deps_info = build_config['deps_info'] |
254 gradle = build_config['gradle'] | 278 gradle = build_config['gradle'] |
255 | 279 |
256 variables = { | 280 variables = { |
257 'sourceSetName': 'main', | 281 'sourceSetName': 'main', |
258 'depCompileName': 'compile', | 282 'depCompileName': 'compile', |
259 } | 283 } |
260 if deps_info['type'] == 'android_apk': | 284 if deps_info['type'] == 'android_apk': |
261 target_type = 'android_apk' | 285 target_type = 'android_apk' |
(...skipping 19 matching lines...) Expand all Loading... | |
281 variables['target_name'] = os.path.splitext(deps_info['name'])[0] | 305 variables['target_name'] = os.path.splitext(deps_info['name'])[0] |
282 variables['template_type'] = target_type | 306 variables['template_type'] = target_type |
283 variables['use_gradle_process_resources'] = use_gradle_process_resources | 307 variables['use_gradle_process_resources'] = use_gradle_process_resources |
284 variables['build_tools_version'] = ( | 308 variables['build_tools_version'] = ( |
285 build_vars['android_sdk_build_tools_version']) | 309 build_vars['android_sdk_build_tools_version']) |
286 variables['compile_sdk_version'] = build_vars['android_sdk_version'] | 310 variables['compile_sdk_version'] = build_vars['android_sdk_version'] |
287 android_manifest = gradle.get('android_manifest', | 311 android_manifest = gradle.get('android_manifest', |
288 _DEFAULT_ANDROID_MANIFEST_PATH) | 312 _DEFAULT_ANDROID_MANIFEST_PATH) |
289 variables['android_manifest'] = relativize(android_manifest) | 313 variables['android_manifest'] = relativize(android_manifest) |
290 variables['java_dirs'] = relativize(java_dirs) | 314 variables['java_dirs'] = relativize(java_dirs) |
315 variables['jni_libs'] = relativize(jni_libs) | |
291 # TODO(agrieve): Add an option to use interface jars and see if that speeds | 316 # TODO(agrieve): Add an option to use interface jars and see if that speeds |
292 # things up at all. | 317 # things up at all. |
293 variables['prebuilts'] = relativize(gradle['dependent_prebuilt_jars']) | 318 variables['prebuilts'] = relativize(gradle['dependent_prebuilt_jars']) |
294 deps = [_ProjectEntry.FromBuildConfigPath(p) | 319 deps = [_ProjectEntry.FromBuildConfigPath(p) |
295 for p in gradle['dependent_android_projects']] | 320 for p in gradle['dependent_android_projects']] |
296 | 321 |
297 variables['android_project_deps'] = [d.ProjectName() for d in deps] | 322 variables['android_project_deps'] = [d.ProjectName() for d in deps] |
298 deps = [_ProjectEntry.FromBuildConfigPath(p) | 323 deps = [_ProjectEntry.FromBuildConfigPath(p) |
299 for p in gradle['dependent_java_projects']] | 324 for p in gradle['dependent_java_projects']] |
300 variables['java_project_deps'] = [d.ProjectName() for d in deps] | 325 variables['java_project_deps'] = [d.ProjectName() for d in deps] |
(...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
437 java_sources_file = build_config['gradle'].get('java_sources_file') | 462 java_sources_file = build_config['gradle'].get('java_sources_file') |
438 java_files = [] | 463 java_files = [] |
439 if java_sources_file: | 464 if java_sources_file: |
440 java_sources_file = _RebasePath(java_sources_file) | 465 java_sources_file = _RebasePath(java_sources_file) |
441 java_files = build_utils.ReadSourcesList(java_sources_file) | 466 java_files = build_utils.ReadSourcesList(java_sources_file) |
442 | 467 |
443 java_dirs = _CreateJavaSourceDir(output_dir, entry_output_dir, java_files) | 468 java_dirs = _CreateJavaSourceDir(output_dir, entry_output_dir, java_files) |
444 if srcjars: | 469 if srcjars: |
445 java_dirs.append(os.path.join(entry_output_dir, _SRCJARS_SUBDIR)) | 470 java_dirs.append(os.path.join(entry_output_dir, _SRCJARS_SUBDIR)) |
446 | 471 |
447 data = _GenerateGradleFile(build_config, build_vars, java_dirs, relativize, | 472 native_part = build_config.get('native') |
448 args.use_gradle_process_resources, | 473 if native_part: |
474 jni_libs = _CreateJniLibsDir( | |
475 output_dir, entry_output_dir, native_part.get('libraries')) | |
476 else: | |
477 jni_libs = [] | |
478 | |
479 data = _GenerateGradleFile(build_config, build_vars, java_dirs, jni_libs, | |
480 relativize, args.use_gradle_process_resources, | |
449 jinja_processor) | 481 jinja_processor) |
450 if data: | 482 if data: |
451 project_entries.append(entry) | 483 project_entries.append(entry) |
452 # Build all paths references by .gradle that exist within output_dir. | 484 # Build all paths references by .gradle that exist within output_dir. |
453 generated_inputs.extend(srcjars) | 485 generated_inputs.extend(srcjars) |
454 generated_inputs.extend(p for p in java_files if not p.startswith('..')) | 486 generated_inputs.extend(p for p in java_files if not p.startswith('..')) |
455 generated_inputs.extend(build_config['gradle']['dependent_prebuilt_jars']) | 487 generated_inputs.extend(build_config['gradle']['dependent_prebuilt_jars']) |
456 | 488 |
457 srcjar_tuples.extend( | 489 srcjar_tuples.extend( |
458 (s, os.path.join(entry_output_dir, _SRCJARS_SUBDIR)) for s in srcjars) | 490 (s, os.path.join(entry_output_dir, _SRCJARS_SUBDIR)) for s in srcjars) |
(...skipping 18 matching lines...) Expand all Loading... | |
477 _ExtractSrcjars(gradle_output_dir, srcjar_tuples) | 509 _ExtractSrcjars(gradle_output_dir, srcjar_tuples) |
478 | 510 |
479 logging.warning('Project created! (%d subprojects)', len(project_entries)) | 511 logging.warning('Project created! (%d subprojects)', len(project_entries)) |
480 logging.warning('Generated projects work best with Android Studio 2.2') | 512 logging.warning('Generated projects work best with Android Studio 2.2') |
481 logging.warning('For more tips: https://chromium.googlesource.com/chromium' | 513 logging.warning('For more tips: https://chromium.googlesource.com/chromium' |
482 '/src.git/+/master/docs/android_studio.md') | 514 '/src.git/+/master/docs/android_studio.md') |
483 | 515 |
484 | 516 |
485 if __name__ == '__main__': | 517 if __name__ == '__main__': |
486 main() | 518 main() |
OLD | NEW |