Index: pylib/gyp/msvs_emulation.py |
=================================================================== |
--- pylib/gyp/msvs_emulation.py (revision 1421) |
+++ pylib/gyp/msvs_emulation.py (working copy) |
@@ -145,6 +145,7 @@ |
('msvs_disabled_warnings', list), |
('msvs_precompiled_header', str), |
('msvs_precompiled_source', str), |
+ ('msvs_target_platform', str), |
] |
configs = spec['configurations'] |
for field, default in supported_fields: |
@@ -154,9 +155,11 @@ |
self.msvs_cygwin_dirs = spec.get('msvs_cygwin_dirs', ['.']) |
- def GetVSMacroEnv(self, base_to_build=None): |
+ def GetVSMacroEnv(self, base_to_build=None, config=None): |
"""Get a dict of variables mapping internal VS macro names to their gyp |
equivalents.""" |
+ target_platform = self.GetTargetPlatform(config) |
+ target_platform = {'x86': 'Win32'}.get(target_platform, target_platform) |
replacements = { |
'$(VSInstallDir)': self.vs_version.Path(), |
'$(VCInstallDir)': os.path.join(self.vs_version.Path(), 'VC') + '\\', |
@@ -165,7 +168,7 @@ |
'$(InputPath)': '${source}', |
'$(InputName)': '${root}', |
'$(ProjectName)': self.spec['target_name'], |
- '$(PlatformName)': 'Win32', # TODO(scottmg): Support for x64 toolchain. |
+ '$(PlatformName)': target_platform, |
} |
# Chromium uses DXSDK_DIR in include/lib paths, but it may or may not be |
# set. This happens when the SDK is sync'd via src-internal, rather than |
@@ -175,9 +178,9 @@ |
replacements['$(WDK_DIR)'] = self.wdk_dir if self.wdk_dir else '' |
return replacements |
- def ConvertVSMacros(self, s, base_to_build=None): |
+ def ConvertVSMacros(self, s, base_to_build=None, config=None): |
"""Convert from VS macro names to something equivalent.""" |
- env = self.GetVSMacroEnv(base_to_build) |
+ env = self.GetVSMacroEnv(base_to_build, config=config) |
return ExpandMacros(s, env) |
def AdjustLibraries(self, libraries): |
@@ -204,15 +207,29 @@ |
return self.parent._GetAndMunge(self.field, self.base_path + [name], |
default=default, prefix=prefix, append=self.append, map=map) |
+ def GetTargetPlatform(self, config): |
+ target_platform = self.msvs_target_platform.get(config, '') |
+ if not target_platform: |
+ target_platform = 'Win32' |
+ return {'Win32': 'x86'}.get(target_platform, target_platform) |
+ |
+ def _RealConfig(self, config): |
+ target_platform = self.GetTargetPlatform(config) |
+ if target_platform == 'x64' and not config.endswith('_x64'): |
+ config += '_x64' |
+ return config |
+ |
def _Setting(self, path, config, |
default=None, prefix='', append=None, map=None): |
"""_GetAndMunge for msvs_settings.""" |
+ config = self._RealConfig(config) |
return self._GetAndMunge( |
self.msvs_settings[config], path, default, prefix, append, map) |
def _ConfigAttrib(self, path, config, |
default=None, prefix='', append=None, map=None): |
"""_GetAndMunge for msvs_configuration_attributes.""" |
+ config = self._RealConfig(config) |
return self._GetAndMunge( |
self.msvs_configuration_attributes[config], |
path, default, prefix, append, map) |
@@ -220,14 +237,16 @@ |
def AdjustIncludeDirs(self, include_dirs, config): |
"""Updates include_dirs to expand VS specific paths, and adds the system |
include dirs used for platform SDK and similar.""" |
+ config = self._RealConfig(config) |
includes = include_dirs + self.msvs_system_include_dirs[config] |
includes.extend(self._Setting( |
('VCCLCompilerTool', 'AdditionalIncludeDirectories'), config, default=[])) |
- return [self.ConvertVSMacros(p) for p in includes] |
+ return [self.ConvertVSMacros(p, config=config) for p in includes] |
def GetComputedDefines(self, config): |
"""Returns the set of defines that are injected to the defines list based |
on other VS settings.""" |
+ config = self._RealConfig(config) |
defines = [] |
if self._ConfigAttrib(['CharacterSet'], config) == '1': |
defines.extend(('_UNICODE', 'UNICODE')) |
@@ -240,16 +259,19 @@ |
def GetOutputName(self, config, expand_special): |
"""Gets the explicitly overridden output name for a target or returns None |
if it's not overridden.""" |
+ config = self._RealConfig(config) |
type = self.spec['type'] |
root = 'VCLibrarianTool' if type == 'static_library' else 'VCLinkerTool' |
# TODO(scottmg): Handle OutputDirectory without OutputFile. |
output_file = self._Setting((root, 'OutputFile'), config) |
if output_file: |
- output_file = expand_special(self.ConvertVSMacros(output_file)) |
+ output_file = expand_special(self.ConvertVSMacros( |
+ output_file, config=config)) |
return output_file |
def GetCflags(self, config): |
"""Returns the flags that need to be added to .c and .cc compilations.""" |
+ config = self._RealConfig(config) |
cflags = [] |
cflags.extend(['/wd' + w for w in self.msvs_disabled_warnings[config]]) |
cl = self._GetWrapper(self, self.msvs_settings[config], |
@@ -280,11 +302,13 @@ |
def GetPrecompiledHeader(self, config, gyp_to_build_path): |
"""Returns an object that handles the generation of precompiled header |
build steps.""" |
+ config = self._RealConfig(config) |
return _PchHelper(self, config, gyp_to_build_path) |
def _GetPchFlags(self, config, extension): |
"""Get the flags to be added to the cflags for precompiled header support. |
""" |
+ config = self._RealConfig(config) |
# The PCH is only built once by a particular source file. Usage of PCH must |
# only be for the same language (i.e. C vs. C++), so only include the pch |
# flags when the language matches. |
@@ -297,23 +321,28 @@ |
def GetCflagsC(self, config): |
"""Returns the flags that need to be added to .c compilations.""" |
+ config = self._RealConfig(config) |
return self._GetPchFlags(config, '.c') |
def GetCflagsCC(self, config): |
"""Returns the flags that need to be added to .cc compilations.""" |
+ config = self._RealConfig(config) |
return ['/TP'] + self._GetPchFlags(config, '.cc') |
def _GetAdditionalLibraryDirectories(self, root, config, gyp_to_build_path): |
"""Get and normalize the list of paths in AdditionalLibraryDirectories |
setting.""" |
+ config = self._RealConfig(config) |
libpaths = self._Setting((root, 'AdditionalLibraryDirectories'), |
config, default=[]) |
- libpaths = [os.path.normpath(gyp_to_build_path(self.ConvertVSMacros(p))) |
+ libpaths = [os.path.normpath( |
+ gyp_to_build_path(self.ConvertVSMacros(p, config=config))) |
for p in libpaths] |
return ['/LIBPATH:"' + p + '"' for p in libpaths] |
def GetLibFlags(self, config, gyp_to_build_path): |
"""Returns the flags that need to be added to lib commands.""" |
+ config = self._RealConfig(config) |
libflags = [] |
lib = self._GetWrapper(self, self.msvs_settings[config], |
'VCLibrarianTool', append=libflags) |
@@ -335,6 +364,7 @@ |
def GetLdflags(self, config, gyp_to_build_path, expand_special): |
"""Returns the flags that need to be added to link commands.""" |
+ config = self._RealConfig(config) |
ldflags = [] |
ld = self._GetWrapper(self, self.msvs_settings[config], |
'VCLinkerTool', append=ldflags) |
@@ -387,12 +417,14 @@ |
def IsUseLibraryDependencyInputs(self, config): |
"""Returns whether the target should be linked via Use Library Dependency |
Inputs (using component .objs of a given .lib).""" |
+ config = self._RealConfig(config) |
uldi = self._Setting(('VCLinkerTool', 'UseLibraryDependencyInputs'), config) |
return uldi == 'true' |
def GetRcflags(self, config, gyp_to_ninja_path): |
"""Returns the flags that need to be added to invocations of the resource |
compiler.""" |
+ config = self._RealConfig(config) |
rcflags = [] |
rc = self._GetWrapper(self, self.msvs_settings[config], |
'VCResourceCompilerTool', append=rcflags) |
@@ -440,9 +472,11 @@ |
def GetIdlBuildData(self, source, config): |
"""Determine the implicit outputs for an idl file. Returns output |
directory, outputs, and variables and flags that are required.""" |
+ config = self._RealConfig(config) |
midl_get = self._GetWrapper(self, self.msvs_settings[config], 'VCMIDLTool') |
def midl(name, default=None): |
- return self.ConvertVSMacros(midl_get(name, default=default)) |
+ return self.ConvertVSMacros(midl_get(name, default=default), |
+ config=config) |
tlb = midl('TypeLibraryName', default='${root}.tlb') |
header = midl('HeaderFileName', default='${root}.h') |
dlldata = midl('DLLDataFileName', default='dlldata.c') |