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

Side by Side Diff: build/android/gradle/generate_gradle.py

Issue 2447413003: Write out useful Android GN vars in a non-gradle-specific form. (Closed)
Patch Set: Created 4 years, 1 month 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 | « build/android/BUILD.gn ('k') | no next file » | no next file with comments »
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 # 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
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
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
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()
OLDNEW
« no previous file with comments | « build/android/BUILD.gn ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698