| 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 import copy | 5 import copy |
| 6 import ntpath | 6 import ntpath |
| 7 import os | 7 import os |
| 8 import posixpath | 8 import posixpath |
| 9 import re | 9 import re |
| 10 import subprocess | 10 import subprocess |
| (...skipping 903 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 914 # Skip emitting anything if told to with msvs_existing_vcproj option. | 914 # Skip emitting anything if told to with msvs_existing_vcproj option. |
| 915 if default_config.get('msvs_existing_vcproj'): | 915 if default_config.get('msvs_existing_vcproj'): |
| 916 return [] | 916 return [] |
| 917 | 917 |
| 918 if version.UsesVcxproj(): | 918 if version.UsesVcxproj(): |
| 919 return _GenerateMSBuildProject(project, options, version, generator_flags) | 919 return _GenerateMSBuildProject(project, options, version, generator_flags) |
| 920 else: | 920 else: |
| 921 return _GenerateMSVSProject(project, options, version, generator_flags) | 921 return _GenerateMSVSProject(project, options, version, generator_flags) |
| 922 | 922 |
| 923 | 923 |
| 924 # TODO: Avoid code duplication with _ValidateSourcesForOSX in make.py. |
| 925 def _ValidateSourcesForMSVSProject(spec, version): |
| 926 """Makes sure if duplicate basenames are not specified in the source list. |
| 927 |
| 928 Arguments: |
| 929 spec: The target dictionary containing the properties of the target. |
| 930 version: The VisualStudioVersion object. |
| 931 """ |
| 932 # This validation should not be applied to MSVC2010 and later. |
| 933 assert not version.UsesVcxproj() |
| 934 |
| 935 # TODO: Check if MSVC allows this for loadable_module targets. |
| 936 if spec.get('type', None) not in ('static_library', 'shared_library'): |
| 937 return |
| 938 sources = spec.get('sources', []) |
| 939 basenames = {} |
| 940 for source in sources: |
| 941 name, ext = os.path.splitext(source) |
| 942 is_compiled_file = ext in [ |
| 943 '.c', '.cc', '.cpp', '.cxx', '.m', '.mm', '.s', '.S'] |
| 944 if not is_compiled_file: |
| 945 continue |
| 946 basename = os.path.basename(name) # Don't include extension. |
| 947 basenames.setdefault(basename, []).append(source) |
| 948 |
| 949 error = '' |
| 950 for basename, files in basenames.iteritems(): |
| 951 if len(files) > 1: |
| 952 error += ' %s: %s\n' % (basename, ' '.join(files)) |
| 953 |
| 954 if error: |
| 955 print('static library %s has several files with the same basename:\n' % |
| 956 spec['target_name'] + error + 'MSVC08 cannot handle that.') |
| 957 raise GypError('Duplicate basenames in sources section, see list above') |
| 958 |
| 959 |
| 924 def _GenerateMSVSProject(project, options, version, generator_flags): | 960 def _GenerateMSVSProject(project, options, version, generator_flags): |
| 925 """Generates a .vcproj file. It may create .rules and .user files too. | 961 """Generates a .vcproj file. It may create .rules and .user files too. |
| 926 | 962 |
| 927 Arguments: | 963 Arguments: |
| 928 project: The project object we will generate the file for. | 964 project: The project object we will generate the file for. |
| 929 options: Global options passed to the generator. | 965 options: Global options passed to the generator. |
| 930 version: The VisualStudioVersion object. | 966 version: The VisualStudioVersion object. |
| 931 generator_flags: dict of generator-specific flags. | 967 generator_flags: dict of generator-specific flags. |
| 932 """ | 968 """ |
| 933 spec = project.spec | 969 spec = project.spec |
| 934 gyp.common.EnsureDirExists(project.path) | 970 gyp.common.EnsureDirExists(project.path) |
| 935 | 971 |
| 936 platforms = _GetUniquePlatforms(spec) | 972 platforms = _GetUniquePlatforms(spec) |
| 937 p = MSVSProject.Writer(project.path, version, spec['target_name'], | 973 p = MSVSProject.Writer(project.path, version, spec['target_name'], |
| 938 project.guid, platforms) | 974 project.guid, platforms) |
| 939 | 975 |
| 940 # Get directory project file is in. | 976 # Get directory project file is in. |
| 941 project_dir = os.path.split(project.path)[0] | 977 project_dir = os.path.split(project.path)[0] |
| 942 gyp_path = _NormalizedSource(project.build_file) | 978 gyp_path = _NormalizedSource(project.build_file) |
| 943 relative_path_of_gyp_file = gyp.common.RelativePath(gyp_path, project_dir) | 979 relative_path_of_gyp_file = gyp.common.RelativePath(gyp_path, project_dir) |
| 944 | 980 |
| 945 config_type = _GetMSVSConfigurationType(spec, project.build_file) | 981 config_type = _GetMSVSConfigurationType(spec, project.build_file) |
| 946 for config_name, config in spec['configurations'].iteritems(): | 982 for config_name, config in spec['configurations'].iteritems(): |
| 947 _AddConfigurationToMSVSProject(p, spec, config_type, config_name, config) | 983 _AddConfigurationToMSVSProject(p, spec, config_type, config_name, config) |
| 948 | 984 |
| 985 # MSVC08 and prior version cannot handle duplicate basenames in the same |
| 986 # target. |
| 987 # TODO: Take excluded sources into consideration if possible. |
| 988 _ValidateSourcesForMSVSProject(spec, version) |
| 989 |
| 949 # Prepare list of sources and excluded sources. | 990 # Prepare list of sources and excluded sources. |
| 950 gyp_file = os.path.split(project.build_file)[1] | 991 gyp_file = os.path.split(project.build_file)[1] |
| 951 sources, excluded_sources = _PrepareListOfSources(spec, generator_flags, | 992 sources, excluded_sources = _PrepareListOfSources(spec, generator_flags, |
| 952 gyp_file) | 993 gyp_file) |
| 953 | 994 |
| 954 # Add rules. | 995 # Add rules. |
| 955 actions_to_add = {} | 996 actions_to_add = {} |
| 956 _GenerateRulesForMSVS(p, project_dir, options, spec, | 997 _GenerateRulesForMSVS(p, project_dir, options, spec, |
| 957 sources, excluded_sources, | 998 sources, excluded_sources, |
| 958 actions_to_add) | 999 actions_to_add) |
| (...skipping 2355 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3314 action_spec.extend( | 3355 action_spec.extend( |
| 3315 # TODO(jeanluc) 'Document' for all or just if as_sources? | 3356 # TODO(jeanluc) 'Document' for all or just if as_sources? |
| 3316 [['FileType', 'Document'], | 3357 [['FileType', 'Document'], |
| 3317 ['Command', command], | 3358 ['Command', command], |
| 3318 ['Message', description], | 3359 ['Message', description], |
| 3319 ['Outputs', outputs] | 3360 ['Outputs', outputs] |
| 3320 ]) | 3361 ]) |
| 3321 if additional_inputs: | 3362 if additional_inputs: |
| 3322 action_spec.append(['AdditionalInputs', additional_inputs]) | 3363 action_spec.append(['AdditionalInputs', additional_inputs]) |
| 3323 actions_spec.append(action_spec) | 3364 actions_spec.append(action_spec) |
| OLD | NEW |