Index: pylib/gyp/input.py |
=================================================================== |
--- pylib/gyp/input.py (revision 1311) |
+++ pylib/gyp/input.py (working copy) |
@@ -2105,6 +2105,33 @@ |
(target, target_type, '/'.join(VALID_TARGET_TYPES))) |
+def ValidateSourcesInTarget(target, target_dict, build_file): |
+ # TODO: Check if MSVC allows this for non-static_library targets. |
+ if target_dict.get('type', None) != 'static_library': |
+ return |
+ sources = target_dict.get('sources', []) |
+ basenames = {} |
+ for source in sources: |
+ name, ext = os.path.splitext(source) |
+ is_compiled_file = ext in [ |
+ '.c', '.cc', '.cpp', '.cxx', '.m', '.mm', '.s', '.S'] |
+ if not is_compiled_file: |
+ continue |
+ basename = os.path.basename(name) # Don't include extension. |
+ basenames.setdefault(basename, []).append(source) |
+ |
+ error = '' |
+ for basename, files in basenames.iteritems(): |
+ if len(files) > 1: |
+ error += ' %s: %s\n' % (basename, ' '.join(files)) |
+ |
+ if error: |
+ print ('static library %s has several files with the same basename:\n' % |
+ target + error + 'Some build systems, e.g. MSVC08, ' |
+ 'cannot handle that.') |
+ raise KeyError, 'Duplicate basenames in sources section, see list above' |
+ |
+ |
def ValidateRulesInTarget(target, target_dict, extra_sources_for_rules): |
"""Ensures that the rules sections in target_dict are valid and consistent, |
and determines which sources they apply to. |
@@ -2162,22 +2189,6 @@ |
rule['rule_sources'] = rule_sources |
-def ValidateActionsInTarget(target, target_dict, build_file): |
- '''Validates the inputs to the actions in a target.''' |
- target_name = target_dict.get('target_name') |
- actions = target_dict.get('actions', []) |
- for action in actions: |
- action_name = action.get('action_name') |
- if not action_name: |
- raise Exception("Anonymous action in target %s. " |
- "An action must have an 'action_name' field." % |
- target_name) |
- inputs = action.get('inputs', []) |
- action_command = action.get('action') |
- if action_command and not action_command[0]: |
- raise Exception("Empty action as command in target %s." % target_name) |
- |
- |
def ValidateRunAsInTarget(target, target_dict, build_file): |
target_name = target_dict.get('target_name') |
run_as = target_dict.get('run_as') |
@@ -2208,6 +2219,22 @@ |
(target_name, build_file)) |
+def ValidateActionsInTarget(target, target_dict, build_file): |
+ '''Validates the inputs to the actions in a target.''' |
+ target_name = target_dict.get('target_name') |
+ actions = target_dict.get('actions', []) |
+ for action in actions: |
+ action_name = action.get('action_name') |
+ if not action_name: |
+ raise Exception("Anonymous action in target %s. " |
+ "An action must have an 'action_name' field." % |
+ target_name) |
+ inputs = action.get('inputs', []) |
+ action_command = action.get('action') |
+ if action_command and not action_command[0]: |
+ raise Exception("Empty action as command in target %s." % target_name) |
+ |
+ |
def TurnIntIntoStrInDict(the_dict): |
"""Given dict the_dict, recursively converts all integers into strings. |
""" |
@@ -2393,6 +2420,7 @@ |
target_dict = targets[target] |
build_file = gyp.common.BuildFile(target) |
ValidateTargetType(target, target_dict) |
+ ValidateSourcesInTarget(target, target_dict, build_file) |
ValidateRulesInTarget(target, target_dict, extra_sources_for_rules) |
ValidateRunAsInTarget(target, target_dict, build_file) |
ValidateActionsInTarget(target, target_dict, build_file) |