| OLD | NEW |
| 1 # Copyright (c) 2012 Google Inc. All rights reserved. | 1 # Copyright (c) 2012 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 from compiler.ast import Const | 5 from compiler.ast import Const |
| 6 from compiler.ast import Dict | 6 from compiler.ast import Dict |
| 7 from compiler.ast import Discard | 7 from compiler.ast import Discard |
| 8 from compiler.ast import List | 8 from compiler.ast import List |
| 9 from compiler.ast import Module | 9 from compiler.ast import Module |
| 10 from compiler.ast import Node | 10 from compiler.ast import Node |
| (...skipping 2155 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2166 if len(files) > 1: | 2166 if len(files) > 1: |
| 2167 error += ' %s: %s\n' % (basename, ' '.join(files)) | 2167 error += ' %s: %s\n' % (basename, ' '.join(files)) |
| 2168 | 2168 |
| 2169 if error: | 2169 if error: |
| 2170 print ('static library %s has several files with the same basename:\n' % | 2170 print ('static library %s has several files with the same basename:\n' % |
| 2171 target + error + 'Some build systems, e.g. MSVC08, ' | 2171 target + error + 'Some build systems, e.g. MSVC08, ' |
| 2172 'cannot handle that.') | 2172 'cannot handle that.') |
| 2173 raise KeyError, 'Duplicate basenames in sources section, see list above' | 2173 raise KeyError, 'Duplicate basenames in sources section, see list above' |
| 2174 | 2174 |
| 2175 | 2175 |
| 2176 def ValidateSourcesInTarget(target, target_dict, build_file): | |
| 2177 # TODO: Check if MSVC allows this for non-static_library targets. | |
| 2178 if target_dict.get('type', None) != 'static_library': | |
| 2179 return | |
| 2180 sources = target_dict.get('sources', []) | |
| 2181 basenames = {} | |
| 2182 for source in sources: | |
| 2183 name, ext = os.path.splitext(source) | |
| 2184 is_compiled_file = ext in [ | |
| 2185 '.c', '.cc', '.cpp', '.cxx', '.m', '.mm', '.s', '.S'] | |
| 2186 if not is_compiled_file: | |
| 2187 continue | |
| 2188 basename = os.path.basename(name) # Don't include extension. | |
| 2189 basenames.setdefault(basename, []).append(source) | |
| 2190 | |
| 2191 error = '' | |
| 2192 for basename, files in basenames.iteritems(): | |
| 2193 if len(files) > 1: | |
| 2194 error += ' %s: %s\n' % (basename, ' '.join(files)) | |
| 2195 | |
| 2196 if error: | |
| 2197 print ('static library %s has several files with the same basename:\n' % | |
| 2198 target + error + 'Some build systems, e.g. MSVC08, ' | |
| 2199 'cannot handle that.') | |
| 2200 raise KeyError, 'Duplicate basenames in sources section, see list above' | |
| 2201 | |
| 2202 | |
| 2203 def ValidateRulesInTarget(target, target_dict, extra_sources_for_rules): | 2176 def ValidateRulesInTarget(target, target_dict, extra_sources_for_rules): |
| 2204 """Ensures that the rules sections in target_dict are valid and consistent, | 2177 """Ensures that the rules sections in target_dict are valid and consistent, |
| 2205 and determines which sources they apply to. | 2178 and determines which sources they apply to. |
| 2206 | 2179 |
| 2207 Arguments: | 2180 Arguments: |
| 2208 target: string, name of target. | 2181 target: string, name of target. |
| 2209 target_dict: dict, target spec containing "rules" and "sources" lists. | 2182 target_dict: dict, target spec containing "rules" and "sources" lists. |
| 2210 extra_sources_for_rules: a list of keys to scan for rule matches in | 2183 extra_sources_for_rules: a list of keys to scan for rule matches in |
| 2211 addition to 'sources'. | 2184 addition to 'sources'. |
| 2212 """ | 2185 """ |
| (...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2296 if not action_name: | 2269 if not action_name: |
| 2297 raise Exception("Anonymous action in target %s. " | 2270 raise Exception("Anonymous action in target %s. " |
| 2298 "An action must have an 'action_name' field." % | 2271 "An action must have an 'action_name' field." % |
| 2299 target_name) | 2272 target_name) |
| 2300 inputs = action.get('inputs', []) | 2273 inputs = action.get('inputs', []) |
| 2301 action_command = action.get('action') | 2274 action_command = action.get('action') |
| 2302 if action_command and not action_command[0]: | 2275 if action_command and not action_command[0]: |
| 2303 raise Exception("Empty action as command in target %s." % target_name) | 2276 raise Exception("Empty action as command in target %s." % target_name) |
| 2304 | 2277 |
| 2305 | 2278 |
| 2306 def ValidateActionsInTarget(target, target_dict, build_file): | |
| 2307 '''Validates the inputs to the actions in a target.''' | |
| 2308 target_name = target_dict.get('target_name') | |
| 2309 actions = target_dict.get('actions', []) | |
| 2310 for action in actions: | |
| 2311 action_name = action.get('action_name') | |
| 2312 if not action_name: | |
| 2313 raise Exception("Anonymous action in target %s. " | |
| 2314 "An action must have an 'action_name' field." % | |
| 2315 target_name) | |
| 2316 inputs = action.get('inputs', []) | |
| 2317 action_command = action.get('action') | |
| 2318 if action_command and not action_command[0]: | |
| 2319 raise Exception("Empty action as command in target %s." % target_name) | |
| 2320 | |
| 2321 | |
| 2322 def TurnIntIntoStrInDict(the_dict): | 2279 def TurnIntIntoStrInDict(the_dict): |
| 2323 """Given dict the_dict, recursively converts all integers into strings. | 2280 """Given dict the_dict, recursively converts all integers into strings. |
| 2324 """ | 2281 """ |
| 2325 # Use items instead of iteritems because there's no need to try to look at | 2282 # Use items instead of iteritems because there's no need to try to look at |
| 2326 # reinserted keys and their associated values. | 2283 # reinserted keys and their associated values. |
| 2327 for k, v in the_dict.items(): | 2284 for k, v in the_dict.items(): |
| 2328 if isinstance(v, int): | 2285 if isinstance(v, int): |
| 2329 v = str(v) | 2286 v = str(v) |
| 2330 the_dict[k] = v | 2287 the_dict[k] = v |
| 2331 elif isinstance(v, dict): | 2288 elif isinstance(v, dict): |
| (...skipping 190 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2522 ValidateRunAsInTarget(target, target_dict, build_file) | 2479 ValidateRunAsInTarget(target, target_dict, build_file) |
| 2523 ValidateActionsInTarget(target, target_dict, build_file) | 2480 ValidateActionsInTarget(target, target_dict, build_file) |
| 2524 | 2481 |
| 2525 # Generators might not expect ints. Turn them into strs. | 2482 # Generators might not expect ints. Turn them into strs. |
| 2526 TurnIntIntoStrInDict(data) | 2483 TurnIntIntoStrInDict(data) |
| 2527 | 2484 |
| 2528 # TODO(mark): Return |data| for now because the generator needs a list of | 2485 # TODO(mark): Return |data| for now because the generator needs a list of |
| 2529 # build files that came in. In the future, maybe it should just accept | 2486 # build files that came in. In the future, maybe it should just accept |
| 2530 # a list, and not the whole data dict. | 2487 # a list, and not the whole data dict. |
| 2531 return [flat_list, targets, data] | 2488 return [flat_list, targets, data] |
| OLD | NEW |