Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(331)

Unified Diff: pylib/gyp/xcode_emulation.py

Issue 138533006: Improve ninja's Xcode emulation (Closed) Base URL: http://gyp.googlecode.com/svn/trunk
Patch Set: Expand $(ARCHS_STANDARD) for all toolset, both "host" and "target" Created 6 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | test/ios/app-bundle/test-archs.gyp » ('j') | test/ios/gyptest-archs.py » ('J')
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: pylib/gyp/xcode_emulation.py
diff --git a/pylib/gyp/xcode_emulation.py b/pylib/gyp/xcode_emulation.py
index 30f27d5832d99bd02ede773af5e59ed7c513b127..4ee00217eec06abfb6a58c74f32fd34344b243a8 100644
--- a/pylib/gyp/xcode_emulation.py
+++ b/pylib/gyp/xcode_emulation.py
@@ -271,7 +271,8 @@ class XcodeSettings(object):
# CURRENT_ARCH / NATIVE_ARCH env vars?
return self.xcode_settings[configname].get('ARCHS', [self._DefaultArch()])
- def _GetStdout(self, cmdlist):
+ @classmethod
Nico 2014/02/07 18:57:56 Why this change?
sdefresne 2014/02/07 20:19:33 I want to call this method from the module functio
+ def _GetStdout(cls, cmdlist):
job = subprocess.Popen(cmdlist, stdout=subprocess.PIPE)
out = job.communicate()[0]
if job.returncode != 0:
@@ -877,7 +878,8 @@ class XcodeSettings(object):
return self._GetStdout(['sw_vers', '-buildVersion'])
# This method ported from the logic in Homebrew's CLT version check
- def _CLTVersion(self):
+ @classmethod
+ def _CLTVersion(cls):
# pkgutil output looks like
# package-id: com.apple.pkg.CLTools_Executables
# version: 5.0.1.0.1.1382131676
@@ -892,12 +894,13 @@ class XcodeSettings(object):
regex = re.compile('version: (?P<version>.+)')
for key in [MAVERICKS_PKG_ID, STANDALONE_PKG_ID, FROM_XCODE_PKG_ID]:
try:
- output = self._GetStdout(['/usr/sbin/pkgutil', '--pkg-info', key])
+ output = cls._GetStdout(['/usr/sbin/pkgutil', '--pkg-info', key])
return re.search(regex, output).groupdict()['version']
except:
continue
- def _XcodeVersion(self):
+ @classmethod
+ def _XcodeVersion(cls):
# `xcodebuild -version` output looks like
# Xcode 4.6.3
# Build version 4H1503
@@ -906,9 +909,9 @@ class XcodeSettings(object):
# Component versions: DevToolsCore-1809.0; DevToolsSupport-1806.0
# BuildVersion: 10M2518
# Convert that to '0463', '4H1503'.
- if len(XcodeSettings._xcode_version_cache) == 0:
+ if not cls._xcode_version_cache:
try:
- version_list = self._GetStdout(['xcodebuild', '-version']).splitlines()
+ version_list = cls._GetStdout(['xcodebuild', '-version']).splitlines()
# In some circumstances xcodebuild exits 0 but doesn't return
# the right results; for example, a user on 10.7 or 10.8 with
# a bogus path set via xcode-select
@@ -917,7 +920,7 @@ class XcodeSettings(object):
if len(version_list) < 2:
raise GypError, "xcodebuild returned unexpected results"
except:
- version = self._CLTVersion()
+ version = cls._CLTVersion()
if version:
version = re.match('(\d\.\d\.?\d*)', version).groups()[0]
else:
@@ -931,8 +934,8 @@ class XcodeSettings(object):
version = (version + '0' * (3 - len(version))).zfill(4)
if build:
build = build.split()[-1]
- XcodeSettings._xcode_version_cache = (version, build)
- return XcodeSettings._xcode_version_cache
+ cls._xcode_version_cache = (version, build)
+ return cls._xcode_version_cache
def _XcodeIOSDeviceFamily(self, configname):
family = self.xcode_settings[configname].get('TARGETED_DEVICE_FAMILY', '1')
@@ -982,7 +985,8 @@ class XcodeSettings(object):
project, then the environment variable was empty. Starting with this
version, Xcode uses the name of the newest SDK installed.
"""
- if self._XcodeVersion() < '0500':
+ xcode, xcode_build = self._XcodeVersion()
+ if xcode < '0500':
return ''
default_sdk_path = self._XcodeSdkPath('')
default_sdk_root = XcodeSettings._sdk_root_cache.get(default_sdk_path)
@@ -1418,18 +1422,63 @@ def _HasIOSTarget(targets):
return False
+def _IOSIsDeviceSDKROOT(sdkroot):
+ """Tests if |sdkroot| is a SDK for building for device."""
+ return 'iphoneos' in sdkroot.lower()
+
+
+def _IOSDefaultArchForSDKRoot(sdkroot):
+ xcode, xcode_build = XcodeSettings._XcodeVersion()
+ if xcode < '0500':
+ if _IOSIsDeviceSDKROOT(sdkroot):
+ return {'$(ARCHS_STANDARD)': ['armv7']}
+ else:
+ return {'$(ARCHS_STANDARD)': ['i386']}
+ else:
+ if _IOSIsDeviceSDKROOT(sdkroot):
+ return {
+ '$(ARCHS_STANDARD)': ['armv7', 'armv7s'],
+ '$(ARCHS_STANDARD_INCLUDING_64_BIT)': ['armv7', 'armv7s', 'arm64'],
+ }
+ else:
+ return {
+ '$(ARCHS_STANDARD)': ['i386'],
+ '$(ARCHS_STANDARD_INCLUDING_64_BIT)': ['i386', 'x86_64'],
+ }
+
+
+def _FilterIOSArchitectureForSDKROOT(xcode_settings):
+ """Filter the ARCHS value from the |xcode_settings| dictionary to only
+ contains architectures valid for the sdk configured in SDKROOT value."""
+ defaults_archs = _IOSDefaultArchForSDKRoot(xcode_settings.get('SDKROOT', ''))
+ allowed_archs = set()
+ for archs in defaults_archs.itervalues():
+ allowed_archs.update(archs)
+ selected_archs = set()
+ for arch in (xcode_settings.get('ARCHS', []) or ['$(ARCHS_STANDARD)']):
Nico 2014/02/07 18:57:56 No need for the default [] if you do `or default`
sdefresne 2014/02/07 20:19:33 There are some xcode_settings objects that don't d
+ if arch in defaults_archs:
+ selected_archs.update(defaults_archs[arch])
+ elif arch in allowed_archs:
+ selected_archs.add(arch)
+ valid_archs = set(xcode_settings.get('VALID_ARCHS', []))
+ if valid_archs:
+ selected_archs = selected_archs & valid_archs
+ xcode_settings['ARCHS'] = list(selected_archs)
+
+
def _AddIOSDeviceConfigurations(targets):
"""Clone all targets and append -iphoneos to the name. Configure these targets
- to build for iOS devices."""
- for target_dict in targets.values():
- for config_name in target_dict['configurations'].keys():
- config = target_dict['configurations'][config_name]
- new_config_name = config_name + '-iphoneos'
- new_config_dict = copy.deepcopy(config)
- if target_dict['toolset'] == 'target':
- new_config_dict['xcode_settings']['ARCHS'] = ['armv7']
- new_config_dict['xcode_settings']['SDKROOT'] = 'iphoneos'
- target_dict['configurations'][new_config_name] = new_config_dict
+ to build for iOS devices and use correct architectures for those builds."""
+ for target_dict in targets.itervalues():
+ toolset = target_dict['toolset']
+ configs = target_dict['configurations']
+ for config_name, config_dict in dict(configs).iteritems():
+ iphoneos_config_dict = copy.deepcopy(config_dict)
Nico 2014/02/07 18:57:56 Why this variable name change?
sdefresne 2014/02/07 20:19:33 I found the old name confusing when updating the c
+ configs[config_name + '-iphoneos'] = iphoneos_config_dict
+ if toolset == 'target':
+ iphoneos_config_dict['xcode_settings']['SDKROOT'] = 'iphoneos'
+ _FilterIOSArchitectureForSDKROOT(iphoneos_config_dict['xcode_settings'])
+ _FilterIOSArchitectureForSDKROOT(config_dict['xcode_settings'])
return targets
def CloneConfigurationForDeviceAndEmulator(target_dicts):
« no previous file with comments | « no previous file | test/ios/app-bundle/test-archs.gyp » ('j') | test/ios/gyptest-archs.py » ('J')

Powered by Google App Engine
This is Rietveld 408576698