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

Side by Side Diff: platform_tools/android/bin/gyp_to_android.py

Issue 142173002: Add self tests for gyp_to_android. (Closed) Base URL: https://skia.googlesource.com/skia.git@GYP2
Patch Set: Find absolute path for android_framework_gyp. Created 6 years, 11 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
OLDNEW
1 #!/usr/bin/python 1 #!/usr/bin/python
2 2
3 # Copyright 2014 Google Inc. 3 # Copyright 2014 Google Inc.
4 # 4 #
5 # Use of this source code is governed by a BSD-style license that can be 5 # Use of this source code is governed by a BSD-style license that can be
6 # found in the LICENSE file. 6 # found in the LICENSE file.
7 7
8 """ 8 """
9 Script for generating the Android framework's verision of Skia from gyp 9 Script for generating the Android framework's verision of Skia from gyp
10 files. 10 files.
11 """ 11 """
12 12
13 import os 13 import os
14 import shutil
15 import tempfile
14 16
15 # Folder containing all gyp files and generated gypd files. 17 # Folder containing all gyp files and generated gypd files.
16 GYP_FOLDER = 'gyp' 18 GYP_FOLDER = 'gyp'
17 19
18 # FIXME: Currently the x86 specific files are not included. Include them. 20 # FIXME: Currently the x86 specific files are not included. Include them.
19 INCLUDE_X86_OPTS = False 21 INCLUDE_X86_OPTS = False
20 22
21 def WriteGroup(f, name, items, append): 23 def WriteGroup(f, name, items, append):
22 """ 24 """
23 Helper function to list all names passed to a variable. 25 Helper function to list all names passed to a variable.
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after
114 # (b) You can update all the users of libskia to define SK_DEBUG when they are 116 # (b) You can update all the users of libskia to define SK_DEBUG when they are
115 # building their sources. 117 # building their sources.
116 # 118 #
117 # NOTE: If neither SK_DEBUG or SK_RELEASE are defined then Skia checks NDEBUG to 119 # NOTE: If neither SK_DEBUG or SK_RELEASE are defined then Skia checks NDEBUG to
118 # determine which build type to use. 120 # determine which build type to use.
119 ############################################################################### 121 ###############################################################################
120 122
121 """ 123 """
122 ) 124 )
123 125
124 def WriteAndroidMk(common, arm, armNeon, x86, default): 126 def WriteAndroidMk(target_dir, common, arm, armNeon, x86, default):
125 """ 127 """
126 Given all the variables, write the final make file. 128 Given all the variables, write the final make file.
129 @param target_dir The full path to the directory to write Android.mk, or None
130 to use the current working directory.
127 @param common VarsDict holding variables definitions common to all 131 @param common VarsDict holding variables definitions common to all
128 configurations. 132 configurations.
129 @param arm VarsDict holding variable definitions unique to arm. Will be 133 @param arm VarsDict holding variable definitions unique to arm. Will be
130 written to the makefile inside an 'ifeq ($(TARGET_ARCH), arm)' 134 written to the makefile inside an 'ifeq ($(TARGET_ARCH), arm)'
131 block. 135 block.
132 @param armNeon VarsDict holding variable definitions unique to arm with neon. 136 @param armNeon VarsDict holding variable definitions unique to arm with neon.
133 Will be written inside an 'ifeq ($(ARCH_ARM_HAVE_NEON),true)' 137 Will be written inside an 'ifeq ($(ARCH_ARM_HAVE_NEON),true)'
134 block nested inside an 'ifeq ($(TARGET_ARCH), arm)' block. 138 block nested inside an 'ifeq ($(TARGET_ARCH), arm)' block.
135 @param x86 VarsDict holding variable definitions unique to x86. Will be 139 @param x86 VarsDict holding variable definitions unique to x86. Will be
136 written inside an 'ifeq ($(TARGET_ARCH),x86)' block. 140 written inside an 'ifeq ($(TARGET_ARCH),x86)' block.
137 @param default VarsDict holding variable definitions for an architecture 141 @param default VarsDict holding variable definitions for an architecture
138 without custom optimizations. 142 without custom optimizations.
139 TODO: Add mips. 143 TODO: Add mips.
140 """ 144 """
141 with open('Android.mk', 'w') as f: 145 target_file = 'Android.mk'
146 if target_dir:
147 target_file = os.path.join(target_dir, target_file)
148 with open(target_file, 'w') as f:
142 f.write('BASE_PATH := $(call my-dir)\n') 149 f.write('BASE_PATH := $(call my-dir)\n')
143 f.write('LOCAL_PATH:= $(call my-dir)\n') 150 f.write('LOCAL_PATH:= $(call my-dir)\n')
144 151
145 f.write(DEBUGGING_HELP) 152 f.write(DEBUGGING_HELP)
146 153
147 f.write('include $(CLEAR_VARS)\n') 154 f.write('include $(CLEAR_VARS)\n')
148 155
149 f.write('LOCAL_ARM_MODE := thumb\n') 156 f.write('LOCAL_ARM_MODE := thumb\n')
150 157
151 # need a flag to tell the C side when we're on devices with large memory 158 # need a flag to tell the C side when we're on devices with large memory
(...skipping 181 matching lines...) Expand 10 before | Expand all | Expand 10 after
333 # set of keys. 340 # set of keys.
334 if not item in var_dict[key]: 341 if not item in var_dict[key]:
335 in_all_lists = False 342 in_all_lists = False
336 break 343 break
337 if in_all_lists: 344 if in_all_lists:
338 intersection[key].append(item) 345 intersection[key].append(item)
339 for var_dict in var_dict_list: 346 for var_dict in var_dict_list:
340 var_dict[key].remove(item) 347 var_dict[key].remove(item)
341 return intersection 348 return intersection
342 349
343 def CleanGypdFiles(): 350 def CleanGypdFiles(folder):
344 """ 351 """
345 Remove the gypd files generated by android_framework_gyp.main(). 352 Remove the gypd files generated by android_framework_gyp.main().
353 @param folder Folder in which to delete all files ending with 'gypd'.
346 """ 354 """
347 assert os.path.isdir(GYP_FOLDER) 355 assert os.path.isdir(folder)
348 files = os.listdir(GYP_FOLDER) 356 files = os.listdir(folder)
349 for f in files: 357 for f in files:
350 if f.endswith('gypd'): 358 if f.endswith('gypd'):
351 os.remove(os.path.join(GYP_FOLDER, f)) 359 os.remove(os.path.join(folder, f))
352 360
353 import android_framework_gyp 361 import android_framework_gyp
354 362
355 def main(): 363 def main(target_dir=None):
364 """
365 Read gyp files and create Android.mk for the Android framework's
366 external/skia.
367 @param target_dir Directory in which to place 'Android.mk'. If None, the file
368 will be placed in skia's root directory.
369 """
356 # Move up to top of trunk 370 # Move up to top of trunk
357 script_dir = os.path.dirname(__file__) 371 script_dir = os.path.dirname(__file__)
358 skia_dir = os.path.normpath(os.path.join(script_dir, os.pardir, os.pardir, 372 skia_dir = os.path.normpath(os.path.join(script_dir, os.pardir, os.pardir,
359 os.pardir)) 373 os.pardir))
360 os.chdir(skia_dir) 374 os.chdir(skia_dir)
361 375
362 main_gypd_file = os.path.join(GYP_FOLDER, 'android_framework_lib.gypd') 376 # Create a temporary folder to hold gyp and gypd files. Create it in skia_dir
377 # so that it is a sibling of gyp/, so the relationships between gyp files and
378 # other files (e.g. platform_tools/android/gyp/dependencies.gypi, referenced
379 # by android_deps.gyp as a relative path) is unchanged.
380 # Use mkdtemp to find an unused folder name, but then delete it so copytree
381 # can be called with a non-existent directory.
382 tmp_folder = tempfile.mkdtemp(dir=os.getcwd())
epoger 2014/01/22 21:35:03 This will work, but maybe set dir=skia_dir so that
scroggo 2014/01/22 23:33:08 Done.
383 os.rmdir(tmp_folder)
384 shutil.copytree(GYP_FOLDER, tmp_folder)
363 385
364 print 'Creating Android.mk', 386 try:
387 main_gyp_file = 'android_framework_lib.gyp'
388 main_gypd_file = os.path.join(tmp_folder, main_gyp_file + 'd')
365 389
366 # Call the script to generate gypd files, first using a non-existant archtype. 390 print 'Creating Android.mk',
367 android_framework_gyp.main('other', False)
368 # And store its variables in the default dict
369 default_var_dict = VarsDict()
370 ParseGypd(default_var_dict, main_gypd_file)
371 CleanGypdFiles()
372 391
373 print '.', 392 # Call the script to generate gypd files, first using a non-existant
393 # archtype.
394 android_framework_gyp.main(tmp_folder, main_gyp_file, 'other', False)
395 # And store its variables in the default dict
396 default_var_dict = VarsDict()
397 ParseGypd(default_var_dict, main_gypd_file)
398 CleanGypdFiles(tmp_folder)
374 399
375 # Now do the same for Arm. arm_var_dict will contain all the variable 400 print '.',
376 # definitions needed to build with arm (meaning that it will share most
377 # with default_var_dict).
378 android_framework_gyp.main('arm', False)
379 arm_var_dict = VarsDict()
380 ParseGypd(arm_var_dict, main_gypd_file)
381 CleanGypdFiles()
382 401
383 print '.', 402 # Now do the same for Arm. arm_var_dict will contain all the variable
403 # definitions needed to build with arm (meaning that it will share most
404 # with default_var_dict).
405 android_framework_gyp.main(tmp_folder, main_gyp_file, 'arm', False)
406 arm_var_dict = VarsDict()
407 ParseGypd(arm_var_dict, main_gypd_file)
408 CleanGypdFiles(tmp_folder)
384 409
385 # Now do the same for Arm/Neon. 410 print '.',
386 android_framework_gyp.main('arm', True)
387 arm_neon_var_dict = VarsDict()
388 ParseGypd(arm_neon_var_dict, main_gypd_file)
389 CleanGypdFiles()
390 411
391 print '.' 412 # Now do the same for Arm/Neon.
413 android_framework_gyp.main(tmp_folder, main_gyp_file, 'arm', True)
414 arm_neon_var_dict = VarsDict()
415 ParseGypd(arm_neon_var_dict, main_gypd_file)
416 CleanGypdFiles(tmp_folder)
392 417
393 # Now do the same for x86. 418 print '.'
394 x86_var_dict = VarsDict()
395 if INCLUDE_X86_OPTS:
396 android_framework_gyp.main('x86', False)
397 ParseGypd(x86_var_dict, main_gypd_file)
398 CleanGypdFiles()
399 419
400 # Compute the intersection of all targets. All the files in the intersection 420 # Now do the same for x86.
401 # should be part of the makefile always. Each dict will now contain trimmed 421 x86_var_dict = VarsDict()
402 # lists containing only variable definitions specific to that configuration. 422 if INCLUDE_X86_OPTS:
403 var_dict_list = [default_var_dict, arm_var_dict, arm_neon_var_dict] 423 android_framework_gyp.main(tmp_folder, main_gyp_file, 'x86', False)
404 if INCLUDE_X86_OPTS: 424 ParseGypd(x86_var_dict, main_gypd_file)
405 var_dict_list.append(x86_var_dict) 425 CleanGypdFiles(tmp_folder)
406 common = Intersect(var_dict_list)
407 426
408 # Further trim arm_neon_var_dict with arm_var_dict. After this call, 427 # Compute the intersection of all targets. All the files in the intersection
409 # arm_var_dict (which will now be the intersection) includes all definitions 428 # should be part of the makefile always. Each dict will now contain trimmed
410 # used by both arm and arm + neon, and arm_neon_var_dict will only contain 429 # lists containing only variable definitions specific to that configuration.
411 # those specific to arm + neon. 430 var_dict_list = [default_var_dict, arm_var_dict, arm_neon_var_dict]
412 arm_var_dict = Intersect([arm_var_dict, arm_neon_var_dict]) 431 if INCLUDE_X86_OPTS:
432 var_dict_list.append(x86_var_dict)
433 common = Intersect(var_dict_list)
413 434
414 WriteAndroidMk(common, arm_var_dict, arm_neon_var_dict, x86_var_dict, 435 # Further trim arm_neon_var_dict with arm_var_dict. After this call,
415 default_var_dict) 436 # arm_var_dict (which will now be the intersection) includes all definitions
437 # used by both arm and arm + neon, and arm_neon_var_dict will only contain
438 # those specific to arm + neon.
439 arm_var_dict = Intersect([arm_var_dict, arm_neon_var_dict])
440
441 WriteAndroidMk(target_dir, common, arm_var_dict, arm_neon_var_dict,
442 x86_var_dict, default_var_dict)
443
444 finally:
445 shutil.rmtree(tmp_folder)
416 446
417 if __name__ == '__main__': 447 if __name__ == '__main__':
418 main() 448 main()
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698