OLD | NEW |
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 Functions for creating an Android.mk from already created dictionaries. | 9 Functions for creating an Android.mk from already created dictionaries. |
10 """ | 10 """ |
11 | 11 |
12 import os | 12 import os |
13 import variables | |
14 | 13 |
| 14 # TODO(scroggo): Add unit tests for this file. |
15 def write_group(f, name, items, append): | 15 def write_group(f, name, items, append): |
16 """ | 16 """ |
17 Helper function to list all names passed to a variable. | 17 Helper function to list all names passed to a variable. |
18 @param f File open for writing (Android.mk) | 18 @param f File open for writing (Android.mk) |
19 @param name Name of the makefile variable (e.g. LOCAL_CFLAGS) | 19 @param name Name of the makefile variable (e.g. LOCAL_CFLAGS) |
20 @param items list of strings to be passed to the variable. | 20 @param items list of strings to be passed to the variable. |
21 @param append Whether to append to the variable or overwrite it. | 21 @param append Whether to append to the variable or overwrite it. |
22 """ | 22 """ |
23 if not items: | 23 if not items: |
24 return | 24 return |
25 | 25 |
26 # Copy the list so we can prepend it with its name. | 26 # Copy the list so we can prepend it with its name. |
27 items_to_write = list(items) | 27 items_to_write = list(items) |
28 | 28 |
29 if append: | 29 if append: |
30 items_to_write.insert(0, '%s +=' % name) | 30 items_to_write.insert(0, '%s +=' % name) |
31 else: | 31 else: |
32 items_to_write.insert(0, '%s :=' % name) | 32 items_to_write.insert(0, '%s :=' % name) |
33 | 33 |
34 f.write(' \\\n\t'.join(items_to_write)) | 34 f.write(' \\\n\t'.join(items_to_write)) |
35 | 35 |
36 f.write('\n\n') | 36 f.write('\n\n') |
37 | 37 |
38 | 38 |
39 def write_local_vars(f, var_dict, append): | 39 def write_local_vars(f, var_dict, append, name): |
40 """ | 40 """ |
41 Helper function to write all the members of var_dict to the makefile. | 41 Helper function to write all the members of var_dict to the makefile. |
42 @param f File open for writing (Android.mk) | 42 @param f File open for writing (Android.mk) |
43 @param var_dict VarsDict holding the unique values for one configuration. | 43 @param var_dict VarsDict holding the unique values for one configuration. |
44 @param append Whether to append to each makefile variable or overwrite it. | 44 @param append Whether to append to each makefile variable or overwrite it. |
| 45 @param name If not None, a string to be appended to each key. |
45 """ | 46 """ |
46 for key in var_dict.keys(): | 47 for key in var_dict.keys(): |
47 if key == 'LOCAL_CFLAGS': | 48 if key == 'LOCAL_CFLAGS': |
48 # Always append LOCAL_CFLAGS. This allows us to define some early on in | 49 # Always append LOCAL_CFLAGS. This allows us to define some early on in |
49 # the makefile and not overwrite them. | 50 # the makefile and not overwrite them. |
50 _append = True | 51 _append = True |
51 elif key == 'KNOWN_TARGETS': | 52 elif key == 'KNOWN_TARGETS': |
52 # KNOWN_TARGETS are not needed in the final make file. | 53 # KNOWN_TARGETS are not needed in the final make file. |
53 continue | 54 continue |
54 else: | 55 else: |
55 _append = append | 56 _append = append |
56 write_group(f, key, var_dict[key], _append) | 57 _key = key |
| 58 if name: |
| 59 _key += '_' + name |
| 60 write_group(f, _key, var_dict[key], _append) |
57 | 61 |
58 | 62 |
59 AUTOGEN_WARNING = ( | 63 AUTOGEN_WARNING = ( |
60 """ | 64 """ |
61 ############################################################################### | 65 ############################################################################### |
62 # | 66 # |
63 # THIS FILE IS AUTOGENERATED BY GYP_TO_ANDROID.PY. DO NOT EDIT. | 67 # THIS FILE IS AUTOGENERATED BY GYP_TO_ANDROID.PY. DO NOT EDIT. |
64 # | 68 # |
65 ############################################################################### | 69 ############################################################################### |
66 | 70 |
(...skipping 23 matching lines...) Expand all Loading... |
90 # (b) You can update all the users of libskia to define SK_DEBUG when they are | 94 # (b) You can update all the users of libskia to define SK_DEBUG when they are |
91 # building their sources. | 95 # building their sources. |
92 # | 96 # |
93 # NOTE: If neither SK_DEBUG or SK_RELEASE are defined then Skia checks NDEBUG to | 97 # NOTE: If neither SK_DEBUG or SK_RELEASE are defined then Skia checks NDEBUG to |
94 # determine which build type to use. | 98 # determine which build type to use. |
95 ############################################################################### | 99 ############################################################################### |
96 | 100 |
97 """ | 101 """ |
98 ) | 102 ) |
99 | 103 |
| 104 class VarsDictData(object): |
| 105 """ |
| 106 Helper class for keeping a VarsDict along with a name and an optional |
| 107 condition. |
| 108 """ |
| 109 def __init__(self, vars_dict, name, condition=None): |
| 110 """ |
| 111 Create a new VarsDictData. |
| 112 @param vars_dict A VarsDict. Can be accessed via self.vars_dict. |
| 113 @param name Name associated with the VarsDict. Can be accessed via |
| 114 self.name. |
| 115 @param condition Optional string representing a condition. If not None, |
| 116 used to create a conditional inside the makefile. |
| 117 """ |
| 118 self.vars_dict = vars_dict |
| 119 self.condition = condition |
| 120 self.name = name |
100 | 121 |
101 # TODO (scroggo): Currently write_android_mk has intimate knowledge about its | 122 def write_android_mk(target_dir, common, deviations_from_common): |
102 # parameters: e.g. arm_neon keeps track of differences from arm, whereas the | |
103 # others keep track of differences from common. Consider reworking this. | |
104 def write_android_mk(target_dir, common, arm, arm_neon, x86, default): | |
105 """ | 123 """ |
106 Given all the variables, write the final make file. | 124 Given all the variables, write the final make file. |
107 @param target_dir The full path to the directory to write Android.mk, or None | 125 @param target_dir The full path to the directory to write Android.mk, or None |
108 to use the current working directory. | 126 to use the current working directory. |
109 @param common VarsDict holding variables definitions common to all | 127 @param common VarsDict holding variables definitions common to all |
110 configurations. | 128 configurations. |
111 @param arm VarsDict holding variable definitions unique to arm. Will be | 129 @param deviations_from_common List of VarsDictData, one for each possible |
112 written to the makefile inside an 'ifeq ($(TARGET_ARCH), arm)' | 130 configuration. VarsDictData.name will be |
113 block. | 131 appended to each key before writing it to the |
114 @param arm_neon VarsDict holding variable definitions unique to arm with neon. | 132 makefile. VarsDictData.condition, if not None, |
115 Will be written inside an 'ifeq ($(ARCH_ARM_HAVE_NEON),true)' | 133 will be written to the makefile as a condition |
116 block nested inside an 'ifeq ($(TARGET_ARCH), arm)' block. | 134 to determine whether to include |
117 @param x86 VarsDict holding variable definitions unique to x86. Will be | 135 VarsDictData.vars_dict. |
118 written inside an 'ifeq ($(TARGET_ARCH),x86)' block. | |
119 @param default VarsDict holding variable definitions for an architecture | |
120 without custom optimizations. | |
121 TODO: Add mips. | |
122 """ | 136 """ |
123 target_file = 'Android.mk' | 137 target_file = 'Android.mk' |
124 if target_dir: | 138 if target_dir: |
125 target_file = os.path.join(target_dir, target_file) | 139 target_file = os.path.join(target_dir, target_file) |
126 with open(target_file, 'w') as f: | 140 with open(target_file, 'w') as f: |
127 f.write(AUTOGEN_WARNING) | 141 f.write(AUTOGEN_WARNING) |
128 f.write('BASE_PATH := $(call my-dir)\n') | 142 f.write('BASE_PATH := $(call my-dir)\n') |
129 f.write('LOCAL_PATH:= $(call my-dir)\n') | 143 f.write('LOCAL_PATH:= $(call my-dir)\n') |
130 | 144 |
131 f.write(DEBUGGING_HELP) | 145 f.write(DEBUGGING_HELP) |
132 | 146 |
133 f.write('include $(CLEAR_VARS)\n') | 147 f.write('include $(CLEAR_VARS)\n') |
134 | 148 |
135 f.write('LOCAL_ARM_MODE := thumb\n') | 149 f.write('LOCAL_ARM_MODE := thumb\n') |
136 | 150 |
137 # need a flag to tell the C side when we're on devices with large memory | 151 # need a flag to tell the C side when we're on devices with large memory |
138 # budgets (i.e. larger than the low-end devices that initially shipped) | 152 # budgets (i.e. larger than the low-end devices that initially shipped) |
139 f.write('ifeq ($(ARCH_ARM_HAVE_VFP),true)\n') | 153 # On arm, only define the flag if it has VFP. For all other architectures, |
| 154 # always define the flag. |
| 155 f.write('ifeq ($(TARGET_ARCH),arm)\n') |
| 156 f.write('\tifeq ($(ARCH_ARM_HAVE_VFP),true)\n') |
| 157 f.write('\t\tLOCAL_CFLAGS += -DANDROID_LARGE_MEMORY_DEVICE\n') |
| 158 f.write('\tendif\n') |
| 159 f.write('else\n') |
140 f.write('\tLOCAL_CFLAGS += -DANDROID_LARGE_MEMORY_DEVICE\n') | 160 f.write('\tLOCAL_CFLAGS += -DANDROID_LARGE_MEMORY_DEVICE\n') |
141 f.write('endif\n\n') | 161 f.write('endif\n\n') |
142 | 162 |
143 f.write('ifeq ($(TARGET_ARCH),x86)\n') | |
144 f.write('\tLOCAL_CFLAGS += -DANDROID_LARGE_MEMORY_DEVICE\n') | |
145 f.write('endif\n\n') | |
146 | |
147 f.write('# used for testing\n') | 163 f.write('# used for testing\n') |
148 f.write('#LOCAL_CFLAGS += -g -O0\n\n') | 164 f.write('#LOCAL_CFLAGS += -g -O0\n\n') |
149 | 165 |
150 f.write('ifeq ($(NO_FALLBACK_FONT),true)\n') | 166 f.write('ifeq ($(NO_FALLBACK_FONT),true)\n') |
151 f.write('\tLOCAL_CFLAGS += -DNO_FALLBACK_FONT\n') | 167 f.write('\tLOCAL_CFLAGS += -DNO_FALLBACK_FONT\n') |
152 f.write('endif\n\n') | 168 f.write('endif\n\n') |
153 | 169 |
154 write_local_vars(f, common, False) | 170 write_local_vars(f, common, False, None) |
155 | 171 |
156 f.write('ifeq ($(TARGET_ARCH),arm)\n') | 172 for data in deviations_from_common: |
157 f.write('ifeq ($(ARCH_ARM_HAVE_NEON),true)\n') | 173 if data.condition: |
158 write_local_vars(f, arm_neon, True) | 174 f.write('ifeq ($(%s), true)\n' % data.condition) |
159 f.write('endif\n\n') | 175 write_local_vars(f, data.vars_dict, True, data.name) |
160 write_local_vars(f, arm, True) | 176 if data.condition: |
161 | 177 f.write('endif\n\n') |
162 if variables.INCLUDE_X86_OPTS: | |
163 f.write('else ifeq ($(TARGET_ARCH),x86)\n') | |
164 write_local_vars(f, x86, True) | |
165 | |
166 f.write('else\n') | |
167 write_local_vars(f, default, True) | |
168 f.write('endif\n\n') | |
169 | 178 |
170 f.write('include external/stlport/libstlport.mk\n') | 179 f.write('include external/stlport/libstlport.mk\n') |
171 f.write('LOCAL_MODULE:= libskia\n') | 180 f.write('LOCAL_MODULE:= libskia\n') |
172 f.write('include $(BUILD_SHARED_LIBRARY)\n') | 181 f.write('include $(BUILD_SHARED_LIBRARY)\n') |
173 | 182 |
174 | |
175 | |
OLD | NEW |