Index: pylib/gyp/generator/eclipse.py |
diff --git a/pylib/gyp/generator/eclipse.py b/pylib/gyp/generator/eclipse.py |
index 08425da8e89e1cf282686cc5c818a59785d995ea..07c1fa61c6a5c1e717d352e3888c6566c4d66652 100644 |
--- a/pylib/gyp/generator/eclipse.py |
+++ b/pylib/gyp/generator/eclipse.py |
@@ -22,6 +22,7 @@ import os.path |
import subprocess |
import gyp |
import gyp.common |
+import gyp.msvs_emulation |
import shlex |
generator_wants_static_library_dependencies_adjusted = False |
@@ -52,7 +53,30 @@ def CalculateVariables(default_variables, params): |
generator_flags = params.get('generator_flags', {}) |
for key, val in generator_flags.items(): |
default_variables.setdefault(key, val) |
- default_variables.setdefault('OS', gyp.common.GetFlavor(params)) |
+ flavor = gyp.common.GetFlavor(params) |
+ default_variables.setdefault('OS', flavor) |
+ if flavor == 'win': |
+ # Copy additional generator configuration data from VS, which is shared |
+ # by the Eclipse generator. |
+ import gyp.generator.msvs as msvs_generator |
+ generator_additional_non_configuration_keys = getattr(msvs_generator, |
+ 'generator_additional_non_configuration_keys', []) |
+ generator_additional_path_sections = getattr(msvs_generator, |
+ 'generator_additional_path_sections', []) |
+ |
+ # Set a variable so conditions can be based on msvs_version. |
+ msvs_version = gyp.msvs_emulation.GetVSVersion(generator_flags) |
+ default_variables['MSVS_VERSION'] = msvs_version.ShortName() |
+ |
+ # To determine processor word size on Windows, in addition to checking |
+ # PROCESSOR_ARCHITECTURE (which reflects the word size of the current |
+ # process), it is also necessary to check PROCESSOR_ARCHITEW6432 (which |
+ # contains the actual word size of the system when running thru WOW64). |
+ if ('64' in os.environ.get('PROCESSOR_ARCHITECTURE', '') or |
+ '64' in os.environ.get('PROCESSOR_ARCHITEW6432', '')): |
+ default_variables['MSVS_OS_BITS'] = 64 |
+ else: |
+ default_variables['MSVS_OS_BITS'] = 32 |
def CalculateGeneratorInputInfo(params): |
@@ -65,7 +89,7 @@ def CalculateGeneratorInputInfo(params): |
def GetAllIncludeDirectories(target_list, target_dicts, |
- shared_intermediate_dirs, config_name): |
+ shared_intermediate_dirs, config_name, params): |
"""Calculate the set of include directories to be used. |
Returns: |
@@ -76,6 +100,9 @@ def GetAllIncludeDirectories(target_list, target_dicts, |
gyp_includes_set = set() |
compiler_includes_list = [] |
+ flavor = gyp.common.GetFlavor(params) |
+ if flavor == 'win': |
+ generator_flags = params.get('generator_flags', {}) |
for target_name in target_list: |
target = target_dicts[target_name] |
if config_name in target['configurations']: |
@@ -85,7 +112,11 @@ def GetAllIncludeDirectories(target_list, target_dicts, |
# may be done in gyp files to force certain includes to come at the end. |
# TODO(jgreenwald): Change the gyp files to not abuse cflags for this, and |
# remove this. |
- cflags = config['cflags'] |
+ if flavor == 'win': |
+ msvs_settings = gyp.msvs_emulation.MsvsSettings(target, generator_flags) |
+ cflags = msvs_settings.GetCflags(config_name) |
+ else: |
+ cflags = config['cflags'] |
for cflag in cflags: |
include_dir = '' |
if cflag.startswith('-I'): |
@@ -146,7 +177,7 @@ def GetCompilerPath(target_list, target_dicts, data): |
return 'gcc' |
-def GetAllDefines(target_list, target_dicts, data, config_name): |
+def GetAllDefines(target_list, target_dicts, data, config_name, params): |
"""Calculate the defines for a project. |
Returns: |
@@ -156,22 +187,33 @@ def GetAllDefines(target_list, target_dicts, data, config_name): |
# Get defines declared in the gyp files. |
all_defines = {} |
+ flavor = gyp.common.GetFlavor(params) |
+ if flavor == 'win': |
+ generator_flags = params.get('generator_flags', {}) |
for target_name in target_list: |
target = target_dicts[target_name] |
+ if flavor == 'win': |
+ msvs_settings = gyp.msvs_emulation.MsvsSettings(target, generator_flags) |
+ extra_defines = msvs_settings.GetComputedDefines(config_name) |
+ else: |
+ extra_defines = [] |
if config_name in target['configurations']: |
config = target['configurations'][config_name] |
- for define in config['defines']: |
- split_define = define.split('=', 1) |
- if len(split_define) == 1: |
- split_define.append('1') |
- if split_define[0].strip() in all_defines: |
- # Already defined |
- continue |
- |
- all_defines[split_define[0].strip()] = split_define[1].strip() |
- |
+ target_defines = config['defines'] |
+ else: |
+ target_defines = [] |
+ for define in target_defines + extra_defines: |
+ split_define = define.split('=', 1) |
+ if len(split_define) == 1: |
+ split_define.append('1') |
+ if split_define[0].strip() in all_defines: |
+ # Already defined |
+ continue |
+ all_defines[split_define[0].strip()] = split_define[1].strip() |
# Get default compiler defines (if possible). |
+ if flavor == 'win': |
+ return all_defines # Default defines already processed in the loop above. |
cc_target = GetCompilerPath(target_list, target_dicts, data) |
if cc_target: |
command = shlex.split(cc_target) |
@@ -250,9 +292,10 @@ def GenerateOutputForConfig(target_list, target_dicts, data, params, |
eclipse_langs = ['C++ Source File', 'C Source File', 'Assembly Source File', |
'GNU C++', 'GNU C', 'Assembly'] |
include_dirs = GetAllIncludeDirectories(target_list, target_dicts, |
- shared_intermediate_dirs, config_name) |
+ shared_intermediate_dirs, config_name, |
+ params) |
WriteIncludePaths(out, eclipse_langs, include_dirs) |
- defines = GetAllDefines(target_list, target_dicts, data, config_name) |
+ defines = GetAllDefines(target_list, target_dicts, data, config_name, params) |
WriteMacros(out, eclipse_langs, defines) |
out.write('</cdtprojectproperties>\n') |