Index: pylib/gyp/generator/cmake.py |
diff --git a/pylib/gyp/generator/cmake.py b/pylib/gyp/generator/cmake.py |
index 17f5e6396c6303e16fc49944b0454df69763c1d8..a2b96291aa526aa5c93d1ecef687c70806872f53 100644 |
--- a/pylib/gyp/generator/cmake.py |
+++ b/pylib/gyp/generator/cmake.py |
@@ -34,6 +34,7 @@ import signal |
import string |
import subprocess |
import gyp.common |
+import gyp.xcode_emulation |
generator_default_variables = { |
'EXECUTABLE_PREFIX': '', |
@@ -608,8 +609,8 @@ class CMakeNamer(object): |
def WriteTarget(namer, qualified_target, target_dicts, build_dir, config_to_use, |
- options, generator_flags, all_qualified_targets, output): |
- |
+ options, generator_flags, all_qualified_targets, flavor, |
+ output): |
# The make generator does this always. |
# TODO: It would be nice to be able to tell CMake all dependencies. |
circular_libs = generator_flags.get('circular', True) |
@@ -633,6 +634,10 @@ def WriteTarget(namer, qualified_target, target_dicts, build_dir, config_to_use, |
spec = target_dicts.get(qualified_target, {}) |
config = spec.get('configurations', {}).get(config_to_use, {}) |
+ xcode_settings = None |
+ if flavor == 'mac': |
+ xcode_settings = gyp.xcode_emulation.XcodeSettings(spec) |
+ |
target_name = spec.get('target_name', '<missing target name>') |
target_type = spec.get('type', '<missing target type>') |
target_toolset = spec.get('toolset') |
@@ -904,10 +909,10 @@ def WriteTarget(namer, qualified_target, target_dicts, build_dir, config_to_use, |
defines = config.get('defines') |
if defines is not None: |
SetTargetProperty(output, |
- cmake_target_name, |
- 'COMPILE_DEFINITIONS', |
- defines, |
- ';') |
+ cmake_target_name, |
+ 'COMPILE_DEFINITIONS', |
+ defines, |
+ ';') |
# Compile Flags - http://www.cmake.org/Bug/view.php?id=6493 |
# CMake currently does not have target C and CXX flags. |
@@ -927,6 +932,13 @@ def WriteTarget(namer, qualified_target, target_dicts, build_dir, config_to_use, |
cflags = config.get('cflags', []) |
cflags_c = config.get('cflags_c', []) |
cflags_cxx = config.get('cflags_cc', []) |
+ if xcode_settings: |
+ cflags = xcode_settings.GetCflags(config_to_use) |
+ cflags_c = xcode_settings.GetCflagsC(config_to_use) |
+ cflags_cxx = xcode_settings.GetCflagsCC(config_to_use) |
+ #cflags_objc = xcode_settings.GetCflagsObjC(config_to_use) |
+ #cflags_objcc = xcode_settings.GetCflagsObjCC(config_to_use) |
+ |
if (not cflags_c or not c_sources) and (not cflags_cxx or not cxx_sources): |
SetTargetProperty(output, cmake_target_name, 'COMPILE_FLAGS', cflags, ' ') |
@@ -965,6 +977,13 @@ def WriteTarget(namer, qualified_target, target_dicts, build_dir, config_to_use, |
if ldflags is not None: |
SetTargetProperty(output, cmake_target_name, 'LINK_FLAGS', ldflags, ' ') |
+ # XCode settings |
+ xcode_settings = config.get('xcode_settings', {}) |
+ for xcode_setting, xcode_value in xcode_settings.viewitems(): |
+ SetTargetProperty(output, cmake_target_name, |
+ "XCODE_ATTRIBUTE_%s" % xcode_setting, xcode_value, |
+ '' if isinstance(xcode_value, str) else ' ') |
+ |
# Note on Dependencies and Libraries: |
# CMake wants to handle link order, resolving the link line up front. |
# Gyp does not retain or enforce specifying enough information to do so. |
@@ -1029,7 +1048,7 @@ def WriteTarget(namer, qualified_target, target_dicts, build_dir, config_to_use, |
output.write(cmake_target_name) |
output.write('\n') |
if static_deps: |
- write_group = circular_libs and len(static_deps) > 1 |
+ write_group = circular_libs and len(static_deps) > 1 and flavor != 'mac' |
if write_group: |
output.write('-Wl,--start-group\n') |
for dep in gyp.common.uniquer(static_deps): |
@@ -1045,9 +1064,9 @@ def WriteTarget(namer, qualified_target, target_dicts, build_dir, config_to_use, |
output.write('\n') |
if external_libs: |
for lib in gyp.common.uniquer(external_libs): |
- output.write(' ') |
- output.write(lib) |
- output.write('\n') |
+ output.write(' "') |
+ output.write(RemovePrefix(lib, "$(SDKROOT)")) |
+ output.write('"\n') |
output.write(')\n') |
@@ -1059,6 +1078,7 @@ def GenerateOutputForConfig(target_list, target_dicts, data, |
params, config_to_use): |
options = params['options'] |
generator_flags = params['generator_flags'] |
+ flavor = gyp.common.GetFlavor(params) |
# generator_dir: relative path from pwd to where make puts build files. |
# Makes migrating from make to cmake easier, cmake doesn't put anything here. |
@@ -1141,7 +1161,9 @@ def GenerateOutputForConfig(target_list, target_dicts, data, |
# Force ninja to use rsp files. Otherwise link and ar lines can get too long, |
# resulting in 'Argument list too long' errors. |
- output.write('set(CMAKE_NINJA_FORCE_RESPONSE_FILE 1)\n') |
+ # However, rsp files don't work correctly on Mac. |
+ if flavor != 'mac': |
+ output.write('set(CMAKE_NINJA_FORCE_RESPONSE_FILE 1)\n') |
output.write('\n') |
namer = CMakeNamer(target_list) |
@@ -1156,8 +1178,13 @@ def GenerateOutputForConfig(target_list, target_dicts, data, |
all_qualified_targets.add(qualified_target) |
for qualified_target in target_list: |
+ if flavor == 'mac': |
+ gyp_file, _, _ = gyp.common.ParseQualifiedTarget(qualified_target) |
+ spec = target_dicts[qualified_target] |
+ gyp.xcode_emulation.MergeGlobalXcodeSettingsToSpec(data[gyp_file], spec) |
+ |
WriteTarget(namer, qualified_target, target_dicts, build_dir, config_to_use, |
- options, generator_flags, all_qualified_targets, output) |
+ options, generator_flags, all_qualified_targets, flavor, output) |
output.close() |