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

Side by Side Diff: pylib/gyp/xcode_ninja.py

Issue 234843005: Add xcode_ninja_target_pattern to xcode-ninja generator (Closed) Base URL: http://gyp.googlecode.com/svn/trunk
Patch Set: English Created 6 years, 7 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 | Annotate | Revision Log
« no previous file with comments | « no previous file | 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 # Copyright (c) 2014 Google Inc. All rights reserved. 1 # Copyright (c) 2014 Google Inc. All rights reserved.
2 # Use of this source code is governed by a BSD-style license that can be 2 # Use of this source code is governed by a BSD-style license that can be
3 # found in the LICENSE file. 3 # found in the LICENSE file.
4 4
5 """Xcode-ninja wrapper project file generator. 5 """Xcode-ninja wrapper project file generator.
6 6
7 This updates the data structures passed to the Xcode gyp generator to build 7 This updates the data structures passed to the Xcode gyp generator to build
8 with ninja instead. The Xcode project itself is transformed into a list of 8 with ninja instead. The Xcode project itself is transformed into a list of
9 executable targets, each with a build step to build with ninja, and a target 9 executable targets, each with a build step to build with ninja, and a target
10 with every source and resource file. This appears to sidestep some of the 10 with every source and resource file. This appears to sidestep some of the
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after
105 new_xcode_settings['CONFIGURATION_BUILD_DIR'], 105 new_xcode_settings['CONFIGURATION_BUILD_DIR'],
106 target_name, 106 target_name,
107 ], 107 ],
108 'message': 'Compile and copy %s via ninja' % target_name, 108 'message': 'Compile and copy %s via ninja' % target_name,
109 }, 109 },
110 ] 110 ]
111 if jobs > 0: 111 if jobs > 0:
112 ninja_target['actions'][0]['action'].extend(('-j', jobs)) 112 ninja_target['actions'][0]['action'].extend(('-j', jobs))
113 return ninja_target 113 return ninja_target
114 114
115 def IsValidTargetForWrapper(target_extras, executable_target_pattern, spec):
116 """Limit targets for Xcode wrapper.
117
118 Xcode sometimes performs poorly with too many targets, so only include
119 proper executable targets, with filters to customize.
120 Arguments:
121 target_extras: Regular expression to always add, matching any target.
122 executable_target_pattern: Regular expression limiting executable targets.
123 spec: Specifications for target.
124 """
125 target_name = spec.get('target_name')
126 # Always include targets matching target_extras.
127 if target_extras is not None and re.search(target_extras, target_name):
128 return True
129
130 # Otherwise just show executable targets.
131 if spec.get('type', '') == 'executable' and \
132 spec.get('product_extension', '') != 'bundle':
133
134 # If there is a filter and the target does not match, exclude the target.
135 if executable_target_pattern is not None:
136 if not re.search(executable_target_pattern, target_name):
137 return False
138 return True
139 return False
140
115 def CreateWrapper(target_list, target_dicts, data, params): 141 def CreateWrapper(target_list, target_dicts, data, params):
116 """Initialize targets for the ninja wrapper. 142 """Initialize targets for the ninja wrapper.
117 143
118 This sets up the necessary variables in the targets to generate Xcode projects 144 This sets up the necessary variables in the targets to generate Xcode projects
119 that use ninja as an external builder. 145 that use ninja as an external builder.
120 Arguments: 146 Arguments:
121 target_list: List of target pairs: 'base/base.gyp:base'. 147 target_list: List of target pairs: 'base/base.gyp:base'.
122 target_dicts: Dict of target properties keyed on target pair. 148 target_dicts: Dict of target properties keyed on target pair.
123 data: Dict of flattened build files keyed on gyp path. 149 data: Dict of flattened build files keyed on gyp path.
124 params: Dict of global options for gyp. 150 params: Dict of global options for gyp.
(...skipping 16 matching lines...) Expand all
141 new_target_dicts = {} 167 new_target_dicts = {}
142 new_data = {} 168 new_data = {}
143 169
144 # Set base keys needed for |data|. 170 # Set base keys needed for |data|.
145 new_data[main_gyp] = {} 171 new_data[main_gyp] = {}
146 new_data[main_gyp]['included_files'] = [] 172 new_data[main_gyp]['included_files'] = []
147 new_data[main_gyp]['targets'] = [] 173 new_data[main_gyp]['targets'] = []
148 new_data[main_gyp]['xcode_settings'] = \ 174 new_data[main_gyp]['xcode_settings'] = \
149 data[orig_gyp].get('xcode_settings', {}) 175 data[orig_gyp].get('xcode_settings', {})
150 176
177 # Normally the xcode-ninja generator includes only valid executable targets.
178 # If |xcode_ninja_executable_target_pattern| is set, that list is reduced to
179 # executable targets that match the pattern. (Default all)
180 executable_target_pattern = \
181 generator_flags.get('xcode_ninja_executable_target_pattern', None)
182
183 # For including other non-executable targets, add the matching target name
184 # to the |xcode_ninja_target_pattern| regular expression. (Default none)
185 target_extras = generator_flags.get('xcode_ninja_target_pattern', None)
186
151 for old_qualified_target in target_list: 187 for old_qualified_target in target_list:
152 spec = target_dicts[old_qualified_target] 188 spec = target_dicts[old_qualified_target]
153 if spec.get('type', '') == 'executable' and \ 189 if IsValidTargetForWrapper(target_extras, executable_target_pattern, spec):
154 spec.get('product_extension', '') != 'bundle':
155
156 # Add to new_target_list. 190 # Add to new_target_list.
157 target_name = spec.get('target_name') 191 target_name = spec.get('target_name')
158
159 # Filter target names if requested.
160 target_filter = generator_flags.get('xcode_ninja_target_filter', None)
161 if target_filter is not None:
162 if not re.search(target_filter, target_name):
163 continue;
164
165 new_target_name = '%s:%s#target' % (main_gyp, target_name) 192 new_target_name = '%s:%s#target' % (main_gyp, target_name)
166 new_target_list.append(new_target_name) 193 new_target_list.append(new_target_name)
167 194
168 # Add to new_target_dicts. 195 # Add to new_target_dicts.
169 new_target_dicts[new_target_name] = _TargetFromSpec(spec, params) 196 new_target_dicts[new_target_name] = _TargetFromSpec(spec, params)
170 197
171 # Add to new_data. 198 # Add to new_data.
172 for old_target in data[old_qualified_target.split(':')[0]]['targets']: 199 for old_target in data[old_qualified_target.split(':')[0]]['targets']:
173 if old_target['target_name'] == target_name: 200 if old_target['target_name'] == target_name:
174 new_data_target = {} 201 new_data_target = {}
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
221 new_data[sources_gyp] = {} 248 new_data[sources_gyp] = {}
222 new_data[sources_gyp]['targets'] = [] 249 new_data[sources_gyp]['targets'] = []
223 new_data[sources_gyp]['included_files'] = [] 250 new_data[sources_gyp]['included_files'] = []
224 new_data[sources_gyp]['xcode_settings'] = \ 251 new_data[sources_gyp]['xcode_settings'] = \
225 data[orig_gyp].get('xcode_settings', {}) 252 data[orig_gyp].get('xcode_settings', {})
226 new_data[sources_gyp]['targets'].append(new_data_target) 253 new_data[sources_gyp]['targets'].append(new_data_target)
227 254
228 # Write workspace to file. 255 # Write workspace to file.
229 _WriteWorkspace(main_gyp, sources_gyp) 256 _WriteWorkspace(main_gyp, sources_gyp)
230 return (new_target_list, new_target_dicts, new_data) 257 return (new_target_list, new_target_dicts, new_data)
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698