1a402b25fabd2182c4c74dc3cf89c856c93ff5472thakis@chromium.org# Copyright (c) 2012 Google Inc. All rights reserved. 20839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org# Use of this source code is governed by a BSD-style license that can be 30839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org# found in the LICENSE file. 40839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org 50839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org""" 60839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.orgThis module contains classes that help to emulate xcodebuild behavior on top of 70839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.orgother build systems, such as make and ninja. 80839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org""" 90839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org 10cf2844a528ca8114b324f5d7b97b9f0363ec4d25justincohen@chromium.orgimport copy 1160e8244fa9b6f4bef0606ccc46cc5d23904a952athakis@chromium.orgimport gyp.common 1234b060532e7753b3de7d33e9d330a8cd0179b5cbjustincohen@chromium.orgimport os 130839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.orgimport os.path 143fc6c8d718be1df48005da2802759adbaf82b2e4thakis@chromium.orgimport re 154143358985fabc41e9220e0ca415a1e9d858fa92thakis@chromium.orgimport shlex 1607729ba52e877ad288263b39bd67743e5a238b10thakis@chromium.orgimport subprocess 1707729ba52e877ad288263b39bd67743e5a238b10thakis@chromium.orgimport sys 1834b060532e7753b3de7d33e9d330a8cd0179b5cbjustincohen@chromium.orgimport tempfile 1907729ba52e877ad288263b39bd67743e5a238b10thakis@chromium.orgfrom gyp.common import GypError 200839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org 21e51b0ce7b199bb0853d451d70fa8eedfcf3f3583sdefresne@chromium.org# Populated lazily by XcodeVersion, for efficiency, and to fix an issue when 22e51b0ce7b199bb0853d451d70fa8eedfcf3f3583sdefresne@chromium.org# "xcodebuild" is called too quickly (it has been found to return incorrect 23e51b0ce7b199bb0853d451d70fa8eedfcf3f3583sdefresne@chromium.org# version number). 24f7b210db6356614db35a666932c4d213d67988e2sdefresne@chromium.orgXCODE_VERSION_CACHE = None 25f7b210db6356614db35a666932c4d213d67988e2sdefresne@chromium.org 26f7b210db6356614db35a666932c4d213d67988e2sdefresne@chromium.org# Populated lazily by GetXcodeArchsDefault, to an |XcodeArchsDefault| instance 27f7b210db6356614db35a666932c4d213d67988e2sdefresne@chromium.org# corresponding to the installed version of Xcode. 28f7b210db6356614db35a666932c4d213d67988e2sdefresne@chromium.orgXCODE_ARCHS_DEFAULT_CACHE = None 29f7b210db6356614db35a666932c4d213d67988e2sdefresne@chromium.org 30f7b210db6356614db35a666932c4d213d67988e2sdefresne@chromium.org 31f7b210db6356614db35a666932c4d213d67988e2sdefresne@chromium.orgdef XcodeArchsVariableMapping(archs, archs_including_64_bit=None): 32f7b210db6356614db35a666932c4d213d67988e2sdefresne@chromium.org """Constructs a dictionary with expansion for $(ARCHS_STANDARD) variable, 33f7b210db6356614db35a666932c4d213d67988e2sdefresne@chromium.org and optionally for $(ARCHS_STANDARD_INCLUDING_64_BIT).""" 34f7b210db6356614db35a666932c4d213d67988e2sdefresne@chromium.org mapping = {'$(ARCHS_STANDARD)': archs} 35f7b210db6356614db35a666932c4d213d67988e2sdefresne@chromium.org if archs_including_64_bit: 36f7b210db6356614db35a666932c4d213d67988e2sdefresne@chromium.org mapping['$(ARCHS_STANDARD_INCLUDING_64_BIT)'] = archs_including_64_bit 37f7b210db6356614db35a666932c4d213d67988e2sdefresne@chromium.org return mapping 38f7b210db6356614db35a666932c4d213d67988e2sdefresne@chromium.org 39f7b210db6356614db35a666932c4d213d67988e2sdefresne@chromium.orgclass XcodeArchsDefault(object): 40f7b210db6356614db35a666932c4d213d67988e2sdefresne@chromium.org """A class to resolve ARCHS variable from xcode_settings, resolving Xcode 41f7b210db6356614db35a666932c4d213d67988e2sdefresne@chromium.org macros and implementing filtering by VALID_ARCHS. The expansion of macros 42f7b210db6356614db35a666932c4d213d67988e2sdefresne@chromium.org depends on the SDKROOT used ("macosx", "iphoneos", "iphonesimulator") and 43f7b210db6356614db35a666932c4d213d67988e2sdefresne@chromium.org on the version of Xcode. 44f7b210db6356614db35a666932c4d213d67988e2sdefresne@chromium.org """ 45f7b210db6356614db35a666932c4d213d67988e2sdefresne@chromium.org 46f7b210db6356614db35a666932c4d213d67988e2sdefresne@chromium.org # Match variable like $(ARCHS_STANDARD). 47f7b210db6356614db35a666932c4d213d67988e2sdefresne@chromium.org variable_pattern = re.compile(r'\$\([a-zA-Z_][a-zA-Z0-9_]*\)$') 48f7b210db6356614db35a666932c4d213d67988e2sdefresne@chromium.org 49f7b210db6356614db35a666932c4d213d67988e2sdefresne@chromium.org def __init__(self, default, mac, iphonesimulator, iphoneos): 50f7b210db6356614db35a666932c4d213d67988e2sdefresne@chromium.org self._default = (default,) 51f7b210db6356614db35a666932c4d213d67988e2sdefresne@chromium.org self._archs = {'mac': mac, 'ios': iphoneos, 'iossim': iphonesimulator} 52f7b210db6356614db35a666932c4d213d67988e2sdefresne@chromium.org 53f7b210db6356614db35a666932c4d213d67988e2sdefresne@chromium.org def _VariableMapping(self, sdkroot): 54f7b210db6356614db35a666932c4d213d67988e2sdefresne@chromium.org """Returns the dictionary of variable mapping depending on the SDKROOT.""" 55f7b210db6356614db35a666932c4d213d67988e2sdefresne@chromium.org sdkroot = sdkroot.lower() 56f7b210db6356614db35a666932c4d213d67988e2sdefresne@chromium.org if 'iphoneos' in sdkroot: 57f7b210db6356614db35a666932c4d213d67988e2sdefresne@chromium.org return self._archs['ios'] 58f7b210db6356614db35a666932c4d213d67988e2sdefresne@chromium.org elif 'iphonesimulator' in sdkroot: 59f7b210db6356614db35a666932c4d213d67988e2sdefresne@chromium.org return self._archs['iossim'] 60f7b210db6356614db35a666932c4d213d67988e2sdefresne@chromium.org else: 61f7b210db6356614db35a666932c4d213d67988e2sdefresne@chromium.org return self._archs['mac'] 62f7b210db6356614db35a666932c4d213d67988e2sdefresne@chromium.org 63f7b210db6356614db35a666932c4d213d67988e2sdefresne@chromium.org def _ExpandArchs(self, archs, sdkroot): 64f7b210db6356614db35a666932c4d213d67988e2sdefresne@chromium.org """Expands variables references in ARCHS, and remove duplicates.""" 65f7b210db6356614db35a666932c4d213d67988e2sdefresne@chromium.org variable_mapping = self._VariableMapping(sdkroot) 66f7b210db6356614db35a666932c4d213d67988e2sdefresne@chromium.org expanded_archs = [] 67f7b210db6356614db35a666932c4d213d67988e2sdefresne@chromium.org for arch in archs: 68f7b210db6356614db35a666932c4d213d67988e2sdefresne@chromium.org if self.variable_pattern.match(arch): 69f7b210db6356614db35a666932c4d213d67988e2sdefresne@chromium.org variable = arch 70f7b210db6356614db35a666932c4d213d67988e2sdefresne@chromium.org try: 71f7b210db6356614db35a666932c4d213d67988e2sdefresne@chromium.org variable_expansion = variable_mapping[variable] 72f7b210db6356614db35a666932c4d213d67988e2sdefresne@chromium.org for arch in variable_expansion: 73f7b210db6356614db35a666932c4d213d67988e2sdefresne@chromium.org if arch not in expanded_archs: 74f7b210db6356614db35a666932c4d213d67988e2sdefresne@chromium.org expanded_archs.append(arch) 75f7b210db6356614db35a666932c4d213d67988e2sdefresne@chromium.org except KeyError as e: 76f7b210db6356614db35a666932c4d213d67988e2sdefresne@chromium.org print 'Warning: Ignoring unsupported variable "%s".' % variable 77f7b210db6356614db35a666932c4d213d67988e2sdefresne@chromium.org elif arch not in expanded_archs: 78f7b210db6356614db35a666932c4d213d67988e2sdefresne@chromium.org expanded_archs.append(arch) 79f7b210db6356614db35a666932c4d213d67988e2sdefresne@chromium.org return expanded_archs 80f7b210db6356614db35a666932c4d213d67988e2sdefresne@chromium.org 81f7b210db6356614db35a666932c4d213d67988e2sdefresne@chromium.org def ActiveArchs(self, archs, valid_archs, sdkroot): 82f7b210db6356614db35a666932c4d213d67988e2sdefresne@chromium.org """Expands variables references in ARCHS, and filter by VALID_ARCHS if it 83f7b210db6356614db35a666932c4d213d67988e2sdefresne@chromium.org is defined (if not set, Xcode accept any value in ARCHS, otherwise, only 84f7b210db6356614db35a666932c4d213d67988e2sdefresne@chromium.org values present in VALID_ARCHS are kept).""" 85f7b210db6356614db35a666932c4d213d67988e2sdefresne@chromium.org expanded_archs = self._ExpandArchs(archs or self._default, sdkroot or '') 86f7b210db6356614db35a666932c4d213d67988e2sdefresne@chromium.org if valid_archs: 87f7b210db6356614db35a666932c4d213d67988e2sdefresne@chromium.org filtered_archs = [] 88f7b210db6356614db35a666932c4d213d67988e2sdefresne@chromium.org for arch in expanded_archs: 89f7b210db6356614db35a666932c4d213d67988e2sdefresne@chromium.org if arch in valid_archs: 90f7b210db6356614db35a666932c4d213d67988e2sdefresne@chromium.org filtered_archs.append(arch) 91f7b210db6356614db35a666932c4d213d67988e2sdefresne@chromium.org expanded_archs = filtered_archs 92f7b210db6356614db35a666932c4d213d67988e2sdefresne@chromium.org return expanded_archs 93f7b210db6356614db35a666932c4d213d67988e2sdefresne@chromium.org 94f7b210db6356614db35a666932c4d213d67988e2sdefresne@chromium.org 95f7b210db6356614db35a666932c4d213d67988e2sdefresne@chromium.orgdef GetXcodeArchsDefault(): 96f7b210db6356614db35a666932c4d213d67988e2sdefresne@chromium.org """Returns the |XcodeArchsDefault| object to use to expand ARCHS for the 97f7b210db6356614db35a666932c4d213d67988e2sdefresne@chromium.org installed version of Xcode. The default values used by Xcode for ARCHS 98f7b210db6356614db35a666932c4d213d67988e2sdefresne@chromium.org and the expansion of the variables depends on the version of Xcode used. 99f7b210db6356614db35a666932c4d213d67988e2sdefresne@chromium.org 100f7b210db6356614db35a666932c4d213d67988e2sdefresne@chromium.org For all version anterior to Xcode 5.0 or posterior to Xcode 5.1 included 101f7b210db6356614db35a666932c4d213d67988e2sdefresne@chromium.org uses $(ARCHS_STANDARD) if ARCHS is unset, while Xcode 5.0 to 5.0.2 uses 102f7b210db6356614db35a666932c4d213d67988e2sdefresne@chromium.org $(ARCHS_STANDARD_INCLUDING_64_BIT). This variable was added to Xcode 5.0 103f7b210db6356614db35a666932c4d213d67988e2sdefresne@chromium.org and deprecated with Xcode 5.1. 104f7b210db6356614db35a666932c4d213d67988e2sdefresne@chromium.org 105f7b210db6356614db35a666932c4d213d67988e2sdefresne@chromium.org For "macosx" SDKROOT, all version starting with Xcode 5.0 includes 64-bit 106f7b210db6356614db35a666932c4d213d67988e2sdefresne@chromium.org architecture as part of $(ARCHS_STANDARD) and default to only building it. 107f7b210db6356614db35a666932c4d213d67988e2sdefresne@chromium.org 108f7b210db6356614db35a666932c4d213d67988e2sdefresne@chromium.org For "iphoneos" and "iphonesimulator" SDKROOT, 64-bit architectures are part 109f7b210db6356614db35a666932c4d213d67988e2sdefresne@chromium.org of $(ARCHS_STANDARD_INCLUDING_64_BIT) from Xcode 5.0. From Xcode 5.1, they 110f7b210db6356614db35a666932c4d213d67988e2sdefresne@chromium.org are also part of $(ARCHS_STANDARD). 111f7b210db6356614db35a666932c4d213d67988e2sdefresne@chromium.org 112f7b210db6356614db35a666932c4d213d67988e2sdefresne@chromium.org All thoses rules are coded in the construction of the |XcodeArchsDefault| 113f7b210db6356614db35a666932c4d213d67988e2sdefresne@chromium.org object to use depending on the version of Xcode detected. The object is 114f7b210db6356614db35a666932c4d213d67988e2sdefresne@chromium.org for performance reason.""" 115f7b210db6356614db35a666932c4d213d67988e2sdefresne@chromium.org global XCODE_ARCHS_DEFAULT_CACHE 116f7b210db6356614db35a666932c4d213d67988e2sdefresne@chromium.org if XCODE_ARCHS_DEFAULT_CACHE: 117f7b210db6356614db35a666932c4d213d67988e2sdefresne@chromium.org return XCODE_ARCHS_DEFAULT_CACHE 118f7b210db6356614db35a666932c4d213d67988e2sdefresne@chromium.org xcode_version, _ = XcodeVersion() 119f7b210db6356614db35a666932c4d213d67988e2sdefresne@chromium.org if xcode_version < '0500': 120f7b210db6356614db35a666932c4d213d67988e2sdefresne@chromium.org XCODE_ARCHS_DEFAULT_CACHE = XcodeArchsDefault( 121f7b210db6356614db35a666932c4d213d67988e2sdefresne@chromium.org '$(ARCHS_STANDARD)', 122f7b210db6356614db35a666932c4d213d67988e2sdefresne@chromium.org XcodeArchsVariableMapping(['i386']), 123f7b210db6356614db35a666932c4d213d67988e2sdefresne@chromium.org XcodeArchsVariableMapping(['i386']), 124f7b210db6356614db35a666932c4d213d67988e2sdefresne@chromium.org XcodeArchsVariableMapping(['armv7'])) 125f7b210db6356614db35a666932c4d213d67988e2sdefresne@chromium.org elif xcode_version < '0510': 126f7b210db6356614db35a666932c4d213d67988e2sdefresne@chromium.org XCODE_ARCHS_DEFAULT_CACHE = XcodeArchsDefault( 127f7b210db6356614db35a666932c4d213d67988e2sdefresne@chromium.org '$(ARCHS_STANDARD_INCLUDING_64_BIT)', 128f7b210db6356614db35a666932c4d213d67988e2sdefresne@chromium.org XcodeArchsVariableMapping(['x86_64'], ['x86_64']), 129f7b210db6356614db35a666932c4d213d67988e2sdefresne@chromium.org XcodeArchsVariableMapping(['i386'], ['i386', 'x86_64']), 130f7b210db6356614db35a666932c4d213d67988e2sdefresne@chromium.org XcodeArchsVariableMapping( 131f7b210db6356614db35a666932c4d213d67988e2sdefresne@chromium.org ['armv7', 'armv7s'], 132f7b210db6356614db35a666932c4d213d67988e2sdefresne@chromium.org ['armv7', 'armv7s', 'arm64'])) 133f7b210db6356614db35a666932c4d213d67988e2sdefresne@chromium.org else: 134f7b210db6356614db35a666932c4d213d67988e2sdefresne@chromium.org XCODE_ARCHS_DEFAULT_CACHE = XcodeArchsDefault( 135f7b210db6356614db35a666932c4d213d67988e2sdefresne@chromium.org '$(ARCHS_STANDARD)', 136f7b210db6356614db35a666932c4d213d67988e2sdefresne@chromium.org XcodeArchsVariableMapping(['x86_64'], ['x86_64']), 137f7b210db6356614db35a666932c4d213d67988e2sdefresne@chromium.org XcodeArchsVariableMapping(['i386', 'x86_64'], ['i386', 'x86_64']), 138f7b210db6356614db35a666932c4d213d67988e2sdefresne@chromium.org XcodeArchsVariableMapping( 139f7b210db6356614db35a666932c4d213d67988e2sdefresne@chromium.org ['armv7', 'armv7s', 'arm64'], 140f7b210db6356614db35a666932c4d213d67988e2sdefresne@chromium.org ['armv7', 'armv7s', 'arm64'])) 141f7b210db6356614db35a666932c4d213d67988e2sdefresne@chromium.org return XCODE_ARCHS_DEFAULT_CACHE 142f7b210db6356614db35a666932c4d213d67988e2sdefresne@chromium.org 143e51b0ce7b199bb0853d451d70fa8eedfcf3f3583sdefresne@chromium.org 1440839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.orgclass XcodeSettings(object): 1450839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org """A class that understands the gyp 'xcode_settings' object.""" 1460839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org 14707729ba52e877ad288263b39bd67743e5a238b10thakis@chromium.org # Populated lazily by _SdkPath(). Shared by all XcodeSettings, so cached 148de72f6cff5a2b60b9e4f611b26571c21f0e21b6bthakis@chromium.org # at class-level for efficiency. 14907729ba52e877ad288263b39bd67743e5a238b10thakis@chromium.org _sdk_path_cache = {} 150ebde26be3915c0c7baf9029b8b2e667b0ce3675dsdefresne@chromium.org _sdk_root_cache = {} 151de72f6cff5a2b60b9e4f611b26571c21f0e21b6bthakis@chromium.org 152203dfad2aa74a389c60017250fc70cd5b07cff23thakis@chromium.org # Populated lazily by GetExtraPlistItems(). Shared by all XcodeSettings, so 153203dfad2aa74a389c60017250fc70cd5b07cff23thakis@chromium.org # cached at class-level for efficiency. 154203dfad2aa74a389c60017250fc70cd5b07cff23thakis@chromium.org _plist_cache = {} 155203dfad2aa74a389c60017250fc70cd5b07cff23thakis@chromium.org 1563f7d04d67cabfc9b1c45ed551d4885130653d452justincohen@chromium.org # Populated lazily by GetIOSPostbuilds. Shared by all XcodeSettings, so 1573f7d04d67cabfc9b1c45ed551d4885130653d452justincohen@chromium.org # cached at class-level for efficiency. 1583f7d04d67cabfc9b1c45ed551d4885130653d452justincohen@chromium.org _codesigning_key_cache = {} 1593f7d04d67cabfc9b1c45ed551d4885130653d452justincohen@chromium.org 1600839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org def __init__(self, spec): 1610839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org self.spec = spec 1620839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org 163c0d279c53da37dfdb2984a13a802c622e13af728thakis@chromium.org self.isIOS = False 164c0d279c53da37dfdb2984a13a802c622e13af728thakis@chromium.org 1650839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org # Per-target 'xcode_settings' are pushed down into configs earlier by gyp. 1660839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org # This means self.xcode_settings[config] always contains all settings 1670839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org # for that config -- the per-target settings as well. Settings that are 1680839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org # the same for all configs are implicitly per-target settings. 1690839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org self.xcode_settings = {} 1700839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org configs = spec['configurations'] 1710839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org for configname, config in configs.iteritems(): 1720839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org self.xcode_settings[configname] = config.get('xcode_settings', {}) 1733f7d04d67cabfc9b1c45ed551d4885130653d452justincohen@chromium.org self._ConvertConditionalKeys(configname) 174c0d279c53da37dfdb2984a13a802c622e13af728thakis@chromium.org if self.xcode_settings[configname].get('IPHONEOS_DEPLOYMENT_TARGET', 175c0d279c53da37dfdb2984a13a802c622e13af728thakis@chromium.org None): 176c0d279c53da37dfdb2984a13a802c622e13af728thakis@chromium.org self.isIOS = True 1770839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org 1780839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org # This is only non-None temporarily during the execution of some methods. 1790839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org self.configname = None 1800839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org 18108d6b2cb13257ed4eafd7469e1018e2a3531c42cviettrungluu@chromium.org # Used by _AdjustLibrary to match .a and .dylib entries in libraries. 18208d6b2cb13257ed4eafd7469e1018e2a3531c42cviettrungluu@chromium.org self.library_re = re.compile(r'^lib([^/]+)\.(a|dylib)$') 18308d6b2cb13257ed4eafd7469e1018e2a3531c42cviettrungluu@chromium.org 1843f7d04d67cabfc9b1c45ed551d4885130653d452justincohen@chromium.org def _ConvertConditionalKeys(self, configname): 1853f7d04d67cabfc9b1c45ed551d4885130653d452justincohen@chromium.org """Converts or warns on conditional keys. Xcode supports conditional keys, 1863f7d04d67cabfc9b1c45ed551d4885130653d452justincohen@chromium.org such as CODE_SIGN_IDENTITY[sdk=iphoneos*]. This is a partial implementation 1873f7d04d67cabfc9b1c45ed551d4885130653d452justincohen@chromium.org with some keys converted while the rest force a warning.""" 1883f7d04d67cabfc9b1c45ed551d4885130653d452justincohen@chromium.org settings = self.xcode_settings[configname] 1893f7d04d67cabfc9b1c45ed551d4885130653d452justincohen@chromium.org conditional_keys = [key for key in settings if key.endswith(']')] 1903f7d04d67cabfc9b1c45ed551d4885130653d452justincohen@chromium.org for key in conditional_keys: 1913f7d04d67cabfc9b1c45ed551d4885130653d452justincohen@chromium.org # If you need more, speak up at http://crbug.com/122592 1923f7d04d67cabfc9b1c45ed551d4885130653d452justincohen@chromium.org if key.endswith("[sdk=iphoneos*]"): 1933f7d04d67cabfc9b1c45ed551d4885130653d452justincohen@chromium.org if configname.endswith("iphoneos"): 1943f7d04d67cabfc9b1c45ed551d4885130653d452justincohen@chromium.org new_key = key.split("[")[0] 1953f7d04d67cabfc9b1c45ed551d4885130653d452justincohen@chromium.org settings[new_key] = settings[key] 1963f7d04d67cabfc9b1c45ed551d4885130653d452justincohen@chromium.org else: 1973f7d04d67cabfc9b1c45ed551d4885130653d452justincohen@chromium.org print 'Warning: Conditional keys not implemented, ignoring:', \ 1983f7d04d67cabfc9b1c45ed551d4885130653d452justincohen@chromium.org ' '.join(conditional_keys) 1993f7d04d67cabfc9b1c45ed551d4885130653d452justincohen@chromium.org del settings[key] 2003f7d04d67cabfc9b1c45ed551d4885130653d452justincohen@chromium.org 2010839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org def _Settings(self): 2020839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org assert self.configname 2030839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org return self.xcode_settings[self.configname] 2040839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org 2050839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org def _Test(self, test_key, cond_key, default): 2060839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org return self._Settings().get(test_key, default) == cond_key 2070839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org 2080839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org def _Appendf(self, lst, test_key, format_str, default=None): 2090839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org if test_key in self._Settings(): 2100839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org lst.append(format_str % str(self._Settings()[test_key])) 2110839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org elif default: 2120839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org lst.append(format_str % str(default)) 2130839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org 2140839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org def _WarnUnimplemented(self, test_key): 2150839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org if test_key in self._Settings(): 2160839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org print 'Warning: Ignoring not yet implemented key "%s".' % test_key 2170839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org 2180839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org def _IsBundle(self): 2190839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org return int(self.spec.get('mac_bundle', 0)) != 0 2200839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org 221f536bafefff908e7001e5634a5a75d29b1e2cab8sdefresne@chromium.org def _IsIosAppExtension(self): 222f536bafefff908e7001e5634a5a75d29b1e2cab8sdefresne@chromium.org return int(self.spec.get('ios_app_extension', 0)) != 0 223f536bafefff908e7001e5634a5a75d29b1e2cab8sdefresne@chromium.org 2240839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org def GetFrameworkVersion(self): 2250839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org """Returns the framework version of the current target. Only valid for 2260839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org bundles.""" 2270839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org assert self._IsBundle() 2280839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org return self.GetPerTargetSetting('FRAMEWORK_VERSION', default='A') 2290839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org 2300839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org def GetWrapperExtension(self): 2310839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org """Returns the bundle extension (.app, .framework, .plugin, etc). Only 2320839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org valid for bundles.""" 2330839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org assert self._IsBundle() 2340839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org if self.spec['type'] in ('loadable_module', 'shared_library'): 2350839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org default_wrapper_extension = { 2360839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org 'loadable_module': 'bundle', 2370839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org 'shared_library': 'framework', 2380839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org }[self.spec['type']] 2390839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org wrapper_extension = self.GetPerTargetSetting( 2400839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org 'WRAPPER_EXTENSION', default=default_wrapper_extension) 2410839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org return '.' + self.spec.get('product_extension', wrapper_extension) 2420839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org elif self.spec['type'] == 'executable': 243f536bafefff908e7001e5634a5a75d29b1e2cab8sdefresne@chromium.org if self._IsIosAppExtension(): 244f536bafefff908e7001e5634a5a75d29b1e2cab8sdefresne@chromium.org return '.' + self.spec.get('product_extension', 'appex') 245f536bafefff908e7001e5634a5a75d29b1e2cab8sdefresne@chromium.org else: 246f536bafefff908e7001e5634a5a75d29b1e2cab8sdefresne@chromium.org return '.' + self.spec.get('product_extension', 'app') 2470839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org else: 2480839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org assert False, "Don't know extension for '%s', target '%s'" % ( 2490839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org self.spec['type'], self.spec['target_name']) 2500839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org 2510839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org def GetProductName(self): 2520839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org """Returns PRODUCT_NAME.""" 2530839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org return self.spec.get('product_name', self.spec['target_name']) 2540839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org 255749812adc199a33c7dd11dbaa5a0df629b4f3370thakis@chromium.org def GetFullProductName(self): 256749812adc199a33c7dd11dbaa5a0df629b4f3370thakis@chromium.org """Returns FULL_PRODUCT_NAME.""" 257749812adc199a33c7dd11dbaa5a0df629b4f3370thakis@chromium.org if self._IsBundle(): 258749812adc199a33c7dd11dbaa5a0df629b4f3370thakis@chromium.org return self.GetWrapperName() 259749812adc199a33c7dd11dbaa5a0df629b4f3370thakis@chromium.org else: 260749812adc199a33c7dd11dbaa5a0df629b4f3370thakis@chromium.org return self._GetStandaloneBinaryPath() 261749812adc199a33c7dd11dbaa5a0df629b4f3370thakis@chromium.org 2620839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org def GetWrapperName(self): 2630839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org """Returns the directory name of the bundle represented by this target. 2640839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org Only valid for bundles.""" 2650839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org assert self._IsBundle() 2660839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org return self.GetProductName() + self.GetWrapperExtension() 2670839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org 2680839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org def GetBundleContentsFolderPath(self): 2690839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org """Returns the qualified path to the bundle's contents folder. E.g. 2700839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org Chromium.app/Contents or Foo.bundle/Versions/A. Only valid for bundles.""" 271c0d279c53da37dfdb2984a13a802c622e13af728thakis@chromium.org if self.isIOS: 272c0d279c53da37dfdb2984a13a802c622e13af728thakis@chromium.org return self.GetWrapperName() 2730839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org assert self._IsBundle() 2740839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org if self.spec['type'] == 'shared_library': 2750839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org return os.path.join( 2760839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org self.GetWrapperName(), 'Versions', self.GetFrameworkVersion()) 2770839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org else: 2780839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org # loadable_modules have a 'Contents' folder like executables. 2790839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org return os.path.join(self.GetWrapperName(), 'Contents') 2800839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org 2810839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org def GetBundleResourceFolder(self): 2820839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org """Returns the qualified path to the bundle's resource folder. E.g. 2830839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org Chromium.app/Contents/Resources. Only valid for bundles.""" 2840839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org assert self._IsBundle() 285c0d279c53da37dfdb2984a13a802c622e13af728thakis@chromium.org if self.isIOS: 286c0d279c53da37dfdb2984a13a802c622e13af728thakis@chromium.org return self.GetBundleContentsFolderPath() 2870839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org return os.path.join(self.GetBundleContentsFolderPath(), 'Resources') 2880839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org 2890839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org def GetBundlePlistPath(self): 2900839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org """Returns the qualified path to the bundle's plist file. E.g. 2910839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org Chromium.app/Contents/Info.plist. Only valid for bundles.""" 2920839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org assert self._IsBundle() 2930839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org if self.spec['type'] in ('executable', 'loadable_module'): 2940839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org return os.path.join(self.GetBundleContentsFolderPath(), 'Info.plist') 2950839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org else: 2960839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org return os.path.join(self.GetBundleContentsFolderPath(), 2970839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org 'Resources', 'Info.plist') 2980839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org 2990839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org def GetProductType(self): 3000839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org """Returns the PRODUCT_TYPE of this target.""" 301f536bafefff908e7001e5634a5a75d29b1e2cab8sdefresne@chromium.org if self._IsIosAppExtension(): 302f536bafefff908e7001e5634a5a75d29b1e2cab8sdefresne@chromium.org assert self._IsBundle(), ('ios_app_extension flag requires mac_bundle ' 303f536bafefff908e7001e5634a5a75d29b1e2cab8sdefresne@chromium.org '(target %s)' % self.spec['target_name']) 304f536bafefff908e7001e5634a5a75d29b1e2cab8sdefresne@chromium.org return 'com.apple.product-type.app-extension' 3050839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org if self._IsBundle(): 3060839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org return { 3070839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org 'executable': 'com.apple.product-type.application', 3080839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org 'loadable_module': 'com.apple.product-type.bundle', 3090839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org 'shared_library': 'com.apple.product-type.framework', 3100839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org }[self.spec['type']] 3110839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org else: 3120839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org return { 3130839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org 'executable': 'com.apple.product-type.tool', 3140839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org 'loadable_module': 'com.apple.product-type.library.dynamic', 3150839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org 'shared_library': 'com.apple.product-type.library.dynamic', 3160839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org 'static_library': 'com.apple.product-type.library.static', 3170839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org }[self.spec['type']] 3180839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org 3190839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org def GetMachOType(self): 3200839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org """Returns the MACH_O_TYPE of this target.""" 3210839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org # Weird, but matches Xcode. 3220839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org if not self._IsBundle() and self.spec['type'] == 'executable': 3230839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org return '' 3240839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org return { 3250839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org 'executable': 'mh_execute', 3260839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org 'static_library': 'staticlib', 3270839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org 'shared_library': 'mh_dylib', 3280839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org 'loadable_module': 'mh_bundle', 3290839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org }[self.spec['type']] 3300839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org 3310839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org def _GetBundleBinaryPath(self): 3320839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org """Returns the name of the bundle binary of by this target. 3330839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org E.g. Chromium.app/Contents/MacOS/Chromium. Only valid for bundles.""" 3340839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org assert self._IsBundle() 335c0d279c53da37dfdb2984a13a802c622e13af728thakis@chromium.org if self.spec['type'] in ('shared_library') or self.isIOS: 3360839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org path = self.GetBundleContentsFolderPath() 3370839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org elif self.spec['type'] in ('executable', 'loadable_module'): 3380839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org path = os.path.join(self.GetBundleContentsFolderPath(), 'MacOS') 339ac2a8d9430ce7bfc0d3ad415d5c96dabe9b200b2thakis@chromium.org return os.path.join(path, self.GetExecutableName()) 3400839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org 3410839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org def _GetStandaloneExecutableSuffix(self): 3420839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org if 'product_extension' in self.spec: 3430839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org return '.' + self.spec['product_extension'] 3440839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org return { 3450839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org 'executable': '', 3460839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org 'static_library': '.a', 3470839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org 'shared_library': '.dylib', 3480839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org 'loadable_module': '.so', 3490839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org }[self.spec['type']] 3500839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org 3510839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org def _GetStandaloneExecutablePrefix(self): 3520839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org return self.spec.get('product_prefix', { 3530839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org 'executable': '', 3540839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org 'static_library': 'lib', 3550839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org 'shared_library': 'lib', 3560839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org # Non-bundled loadable_modules are called foo.so for some reason 3570839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org # (that is, .so and no prefix) with the xcode build -- match that. 3580839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org 'loadable_module': '', 3590839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org }[self.spec['type']]) 3600839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org 3610839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org def _GetStandaloneBinaryPath(self): 3620839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org """Returns the name of the non-bundle binary represented by this target. 3630839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org E.g. hello_world. Only valid for non-bundles.""" 3640839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org assert not self._IsBundle() 3650839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org assert self.spec['type'] in ( 366749812adc199a33c7dd11dbaa5a0df629b4f3370thakis@chromium.org 'executable', 'shared_library', 'static_library', 'loadable_module'), ( 367749812adc199a33c7dd11dbaa5a0df629b4f3370thakis@chromium.org 'Unexpected type %s' % self.spec['type']) 3680839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org target = self.spec['target_name'] 3690839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org if self.spec['type'] == 'static_library': 3700839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org if target[:3] == 'lib': 3710839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org target = target[3:] 3720839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org elif self.spec['type'] in ('loadable_module', 'shared_library'): 3730839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org if target[:3] == 'lib': 3740839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org target = target[3:] 3750839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org 3760839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org target_prefix = self._GetStandaloneExecutablePrefix() 3770839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org target = self.spec.get('product_name', target) 3780839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org target_ext = self._GetStandaloneExecutableSuffix() 3790839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org return target_prefix + target + target_ext 3800839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org 381ac2a8d9430ce7bfc0d3ad415d5c96dabe9b200b2thakis@chromium.org def GetExecutableName(self): 382ac2a8d9430ce7bfc0d3ad415d5c96dabe9b200b2thakis@chromium.org """Returns the executable name of the bundle represented by this target. 383ac2a8d9430ce7bfc0d3ad415d5c96dabe9b200b2thakis@chromium.org E.g. Chromium.""" 384ac2a8d9430ce7bfc0d3ad415d5c96dabe9b200b2thakis@chromium.org if self._IsBundle(): 385ac2a8d9430ce7bfc0d3ad415d5c96dabe9b200b2thakis@chromium.org return self.spec.get('product_name', self.spec['target_name']) 386ac2a8d9430ce7bfc0d3ad415d5c96dabe9b200b2thakis@chromium.org else: 387ac2a8d9430ce7bfc0d3ad415d5c96dabe9b200b2thakis@chromium.org return self._GetStandaloneBinaryPath() 388ac2a8d9430ce7bfc0d3ad415d5c96dabe9b200b2thakis@chromium.org 3890839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org def GetExecutablePath(self): 3900839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org """Returns the directory name of the bundle represented by this target. E.g. 3910839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org Chromium.app/Contents/MacOS/Chromium.""" 3920839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org if self._IsBundle(): 3930839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org return self._GetBundleBinaryPath() 3940839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org else: 3950839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org return self._GetStandaloneBinaryPath() 3960839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org 3978fcfea42b6d343297e8b6b786d85fa5ad862fc30thakis@chromium.org def GetActiveArchs(self, configname): 3988fcfea42b6d343297e8b6b786d85fa5ad862fc30thakis@chromium.org """Returns the architectures this target should be built for.""" 399f7b210db6356614db35a666932c4d213d67988e2sdefresne@chromium.org config_settings = self.xcode_settings[configname] 400f7b210db6356614db35a666932c4d213d67988e2sdefresne@chromium.org xcode_archs_default = GetXcodeArchsDefault() 401f7b210db6356614db35a666932c4d213d67988e2sdefresne@chromium.org return xcode_archs_default.ActiveArchs( 402f7b210db6356614db35a666932c4d213d67988e2sdefresne@chromium.org config_settings.get('ARCHS'), 403f7b210db6356614db35a666932c4d213d67988e2sdefresne@chromium.org config_settings.get('VALID_ARCHS'), 404f7b210db6356614db35a666932c4d213d67988e2sdefresne@chromium.org config_settings.get('SDKROOT')) 4058fcfea42b6d343297e8b6b786d85fa5ad862fc30thakis@chromium.org 406203dfad2aa74a389c60017250fc70cd5b07cff23thakis@chromium.org def _GetSdkVersionInfoItem(self, sdk, infoitem): 407b1a73dc8dd65f473893444bb084a43d0cff8356fthakis@chromium.org # xcodebuild requires Xcode and can't run on Command Line Tools-only 408b1a73dc8dd65f473893444bb084a43d0cff8356fthakis@chromium.org # systems from 10.7 onward. 409b1a73dc8dd65f473893444bb084a43d0cff8356fthakis@chromium.org # Since the CLT has no SDK paths anyway, returning None is the 410b1a73dc8dd65f473893444bb084a43d0cff8356fthakis@chromium.org # most sensible route and should still do the right thing. 411b1a73dc8dd65f473893444bb084a43d0cff8356fthakis@chromium.org try: 41278ac757f4051c5e657040c294390e8ad65de8e58sdefresne@chromium.org return GetStdout(['xcodebuild', '-version', '-sdk', sdk, infoitem]) 413b1a73dc8dd65f473893444bb084a43d0cff8356fthakis@chromium.org except: 414b1a73dc8dd65f473893444bb084a43d0cff8356fthakis@chromium.org pass 415203dfad2aa74a389c60017250fc70cd5b07cff23thakis@chromium.org 4168e62cceb8070a4458fe58648753e1b2cc588f229justincohen@chromium.org def _SdkRoot(self, configname): 4178e62cceb8070a4458fe58648753e1b2cc588f229justincohen@chromium.org if configname is None: 4188e62cceb8070a4458fe58648753e1b2cc588f229justincohen@chromium.org configname = self.configname 4198e62cceb8070a4458fe58648753e1b2cc588f229justincohen@chromium.org return self.GetPerConfigSetting('SDKROOT', configname, default='') 420203dfad2aa74a389c60017250fc70cd5b07cff23thakis@chromium.org 4218e62cceb8070a4458fe58648753e1b2cc588f229justincohen@chromium.org def _SdkPath(self, configname=None): 4228e62cceb8070a4458fe58648753e1b2cc588f229justincohen@chromium.org sdk_root = self._SdkRoot(configname) 4230f416e49e716f6aded6b1a6422d88b9d6c9d5adbmark@chromium.org if sdk_root.startswith('/'): 4240f416e49e716f6aded6b1a6422d88b9d6c9d5adbmark@chromium.org return sdk_root 425ebde26be3915c0c7baf9029b8b2e667b0ce3675dsdefresne@chromium.org return self._XcodeSdkPath(sdk_root) 426ebde26be3915c0c7baf9029b8b2e667b0ce3675dsdefresne@chromium.org 427ebde26be3915c0c7baf9029b8b2e667b0ce3675dsdefresne@chromium.org def _XcodeSdkPath(self, sdk_root): 42807729ba52e877ad288263b39bd67743e5a238b10thakis@chromium.org if sdk_root not in XcodeSettings._sdk_path_cache: 429ebde26be3915c0c7baf9029b8b2e667b0ce3675dsdefresne@chromium.org sdk_path = self._GetSdkVersionInfoItem(sdk_root, 'Path') 430ebde26be3915c0c7baf9029b8b2e667b0ce3675dsdefresne@chromium.org XcodeSettings._sdk_path_cache[sdk_root] = sdk_path 431ebde26be3915c0c7baf9029b8b2e667b0ce3675dsdefresne@chromium.org if sdk_root: 432ebde26be3915c0c7baf9029b8b2e667b0ce3675dsdefresne@chromium.org XcodeSettings._sdk_root_cache[sdk_path] = sdk_root 43307729ba52e877ad288263b39bd67743e5a238b10thakis@chromium.org return XcodeSettings._sdk_path_cache[sdk_root] 43407729ba52e877ad288263b39bd67743e5a238b10thakis@chromium.org 43507729ba52e877ad288263b39bd67743e5a238b10thakis@chromium.org def _AppendPlatformVersionMinFlags(self, lst): 43607729ba52e877ad288263b39bd67743e5a238b10thakis@chromium.org self._Appendf(lst, 'MACOSX_DEPLOYMENT_TARGET', '-mmacosx-version-min=%s') 43707729ba52e877ad288263b39bd67743e5a238b10thakis@chromium.org if 'IPHONEOS_DEPLOYMENT_TARGET' in self._Settings(): 43807729ba52e877ad288263b39bd67743e5a238b10thakis@chromium.org # TODO: Implement this better? 43907729ba52e877ad288263b39bd67743e5a238b10thakis@chromium.org sdk_path_basename = os.path.basename(self._SdkPath()) 44007729ba52e877ad288263b39bd67743e5a238b10thakis@chromium.org if sdk_path_basename.lower().startswith('iphonesimulator'): 44107729ba52e877ad288263b39bd67743e5a238b10thakis@chromium.org self._Appendf(lst, 'IPHONEOS_DEPLOYMENT_TARGET', 44207729ba52e877ad288263b39bd67743e5a238b10thakis@chromium.org '-mios-simulator-version-min=%s') 44307729ba52e877ad288263b39bd67743e5a238b10thakis@chromium.org else: 44407729ba52e877ad288263b39bd67743e5a238b10thakis@chromium.org self._Appendf(lst, 'IPHONEOS_DEPLOYMENT_TARGET', 44507729ba52e877ad288263b39bd67743e5a238b10thakis@chromium.org '-miphoneos-version-min=%s') 4460839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org 4478fcfea42b6d343297e8b6b786d85fa5ad862fc30thakis@chromium.org def GetCflags(self, configname, arch=None): 4480839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org """Returns flags that need to be added to .c, .cc, .m, and .mm 4490839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org compilations.""" 4500839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org # This functions (and the similar ones below) do not offer complete 4510839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org # emulation of all xcode_settings keys. They're implemented on demand. 4520839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org 4530839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org self.configname = configname 4540839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org cflags = [] 4550839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org 4560839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org sdk_root = self._SdkPath() 457b1a73dc8dd65f473893444bb084a43d0cff8356fthakis@chromium.org if 'SDKROOT' in self._Settings() and sdk_root: 4580839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org cflags.append('-isysroot %s' % sdk_root) 4590839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org 46007729ba52e877ad288263b39bd67743e5a238b10thakis@chromium.org if self._Test('CLANG_WARN_CONSTANT_CONVERSION', 'YES', default='NO'): 46107729ba52e877ad288263b39bd67743e5a238b10thakis@chromium.org cflags.append('-Wconstant-conversion') 46207729ba52e877ad288263b39bd67743e5a238b10thakis@chromium.org 463e3389bf8ea077627bfc900f749d2002a5a397b70thakis@chromium.org if self._Test('GCC_CHAR_IS_UNSIGNED_CHAR', 'YES', default='NO'): 464e3389bf8ea077627bfc900f749d2002a5a397b70thakis@chromium.org cflags.append('-funsigned-char') 465e3389bf8ea077627bfc900f749d2002a5a397b70thakis@chromium.org 4660839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org if self._Test('GCC_CW_ASM_SYNTAX', 'YES', default='YES'): 4670839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org cflags.append('-fasm-blocks') 4680839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org 4690839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org if 'GCC_DYNAMIC_NO_PIC' in self._Settings(): 4700839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org if self._Settings()['GCC_DYNAMIC_NO_PIC'] == 'YES': 4710839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org cflags.append('-mdynamic-no-pic') 4720839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org else: 4730839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org pass 4740839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org # TODO: In this case, it depends on the target. xcode passes 4750839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org # mdynamic-no-pic by default for executable and possibly static lib 4760839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org # according to mento 4770839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org 4780839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org if self._Test('GCC_ENABLE_PASCAL_STRINGS', 'YES', default='YES'): 4790839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org cflags.append('-mpascal-strings') 4800839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org 4810839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org self._Appendf(cflags, 'GCC_OPTIMIZATION_LEVEL', '-O%s', default='s') 4820839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org 4830839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org if self._Test('GCC_GENERATE_DEBUGGING_SYMBOLS', 'YES', default='YES'): 4840839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org dbg_format = self._Settings().get('DEBUG_INFORMATION_FORMAT', 'dwarf') 4850839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org if dbg_format == 'dwarf': 4860839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org cflags.append('-gdwarf-2') 4870839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org elif dbg_format == 'stabs': 4880839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org raise NotImplementedError('stabs debug format is not supported yet.') 4890839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org elif dbg_format == 'dwarf-with-dsym': 4900839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org cflags.append('-gdwarf-2') 4910839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org else: 4920839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org raise NotImplementedError('Unknown debug format %s' % dbg_format) 4930839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org 494dc4f7194a410b59b21e3d3df9d65b2bce985853cthakis@chromium.org if self._Settings().get('GCC_STRICT_ALIASING') == 'YES': 495dc4f7194a410b59b21e3d3df9d65b2bce985853cthakis@chromium.org cflags.append('-fstrict-aliasing') 496dc4f7194a410b59b21e3d3df9d65b2bce985853cthakis@chromium.org elif self._Settings().get('GCC_STRICT_ALIASING') == 'NO': 497dc4f7194a410b59b21e3d3df9d65b2bce985853cthakis@chromium.org cflags.append('-fno-strict-aliasing') 498dc4f7194a410b59b21e3d3df9d65b2bce985853cthakis@chromium.org 4990839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org if self._Test('GCC_SYMBOLS_PRIVATE_EXTERN', 'YES', default='NO'): 5000839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org cflags.append('-fvisibility=hidden') 5010839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org 5020839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org if self._Test('GCC_TREAT_WARNINGS_AS_ERRORS', 'YES', default='NO'): 5030839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org cflags.append('-Werror') 5040839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org 5050839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org if self._Test('GCC_WARN_ABOUT_MISSING_NEWLINE', 'YES', default='NO'): 5060839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org cflags.append('-Wnewline-eof') 5070839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org 50807729ba52e877ad288263b39bd67743e5a238b10thakis@chromium.org self._AppendPlatformVersionMinFlags(cflags) 5090839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org 5100839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org # TODO: 5110839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org if self._Test('COPY_PHASE_STRIP', 'YES', default='NO'): 5120839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org self._WarnUnimplemented('COPY_PHASE_STRIP') 5130839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org self._WarnUnimplemented('GCC_DEBUGGING_SYMBOLS') 5140839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org self._WarnUnimplemented('GCC_ENABLE_OBJC_EXCEPTIONS') 5150839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org 5160839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org # TODO: This is exported correctly, but assigning to it is not supported. 5170839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org self._WarnUnimplemented('MACH_O_TYPE') 5180839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org self._WarnUnimplemented('PRODUCT_TYPE') 5190839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org 5208fcfea42b6d343297e8b6b786d85fa5ad862fc30thakis@chromium.org if arch is not None: 5218fcfea42b6d343297e8b6b786d85fa5ad862fc30thakis@chromium.org archs = [arch] 5228fcfea42b6d343297e8b6b786d85fa5ad862fc30thakis@chromium.org else: 523c0a33f48500fd0b7bed2407cfdc983911b254aeasdefresne@chromium.org assert self.configname 524c0a33f48500fd0b7bed2407cfdc983911b254aeasdefresne@chromium.org archs = self.GetActiveArchs(self.configname) 52531543448be478a5482732cda9e9b88cf5b3e08e1thakis@chromium.org if len(archs) != 1: 52631543448be478a5482732cda9e9b88cf5b3e08e1thakis@chromium.org # TODO: Supporting fat binaries will be annoying. 52731543448be478a5482732cda9e9b88cf5b3e08e1thakis@chromium.org self._WarnUnimplemented('ARCHS') 52831543448be478a5482732cda9e9b88cf5b3e08e1thakis@chromium.org archs = ['i386'] 52931543448be478a5482732cda9e9b88cf5b3e08e1thakis@chromium.org cflags.append('-arch ' + archs[0]) 5300839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org 531b7adfd975a2b7eefed0cdf40e8b89ecf41e72e40thakis@chromium.org if archs[0] in ('i386', 'x86_64'): 532b7adfd975a2b7eefed0cdf40e8b89ecf41e72e40thakis@chromium.org if self._Test('GCC_ENABLE_SSE3_EXTENSIONS', 'YES', default='NO'): 533b7adfd975a2b7eefed0cdf40e8b89ecf41e72e40thakis@chromium.org cflags.append('-msse3') 534b7adfd975a2b7eefed0cdf40e8b89ecf41e72e40thakis@chromium.org if self._Test('GCC_ENABLE_SUPPLEMENTAL_SSE3_INSTRUCTIONS', 'YES', 535b7adfd975a2b7eefed0cdf40e8b89ecf41e72e40thakis@chromium.org default='NO'): 536b7adfd975a2b7eefed0cdf40e8b89ecf41e72e40thakis@chromium.org cflags.append('-mssse3') # Note 3rd 's'. 537b7adfd975a2b7eefed0cdf40e8b89ecf41e72e40thakis@chromium.org if self._Test('GCC_ENABLE_SSE41_EXTENSIONS', 'YES', default='NO'): 538b7adfd975a2b7eefed0cdf40e8b89ecf41e72e40thakis@chromium.org cflags.append('-msse4.1') 539b7adfd975a2b7eefed0cdf40e8b89ecf41e72e40thakis@chromium.org if self._Test('GCC_ENABLE_SSE42_EXTENSIONS', 'YES', default='NO'): 540b7adfd975a2b7eefed0cdf40e8b89ecf41e72e40thakis@chromium.org cflags.append('-msse4.2') 541b7adfd975a2b7eefed0cdf40e8b89ecf41e72e40thakis@chromium.org 5420839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org cflags += self._Settings().get('WARNING_CFLAGS', []) 5430839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org 544b1a73dc8dd65f473893444bb084a43d0cff8356fthakis@chromium.org if sdk_root: 545b1a73dc8dd65f473893444bb084a43d0cff8356fthakis@chromium.org framework_root = sdk_root 546b1a73dc8dd65f473893444bb084a43d0cff8356fthakis@chromium.org else: 547b1a73dc8dd65f473893444bb084a43d0cff8356fthakis@chromium.org framework_root = '' 5485d8178cbf9bc22c6d1d36c37d7264f6f0447e58dthakis@chromium.org config = self.spec['configurations'][self.configname] 5495d8178cbf9bc22c6d1d36c37d7264f6f0447e58dthakis@chromium.org framework_dirs = config.get('mac_framework_dirs', []) 5505d8178cbf9bc22c6d1d36c37d7264f6f0447e58dthakis@chromium.org for directory in framework_dirs: 551b1a73dc8dd65f473893444bb084a43d0cff8356fthakis@chromium.org cflags.append('-F' + directory.replace('$(SDKROOT)', framework_root)) 5520839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org 5530839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org self.configname = None 5540839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org return cflags 5550839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org 5560839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org def GetCflagsC(self, configname): 5570839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org """Returns flags that need to be added to .c, and .m compilations.""" 5580839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org self.configname = configname 5590839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org cflags_c = [] 56060947b8014d56749a3def7404c827a57e64a264bjochen@chromium.org if self._Settings().get('GCC_C_LANGUAGE_STANDARD', '') == 'ansi': 56160947b8014d56749a3def7404c827a57e64a264bjochen@chromium.org cflags_c.append('-ansi') 56260947b8014d56749a3def7404c827a57e64a264bjochen@chromium.org else: 56360947b8014d56749a3def7404c827a57e64a264bjochen@chromium.org self._Appendf(cflags_c, 'GCC_C_LANGUAGE_STANDARD', '-std=%s') 56405db0cd87fbd78fe8599db6a23bddf5431dd6f7dthakis@chromium.org cflags_c += self._Settings().get('OTHER_CFLAGS', []) 5650839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org self.configname = None 5660839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org return cflags_c 5670839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org 5680839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org def GetCflagsCC(self, configname): 5690839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org """Returns flags that need to be added to .cc, and .mm compilations.""" 5700839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org self.configname = configname 5710839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org cflags_cc = [] 57207729ba52e877ad288263b39bd67743e5a238b10thakis@chromium.org 57307729ba52e877ad288263b39bd67743e5a238b10thakis@chromium.org clang_cxx_language_standard = self._Settings().get( 57407729ba52e877ad288263b39bd67743e5a238b10thakis@chromium.org 'CLANG_CXX_LANGUAGE_STANDARD') 575bac8efc8bcffe74323e9e05d8b46d8465b97dc70thakis@chromium.org # Note: Don't make c++0x to c++11 so that c++0x can be used with older 576bac8efc8bcffe74323e9e05d8b46d8465b97dc70thakis@chromium.org # clangs that don't understand c++11 yet (like Xcode 4.2's). 577bac8efc8bcffe74323e9e05d8b46d8465b97dc70thakis@chromium.org if clang_cxx_language_standard: 57807729ba52e877ad288263b39bd67743e5a238b10thakis@chromium.org cflags_cc.append('-std=%s' % clang_cxx_language_standard) 57907729ba52e877ad288263b39bd67743e5a238b10thakis@chromium.org 58007729ba52e877ad288263b39bd67743e5a238b10thakis@chromium.org self._Appendf(cflags_cc, 'CLANG_CXX_LIBRARY', '-stdlib=%s') 58107729ba52e877ad288263b39bd67743e5a238b10thakis@chromium.org 5820839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org if self._Test('GCC_ENABLE_CPP_RTTI', 'NO', default='YES'): 5830839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org cflags_cc.append('-fno-rtti') 5840839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org if self._Test('GCC_ENABLE_CPP_EXCEPTIONS', 'NO', default='YES'): 5850839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org cflags_cc.append('-fno-exceptions') 5860839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org if self._Test('GCC_INLINES_ARE_PRIVATE_EXTERN', 'YES', default='NO'): 5870839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org cflags_cc.append('-fvisibility-inlines-hidden') 5880839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org if self._Test('GCC_THREADSAFE_STATICS', 'NO', default='YES'): 5890839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org cflags_cc.append('-fno-threadsafe-statics') 590b26acf5e5b3caac5b10c0027b63c8633a7c82c3dthakis@chromium.org # Note: This flag is a no-op for clang, it only has an effect for gcc. 59121dc75405e91ff2473d834decf92c9a384e39b6eviettrungluu@chromium.org if self._Test('GCC_WARN_ABOUT_INVALID_OFFSETOF_MACRO', 'NO', default='YES'): 59221dc75405e91ff2473d834decf92c9a384e39b6eviettrungluu@chromium.org cflags_cc.append('-Wno-invalid-offsetof') 59305db0cd87fbd78fe8599db6a23bddf5431dd6f7dthakis@chromium.org 59405db0cd87fbd78fe8599db6a23bddf5431dd6f7dthakis@chromium.org other_ccflags = [] 595581dcf4a237f60bcae86ef7ded8f90823847ca5bthakis@chromium.org 59690d3d0c4d76d6bcc95b4e42b5866bc4040346575thakis@chromium.org for flag in self._Settings().get('OTHER_CPLUSPLUSFLAGS', ['$(inherited)']): 59705db0cd87fbd78fe8599db6a23bddf5431dd6f7dthakis@chromium.org # TODO: More general variable expansion. Missing in many other places too. 59805db0cd87fbd78fe8599db6a23bddf5431dd6f7dthakis@chromium.org if flag in ('$inherited', '$(inherited)', '${inherited}'): 59905db0cd87fbd78fe8599db6a23bddf5431dd6f7dthakis@chromium.org flag = '$OTHER_CFLAGS' 60005db0cd87fbd78fe8599db6a23bddf5431dd6f7dthakis@chromium.org if flag in ('$OTHER_CFLAGS', '$(OTHER_CFLAGS)', '${OTHER_CFLAGS}'): 60105db0cd87fbd78fe8599db6a23bddf5431dd6f7dthakis@chromium.org other_ccflags += self._Settings().get('OTHER_CFLAGS', []) 60205db0cd87fbd78fe8599db6a23bddf5431dd6f7dthakis@chromium.org else: 60305db0cd87fbd78fe8599db6a23bddf5431dd6f7dthakis@chromium.org other_ccflags.append(flag) 60405db0cd87fbd78fe8599db6a23bddf5431dd6f7dthakis@chromium.org cflags_cc += other_ccflags 60505db0cd87fbd78fe8599db6a23bddf5431dd6f7dthakis@chromium.org 6060839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org self.configname = None 6070839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org return cflags_cc 6080839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org 60984791a1bd5c7e5336b3dbc61d14c99130183aca2thakis@chromium.org def _AddObjectiveCGarbageCollectionFlags(self, flags): 61084791a1bd5c7e5336b3dbc61d14c99130183aca2thakis@chromium.org gc_policy = self._Settings().get('GCC_ENABLE_OBJC_GC', 'unsupported') 61184791a1bd5c7e5336b3dbc61d14c99130183aca2thakis@chromium.org if gc_policy == 'supported': 61284791a1bd5c7e5336b3dbc61d14c99130183aca2thakis@chromium.org flags.append('-fobjc-gc') 61384791a1bd5c7e5336b3dbc61d14c99130183aca2thakis@chromium.org elif gc_policy == 'required': 61484791a1bd5c7e5336b3dbc61d14c99130183aca2thakis@chromium.org flags.append('-fobjc-gc-only') 61584791a1bd5c7e5336b3dbc61d14c99130183aca2thakis@chromium.org 616d3a78a9cab563bf52c69a382ac65dda2c1c8b5cffischman@chromium.org def _AddObjectiveCARCFlags(self, flags): 617d3a78a9cab563bf52c69a382ac65dda2c1c8b5cffischman@chromium.org if self._Test('CLANG_ENABLE_OBJC_ARC', 'YES', default='NO'): 618d3a78a9cab563bf52c69a382ac65dda2c1c8b5cffischman@chromium.org flags.append('-fobjc-arc') 619d3a78a9cab563bf52c69a382ac65dda2c1c8b5cffischman@chromium.org 620739010860d3c5a8d0dacb1f32a955828288c05b1justincohen@chromium.org def _AddObjectiveCMissingPropertySynthesisFlags(self, flags): 621739010860d3c5a8d0dacb1f32a955828288c05b1justincohen@chromium.org if self._Test('CLANG_WARN_OBJC_MISSING_PROPERTY_SYNTHESIS', 622739010860d3c5a8d0dacb1f32a955828288c05b1justincohen@chromium.org 'YES', default='NO'): 623739010860d3c5a8d0dacb1f32a955828288c05b1justincohen@chromium.org flags.append('-Wobjc-missing-property-synthesis') 624739010860d3c5a8d0dacb1f32a955828288c05b1justincohen@chromium.org 6250839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org def GetCflagsObjC(self, configname): 6260839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org """Returns flags that need to be added to .m compilations.""" 6270839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org self.configname = configname 62884791a1bd5c7e5336b3dbc61d14c99130183aca2thakis@chromium.org cflags_objc = [] 62984791a1bd5c7e5336b3dbc61d14c99130183aca2thakis@chromium.org self._AddObjectiveCGarbageCollectionFlags(cflags_objc) 630d3a78a9cab563bf52c69a382ac65dda2c1c8b5cffischman@chromium.org self._AddObjectiveCARCFlags(cflags_objc) 631739010860d3c5a8d0dacb1f32a955828288c05b1justincohen@chromium.org self._AddObjectiveCMissingPropertySynthesisFlags(cflags_objc) 6320839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org self.configname = None 63384791a1bd5c7e5336b3dbc61d14c99130183aca2thakis@chromium.org return cflags_objc 6340839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org 6350839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org def GetCflagsObjCC(self, configname): 6360839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org """Returns flags that need to be added to .mm compilations.""" 6370839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org self.configname = configname 6380839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org cflags_objcc = [] 63984791a1bd5c7e5336b3dbc61d14c99130183aca2thakis@chromium.org self._AddObjectiveCGarbageCollectionFlags(cflags_objcc) 640d3a78a9cab563bf52c69a382ac65dda2c1c8b5cffischman@chromium.org self._AddObjectiveCARCFlags(cflags_objcc) 641739010860d3c5a8d0dacb1f32a955828288c05b1justincohen@chromium.org self._AddObjectiveCMissingPropertySynthesisFlags(cflags_objcc) 6420839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org if self._Test('GCC_OBJC_CALL_CXX_CDTORS', 'YES', default='NO'): 6430839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org cflags_objcc.append('-fobjc-call-cxx-cdtors') 6440839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org self.configname = None 6450839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org return cflags_objcc 6460839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org 647dea566fe51cb78913373c853b796251f50460125thakis@chromium.org def GetInstallNameBase(self): 648dea566fe51cb78913373c853b796251f50460125thakis@chromium.org """Return DYLIB_INSTALL_NAME_BASE for this target.""" 649dea566fe51cb78913373c853b796251f50460125thakis@chromium.org # Xcode sets this for shared_libraries, and for nonbundled loadable_modules. 650dea566fe51cb78913373c853b796251f50460125thakis@chromium.org if (self.spec['type'] != 'shared_library' and 651dea566fe51cb78913373c853b796251f50460125thakis@chromium.org (self.spec['type'] != 'loadable_module' or self._IsBundle())): 652dea566fe51cb78913373c853b796251f50460125thakis@chromium.org return None 653dea566fe51cb78913373c853b796251f50460125thakis@chromium.org install_base = self.GetPerTargetSetting( 654dea566fe51cb78913373c853b796251f50460125thakis@chromium.org 'DYLIB_INSTALL_NAME_BASE', 655dea566fe51cb78913373c853b796251f50460125thakis@chromium.org default='/Library/Frameworks' if self._IsBundle() else '/usr/local/lib') 656dea566fe51cb78913373c853b796251f50460125thakis@chromium.org return install_base 657dea566fe51cb78913373c853b796251f50460125thakis@chromium.org 658dea566fe51cb78913373c853b796251f50460125thakis@chromium.org def _StandardizePath(self, path): 659dea566fe51cb78913373c853b796251f50460125thakis@chromium.org """Do :standardizepath processing for path.""" 660dea566fe51cb78913373c853b796251f50460125thakis@chromium.org # I'm not quite sure what :standardizepath does. Just call normpath(), 661dea566fe51cb78913373c853b796251f50460125thakis@chromium.org # but don't let @executable_path/../foo collapse to foo. 662dea566fe51cb78913373c853b796251f50460125thakis@chromium.org if '/' in path: 663dea566fe51cb78913373c853b796251f50460125thakis@chromium.org prefix, rest = '', path 664dea566fe51cb78913373c853b796251f50460125thakis@chromium.org if path.startswith('@'): 665dea566fe51cb78913373c853b796251f50460125thakis@chromium.org prefix, rest = path.split('/', 1) 666dea566fe51cb78913373c853b796251f50460125thakis@chromium.org rest = os.path.normpath(rest) # :standardizepath 667dea566fe51cb78913373c853b796251f50460125thakis@chromium.org path = os.path.join(prefix, rest) 668dea566fe51cb78913373c853b796251f50460125thakis@chromium.org return path 669dea566fe51cb78913373c853b796251f50460125thakis@chromium.org 670dea566fe51cb78913373c853b796251f50460125thakis@chromium.org def GetInstallName(self): 671dea566fe51cb78913373c853b796251f50460125thakis@chromium.org """Return LD_DYLIB_INSTALL_NAME for this target.""" 672dea566fe51cb78913373c853b796251f50460125thakis@chromium.org # Xcode sets this for shared_libraries, and for nonbundled loadable_modules. 673dea566fe51cb78913373c853b796251f50460125thakis@chromium.org if (self.spec['type'] != 'shared_library' and 674dea566fe51cb78913373c853b796251f50460125thakis@chromium.org (self.spec['type'] != 'loadable_module' or self._IsBundle())): 675dea566fe51cb78913373c853b796251f50460125thakis@chromium.org return None 676dea566fe51cb78913373c853b796251f50460125thakis@chromium.org 677dea566fe51cb78913373c853b796251f50460125thakis@chromium.org default_install_name = \ 678dea566fe51cb78913373c853b796251f50460125thakis@chromium.org '$(DYLIB_INSTALL_NAME_BASE:standardizepath)/$(EXECUTABLE_PATH)' 679dea566fe51cb78913373c853b796251f50460125thakis@chromium.org install_name = self.GetPerTargetSetting( 680dea566fe51cb78913373c853b796251f50460125thakis@chromium.org 'LD_DYLIB_INSTALL_NAME', default=default_install_name) 681dea566fe51cb78913373c853b796251f50460125thakis@chromium.org 682dea566fe51cb78913373c853b796251f50460125thakis@chromium.org # Hardcode support for the variables used in chromium for now, to 683dea566fe51cb78913373c853b796251f50460125thakis@chromium.org # unblock people using the make build. 684dea566fe51cb78913373c853b796251f50460125thakis@chromium.org if '$' in install_name: 685dea566fe51cb78913373c853b796251f50460125thakis@chromium.org assert install_name in ('$(DYLIB_INSTALL_NAME_BASE:standardizepath)/' 686dea566fe51cb78913373c853b796251f50460125thakis@chromium.org '$(WRAPPER_NAME)/$(PRODUCT_NAME)', default_install_name), ( 687dea566fe51cb78913373c853b796251f50460125thakis@chromium.org 'Variables in LD_DYLIB_INSTALL_NAME are not generally supported ' 688dea566fe51cb78913373c853b796251f50460125thakis@chromium.org 'yet in target \'%s\' (got \'%s\')' % 689dea566fe51cb78913373c853b796251f50460125thakis@chromium.org (self.spec['target_name'], install_name)) 690dea566fe51cb78913373c853b796251f50460125thakis@chromium.org 691dea566fe51cb78913373c853b796251f50460125thakis@chromium.org install_name = install_name.replace( 692dea566fe51cb78913373c853b796251f50460125thakis@chromium.org '$(DYLIB_INSTALL_NAME_BASE:standardizepath)', 693dea566fe51cb78913373c853b796251f50460125thakis@chromium.org self._StandardizePath(self.GetInstallNameBase())) 694dea566fe51cb78913373c853b796251f50460125thakis@chromium.org if self._IsBundle(): 695dea566fe51cb78913373c853b796251f50460125thakis@chromium.org # These are only valid for bundles, hence the |if|. 696dea566fe51cb78913373c853b796251f50460125thakis@chromium.org install_name = install_name.replace( 697dea566fe51cb78913373c853b796251f50460125thakis@chromium.org '$(WRAPPER_NAME)', self.GetWrapperName()) 698dea566fe51cb78913373c853b796251f50460125thakis@chromium.org install_name = install_name.replace( 699dea566fe51cb78913373c853b796251f50460125thakis@chromium.org '$(PRODUCT_NAME)', self.GetProductName()) 700dea566fe51cb78913373c853b796251f50460125thakis@chromium.org else: 701dea566fe51cb78913373c853b796251f50460125thakis@chromium.org assert '$(WRAPPER_NAME)' not in install_name 702dea566fe51cb78913373c853b796251f50460125thakis@chromium.org assert '$(PRODUCT_NAME)' not in install_name 703dea566fe51cb78913373c853b796251f50460125thakis@chromium.org 704dea566fe51cb78913373c853b796251f50460125thakis@chromium.org install_name = install_name.replace( 705dea566fe51cb78913373c853b796251f50460125thakis@chromium.org '$(EXECUTABLE_PATH)', self.GetExecutablePath()) 706dea566fe51cb78913373c853b796251f50460125thakis@chromium.org return install_name 707dea566fe51cb78913373c853b796251f50460125thakis@chromium.org 70859906326b3431dc9daaeabbe2625611e28545affthakis@chromium.org def _MapLinkerFlagFilename(self, ldflag, gyp_to_build_path): 70959906326b3431dc9daaeabbe2625611e28545affthakis@chromium.org """Checks if ldflag contains a filename and if so remaps it from 71059906326b3431dc9daaeabbe2625611e28545affthakis@chromium.org gyp-directory-relative to build-directory-relative.""" 71159906326b3431dc9daaeabbe2625611e28545affthakis@chromium.org # This list is expanded on demand. 71259906326b3431dc9daaeabbe2625611e28545affthakis@chromium.org # They get matched as: 71359906326b3431dc9daaeabbe2625611e28545affthakis@chromium.org # -exported_symbols_list file 71459906326b3431dc9daaeabbe2625611e28545affthakis@chromium.org # -Wl,exported_symbols_list file 71559906326b3431dc9daaeabbe2625611e28545affthakis@chromium.org # -Wl,exported_symbols_list,file 71659906326b3431dc9daaeabbe2625611e28545affthakis@chromium.org LINKER_FILE = '(\S+)' 71759906326b3431dc9daaeabbe2625611e28545affthakis@chromium.org WORD = '\S+' 71859906326b3431dc9daaeabbe2625611e28545affthakis@chromium.org linker_flags = [ 71959906326b3431dc9daaeabbe2625611e28545affthakis@chromium.org ['-exported_symbols_list', LINKER_FILE], # Needed for NaCl. 72059906326b3431dc9daaeabbe2625611e28545affthakis@chromium.org ['-unexported_symbols_list', LINKER_FILE], 72159906326b3431dc9daaeabbe2625611e28545affthakis@chromium.org ['-reexported_symbols_list', LINKER_FILE], 72259906326b3431dc9daaeabbe2625611e28545affthakis@chromium.org ['-sectcreate', WORD, WORD, LINKER_FILE], # Needed for remoting. 72359906326b3431dc9daaeabbe2625611e28545affthakis@chromium.org ] 72459906326b3431dc9daaeabbe2625611e28545affthakis@chromium.org for flag_pattern in linker_flags: 72559906326b3431dc9daaeabbe2625611e28545affthakis@chromium.org regex = re.compile('(?:-Wl,)?' + '[ ,]'.join(flag_pattern)) 72659906326b3431dc9daaeabbe2625611e28545affthakis@chromium.org m = regex.match(ldflag) 72759906326b3431dc9daaeabbe2625611e28545affthakis@chromium.org if m: 72859906326b3431dc9daaeabbe2625611e28545affthakis@chromium.org ldflag = ldflag[:m.start(1)] + gyp_to_build_path(m.group(1)) + \ 72959906326b3431dc9daaeabbe2625611e28545affthakis@chromium.org ldflag[m.end(1):] 73059906326b3431dc9daaeabbe2625611e28545affthakis@chromium.org # Required for ffmpeg (no idea why they don't use LIBRARY_SEARCH_PATHS, 73159906326b3431dc9daaeabbe2625611e28545affthakis@chromium.org # TODO(thakis): Update ffmpeg.gyp): 73259906326b3431dc9daaeabbe2625611e28545affthakis@chromium.org if ldflag.startswith('-L'): 73359906326b3431dc9daaeabbe2625611e28545affthakis@chromium.org ldflag = '-L' + gyp_to_build_path(ldflag[len('-L'):]) 73459906326b3431dc9daaeabbe2625611e28545affthakis@chromium.org return ldflag 73559906326b3431dc9daaeabbe2625611e28545affthakis@chromium.org 7368fcfea42b6d343297e8b6b786d85fa5ad862fc30thakis@chromium.org def GetLdflags(self, configname, product_dir, gyp_to_build_path, arch=None): 73792176cf8740adbcdc973858b7f87bcdb6e7938b1thakis@chromium.org """Returns flags that need to be passed to the linker. 73892176cf8740adbcdc973858b7f87bcdb6e7938b1thakis@chromium.org 73992176cf8740adbcdc973858b7f87bcdb6e7938b1thakis@chromium.org Args: 74092176cf8740adbcdc973858b7f87bcdb6e7938b1thakis@chromium.org configname: The name of the configuration to get ld flags for. 74192176cf8740adbcdc973858b7f87bcdb6e7938b1thakis@chromium.org product_dir: The directory where products such static and dynamic 74292176cf8740adbcdc973858b7f87bcdb6e7938b1thakis@chromium.org libraries are placed. This is added to the library search path. 7434143358985fabc41e9220e0ca415a1e9d858fa92thakis@chromium.org gyp_to_build_path: A function that converts paths relative to the 74492176cf8740adbcdc973858b7f87bcdb6e7938b1thakis@chromium.org current gyp file to paths relative to the build direcotry. 74592176cf8740adbcdc973858b7f87bcdb6e7938b1thakis@chromium.org """ 7460839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org self.configname = configname 7470839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org ldflags = [] 7480839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org 7490839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org # The xcode build is relative to a gyp file's directory, and OTHER_LDFLAGS 75059906326b3431dc9daaeabbe2625611e28545affthakis@chromium.org # can contain entries that depend on this. Explicitly absolutify these. 7510839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org for ldflag in self._Settings().get('OTHER_LDFLAGS', []): 75259906326b3431dc9daaeabbe2625611e28545affthakis@chromium.org ldflags.append(self._MapLinkerFlagFilename(ldflag, gyp_to_build_path)) 7530839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org 7540839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org if self._Test('DEAD_CODE_STRIPPING', 'YES', default='NO'): 7550839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org ldflags.append('-Wl,-dead_strip') 7560839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org 7570839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org if self._Test('PREBINDING', 'YES', default='NO'): 7580839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org ldflags.append('-Wl,-prebind') 7590839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org 7600839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org self._Appendf( 7610839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org ldflags, 'DYLIB_COMPATIBILITY_VERSION', '-compatibility_version %s') 7620839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org self._Appendf( 7630839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org ldflags, 'DYLIB_CURRENT_VERSION', '-current_version %s') 76407729ba52e877ad288263b39bd67743e5a238b10thakis@chromium.org 76507729ba52e877ad288263b39bd67743e5a238b10thakis@chromium.org self._AppendPlatformVersionMinFlags(ldflags) 76607729ba52e877ad288263b39bd67743e5a238b10thakis@chromium.org 767b1a73dc8dd65f473893444bb084a43d0cff8356fthakis@chromium.org if 'SDKROOT' in self._Settings() and self._SdkPath(): 7680839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org ldflags.append('-isysroot ' + self._SdkPath()) 7690839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org 7700839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org for library_path in self._Settings().get('LIBRARY_SEARCH_PATHS', []): 77108d6b2cb13257ed4eafd7469e1018e2a3531c42cviettrungluu@chromium.org ldflags.append('-L' + gyp_to_build_path(library_path)) 7720839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org 7730839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org if 'ORDER_FILE' in self._Settings(): 7740839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org ldflags.append('-Wl,-order_file ' + 7754143358985fabc41e9220e0ca415a1e9d858fa92thakis@chromium.org '-Wl,' + gyp_to_build_path( 77692176cf8740adbcdc973858b7f87bcdb6e7938b1thakis@chromium.org self._Settings()['ORDER_FILE'])) 7770839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org 7788fcfea42b6d343297e8b6b786d85fa5ad862fc30thakis@chromium.org if arch is not None: 7798fcfea42b6d343297e8b6b786d85fa5ad862fc30thakis@chromium.org archs = [arch] 7808fcfea42b6d343297e8b6b786d85fa5ad862fc30thakis@chromium.org else: 781c0a33f48500fd0b7bed2407cfdc983911b254aeasdefresne@chromium.org assert self.configname 782c0a33f48500fd0b7bed2407cfdc983911b254aeasdefresne@chromium.org archs = self.GetActiveArchs(self.configname) 78331543448be478a5482732cda9e9b88cf5b3e08e1thakis@chromium.org if len(archs) != 1: 78431543448be478a5482732cda9e9b88cf5b3e08e1thakis@chromium.org # TODO: Supporting fat binaries will be annoying. 78531543448be478a5482732cda9e9b88cf5b3e08e1thakis@chromium.org self._WarnUnimplemented('ARCHS') 78631543448be478a5482732cda9e9b88cf5b3e08e1thakis@chromium.org archs = ['i386'] 78731543448be478a5482732cda9e9b88cf5b3e08e1thakis@chromium.org ldflags.append('-arch ' + archs[0]) 7880839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org 7890839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org # Xcode adds the product directory by default. 7900839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org ldflags.append('-L' + product_dir) 7910839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org 792dea566fe51cb78913373c853b796251f50460125thakis@chromium.org install_name = self.GetInstallName() 7935b29b370c07c612c1f1201f8a1fd549c6288d17ethakis@chromium.org if install_name and self.spec['type'] != 'loadable_module': 794dea566fe51cb78913373c853b796251f50460125thakis@chromium.org ldflags.append('-install_name ' + install_name.replace(' ', r'\ ')) 7950839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org 79655d19e83539fdc030589072ee9c448cb1556915fthakis@chromium.org for rpath in self._Settings().get('LD_RUNPATH_SEARCH_PATHS', []): 79755d19e83539fdc030589072ee9c448cb1556915fthakis@chromium.org ldflags.append('-Wl,-rpath,' + rpath) 79855d19e83539fdc030589072ee9c448cb1556915fthakis@chromium.org 799b1a73dc8dd65f473893444bb084a43d0cff8356fthakis@chromium.org sdk_root = self._SdkPath() 800b1a73dc8dd65f473893444bb084a43d0cff8356fthakis@chromium.org if not sdk_root: 801b1a73dc8dd65f473893444bb084a43d0cff8356fthakis@chromium.org sdk_root = '' 8025d8178cbf9bc22c6d1d36c37d7264f6f0447e58dthakis@chromium.org config = self.spec['configurations'][self.configname] 8035d8178cbf9bc22c6d1d36c37d7264f6f0447e58dthakis@chromium.org framework_dirs = config.get('mac_framework_dirs', []) 8045d8178cbf9bc22c6d1d36c37d7264f6f0447e58dthakis@chromium.org for directory in framework_dirs: 805b1a73dc8dd65f473893444bb084a43d0cff8356fthakis@chromium.org ldflags.append('-F' + directory.replace('$(SDKROOT)', sdk_root)) 8061f13a89539cae882bbfbbb3d0cc358bade5aff44thakis@chromium.org 807f536bafefff908e7001e5634a5a75d29b1e2cab8sdefresne@chromium.org if sdk_root and self._IsIosAppExtension(): 808f536bafefff908e7001e5634a5a75d29b1e2cab8sdefresne@chromium.org # Adds the link flags for extensions. These flags are common for all 809f536bafefff908e7001e5634a5a75d29b1e2cab8sdefresne@chromium.org # extensions and provide loader and main function. 810f536bafefff908e7001e5634a5a75d29b1e2cab8sdefresne@chromium.org # These flags reflect the compilation options used by xcode to compile 811f536bafefff908e7001e5634a5a75d29b1e2cab8sdefresne@chromium.org # extensions. 812f536bafefff908e7001e5634a5a75d29b1e2cab8sdefresne@chromium.org ldflags.append('-lpkstart') 813f536bafefff908e7001e5634a5a75d29b1e2cab8sdefresne@chromium.org ldflags.append(sdk_root + 814f536bafefff908e7001e5634a5a75d29b1e2cab8sdefresne@chromium.org '/System/Library/PrivateFrameworks/PlugInKit.framework/PlugInKit') 815f536bafefff908e7001e5634a5a75d29b1e2cab8sdefresne@chromium.org ldflags.append('-fapplication-extension') 816f536bafefff908e7001e5634a5a75d29b1e2cab8sdefresne@chromium.org ldflags.append('-Xlinker -rpath ' 817f536bafefff908e7001e5634a5a75d29b1e2cab8sdefresne@chromium.org '-Xlinker @executable_path/../../Frameworks') 818f536bafefff908e7001e5634a5a75d29b1e2cab8sdefresne@chromium.org 8193efe68d8cf67fbdabe3ea719bbfbc3b59181c642sdefresne@chromium.org self._Appendf(ldflags, 'CLANG_CXX_LIBRARY', '-stdlib=%s') 8203efe68d8cf67fbdabe3ea719bbfbc3b59181c642sdefresne@chromium.org 8210839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org self.configname = None 8220839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org return ldflags 8230839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org 8245c809bab10c272ab2e34289a2505fc19ccd1da2cthakis@chromium.org def GetLibtoolflags(self, configname): 8255c809bab10c272ab2e34289a2505fc19ccd1da2cthakis@chromium.org """Returns flags that need to be passed to the static linker. 8265c809bab10c272ab2e34289a2505fc19ccd1da2cthakis@chromium.org 8275c809bab10c272ab2e34289a2505fc19ccd1da2cthakis@chromium.org Args: 8285c809bab10c272ab2e34289a2505fc19ccd1da2cthakis@chromium.org configname: The name of the configuration to get ld flags for. 8295c809bab10c272ab2e34289a2505fc19ccd1da2cthakis@chromium.org """ 8305c809bab10c272ab2e34289a2505fc19ccd1da2cthakis@chromium.org self.configname = configname 8315c809bab10c272ab2e34289a2505fc19ccd1da2cthakis@chromium.org libtoolflags = [] 8325c809bab10c272ab2e34289a2505fc19ccd1da2cthakis@chromium.org 8335c809bab10c272ab2e34289a2505fc19ccd1da2cthakis@chromium.org for libtoolflag in self._Settings().get('OTHER_LDFLAGS', []): 8345c809bab10c272ab2e34289a2505fc19ccd1da2cthakis@chromium.org libtoolflags.append(libtoolflag) 8355c809bab10c272ab2e34289a2505fc19ccd1da2cthakis@chromium.org # TODO(thakis): ARCHS? 8365c809bab10c272ab2e34289a2505fc19ccd1da2cthakis@chromium.org 8375c809bab10c272ab2e34289a2505fc19ccd1da2cthakis@chromium.org self.configname = None 8385c809bab10c272ab2e34289a2505fc19ccd1da2cthakis@chromium.org return libtoolflags 8395c809bab10c272ab2e34289a2505fc19ccd1da2cthakis@chromium.org 8400839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org def GetPerTargetSettings(self): 8410839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org """Gets a list of all the per-target settings. This will only fetch keys 8420839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org whose values are the same across all configurations.""" 8430839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org first_pass = True 8440839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org result = {} 8450839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org for configname in sorted(self.xcode_settings.keys()): 8460839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org if first_pass: 8470839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org result = dict(self.xcode_settings[configname]) 8480839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org first_pass = False 8490839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org else: 8500839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org for key, value in self.xcode_settings[configname].iteritems(): 8510839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org if key not in result: 8520839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org continue 8530839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org elif result[key] != value: 8540839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org del result[key] 8550839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org return result 8560839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org 8578e62cceb8070a4458fe58648753e1b2cc588f229justincohen@chromium.org def GetPerConfigSetting(self, setting, configname, default=None): 8588e62cceb8070a4458fe58648753e1b2cc588f229justincohen@chromium.org if configname in self.xcode_settings: 8598e62cceb8070a4458fe58648753e1b2cc588f229justincohen@chromium.org return self.xcode_settings[configname].get(setting, default) 8608e62cceb8070a4458fe58648753e1b2cc588f229justincohen@chromium.org else: 8618e62cceb8070a4458fe58648753e1b2cc588f229justincohen@chromium.org return self.GetPerTargetSetting(setting, default) 8628e62cceb8070a4458fe58648753e1b2cc588f229justincohen@chromium.org 8630839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org def GetPerTargetSetting(self, setting, default=None): 8640839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org """Tries to get xcode_settings.setting from spec. Assumes that the setting 8650839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org has the same value in all configurations and throws otherwise.""" 866203dfad2aa74a389c60017250fc70cd5b07cff23thakis@chromium.org is_first_pass = True 8670839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org result = None 8680839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org for configname in sorted(self.xcode_settings.keys()): 869203dfad2aa74a389c60017250fc70cd5b07cff23thakis@chromium.org if is_first_pass: 8700839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org result = self.xcode_settings[configname].get(setting, None) 871203dfad2aa74a389c60017250fc70cd5b07cff23thakis@chromium.org is_first_pass = False 8720839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org else: 8730839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org assert result == self.xcode_settings[configname].get(setting, None), ( 8740839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org "Expected per-target setting for '%s', got per-config setting " 8758e62cceb8070a4458fe58648753e1b2cc588f229justincohen@chromium.org "(target %s)" % (setting, self.spec['target_name'])) 8760839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org if result is None: 8770839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org return default 8780839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org return result 8790839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org 880786c3e3f0352600183caeb02501d0d9bbb7c1126thakis@chromium.org def _GetStripPostbuilds(self, configname, output_binary, quiet): 8810839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org """Returns a list of shell commands that contain the shell commands 8820839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org neccessary to strip this target's binary. These should be run as postbuilds 8830839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org before the actual postbuilds run.""" 8840839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org self.configname = configname 8850839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org 8860839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org result = [] 8870839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org if (self._Test('DEPLOYMENT_POSTPROCESSING', 'YES', default='NO') and 8880839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org self._Test('STRIP_INSTALLED_PRODUCT', 'YES', default='NO')): 8890839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org 8900839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org default_strip_style = 'debugging' 8917321abfcf267513ccf30d61c0f7bbf47983d9a33thakis@chromium.org if self.spec['type'] == 'loadable_module' and self._IsBundle(): 8920839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org default_strip_style = 'non-global' 8930839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org elif self.spec['type'] == 'executable': 8940839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org default_strip_style = 'all' 8950839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org 8960839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org strip_style = self._Settings().get('STRIP_STYLE', default_strip_style) 8970839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org strip_flags = { 8980839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org 'all': '', 8990839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org 'non-global': '-x', 9000839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org 'debugging': '-S', 9010839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org }[strip_style] 9020839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org 9030839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org explicit_strip_flags = self._Settings().get('STRIPFLAGS', '') 9040839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org if explicit_strip_flags: 905ecae04c143848a2a0247af1af0180fe0a19b1a77thakis@chromium.org strip_flags += ' ' + _NormalizeEnvVarReferences(explicit_strip_flags) 9060839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org 907786c3e3f0352600183caeb02501d0d9bbb7c1126thakis@chromium.org if not quiet: 908786c3e3f0352600183caeb02501d0d9bbb7c1126thakis@chromium.org result.append('echo STRIP\\(%s\\)' % self.spec['target_name']) 9090839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org result.append('strip %s %s' % (strip_flags, output_binary)) 9100839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org 9110839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org self.configname = None 9120839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org return result 9130839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org 914786c3e3f0352600183caeb02501d0d9bbb7c1126thakis@chromium.org def _GetDebugInfoPostbuilds(self, configname, output, output_binary, quiet): 9150839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org """Returns a list of shell commands that contain the shell commands 9160839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org neccessary to massage this target's debug information. These should be run 9170839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org as postbuilds before the actual postbuilds run.""" 9180839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org self.configname = configname 9190839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org 9200839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org # For static libraries, no dSYMs are created. 9210839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org result = [] 9220839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org if (self._Test('GCC_GENERATE_DEBUGGING_SYMBOLS', 'YES', default='YES') and 9230839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org self._Test( 9240839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org 'DEBUG_INFORMATION_FORMAT', 'dwarf-with-dsym', default='dwarf') and 9250839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org self.spec['type'] != 'static_library'): 926786c3e3f0352600183caeb02501d0d9bbb7c1126thakis@chromium.org if not quiet: 927786c3e3f0352600183caeb02501d0d9bbb7c1126thakis@chromium.org result.append('echo DSYMUTIL\\(%s\\)' % self.spec['target_name']) 9280839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org result.append('dsymutil %s -o %s' % (output_binary, output + '.dSYM')) 9290839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org 9300839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org self.configname = None 9310839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org return result 9320839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org 9333f7d04d67cabfc9b1c45ed551d4885130653d452justincohen@chromium.org def _GetTargetPostbuilds(self, configname, output, output_binary, 9343f7d04d67cabfc9b1c45ed551d4885130653d452justincohen@chromium.org quiet=False): 9350839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org """Returns a list of shell commands that contain the shell commands 9360839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org to run as postbuilds for this target, before the actual postbuilds.""" 9370839e68998d2c8e8f10ff21e648136f220fddd26thakis@chromium.org # dSYMs need to build before stripping happens. 938786c3e3f0352600183caeb02501d0d9bbb7c1126thakis@chromium.org return ( 939786c3e3f0352600183caeb02501d0d9bbb7c1126thakis@chromium.org self._GetDebugInfoPostbuilds(configname, output, output_binary, quiet) + 940786c3e3f0352600183caeb02501d0d9bbb7c1126thakis@chromium.org self._GetStripPostbuilds(configname, output_binary, quiet)) 9415a5caa1c101713c4bf0b7ca2d0302e3ee0ccff08thakis@chromium.org 9423f7d04d67cabfc9b1c45ed551d4885130653d452justincohen@chromium.org def _GetIOSPostbuilds(self, configname, output_binary): 9433f7d04d67cabfc9b1c45ed551d4885130653d452justincohen@chromium.org """Return a shell command to codesign the iOS output binary so it can 9443f7d04d67cabfc9b1c45ed551d4885130653d452justincohen@chromium.org be deployed to a device. This should be run as the very last step of the 9453f7d04d67cabfc9b1c45ed551d4885130653d452justincohen@chromium.org build.""" 946f536bafefff908e7001e5634a5a75d29b1e2cab8sdefresne@chromium.org if not (self.isIOS and self.spec['type'] == 'executable'): 9473f7d04d67cabfc9b1c45ed551d4885130653d452justincohen@chromium.org return [] 9483f7d04d67cabfc9b1c45ed551d4885130653d452justincohen@chromium.org 94934b060532e7753b3de7d33e9d330a8cd0179b5cbjustincohen@chromium.org settings = self.xcode_settings[configname] 95034b060532e7753b3de7d33e9d330a8cd0179b5cbjustincohen@chromium.org key = self._GetIOSCodeSignIdentityKey(settings) 95134b060532e7753b3de7d33e9d330a8cd0179b5cbjustincohen@chromium.org if not key: 9523f7d04d67cabfc9b1c45ed551d4885130653d452justincohen@chromium.org return [] 95334b060532e7753b3de7d33e9d330a8cd0179b5cbjustincohen@chromium.org 95434b060532e7753b3de7d33e9d330a8cd0179b5cbjustincohen@chromium.org # Warn for any unimplemented signing xcode keys. 95534b060532e7753b3de7d33e9d330a8cd0179b5cbjustincohen@chromium.org unimpl = ['OTHER_CODE_SIGN_FLAGS'] 95634b060532e7753b3de7d33e9d330a8cd0179b5cbjustincohen@chromium.org unimpl = set(unimpl) & set(self.xcode_settings[configname].keys()) 95734b060532e7753b3de7d33e9d330a8cd0179b5cbjustincohen@chromium.org if unimpl: 95834b060532e7753b3de7d33e9d330a8cd0179b5cbjustincohen@chromium.org print 'Warning: Some codesign keys not implemented, ignoring: %s' % ( 95934b060532e7753b3de7d33e9d330a8cd0179b5cbjustincohen@chromium.org ', '.join(sorted(unimpl))) 96034b060532e7753b3de7d33e9d330a8cd0179b5cbjustincohen@chromium.org 96134b060532e7753b3de7d33e9d330a8cd0179b5cbjustincohen@chromium.org return ['%s code-sign-bundle "%s" "%s" "%s" "%s"' % ( 96234b060532e7753b3de7d33e9d330a8cd0179b5cbjustincohen@chromium.org os.path.join('${TARGET_BUILD_DIR}', 'gyp-mac-tool'), key, 96334b060532e7753b3de7d33e9d330a8cd0179b5cbjustincohen@chromium.org settings.get('CODE_SIGN_RESOURCE_RULES_PATH', ''), 96434b060532e7753b3de7d33e9d330a8cd0179b5cbjustincohen@chromium.org settings.get('CODE_SIGN_ENTITLEMENTS', ''), 96534b060532e7753b3de7d33e9d330a8cd0179b5cbjustincohen@chromium.org settings.get('PROVISIONING_PROFILE', '')) 96634b060532e7753b3de7d33e9d330a8cd0179b5cbjustincohen@chromium.org ] 96734b060532e7753b3de7d33e9d330a8cd0179b5cbjustincohen@chromium.org 96834b060532e7753b3de7d33e9d330a8cd0179b5cbjustincohen@chromium.org def _GetIOSCodeSignIdentityKey(self, settings): 96934b060532e7753b3de7d33e9d330a8cd0179b5cbjustincohen@chromium.org identity = settings.get('CODE_SIGN_IDENTITY') 97034b060532e7753b3de7d33e9d330a8cd0179b5cbjustincohen@chromium.org if not identity: 97134b060532e7753b3de7d33e9d330a8cd0179b5cbjustincohen@chromium.org return None 9723f7d04d67cabfc9b1c45ed551d4885130653d452justincohen@chromium.org if identity not in XcodeSettings._codesigning_key_cache: 97334b060532e7753b3de7d33e9d330a8cd0179b5cbjustincohen@chromium.org output = subprocess.check_output( 97434b060532e7753b3de7d33e9d330a8cd0179b5cbjustincohen@chromium.org ['security', 'find-identity', '-p', 'codesigning', '-v']) 97534b060532e7753b3de7d33e9d330a8cd0179b5cbjustincohen@chromium.org for line in output.splitlines(): 97634b060532e7753b3de7d33e9d330a8cd0179b5cbjustincohen@chromium.org if identity in line: 97796a394efadb48606f9217131843dc3e3be12deabjustincohen@chromium.org fingerprint = line.split()[1] 97896a394efadb48606f9217131843dc3e3be12deabjustincohen@chromium.org cache = XcodeSettings._codesigning_key_cache 97996a394efadb48606f9217131843dc3e3be12deabjustincohen@chromium.org assert identity not in cache or fingerprint == cache[identity], ( 98096a394efadb48606f9217131843dc3e3be12deabjustincohen@chromium.org "Multiple codesigning fingerprints for identity: %s" % identity) 98196a394efadb48606f9217131843dc3e3be12deabjustincohen@chromium.org XcodeSettings._codesigning_key_cache[identity] = fingerprint 98234b060532e7753b3de7d33e9d330a8cd0179b5cbjustincohen@chromium.org return XcodeSettings._codesigning_key_cache.get(identity, '') 9833f7d04d67cabfc9b1c45ed551d4885130653d452justincohen@chromium.org 9843f7d04d67cabfc9b1c45ed551d4885130653d452justincohen@chromium.org def AddImplicitPostbuilds(self, configname, output, output_binary, 9853f7d04d67cabfc9b1c45ed551d4885130653d452justincohen@chromium.org postbuilds=[], quiet=False): 9863f7d04d67cabfc9b1c45ed551d4885130653d452justincohen@chromium.org """Returns a list of shell commands that should run before and after 9873f7d04d67cabfc9b1c45ed551d4885130653d452justincohen@chromium.org |postbuilds|.""" 9883f7d04d67cabfc9b1c45ed551d4885130653d452justincohen@chromium.org assert output_binary is not None 9893f7d04d67cabfc9b1c45ed551d4885130653d452justincohen@chromium.org pre = self._GetTargetPostbuilds(configname, output, output_binary, quiet) 9903f7d04d67cabfc9b1c45ed551d4885130653d452justincohen@chromium.org post = self._GetIOSPostbuilds(configname, output_binary) 9913f7d04d67cabfc9b1c45ed551d4885130653d452justincohen@chromium.org return pre + postbuilds + post 9923f7d04d67cabfc9b1c45ed551d4885130653d452justincohen@chromium.org 9938e62cceb8070a4458fe58648753e1b2cc588f229justincohen@chromium.org def _AdjustLibrary(self, library, config_name=None): 99408d6b2cb13257ed4eafd7469e1018e2a3531c42cviettrungluu@chromium.org if library.endswith('.framework'): 99508d6b2cb13257ed4eafd7469e1018e2a3531c42cviettrungluu@chromium.org l = '-framework ' + os.path.splitext(os.path.basename(library))[0] 99608d6b2cb13257ed4eafd7469e1018e2a3531c42cviettrungluu@chromium.org else: 99708d6b2cb13257ed4eafd7469e1018e2a3531c42cviettrungluu@chromium.org m = self.library_re.match(library) 99808d6b2cb13257ed4eafd7469e1018e2a3531c42cviettrungluu@chromium.org if m: 99908d6b2cb13257ed4eafd7469e1018e2a3531c42cviettrungluu@chromium.org l = '-l' + m.group(1) 100008d6b2cb13257ed4eafd7469e1018e2a3531c42cviettrungluu@chromium.org else: 100108d6b2cb13257ed4eafd7469e1018e2a3531c42cviettrungluu@chromium.org l = library 1002b1a73dc8dd65f473893444bb084a43d0cff8356fthakis@chromium.org 1003b1a73dc8dd65f473893444bb084a43d0cff8356fthakis@chromium.org sdk_root = self._SdkPath(config_name) 1004b1a73dc8dd65f473893444bb084a43d0cff8356fthakis@chromium.org if not sdk_root: 1005b1a73dc8dd65f473893444bb084a43d0cff8356fthakis@chromium.org sdk_root = '' 1006b1a73dc8dd65f473893444bb084a43d0cff8356fthakis@chromium.org return l.replace('$(SDKROOT)', sdk_root) 100708d6b2cb13257ed4eafd7469e1018e2a3531c42cviettrungluu@chromium.org 10088e62cceb8070a4458fe58648753e1b2cc588f229justincohen@chromium.org def AdjustLibraries(self, libraries, config_name=None): 100990c37cd9897316955b4b232b1bad23d846e651b7thakis@chromium.org """Transforms entries like 'Cocoa.framework' in libraries into entries like 101008d6b2cb13257ed4eafd7469e1018e2a3531c42cviettrungluu@chromium.org '-framework Cocoa', 'libcrypto.dylib' into '-lcrypto', etc. 101190c37cd9897316955b4b232b1bad23d846e651b7thakis@chromium.org """ 10128e62cceb8070a4458fe58648753e1b2cc588f229justincohen@chromium.org libraries = [self._AdjustLibrary(library, config_name) 10138e62cceb8070a4458fe58648753e1b2cc588f229justincohen@chromium.org for library in libraries] 101490c37cd9897316955b4b232b1bad23d846e651b7thakis@chromium.org return libraries 101590c37cd9897316955b4b232b1bad23d846e651b7thakis@chromium.org 1016203dfad2aa74a389c60017250fc70cd5b07cff23thakis@chromium.org def _BuildMachineOSBuild(self): 101778ac757f4051c5e657040c294390e8ad65de8e58sdefresne@chromium.org return GetStdout(['sw_vers', '-buildVersion']) 1018828ce09dd2485ce98886056eecfca78604189e02thakis@chromium.org 1019818dd59932d9d046d7d85ed27208ef873426303bjustincohen@chromium.org def _XcodeIOSDeviceFamily(self, configname): 1020818dd59932d9d046d7d85ed27208ef873426303bjustincohen@chromium.org family = self.xcode_settings[configname].get('TARGETED_DEVICE_FAMILY', '1') 1021818dd59932d9d046d7d85ed27208ef873426303bjustincohen@chromium.org return [int(x) for x in family.split(',')] 1022818dd59932d9d046d7d85ed27208ef873426303bjustincohen@chromium.org 10238e62cceb8070a4458fe58648753e1b2cc588f229justincohen@chromium.org def GetExtraPlistItems(self, configname=None): 1024203dfad2aa74a389c60017250fc70cd5b07cff23thakis@chromium.org """Returns a dictionary with extra items to insert into Info.plist.""" 1025818dd59932d9d046d7d85ed27208ef873426303bjustincohen@chromium.org if configname not in XcodeSettings._plist_cache: 1026818dd59932d9d046d7d85ed27208ef873426303bjustincohen@chromium.org cache = {} 1027203dfad2aa74a389c60017250fc70cd5b07cff23thakis@chromium.org cache['BuildMachineOSBuild'] = self._BuildMachineOSBuild() 1028203dfad2aa74a389c60017250fc70cd5b07cff23thakis@chromium.org 1029e51b0ce7b199bb0853d451d70fa8eedfcf3f3583sdefresne@chromium.org xcode, xcode_build = XcodeVersion() 1030203dfad2aa74a389c60017250fc70cd5b07cff23thakis@chromium.org cache['DTXcode'] = xcode 1031203dfad2aa74a389c60017250fc70cd5b07cff23thakis@chromium.org cache['DTXcodeBuild'] = xcode_build 1032203dfad2aa74a389c60017250fc70cd5b07cff23thakis@chromium.org 10338e62cceb8070a4458fe58648753e1b2cc588f229justincohen@chromium.org sdk_root = self._SdkRoot(configname) 1034ebde26be3915c0c7baf9029b8b2e667b0ce3675dsdefresne@chromium.org if not sdk_root: 1035ebde26be3915c0c7baf9029b8b2e667b0ce3675dsdefresne@chromium.org sdk_root = self._DefaultSdkRoot() 1036203dfad2aa74a389c60017250fc70cd5b07cff23thakis@chromium.org cache['DTSDKName'] = sdk_root 1037203dfad2aa74a389c60017250fc70cd5b07cff23thakis@chromium.org if xcode >= '0430': 1038203dfad2aa74a389c60017250fc70cd5b07cff23thakis@chromium.org cache['DTSDKBuild'] = self._GetSdkVersionInfoItem( 1039203dfad2aa74a389c60017250fc70cd5b07cff23thakis@chromium.org sdk_root, 'ProductBuildVersion') 1040203dfad2aa74a389c60017250fc70cd5b07cff23thakis@chromium.org else: 1041203dfad2aa74a389c60017250fc70cd5b07cff23thakis@chromium.org cache['DTSDKBuild'] = cache['BuildMachineOSBuild'] 1042203dfad2aa74a389c60017250fc70cd5b07cff23thakis@chromium.org 1043818dd59932d9d046d7d85ed27208ef873426303bjustincohen@chromium.org if self.isIOS: 104488fc8cab1e8403d71b968376c4afbb69ec4782ecjustincohen@chromium.org cache['DTPlatformName'] = cache['DTSDKName'] 1045818dd59932d9d046d7d85ed27208ef873426303bjustincohen@chromium.org if configname.endswith("iphoneos"): 104688fc8cab1e8403d71b968376c4afbb69ec4782ecjustincohen@chromium.org cache['DTPlatformVersion'] = self._GetSdkVersionInfoItem( 104788fc8cab1e8403d71b968376c4afbb69ec4782ecjustincohen@chromium.org sdk_root, 'ProductVersion') 1048818dd59932d9d046d7d85ed27208ef873426303bjustincohen@chromium.org cache['CFBundleSupportedPlatforms'] = ['iPhoneOS'] 1049818dd59932d9d046d7d85ed27208ef873426303bjustincohen@chromium.org else: 1050818dd59932d9d046d7d85ed27208ef873426303bjustincohen@chromium.org cache['CFBundleSupportedPlatforms'] = ['iPhoneSimulator'] 1051818dd59932d9d046d7d85ed27208ef873426303bjustincohen@chromium.org XcodeSettings._plist_cache[configname] = cache 10523f7d04d67cabfc9b1c45ed551d4885130653d452justincohen@chromium.org 10533f7d04d67cabfc9b1c45ed551d4885130653d452justincohen@chromium.org # Include extra plist items that are per-target, not per global 10543f7d04d67cabfc9b1c45ed551d4885130653d452justincohen@chromium.org # XcodeSettings. 10553f7d04d67cabfc9b1c45ed551d4885130653d452justincohen@chromium.org items = dict(XcodeSettings._plist_cache[configname]) 10563f7d04d67cabfc9b1c45ed551d4885130653d452justincohen@chromium.org if self.isIOS: 10573f7d04d67cabfc9b1c45ed551d4885130653d452justincohen@chromium.org items['UIDeviceFamily'] = self._XcodeIOSDeviceFamily(configname) 10583f7d04d67cabfc9b1c45ed551d4885130653d452justincohen@chromium.org return items 1059203dfad2aa74a389c60017250fc70cd5b07cff23thakis@chromium.org 1060ebde26be3915c0c7baf9029b8b2e667b0ce3675dsdefresne@chromium.org def _DefaultSdkRoot(self): 1061ebde26be3915c0c7baf9029b8b2e667b0ce3675dsdefresne@chromium.org """Returns the default SDKROOT to use. 1062ebde26be3915c0c7baf9029b8b2e667b0ce3675dsdefresne@chromium.org 1063ebde26be3915c0c7baf9029b8b2e667b0ce3675dsdefresne@chromium.org Prior to version 5.0.0, if SDKROOT was not explicitly set in the Xcode 1064ebde26be3915c0c7baf9029b8b2e667b0ce3675dsdefresne@chromium.org project, then the environment variable was empty. Starting with this 1065ebde26be3915c0c7baf9029b8b2e667b0ce3675dsdefresne@chromium.org version, Xcode uses the name of the newest SDK installed. 1066ebde26be3915c0c7baf9029b8b2e667b0ce3675dsdefresne@chromium.org """ 1067e51b0ce7b199bb0853d451d70fa8eedfcf3f3583sdefresne@chromium.org xcode_version, xcode_build = XcodeVersion() 1068e63790d519a8a1b0ecd05a61f7b7eadc128850f9sdefresne@chromium.org if xcode_version < '0500': 1069ebde26be3915c0c7baf9029b8b2e667b0ce3675dsdefresne@chromium.org return '' 1070ebde26be3915c0c7baf9029b8b2e667b0ce3675dsdefresne@chromium.org default_sdk_path = self._XcodeSdkPath('') 1071ebde26be3915c0c7baf9029b8b2e667b0ce3675dsdefresne@chromium.org default_sdk_root = XcodeSettings._sdk_root_cache.get(default_sdk_path) 1072ebde26be3915c0c7baf9029b8b2e667b0ce3675dsdefresne@chromium.org if default_sdk_root: 1073ebde26be3915c0c7baf9029b8b2e667b0ce3675dsdefresne@chromium.org return default_sdk_root 1074828ce09dd2485ce98886056eecfca78604189e02thakis@chromium.org try: 107578ac757f4051c5e657040c294390e8ad65de8e58sdefresne@chromium.org all_sdks = GetStdout(['xcodebuild', '-showsdks']) 1076828ce09dd2485ce98886056eecfca78604189e02thakis@chromium.org except: 1077828ce09dd2485ce98886056eecfca78604189e02thakis@chromium.org # If xcodebuild fails, there will be no valid SDKs 1078828ce09dd2485ce98886056eecfca78604189e02thakis@chromium.org return '' 1079ebde26be3915c0c7baf9029b8b2e667b0ce3675dsdefresne@chromium.org for line in all_sdks.splitlines(): 1080ebde26be3915c0c7baf9029b8b2e667b0ce3675dsdefresne@chromium.org items = line.split() 1081ebde26be3915c0c7baf9029b8b2e667b0ce3675dsdefresne@chromium.org if len(items) >= 3 and items[-2] == '-sdk': 1082ebde26be3915c0c7baf9029b8b2e667b0ce3675dsdefresne@chromium.org sdk_root = items[-1] 1083ebde26be3915c0c7baf9029b8b2e667b0ce3675dsdefresne@chromium.org sdk_path = self._XcodeSdkPath(sdk_root) 1084ebde26be3915c0c7baf9029b8b2e667b0ce3675dsdefresne@chromium.org if sdk_path == default_sdk_path: 1085ebde26be3915c0c7baf9029b8b2e667b0ce3675dsdefresne@chromium.org return sdk_root 1086ebde26be3915c0c7baf9029b8b2e667b0ce3675dsdefresne@chromium.org return '' 1087ebde26be3915c0c7baf9029b8b2e667b0ce3675dsdefresne@chromium.org 10885a5caa1c101713c4bf0b7ca2d0302e3ee0ccff08thakis@chromium.org 1089a402b25fabd2182c4c74dc3cf89c856c93ff5472thakis@chromium.orgclass MacPrefixHeader(object): 1090a402b25fabd2182c4c74dc3cf89c856c93ff5472thakis@chromium.org """A class that helps with emulating Xcode's GCC_PREFIX_HEADER feature. 1091a402b25fabd2182c4c74dc3cf89c856c93ff5472thakis@chromium.org 1092a402b25fabd2182c4c74dc3cf89c856c93ff5472thakis@chromium.org This feature consists of several pieces: 1093a402b25fabd2182c4c74dc3cf89c856c93ff5472thakis@chromium.org * If GCC_PREFIX_HEADER is present, all compilations in that project get an 1094a402b25fabd2182c4c74dc3cf89c856c93ff5472thakis@chromium.org additional |-include path_to_prefix_header| cflag. 1095a402b25fabd2182c4c74dc3cf89c856c93ff5472thakis@chromium.org * If GCC_PRECOMPILE_PREFIX_HEADER is present too, then the prefix header is 1096a402b25fabd2182c4c74dc3cf89c856c93ff5472thakis@chromium.org instead compiled, and all other compilations in the project get an 1097a402b25fabd2182c4c74dc3cf89c856c93ff5472thakis@chromium.org additional |-include path_to_compiled_header| instead. 1098a402b25fabd2182c4c74dc3cf89c856c93ff5472thakis@chromium.org + Compiled prefix headers have the extension gch. There is one gch file for 1099a402b25fabd2182c4c74dc3cf89c856c93ff5472thakis@chromium.org every language used in the project (c, cc, m, mm), since gch files for 1100a402b25fabd2182c4c74dc3cf89c856c93ff5472thakis@chromium.org different languages aren't compatible. 1101a402b25fabd2182c4c74dc3cf89c856c93ff5472thakis@chromium.org + gch files themselves are built with the target's normal cflags, but they 1102a402b25fabd2182c4c74dc3cf89c856c93ff5472thakis@chromium.org obviously don't get the |-include| flag. Instead, they need a -x flag that 1103a402b25fabd2182c4c74dc3cf89c856c93ff5472thakis@chromium.org describes their language. 1104a402b25fabd2182c4c74dc3cf89c856c93ff5472thakis@chromium.org + All o files in the target need to depend on the gch file, to make sure 1105a402b25fabd2182c4c74dc3cf89c856c93ff5472thakis@chromium.org it's built before any o file is built. 1106a402b25fabd2182c4c74dc3cf89c856c93ff5472thakis@chromium.org 1107a402b25fabd2182c4c74dc3cf89c856c93ff5472thakis@chromium.org This class helps with some of these tasks, but it needs help from the build 1108a402b25fabd2182c4c74dc3cf89c856c93ff5472thakis@chromium.org system for writing dependencies to the gch files, for writing build commands 1109a402b25fabd2182c4c74dc3cf89c856c93ff5472thakis@chromium.org for the gch files, and for figuring out the location of the gch files. 1110a402b25fabd2182c4c74dc3cf89c856c93ff5472thakis@chromium.org """ 1111a402b25fabd2182c4c74dc3cf89c856c93ff5472thakis@chromium.org def __init__(self, xcode_settings, 1112a402b25fabd2182c4c74dc3cf89c856c93ff5472thakis@chromium.org gyp_path_to_build_path, gyp_path_to_build_output): 1113a402b25fabd2182c4c74dc3cf89c856c93ff5472thakis@chromium.org """If xcode_settings is None, all methods on this class are no-ops. 1114a402b25fabd2182c4c74dc3cf89c856c93ff5472thakis@chromium.org 1115a402b25fabd2182c4c74dc3cf89c856c93ff5472thakis@chromium.org Args: 1116a402b25fabd2182c4c74dc3cf89c856c93ff5472thakis@chromium.org gyp_path_to_build_path: A function that takes a gyp-relative path, 1117a402b25fabd2182c4c74dc3cf89c856c93ff5472thakis@chromium.org and returns a path relative to the build directory. 1118a402b25fabd2182c4c74dc3cf89c856c93ff5472thakis@chromium.org gyp_path_to_build_output: A function that takes a gyp-relative path and 1119a402b25fabd2182c4c74dc3cf89c856c93ff5472thakis@chromium.org a language code ('c', 'cc', 'm', or 'mm'), and that returns a path 1120a402b25fabd2182c4c74dc3cf89c856c93ff5472thakis@chromium.org to where the output of precompiling that path for that language 1121a402b25fabd2182c4c74dc3cf89c856c93ff5472thakis@chromium.org should be placed (without the trailing '.gch'). 1122a402b25fabd2182c4c74dc3cf89c856c93ff5472thakis@chromium.org """ 1123a402b25fabd2182c4c74dc3cf89c856c93ff5472thakis@chromium.org # This doesn't support per-configuration prefix headers. Good enough 1124a402b25fabd2182c4c74dc3cf89c856c93ff5472thakis@chromium.org # for now. 1125a402b25fabd2182c4c74dc3cf89c856c93ff5472thakis@chromium.org self.header = None 1126a402b25fabd2182c4c74dc3cf89c856c93ff5472thakis@chromium.org self.compile_headers = False 1127a402b25fabd2182c4c74dc3cf89c856c93ff5472thakis@chromium.org if xcode_settings: 1128a402b25fabd2182c4c74dc3cf89c856c93ff5472thakis@chromium.org self.header = xcode_settings.GetPerTargetSetting('GCC_PREFIX_HEADER') 1129a402b25fabd2182c4c74dc3cf89c856c93ff5472thakis@chromium.org self.compile_headers = xcode_settings.GetPerTargetSetting( 1130a402b25fabd2182c4c74dc3cf89c856c93ff5472thakis@chromium.org 'GCC_PRECOMPILE_PREFIX_HEADER', default='NO') != 'NO' 1131a402b25fabd2182c4c74dc3cf89c856c93ff5472thakis@chromium.org self.compiled_headers = {} 1132a402b25fabd2182c4c74dc3cf89c856c93ff5472thakis@chromium.org if self.header: 1133a402b25fabd2182c4c74dc3cf89c856c93ff5472thakis@chromium.org if self.compile_headers: 1134a402b25fabd2182c4c74dc3cf89c856c93ff5472thakis@chromium.org for lang in ['c', 'cc', 'm', 'mm']: 1135a402b25fabd2182c4c74dc3cf89c856c93ff5472thakis@chromium.org self.compiled_headers[lang] = gyp_path_to_build_output( 1136a402b25fabd2182c4c74dc3cf89c856c93ff5472thakis@chromium.org self.header, lang) 1137a402b25fabd2182c4c74dc3cf89c856c93ff5472thakis@chromium.org self.header = gyp_path_to_build_path(self.header) 1138a402b25fabd2182c4c74dc3cf89c856c93ff5472thakis@chromium.org 11398fcfea42b6d343297e8b6b786d85fa5ad862fc30thakis@chromium.org def _CompiledHeader(self, lang, arch): 11408fcfea42b6d343297e8b6b786d85fa5ad862fc30thakis@chromium.org assert self.compile_headers 11418fcfea42b6d343297e8b6b786d85fa5ad862fc30thakis@chromium.org h = self.compiled_headers[lang] 11428fcfea42b6d343297e8b6b786d85fa5ad862fc30thakis@chromium.org if arch: 11438fcfea42b6d343297e8b6b786d85fa5ad862fc30thakis@chromium.org h += '.' + arch 11448fcfea42b6d343297e8b6b786d85fa5ad862fc30thakis@chromium.org return h 11458fcfea42b6d343297e8b6b786d85fa5ad862fc30thakis@chromium.org 11468fcfea42b6d343297e8b6b786d85fa5ad862fc30thakis@chromium.org def GetInclude(self, lang, arch=None): 1147a402b25fabd2182c4c74dc3cf89c856c93ff5472thakis@chromium.org """Gets the cflags to include the prefix header for language |lang|.""" 1148a402b25fabd2182c4c74dc3cf89c856c93ff5472thakis@chromium.org if self.compile_headers and lang in self.compiled_headers: 11498fcfea42b6d343297e8b6b786d85fa5ad862fc30thakis@chromium.org return '-include %s' % self._CompiledHeader(lang, arch) 1150a402b25fabd2182c4c74dc3cf89c856c93ff5472thakis@chromium.org elif self.header: 1151a402b25fabd2182c4c74dc3cf89c856c93ff5472thakis@chromium.org return '-include %s' % self.header 1152a402b25fabd2182c4c74dc3cf89c856c93ff5472thakis@chromium.org else: 1153a402b25fabd2182c4c74dc3cf89c856c93ff5472thakis@chromium.org return '' 1154a402b25fabd2182c4c74dc3cf89c856c93ff5472thakis@chromium.org 11558fcfea42b6d343297e8b6b786d85fa5ad862fc30thakis@chromium.org def _Gch(self, lang, arch): 1156a402b25fabd2182c4c74dc3cf89c856c93ff5472thakis@chromium.org """Returns the actual file name of the prefix header for language |lang|.""" 1157a402b25fabd2182c4c74dc3cf89c856c93ff5472thakis@chromium.org assert self.compile_headers 11588fcfea42b6d343297e8b6b786d85fa5ad862fc30thakis@chromium.org return self._CompiledHeader(lang, arch) + '.gch' 1159a402b25fabd2182c4c74dc3cf89c856c93ff5472thakis@chromium.org 11608fcfea42b6d343297e8b6b786d85fa5ad862fc30thakis@chromium.org def GetObjDependencies(self, sources, objs, arch=None): 1161a402b25fabd2182c4c74dc3cf89c856c93ff5472thakis@chromium.org """Given a list of source files and the corresponding object files, returns 1162a402b25fabd2182c4c74dc3cf89c856c93ff5472thakis@chromium.org a list of (source, object, gch) tuples, where |gch| is the build-directory 1163a402b25fabd2182c4c74dc3cf89c856c93ff5472thakis@chromium.org relative path to the gch file each object file depends on. |compilable[i]| 1164a402b25fabd2182c4c74dc3cf89c856c93ff5472thakis@chromium.org has to be the source file belonging to |objs[i]|.""" 1165a402b25fabd2182c4c74dc3cf89c856c93ff5472thakis@chromium.org if not self.header or not self.compile_headers: 1166a402b25fabd2182c4c74dc3cf89c856c93ff5472thakis@chromium.org return [] 1167a402b25fabd2182c4c74dc3cf89c856c93ff5472thakis@chromium.org 1168a402b25fabd2182c4c74dc3cf89c856c93ff5472thakis@chromium.org result = [] 1169a402b25fabd2182c4c74dc3cf89c856c93ff5472thakis@chromium.org for source, obj in zip(sources, objs): 1170a402b25fabd2182c4c74dc3cf89c856c93ff5472thakis@chromium.org ext = os.path.splitext(source)[1] 1171a402b25fabd2182c4c74dc3cf89c856c93ff5472thakis@chromium.org lang = { 1172a402b25fabd2182c4c74dc3cf89c856c93ff5472thakis@chromium.org '.c': 'c', 1173a402b25fabd2182c4c74dc3cf89c856c93ff5472thakis@chromium.org '.cpp': 'cc', '.cc': 'cc', '.cxx': 'cc', 1174a402b25fabd2182c4c74dc3cf89c856c93ff5472thakis@chromium.org '.m': 'm', 1175a402b25fabd2182c4c74dc3cf89c856c93ff5472thakis@chromium.org '.mm': 'mm', 1176a402b25fabd2182c4c74dc3cf89c856c93ff5472thakis@chromium.org }.get(ext, None) 1177a402b25fabd2182c4c74dc3cf89c856c93ff5472thakis@chromium.org if lang: 11788fcfea42b6d343297e8b6b786d85fa5ad862fc30thakis@chromium.org result.append((source, obj, self._Gch(lang, arch))) 1179a402b25fabd2182c4c74dc3cf89c856c93ff5472thakis@chromium.org return result 1180a402b25fabd2182c4c74dc3cf89c856c93ff5472thakis@chromium.org 11818fcfea42b6d343297e8b6b786d85fa5ad862fc30thakis@chromium.org def GetPchBuildCommands(self, arch=None): 1182a402b25fabd2182c4c74dc3cf89c856c93ff5472thakis@chromium.org """Returns [(path_to_gch, language_flag, language, header)]. 1183a402b25fabd2182c4c74dc3cf89c856c93ff5472thakis@chromium.org |path_to_gch| and |header| are relative to the build directory. 1184a402b25fabd2182c4c74dc3cf89c856c93ff5472thakis@chromium.org """ 1185a402b25fabd2182c4c74dc3cf89c856c93ff5472thakis@chromium.org if not self.header or not self.compile_headers: 1186a402b25fabd2182c4c74dc3cf89c856c93ff5472thakis@chromium.org return [] 1187a402b25fabd2182c4c74dc3cf89c856c93ff5472thakis@chromium.org return [ 11888fcfea42b6d343297e8b6b786d85fa5ad862fc30thakis@chromium.org (self._Gch('c', arch), '-x c-header', 'c', self.header), 11898fcfea42b6d343297e8b6b786d85fa5ad862fc30thakis@chromium.org (self._Gch('cc', arch), '-x c++-header', 'cc', self.header), 11908fcfea42b6d343297e8b6b786d85fa5ad862fc30thakis@chromium.org (self._Gch('m', arch), '-x objective-c-header', 'm', self.header), 11918fcfea42b6d343297e8b6b786d85fa5ad862fc30thakis@chromium.org (self._Gch('mm', arch), '-x objective-c++-header', 'mm', self.header), 1192a402b25fabd2182c4c74dc3cf89c856c93ff5472thakis@chromium.org ] 1193a402b25fabd2182c4c74dc3cf89c856c93ff5472thakis@chromium.org 1194a402b25fabd2182c4c74dc3cf89c856c93ff5472thakis@chromium.org 119578ac757f4051c5e657040c294390e8ad65de8e58sdefresne@chromium.orgdef XcodeVersion(): 119678ac757f4051c5e657040c294390e8ad65de8e58sdefresne@chromium.org """Returns a tuple of version and build version of installed Xcode.""" 119778ac757f4051c5e657040c294390e8ad65de8e58sdefresne@chromium.org # `xcodebuild -version` output looks like 119878ac757f4051c5e657040c294390e8ad65de8e58sdefresne@chromium.org # Xcode 4.6.3 119978ac757f4051c5e657040c294390e8ad65de8e58sdefresne@chromium.org # Build version 4H1503 120078ac757f4051c5e657040c294390e8ad65de8e58sdefresne@chromium.org # or like 120178ac757f4051c5e657040c294390e8ad65de8e58sdefresne@chromium.org # Xcode 3.2.6 120278ac757f4051c5e657040c294390e8ad65de8e58sdefresne@chromium.org # Component versions: DevToolsCore-1809.0; DevToolsSupport-1806.0 120378ac757f4051c5e657040c294390e8ad65de8e58sdefresne@chromium.org # BuildVersion: 10M2518 120478ac757f4051c5e657040c294390e8ad65de8e58sdefresne@chromium.org # Convert that to '0463', '4H1503'. 1205f7b210db6356614db35a666932c4d213d67988e2sdefresne@chromium.org global XCODE_VERSION_CACHE 1206e51b0ce7b199bb0853d451d70fa8eedfcf3f3583sdefresne@chromium.org if XCODE_VERSION_CACHE: 1207f7b210db6356614db35a666932c4d213d67988e2sdefresne@chromium.org return XCODE_VERSION_CACHE 120878ac757f4051c5e657040c294390e8ad65de8e58sdefresne@chromium.org try: 120978ac757f4051c5e657040c294390e8ad65de8e58sdefresne@chromium.org version_list = GetStdout(['xcodebuild', '-version']).splitlines() 121078ac757f4051c5e657040c294390e8ad65de8e58sdefresne@chromium.org # In some circumstances xcodebuild exits 0 but doesn't return 121178ac757f4051c5e657040c294390e8ad65de8e58sdefresne@chromium.org # the right results; for example, a user on 10.7 or 10.8 with 121278ac757f4051c5e657040c294390e8ad65de8e58sdefresne@chromium.org # a bogus path set via xcode-select 121378ac757f4051c5e657040c294390e8ad65de8e58sdefresne@chromium.org # In that case this may be a CLT-only install so fall back to 121478ac757f4051c5e657040c294390e8ad65de8e58sdefresne@chromium.org # checking that version. 121578ac757f4051c5e657040c294390e8ad65de8e58sdefresne@chromium.org if len(version_list) < 2: 121678ac757f4051c5e657040c294390e8ad65de8e58sdefresne@chromium.org raise GypError, "xcodebuild returned unexpected results" 121778ac757f4051c5e657040c294390e8ad65de8e58sdefresne@chromium.org except: 121878ac757f4051c5e657040c294390e8ad65de8e58sdefresne@chromium.org version = CLTVersion() 121978ac757f4051c5e657040c294390e8ad65de8e58sdefresne@chromium.org if version: 122078ac757f4051c5e657040c294390e8ad65de8e58sdefresne@chromium.org version = re.match('(\d\.\d\.?\d*)', version).groups()[0] 122178ac757f4051c5e657040c294390e8ad65de8e58sdefresne@chromium.org else: 122278ac757f4051c5e657040c294390e8ad65de8e58sdefresne@chromium.org raise GypError, "No Xcode or CLT version detected!" 122378ac757f4051c5e657040c294390e8ad65de8e58sdefresne@chromium.org # The CLT has no build information, so we return an empty string. 122478ac757f4051c5e657040c294390e8ad65de8e58sdefresne@chromium.org version_list = [version, ''] 122578ac757f4051c5e657040c294390e8ad65de8e58sdefresne@chromium.org version = version_list[0] 122678ac757f4051c5e657040c294390e8ad65de8e58sdefresne@chromium.org build = version_list[-1] 122778ac757f4051c5e657040c294390e8ad65de8e58sdefresne@chromium.org # Be careful to convert "4.2" to "0420": 122878ac757f4051c5e657040c294390e8ad65de8e58sdefresne@chromium.org version = version.split()[-1].replace('.', '') 122978ac757f4051c5e657040c294390e8ad65de8e58sdefresne@chromium.org version = (version + '0' * (3 - len(version))).zfill(4) 123078ac757f4051c5e657040c294390e8ad65de8e58sdefresne@chromium.org if build: 123178ac757f4051c5e657040c294390e8ad65de8e58sdefresne@chromium.org build = build.split()[-1] 1232f7b210db6356614db35a666932c4d213d67988e2sdefresne@chromium.org XCODE_VERSION_CACHE = (version, build) 1233f7b210db6356614db35a666932c4d213d67988e2sdefresne@chromium.org return XCODE_VERSION_CACHE 123478ac757f4051c5e657040c294390e8ad65de8e58sdefresne@chromium.org 123578ac757f4051c5e657040c294390e8ad65de8e58sdefresne@chromium.org 123678ac757f4051c5e657040c294390e8ad65de8e58sdefresne@chromium.org# This function ported from the logic in Homebrew's CLT version check 123778ac757f4051c5e657040c294390e8ad65de8e58sdefresne@chromium.orgdef CLTVersion(): 123878ac757f4051c5e657040c294390e8ad65de8e58sdefresne@chromium.org """Returns the version of command-line tools from pkgutil.""" 123978ac757f4051c5e657040c294390e8ad65de8e58sdefresne@chromium.org # pkgutil output looks like 124078ac757f4051c5e657040c294390e8ad65de8e58sdefresne@chromium.org # package-id: com.apple.pkg.CLTools_Executables 124178ac757f4051c5e657040c294390e8ad65de8e58sdefresne@chromium.org # version: 5.0.1.0.1.1382131676 124278ac757f4051c5e657040c294390e8ad65de8e58sdefresne@chromium.org # volume: / 124378ac757f4051c5e657040c294390e8ad65de8e58sdefresne@chromium.org # location: / 124478ac757f4051c5e657040c294390e8ad65de8e58sdefresne@chromium.org # install-time: 1382544035 124578ac757f4051c5e657040c294390e8ad65de8e58sdefresne@chromium.org # groups: com.apple.FindSystemFiles.pkg-group com.apple.DevToolsBoth.pkg-group com.apple.DevToolsNonRelocatableShared.pkg-group 124678ac757f4051c5e657040c294390e8ad65de8e58sdefresne@chromium.org STANDALONE_PKG_ID = "com.apple.pkg.DeveloperToolsCLILeo" 124778ac757f4051c5e657040c294390e8ad65de8e58sdefresne@chromium.org FROM_XCODE_PKG_ID = "com.apple.pkg.DeveloperToolsCLI" 124878ac757f4051c5e657040c294390e8ad65de8e58sdefresne@chromium.org MAVERICKS_PKG_ID = "com.apple.pkg.CLTools_Executables" 124978ac757f4051c5e657040c294390e8ad65de8e58sdefresne@chromium.org 125078ac757f4051c5e657040c294390e8ad65de8e58sdefresne@chromium.org regex = re.compile('version: (?P<version>.+)') 125178ac757f4051c5e657040c294390e8ad65de8e58sdefresne@chromium.org for key in [MAVERICKS_PKG_ID, STANDALONE_PKG_ID, FROM_XCODE_PKG_ID]: 125278ac757f4051c5e657040c294390e8ad65de8e58sdefresne@chromium.org try: 125378ac757f4051c5e657040c294390e8ad65de8e58sdefresne@chromium.org output = GetStdout(['/usr/sbin/pkgutil', '--pkg-info', key]) 125478ac757f4051c5e657040c294390e8ad65de8e58sdefresne@chromium.org return re.search(regex, output).groupdict()['version'] 125578ac757f4051c5e657040c294390e8ad65de8e58sdefresne@chromium.org except: 125678ac757f4051c5e657040c294390e8ad65de8e58sdefresne@chromium.org continue 125778ac757f4051c5e657040c294390e8ad65de8e58sdefresne@chromium.org 125878ac757f4051c5e657040c294390e8ad65de8e58sdefresne@chromium.org 125978ac757f4051c5e657040c294390e8ad65de8e58sdefresne@chromium.orgdef GetStdout(cmdlist): 126078ac757f4051c5e657040c294390e8ad65de8e58sdefresne@chromium.org """Returns the content of standard output returned by invoking |cmdlist|. 126178ac757f4051c5e657040c294390e8ad65de8e58sdefresne@chromium.org Raises |GypError| if the command return with a non-zero return code.""" 126278ac757f4051c5e657040c294390e8ad65de8e58sdefresne@chromium.org job = subprocess.Popen(cmdlist, stdout=subprocess.PIPE) 126378ac757f4051c5e657040c294390e8ad65de8e58sdefresne@chromium.org out = job.communicate()[0] 126478ac757f4051c5e657040c294390e8ad65de8e58sdefresne@chromium.org if job.returncode != 0: 126578ac757f4051c5e657040c294390e8ad65de8e58sdefresne@chromium.org sys.stderr.write(out + '\n') 126678ac757f4051c5e657040c294390e8ad65de8e58sdefresne@chromium.org raise GypError('Error %d running %s' % (job.returncode, cmdlist[0])) 126778ac757f4051c5e657040c294390e8ad65de8e58sdefresne@chromium.org return out.rstrip('\n') 126878ac757f4051c5e657040c294390e8ad65de8e58sdefresne@chromium.org 126978ac757f4051c5e657040c294390e8ad65de8e58sdefresne@chromium.org 12705a5caa1c101713c4bf0b7ca2d0302e3ee0ccff08thakis@chromium.orgdef MergeGlobalXcodeSettingsToSpec(global_dict, spec): 12715a5caa1c101713c4bf0b7ca2d0302e3ee0ccff08thakis@chromium.org """Merges the global xcode_settings dictionary into each configuration of the 12725a5caa1c101713c4bf0b7ca2d0302e3ee0ccff08thakis@chromium.org target represented by spec. For keys that are both in the global and the local 12735a5caa1c101713c4bf0b7ca2d0302e3ee0ccff08thakis@chromium.org xcode_settings dict, the local key gets precendence. 12745a5caa1c101713c4bf0b7ca2d0302e3ee0ccff08thakis@chromium.org """ 12755a5caa1c101713c4bf0b7ca2d0302e3ee0ccff08thakis@chromium.org # The xcode generator special-cases global xcode_settings and does something 12765a5caa1c101713c4bf0b7ca2d0302e3ee0ccff08thakis@chromium.org # that amounts to merging in the global xcode_settings into each local 12775a5caa1c101713c4bf0b7ca2d0302e3ee0ccff08thakis@chromium.org # xcode_settings dict. 12785a5caa1c101713c4bf0b7ca2d0302e3ee0ccff08thakis@chromium.org global_xcode_settings = global_dict.get('xcode_settings', {}) 12795a5caa1c101713c4bf0b7ca2d0302e3ee0ccff08thakis@chromium.org for config in spec['configurations'].values(): 12805a5caa1c101713c4bf0b7ca2d0302e3ee0ccff08thakis@chromium.org if 'xcode_settings' in config: 12815a5caa1c101713c4bf0b7ca2d0302e3ee0ccff08thakis@chromium.org new_settings = global_xcode_settings.copy() 12825a5caa1c101713c4bf0b7ca2d0302e3ee0ccff08thakis@chromium.org new_settings.update(config['xcode_settings']) 12835a5caa1c101713c4bf0b7ca2d0302e3ee0ccff08thakis@chromium.org config['xcode_settings'] = new_settings 1284defcefd76cbddf093d849932c8e22f303335900dthakis@chromium.org 1285defcefd76cbddf093d849932c8e22f303335900dthakis@chromium.org 1286defcefd76cbddf093d849932c8e22f303335900dthakis@chromium.orgdef IsMacBundle(flavor, spec): 1287defcefd76cbddf093d849932c8e22f303335900dthakis@chromium.org """Returns if |spec| should be treated as a bundle. 1288defcefd76cbddf093d849932c8e22f303335900dthakis@chromium.org 1289defcefd76cbddf093d849932c8e22f303335900dthakis@chromium.org Bundles are directories with a certain subdirectory structure, instead of 1290defcefd76cbddf093d849932c8e22f303335900dthakis@chromium.org just a single file. Bundle rules do not produce a binary but also package 1291defcefd76cbddf093d849932c8e22f303335900dthakis@chromium.org resources into that directory.""" 1292defcefd76cbddf093d849932c8e22f303335900dthakis@chromium.org is_mac_bundle = (int(spec.get('mac_bundle', 0)) != 0 and flavor == 'mac') 1293defcefd76cbddf093d849932c8e22f303335900dthakis@chromium.org if is_mac_bundle: 1294defcefd76cbddf093d849932c8e22f303335900dthakis@chromium.org assert spec['type'] != 'none', ( 1295defcefd76cbddf093d849932c8e22f303335900dthakis@chromium.org 'mac_bundle targets cannot have type none (target "%s")' % 1296defcefd76cbddf093d849932c8e22f303335900dthakis@chromium.org spec['target_name']) 1297defcefd76cbddf093d849932c8e22f303335900dthakis@chromium.org return is_mac_bundle 1298defcefd76cbddf093d849932c8e22f303335900dthakis@chromium.org 1299defcefd76cbddf093d849932c8e22f303335900dthakis@chromium.org 1300defcefd76cbddf093d849932c8e22f303335900dthakis@chromium.orgdef GetMacBundleResources(product_dir, xcode_settings, resources): 1301defcefd76cbddf093d849932c8e22f303335900dthakis@chromium.org """Yields (output, resource) pairs for every resource in |resources|. 1302defcefd76cbddf093d849932c8e22f303335900dthakis@chromium.org Only call this for mac bundle targets. 1303defcefd76cbddf093d849932c8e22f303335900dthakis@chromium.org 1304defcefd76cbddf093d849932c8e22f303335900dthakis@chromium.org Args: 1305defcefd76cbddf093d849932c8e22f303335900dthakis@chromium.org product_dir: Path to the directory containing the output bundle, 1306defcefd76cbddf093d849932c8e22f303335900dthakis@chromium.org relative to the build directory. 1307defcefd76cbddf093d849932c8e22f303335900dthakis@chromium.org xcode_settings: The XcodeSettings of the current target. 1308defcefd76cbddf093d849932c8e22f303335900dthakis@chromium.org resources: A list of bundle resources, relative to the build directory. 1309defcefd76cbddf093d849932c8e22f303335900dthakis@chromium.org """ 1310defcefd76cbddf093d849932c8e22f303335900dthakis@chromium.org dest = os.path.join(product_dir, 1311defcefd76cbddf093d849932c8e22f303335900dthakis@chromium.org xcode_settings.GetBundleResourceFolder()) 1312defcefd76cbddf093d849932c8e22f303335900dthakis@chromium.org for res in resources: 1313defcefd76cbddf093d849932c8e22f303335900dthakis@chromium.org output = dest 1314defcefd76cbddf093d849932c8e22f303335900dthakis@chromium.org 1315defcefd76cbddf093d849932c8e22f303335900dthakis@chromium.org # The make generator doesn't support it, so forbid it everywhere 1316defcefd76cbddf093d849932c8e22f303335900dthakis@chromium.org # to keep the generators more interchangable. 1317defcefd76cbddf093d849932c8e22f303335900dthakis@chromium.org assert ' ' not in res, ( 1318defcefd76cbddf093d849932c8e22f303335900dthakis@chromium.org "Spaces in resource filenames not supported (%s)" % res) 1319defcefd76cbddf093d849932c8e22f303335900dthakis@chromium.org 1320defcefd76cbddf093d849932c8e22f303335900dthakis@chromium.org # Split into (path,file). 1321defcefd76cbddf093d849932c8e22f303335900dthakis@chromium.org res_parts = os.path.split(res) 1322defcefd76cbddf093d849932c8e22f303335900dthakis@chromium.org 1323defcefd76cbddf093d849932c8e22f303335900dthakis@chromium.org # Now split the path into (prefix,maybe.lproj). 1324defcefd76cbddf093d849932c8e22f303335900dthakis@chromium.org lproj_parts = os.path.split(res_parts[0]) 1325defcefd76cbddf093d849932c8e22f303335900dthakis@chromium.org # If the resource lives in a .lproj bundle, add that to the destination. 1326defcefd76cbddf093d849932c8e22f303335900dthakis@chromium.org if lproj_parts[1].endswith('.lproj'): 1327defcefd76cbddf093d849932c8e22f303335900dthakis@chromium.org output = os.path.join(output, lproj_parts[1]) 1328defcefd76cbddf093d849932c8e22f303335900dthakis@chromium.org 1329defcefd76cbddf093d849932c8e22f303335900dthakis@chromium.org output = os.path.join(output, res_parts[1]) 1330defcefd76cbddf093d849932c8e22f303335900dthakis@chromium.org # Compiled XIB files are referred to by .nib. 1331defcefd76cbddf093d849932c8e22f303335900dthakis@chromium.org if output.endswith('.xib'): 1332a8b743aed59832935bd510e6878d8a39d08c4c97justincohen@chromium.org output = os.path.splitext(output)[0] + '.nib' 1333a8b743aed59832935bd510e6878d8a39d08c4c97justincohen@chromium.org # Compiled storyboard files are referred to by .storyboardc. 1334a8b743aed59832935bd510e6878d8a39d08c4c97justincohen@chromium.org if output.endswith('.storyboard'): 1335a8b743aed59832935bd510e6878d8a39d08c4c97justincohen@chromium.org output = os.path.splitext(output)[0] + '.storyboardc' 1336defcefd76cbddf093d849932c8e22f303335900dthakis@chromium.org 1337defcefd76cbddf093d849932c8e22f303335900dthakis@chromium.org yield output, res 13384143358985fabc41e9220e0ca415a1e9d858fa92thakis@chromium.org 13394143358985fabc41e9220e0ca415a1e9d858fa92thakis@chromium.org 13404143358985fabc41e9220e0ca415a1e9d858fa92thakis@chromium.orgdef GetMacInfoPlist(product_dir, xcode_settings, gyp_path_to_build_path): 13414143358985fabc41e9220e0ca415a1e9d858fa92thakis@chromium.org """Returns (info_plist, dest_plist, defines, extra_env), where: 134223e7e64acc5aed4e50358244687bc48257ada9bdthakis@chromium.org * |info_plist| is the source plist path, relative to the 13434143358985fabc41e9220e0ca415a1e9d858fa92thakis@chromium.org build directory, 13444143358985fabc41e9220e0ca415a1e9d858fa92thakis@chromium.org * |dest_plist| is the destination plist path, relative to the 13454143358985fabc41e9220e0ca415a1e9d858fa92thakis@chromium.org build directory, 13464143358985fabc41e9220e0ca415a1e9d858fa92thakis@chromium.org * |defines| is a list of preprocessor defines (empty if the plist 13474143358985fabc41e9220e0ca415a1e9d858fa92thakis@chromium.org shouldn't be preprocessed, 13484143358985fabc41e9220e0ca415a1e9d858fa92thakis@chromium.org * |extra_env| is a dict of env variables that should be exported when 13494143358985fabc41e9220e0ca415a1e9d858fa92thakis@chromium.org invoking |mac_tool copy-info-plist|. 13504143358985fabc41e9220e0ca415a1e9d858fa92thakis@chromium.org 13514143358985fabc41e9220e0ca415a1e9d858fa92thakis@chromium.org Only call this for mac bundle targets. 13524143358985fabc41e9220e0ca415a1e9d858fa92thakis@chromium.org 13534143358985fabc41e9220e0ca415a1e9d858fa92thakis@chromium.org Args: 13544143358985fabc41e9220e0ca415a1e9d858fa92thakis@chromium.org product_dir: Path to the directory containing the output bundle, 13554143358985fabc41e9220e0ca415a1e9d858fa92thakis@chromium.org relative to the build directory. 13564143358985fabc41e9220e0ca415a1e9d858fa92thakis@chromium.org xcode_settings: The XcodeSettings of the current target. 13574143358985fabc41e9220e0ca415a1e9d858fa92thakis@chromium.org gyp_to_build_path: A function that converts paths relative to the 13584143358985fabc41e9220e0ca415a1e9d858fa92thakis@chromium.org current gyp file to paths relative to the build direcotry. 13594143358985fabc41e9220e0ca415a1e9d858fa92thakis@chromium.org """ 13604143358985fabc41e9220e0ca415a1e9d858fa92thakis@chromium.org info_plist = xcode_settings.GetPerTargetSetting('INFOPLIST_FILE') 13614143358985fabc41e9220e0ca415a1e9d858fa92thakis@chromium.org if not info_plist: 13624143358985fabc41e9220e0ca415a1e9d858fa92thakis@chromium.org return None, None, [], {} 13634143358985fabc41e9220e0ca415a1e9d858fa92thakis@chromium.org 13644143358985fabc41e9220e0ca415a1e9d858fa92thakis@chromium.org # The make generator doesn't support it, so forbid it everywhere 13654143358985fabc41e9220e0ca415a1e9d858fa92thakis@chromium.org # to keep the generators more interchangable. 13664143358985fabc41e9220e0ca415a1e9d858fa92thakis@chromium.org assert ' ' not in info_plist, ( 13674143358985fabc41e9220e0ca415a1e9d858fa92thakis@chromium.org "Spaces in Info.plist filenames not supported (%s)" % info_plist) 13684143358985fabc41e9220e0ca415a1e9d858fa92thakis@chromium.org 13694143358985fabc41e9220e0ca415a1e9d858fa92thakis@chromium.org info_plist = gyp_path_to_build_path(info_plist) 13704143358985fabc41e9220e0ca415a1e9d858fa92thakis@chromium.org 13714143358985fabc41e9220e0ca415a1e9d858fa92thakis@chromium.org # If explicitly set to preprocess the plist, invoke the C preprocessor and 13724143358985fabc41e9220e0ca415a1e9d858fa92thakis@chromium.org # specify any defines as -D flags. 13734143358985fabc41e9220e0ca415a1e9d858fa92thakis@chromium.org if xcode_settings.GetPerTargetSetting( 13744143358985fabc41e9220e0ca415a1e9d858fa92thakis@chromium.org 'INFOPLIST_PREPROCESS', default='NO') == 'YES': 13754143358985fabc41e9220e0ca415a1e9d858fa92thakis@chromium.org # Create an intermediate file based on the path. 13764143358985fabc41e9220e0ca415a1e9d858fa92thakis@chromium.org defines = shlex.split(xcode_settings.GetPerTargetSetting( 13774143358985fabc41e9220e0ca415a1e9d858fa92thakis@chromium.org 'INFOPLIST_PREPROCESSOR_DEFINITIONS', default='')) 13784143358985fabc41e9220e0ca415a1e9d858fa92thakis@chromium.org else: 13794143358985fabc41e9220e0ca415a1e9d858fa92thakis@chromium.org defines = [] 13804143358985fabc41e9220e0ca415a1e9d858fa92thakis@chromium.org 13814143358985fabc41e9220e0ca415a1e9d858fa92thakis@chromium.org dest_plist = os.path.join(product_dir, xcode_settings.GetBundlePlistPath()) 13824143358985fabc41e9220e0ca415a1e9d858fa92thakis@chromium.org extra_env = xcode_settings.GetPerTargetSettings() 13834143358985fabc41e9220e0ca415a1e9d858fa92thakis@chromium.org 13844143358985fabc41e9220e0ca415a1e9d858fa92thakis@chromium.org return info_plist, dest_plist, defines, extra_env 138526afc55b55209b530f56b79693c52be4e8ff1ecdthakis@chromium.org 138626afc55b55209b530f56b79693c52be4e8ff1ecdthakis@chromium.org 1387477539a34ba23693c5d7ca49d212d9e99e058c02thakis@chromium.orgdef _GetXcodeEnv(xcode_settings, built_products_dir, srcroot, configuration, 138890e4b5779ce263e7101e342ec64cb234db1b3ed7thakis@chromium.org additional_settings=None): 138926afc55b55209b530f56b79693c52be4e8ff1ecdthakis@chromium.org """Return the environment variables that Xcode would set. See 139026afc55b55209b530f56b79693c52be4e8ff1ecdthakis@chromium.org http://developer.apple.com/library/mac/#documentation/DeveloperTools/Reference/XcodeBuildSettingRef/1-Build_Setting_Reference/build_setting_ref.html#//apple_ref/doc/uid/TP40003931-CH3-SW153 139126afc55b55209b530f56b79693c52be4e8ff1ecdthakis@chromium.org for a full list. 139226afc55b55209b530f56b79693c52be4e8ff1ecdthakis@chromium.org 139326afc55b55209b530f56b79693c52be4e8ff1ecdthakis@chromium.org Args: 139426afc55b55209b530f56b79693c52be4e8ff1ecdthakis@chromium.org xcode_settings: An XcodeSettings object. If this is None, this function 139526afc55b55209b530f56b79693c52be4e8ff1ecdthakis@chromium.org returns an empty dict. 139626afc55b55209b530f56b79693c52be4e8ff1ecdthakis@chromium.org built_products_dir: Absolute path to the built products dir. 139726afc55b55209b530f56b79693c52be4e8ff1ecdthakis@chromium.org srcroot: Absolute path to the source root. 1398b69d8712f968628199d5cf927657661b11d05e8bthakis@chromium.org configuration: The build configuration name. 139990e4b5779ce263e7101e342ec64cb234db1b3ed7thakis@chromium.org additional_settings: An optional dict with more values to add to the 140090e4b5779ce263e7101e342ec64cb234db1b3ed7thakis@chromium.org result. 140126afc55b55209b530f56b79693c52be4e8ff1ecdthakis@chromium.org """ 140226afc55b55209b530f56b79693c52be4e8ff1ecdthakis@chromium.org if not xcode_settings: return {} 140326afc55b55209b530f56b79693c52be4e8ff1ecdthakis@chromium.org 140426afc55b55209b530f56b79693c52be4e8ff1ecdthakis@chromium.org # This function is considered a friend of XcodeSettings, so let it reach into 140526afc55b55209b530f56b79693c52be4e8ff1ecdthakis@chromium.org # its implementation details. 140626afc55b55209b530f56b79693c52be4e8ff1ecdthakis@chromium.org spec = xcode_settings.spec 140726afc55b55209b530f56b79693c52be4e8ff1ecdthakis@chromium.org 140826afc55b55209b530f56b79693c52be4e8ff1ecdthakis@chromium.org # These are filled in on a as-needed basis. 140926afc55b55209b530f56b79693c52be4e8ff1ecdthakis@chromium.org env = { 141026afc55b55209b530f56b79693c52be4e8ff1ecdthakis@chromium.org 'BUILT_PRODUCTS_DIR' : built_products_dir, 1411b69d8712f968628199d5cf927657661b11d05e8bthakis@chromium.org 'CONFIGURATION' : configuration, 141226afc55b55209b530f56b79693c52be4e8ff1ecdthakis@chromium.org 'PRODUCT_NAME' : xcode_settings.GetProductName(), 141326afc55b55209b530f56b79693c52be4e8ff1ecdthakis@chromium.org # See /Developer/Platforms/MacOSX.platform/Developer/Library/Xcode/Specifications/MacOSX\ Product\ Types.xcspec for FULL_PRODUCT_NAME 141426afc55b55209b530f56b79693c52be4e8ff1ecdthakis@chromium.org 'SRCROOT' : srcroot, 1415b69d8712f968628199d5cf927657661b11d05e8bthakis@chromium.org 'SOURCE_ROOT': '${SRCROOT}', 141626afc55b55209b530f56b79693c52be4e8ff1ecdthakis@chromium.org # This is not true for static libraries, but currently the env is only 141726afc55b55209b530f56b79693c52be4e8ff1ecdthakis@chromium.org # written for bundles: 141826afc55b55209b530f56b79693c52be4e8ff1ecdthakis@chromium.org 'TARGET_BUILD_DIR' : built_products_dir, 1419b69d8712f968628199d5cf927657661b11d05e8bthakis@chromium.org 'TEMP_DIR' : '${TMPDIR}', 142026afc55b55209b530f56b79693c52be4e8ff1ecdthakis@chromium.org } 14218e62cceb8070a4458fe58648753e1b2cc588f229justincohen@chromium.org if xcode_settings.GetPerConfigSetting('SDKROOT', configuration): 14228e62cceb8070a4458fe58648753e1b2cc588f229justincohen@chromium.org env['SDKROOT'] = xcode_settings._SdkPath(configuration) 14230b7ad3866a1cc7fbed2e9c88629526bb9c0ccc2fthakis@chromium.org else: 14240b7ad3866a1cc7fbed2e9c88629526bb9c0ccc2fthakis@chromium.org env['SDKROOT'] = '' 14250b7ad3866a1cc7fbed2e9c88629526bb9c0ccc2fthakis@chromium.org 142626afc55b55209b530f56b79693c52be4e8ff1ecdthakis@chromium.org if spec['type'] in ( 142726afc55b55209b530f56b79693c52be4e8ff1ecdthakis@chromium.org 'executable', 'static_library', 'shared_library', 'loadable_module'): 142826afc55b55209b530f56b79693c52be4e8ff1ecdthakis@chromium.org env['EXECUTABLE_NAME'] = xcode_settings.GetExecutableName() 142926afc55b55209b530f56b79693c52be4e8ff1ecdthakis@chromium.org env['EXECUTABLE_PATH'] = xcode_settings.GetExecutablePath() 143026afc55b55209b530f56b79693c52be4e8ff1ecdthakis@chromium.org env['FULL_PRODUCT_NAME'] = xcode_settings.GetFullProductName() 143126afc55b55209b530f56b79693c52be4e8ff1ecdthakis@chromium.org mach_o_type = xcode_settings.GetMachOType() 143226afc55b55209b530f56b79693c52be4e8ff1ecdthakis@chromium.org if mach_o_type: 143326afc55b55209b530f56b79693c52be4e8ff1ecdthakis@chromium.org env['MACH_O_TYPE'] = mach_o_type 143426afc55b55209b530f56b79693c52be4e8ff1ecdthakis@chromium.org env['PRODUCT_TYPE'] = xcode_settings.GetProductType() 143526afc55b55209b530f56b79693c52be4e8ff1ecdthakis@chromium.org if xcode_settings._IsBundle(): 143626afc55b55209b530f56b79693c52be4e8ff1ecdthakis@chromium.org env['CONTENTS_FOLDER_PATH'] = \ 143726afc55b55209b530f56b79693c52be4e8ff1ecdthakis@chromium.org xcode_settings.GetBundleContentsFolderPath() 143826afc55b55209b530f56b79693c52be4e8ff1ecdthakis@chromium.org env['UNLOCALIZED_RESOURCES_FOLDER_PATH'] = \ 143926afc55b55209b530f56b79693c52be4e8ff1ecdthakis@chromium.org xcode_settings.GetBundleResourceFolder() 144026afc55b55209b530f56b79693c52be4e8ff1ecdthakis@chromium.org env['INFOPLIST_PATH'] = xcode_settings.GetBundlePlistPath() 144126afc55b55209b530f56b79693c52be4e8ff1ecdthakis@chromium.org env['WRAPPER_NAME'] = xcode_settings.GetWrapperName() 144290e4b5779ce263e7101e342ec64cb234db1b3ed7thakis@chromium.org 1443dea566fe51cb78913373c853b796251f50460125thakis@chromium.org install_name = xcode_settings.GetInstallName() 1444dea566fe51cb78913373c853b796251f50460125thakis@chromium.org if install_name: 1445dea566fe51cb78913373c853b796251f50460125thakis@chromium.org env['LD_DYLIB_INSTALL_NAME'] = install_name 1446dea566fe51cb78913373c853b796251f50460125thakis@chromium.org install_name_base = xcode_settings.GetInstallNameBase() 1447dea566fe51cb78913373c853b796251f50460125thakis@chromium.org if install_name_base: 1448dea566fe51cb78913373c853b796251f50460125thakis@chromium.org env['DYLIB_INSTALL_NAME_BASE'] = install_name_base 14498bdc26b00f12dc11ade0be8cff81fa5ff0ec2bd3sdefresne@chromium.org if XcodeVersion() >= '0500' and not env.get('SDKROOT'): 14508bdc26b00f12dc11ade0be8cff81fa5ff0ec2bd3sdefresne@chromium.org sdk_root = xcode_settings._SdkRoot(configuration) 14518bdc26b00f12dc11ade0be8cff81fa5ff0ec2bd3sdefresne@chromium.org if not sdk_root: 14528bdc26b00f12dc11ade0be8cff81fa5ff0ec2bd3sdefresne@chromium.org sdk_root = xcode_settings._XcodeSdkPath('') 14538bdc26b00f12dc11ade0be8cff81fa5ff0ec2bd3sdefresne@chromium.org env['SDKROOT'] = sdk_root 1454dea566fe51cb78913373c853b796251f50460125thakis@chromium.org 145590e4b5779ce263e7101e342ec64cb234db1b3ed7thakis@chromium.org if not additional_settings: 145690e4b5779ce263e7101e342ec64cb234db1b3ed7thakis@chromium.org additional_settings = {} 145790e4b5779ce263e7101e342ec64cb234db1b3ed7thakis@chromium.org else: 145890e4b5779ce263e7101e342ec64cb234db1b3ed7thakis@chromium.org # Flatten lists to strings. 145990e4b5779ce263e7101e342ec64cb234db1b3ed7thakis@chromium.org for k in additional_settings: 146090e4b5779ce263e7101e342ec64cb234db1b3ed7thakis@chromium.org if not isinstance(additional_settings[k], str): 146190e4b5779ce263e7101e342ec64cb234db1b3ed7thakis@chromium.org additional_settings[k] = ' '.join(additional_settings[k]) 146290e4b5779ce263e7101e342ec64cb234db1b3ed7thakis@chromium.org additional_settings.update(env) 1463b69d8712f968628199d5cf927657661b11d05e8bthakis@chromium.org 1464b69d8712f968628199d5cf927657661b11d05e8bthakis@chromium.org for k in additional_settings: 1465b69d8712f968628199d5cf927657661b11d05e8bthakis@chromium.org additional_settings[k] = _NormalizeEnvVarReferences(additional_settings[k]) 1466b69d8712f968628199d5cf927657661b11d05e8bthakis@chromium.org 146790e4b5779ce263e7101e342ec64cb234db1b3ed7thakis@chromium.org return additional_settings 14683fc6c8d718be1df48005da2802759adbaf82b2e4thakis@chromium.org 14693fc6c8d718be1df48005da2802759adbaf82b2e4thakis@chromium.org 1470b69d8712f968628199d5cf927657661b11d05e8bthakis@chromium.orgdef _NormalizeEnvVarReferences(str): 1471b69d8712f968628199d5cf927657661b11d05e8bthakis@chromium.org """Takes a string containing variable references in the form ${FOO}, $(FOO), 1472b69d8712f968628199d5cf927657661b11d05e8bthakis@chromium.org or $FOO, and returns a string with all variable references in the form ${FOO}. 1473b69d8712f968628199d5cf927657661b11d05e8bthakis@chromium.org """ 1474b69d8712f968628199d5cf927657661b11d05e8bthakis@chromium.org # $FOO -> ${FOO} 1475b69d8712f968628199d5cf927657661b11d05e8bthakis@chromium.org str = re.sub(r'\$([a-zA-Z_][a-zA-Z0-9_]*)', r'${\1}', str) 1476b69d8712f968628199d5cf927657661b11d05e8bthakis@chromium.org 1477b69d8712f968628199d5cf927657661b11d05e8bthakis@chromium.org # $(FOO) -> ${FOO} 1478b69d8712f968628199d5cf927657661b11d05e8bthakis@chromium.org matches = re.findall(r'(\$\(([a-zA-Z0-9\-_]+)\))', str) 1479b69d8712f968628199d5cf927657661b11d05e8bthakis@chromium.org for match in matches: 1480b69d8712f968628199d5cf927657661b11d05e8bthakis@chromium.org to_replace, variable = match 1481b69d8712f968628199d5cf927657661b11d05e8bthakis@chromium.org assert '$(' not in match, '$($(FOO)) variables not supported: ' + match 1482b69d8712f968628199d5cf927657661b11d05e8bthakis@chromium.org str = str.replace(to_replace, '${' + variable + '}') 1483b69d8712f968628199d5cf927657661b11d05e8bthakis@chromium.org 1484b69d8712f968628199d5cf927657661b11d05e8bthakis@chromium.org return str 1485b69d8712f968628199d5cf927657661b11d05e8bthakis@chromium.org 1486b69d8712f968628199d5cf927657661b11d05e8bthakis@chromium.org 1487b69d8712f968628199d5cf927657661b11d05e8bthakis@chromium.orgdef ExpandEnvVars(string, expansions): 1488b69d8712f968628199d5cf927657661b11d05e8bthakis@chromium.org """Expands ${VARIABLES}, $(VARIABLES), and $VARIABLES in string per the 1489477539a34ba23693c5d7ca49d212d9e99e058c02thakis@chromium.org expansions list. If the variable expands to something that references 1490b69d8712f968628199d5cf927657661b11d05e8bthakis@chromium.org another variable, this variable is expanded as well if it's in env -- 1491b69d8712f968628199d5cf927657661b11d05e8bthakis@chromium.org until no variables present in env are left.""" 1492477539a34ba23693c5d7ca49d212d9e99e058c02thakis@chromium.org for k, v in reversed(expansions): 1493477539a34ba23693c5d7ca49d212d9e99e058c02thakis@chromium.org string = string.replace('${' + k + '}', v) 1494477539a34ba23693c5d7ca49d212d9e99e058c02thakis@chromium.org string = string.replace('$(' + k + ')', v) 1495477539a34ba23693c5d7ca49d212d9e99e058c02thakis@chromium.org string = string.replace('$' + k, v) 1496b69d8712f968628199d5cf927657661b11d05e8bthakis@chromium.org return string 1497b69d8712f968628199d5cf927657661b11d05e8bthakis@chromium.org 1498b69d8712f968628199d5cf927657661b11d05e8bthakis@chromium.org 1499477539a34ba23693c5d7ca49d212d9e99e058c02thakis@chromium.orgdef _TopologicallySortedEnvVarKeys(env): 15003fc6c8d718be1df48005da2802759adbaf82b2e4thakis@chromium.org """Takes a dict |env| whose values are strings that can refer to other keys, 15013fc6c8d718be1df48005da2802759adbaf82b2e4thakis@chromium.org for example env['foo'] = '$(bar) and $(baz)'. Returns a list L of all keys of 15023fc6c8d718be1df48005da2802759adbaf82b2e4thakis@chromium.org env such that key2 is after key1 in L if env[key2] refers to env[key1]. 15033fc6c8d718be1df48005da2802759adbaf82b2e4thakis@chromium.org 15043fc6c8d718be1df48005da2802759adbaf82b2e4thakis@chromium.org Throws an Exception in case of dependency cycles. 15053fc6c8d718be1df48005da2802759adbaf82b2e4thakis@chromium.org """ 15063fc6c8d718be1df48005da2802759adbaf82b2e4thakis@chromium.org # Since environment variables can refer to other variables, the evaluation 15073fc6c8d718be1df48005da2802759adbaf82b2e4thakis@chromium.org # order is important. Below is the logic to compute the dependency graph 15083fc6c8d718be1df48005da2802759adbaf82b2e4thakis@chromium.org # and sort it. 1509b69d8712f968628199d5cf927657661b11d05e8bthakis@chromium.org regex = re.compile(r'\$\{([a-zA-Z0-9\-_]+)\}') 15105c770284c79f04c043b706f14e464d5ccf74569fbradnelson@google.com def GetEdges(node): 15115c770284c79f04c043b706f14e464d5ccf74569fbradnelson@google.com # Use a definition of edges such that user_of_variable -> used_varible. 15125c770284c79f04c043b706f14e464d5ccf74569fbradnelson@google.com # This happens to be easier in this case, since a variable's 15135c770284c79f04c043b706f14e464d5ccf74569fbradnelson@google.com # definition contains all variables it references in a single string. 15145c770284c79f04c043b706f14e464d5ccf74569fbradnelson@google.com # We can then reverse the result of the topological sort at the end. 15155c770284c79f04c043b706f14e464d5ccf74569fbradnelson@google.com # Since: reverse(topsort(DAG)) = topsort(reverse_edges(DAG)) 15165c770284c79f04c043b706f14e464d5ccf74569fbradnelson@google.com matches = set([v for v in regex.findall(env[node]) if v in env]) 15173fc6c8d718be1df48005da2802759adbaf82b2e4thakis@chromium.org for dependee in matches: 1518b69d8712f968628199d5cf927657661b11d05e8bthakis@chromium.org assert '${' not in dependee, 'Nested variables not supported: ' + dependee 15195c770284c79f04c043b706f14e464d5ccf74569fbradnelson@google.com return matches 15205c770284c79f04c043b706f14e464d5ccf74569fbradnelson@google.com 15215c770284c79f04c043b706f14e464d5ccf74569fbradnelson@google.com try: 15225c770284c79f04c043b706f14e464d5ccf74569fbradnelson@google.com # Topologically sort, and then reverse, because we used an edge definition 15235c770284c79f04c043b706f14e464d5ccf74569fbradnelson@google.com # that's inverted from the expected result of this function (see comment 15245c770284c79f04c043b706f14e464d5ccf74569fbradnelson@google.com # above). 15255c770284c79f04c043b706f14e464d5ccf74569fbradnelson@google.com order = gyp.common.TopologicallySorted(env.keys(), GetEdges) 15265c770284c79f04c043b706f14e464d5ccf74569fbradnelson@google.com order.reverse() 15275c770284c79f04c043b706f14e464d5ccf74569fbradnelson@google.com return order 1528477539a34ba23693c5d7ca49d212d9e99e058c02thakis@chromium.org except gyp.common.CycleError, e: 152907729ba52e877ad288263b39bd67743e5a238b10thakis@chromium.org raise GypError( 15305c770284c79f04c043b706f14e464d5ccf74569fbradnelson@google.com 'Xcode environment variables are cyclically dependent: ' + str(e.nodes)) 153160e8244fa9b6f4bef0606ccc46cc5d23904a952athakis@chromium.org 153206018e293265568ac848cd5ac7b5f02867b82696thakis@chromium.org 1533477539a34ba23693c5d7ca49d212d9e99e058c02thakis@chromium.orgdef GetSortedXcodeEnv(xcode_settings, built_products_dir, srcroot, 1534477539a34ba23693c5d7ca49d212d9e99e058c02thakis@chromium.org configuration, additional_settings=None): 1535477539a34ba23693c5d7ca49d212d9e99e058c02thakis@chromium.org env = _GetXcodeEnv(xcode_settings, built_products_dir, srcroot, configuration, 1536477539a34ba23693c5d7ca49d212d9e99e058c02thakis@chromium.org additional_settings) 1537477539a34ba23693c5d7ca49d212d9e99e058c02thakis@chromium.org return [(key, env[key]) for key in _TopologicallySortedEnvVarKeys(env)] 1538477539a34ba23693c5d7ca49d212d9e99e058c02thakis@chromium.org 1539477539a34ba23693c5d7ca49d212d9e99e058c02thakis@chromium.org 154006018e293265568ac848cd5ac7b5f02867b82696thakis@chromium.orgdef GetSpecPostbuildCommands(spec, quiet=False): 154160e8244fa9b6f4bef0606ccc46cc5d23904a952athakis@chromium.org """Returns the list of postbuilds explicitly defined on |spec|, in a form 154260e8244fa9b6f4bef0606ccc46cc5d23904a952athakis@chromium.org executable by a shell.""" 154360e8244fa9b6f4bef0606ccc46cc5d23904a952athakis@chromium.org postbuilds = [] 154406018e293265568ac848cd5ac7b5f02867b82696thakis@chromium.org for postbuild in spec.get('postbuilds', []): 1545786c3e3f0352600183caeb02501d0d9bbb7c1126thakis@chromium.org if not quiet: 1546786c3e3f0352600183caeb02501d0d9bbb7c1126thakis@chromium.org postbuilds.append('echo POSTBUILD\\(%s\\) %s' % ( 1547786c3e3f0352600183caeb02501d0d9bbb7c1126thakis@chromium.org spec['target_name'], postbuild['postbuild_name'])) 15486cde8d2820d498078f4c9b5e20a50318c627da14thakis@chromium.org postbuilds.append(gyp.common.EncodePOSIXShellList(postbuild['action'])) 154960e8244fa9b6f4bef0606ccc46cc5d23904a952athakis@chromium.org return postbuilds 1550cf2844a528ca8114b324f5d7b97b9f0363ec4d25justincohen@chromium.org 1551cf2844a528ca8114b324f5d7b97b9f0363ec4d25justincohen@chromium.org 1552cf2844a528ca8114b324f5d7b97b9f0363ec4d25justincohen@chromium.orgdef _HasIOSTarget(targets): 1553cf2844a528ca8114b324f5d7b97b9f0363ec4d25justincohen@chromium.org """Returns true if any target contains the iOS specific key 1554cf2844a528ca8114b324f5d7b97b9f0363ec4d25justincohen@chromium.org IPHONEOS_DEPLOYMENT_TARGET.""" 1555cf2844a528ca8114b324f5d7b97b9f0363ec4d25justincohen@chromium.org for target_dict in targets.values(): 1556cf2844a528ca8114b324f5d7b97b9f0363ec4d25justincohen@chromium.org for config in target_dict['configurations'].values(): 1557cf2844a528ca8114b324f5d7b97b9f0363ec4d25justincohen@chromium.org if config.get('xcode_settings', {}).get('IPHONEOS_DEPLOYMENT_TARGET'): 1558cf2844a528ca8114b324f5d7b97b9f0363ec4d25justincohen@chromium.org return True 1559cf2844a528ca8114b324f5d7b97b9f0363ec4d25justincohen@chromium.org return False 1560cf2844a528ca8114b324f5d7b97b9f0363ec4d25justincohen@chromium.org 1561cf2844a528ca8114b324f5d7b97b9f0363ec4d25justincohen@chromium.org 1562cf2844a528ca8114b324f5d7b97b9f0363ec4d25justincohen@chromium.orgdef _AddIOSDeviceConfigurations(targets): 1563cf2844a528ca8114b324f5d7b97b9f0363ec4d25justincohen@chromium.org """Clone all targets and append -iphoneos to the name. Configure these targets 156413a951e07e0a4130b276dbebce676597abbc797csdefresne@chromium.org to build for iOS devices and use correct architectures for those builds.""" 156513a951e07e0a4130b276dbebce676597abbc797csdefresne@chromium.org for target_dict in targets.itervalues(): 156613a951e07e0a4130b276dbebce676597abbc797csdefresne@chromium.org toolset = target_dict['toolset'] 156713a951e07e0a4130b276dbebce676597abbc797csdefresne@chromium.org configs = target_dict['configurations'] 156813a951e07e0a4130b276dbebce676597abbc797csdefresne@chromium.org for config_name, config_dict in dict(configs).iteritems(): 156913a951e07e0a4130b276dbebce676597abbc797csdefresne@chromium.org iphoneos_config_dict = copy.deepcopy(config_dict) 157013a951e07e0a4130b276dbebce676597abbc797csdefresne@chromium.org configs[config_name + '-iphoneos'] = iphoneos_config_dict 1571d49e6fec9631d1c51a1fe34ff9ee9dd60fa692b7justincohen@chromium.org configs[config_name + '-iphonesimulator'] = config_dict 157213a951e07e0a4130b276dbebce676597abbc797csdefresne@chromium.org if toolset == 'target': 157313a951e07e0a4130b276dbebce676597abbc797csdefresne@chromium.org iphoneos_config_dict['xcode_settings']['SDKROOT'] = 'iphoneos' 1574cf2844a528ca8114b324f5d7b97b9f0363ec4d25justincohen@chromium.org return targets 1575cf2844a528ca8114b324f5d7b97b9f0363ec4d25justincohen@chromium.org 1576cf2844a528ca8114b324f5d7b97b9f0363ec4d25justincohen@chromium.orgdef CloneConfigurationForDeviceAndEmulator(target_dicts): 1577cf2844a528ca8114b324f5d7b97b9f0363ec4d25justincohen@chromium.org """If |target_dicts| contains any iOS targets, automatically create -iphoneos 1578cf2844a528ca8114b324f5d7b97b9f0363ec4d25justincohen@chromium.org targets for iOS device builds.""" 1579cf2844a528ca8114b324f5d7b97b9f0363ec4d25justincohen@chromium.org if _HasIOSTarget(target_dicts): 1580cf2844a528ca8114b324f5d7b97b9f0363ec4d25justincohen@chromium.org return _AddIOSDeviceConfigurations(target_dicts) 1581cf2844a528ca8114b324f5d7b97b9f0363ec4d25justincohen@chromium.org return target_dicts 1582