| OLD | NEW |
| 1 # Copyright (c) 2012 Google Inc. All rights reserved. | 1 # Copyright (c) 2012 Google Inc. All rights reserved. |
| 2 # Use of this source code is governed by a BSD-style license that can be | 2 # Use of this source code is governed by a BSD-style license that can be |
| 3 # found in the LICENSE file. | 3 # found in the LICENSE file. |
| 4 | 4 |
| 5 """ | 5 """ |
| 6 This module contains classes that help to emulate xcodebuild behavior on top of | 6 This module contains classes that help to emulate xcodebuild behavior on top of |
| 7 other build systems, such as make and ninja. | 7 other build systems, such as make and ninja. |
| 8 """ | 8 """ |
| 9 | 9 |
| 10 import copy | 10 import copy |
| (...skipping 294 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 305 Chromium.app/Contents/Resources. Only valid for bundles.""" | 305 Chromium.app/Contents/Resources. Only valid for bundles.""" |
| 306 assert self._IsBundle() | 306 assert self._IsBundle() |
| 307 if self.isIOS: | 307 if self.isIOS: |
| 308 return self.GetBundleContentsFolderPath() | 308 return self.GetBundleContentsFolderPath() |
| 309 return os.path.join(self.GetBundleContentsFolderPath(), 'Resources') | 309 return os.path.join(self.GetBundleContentsFolderPath(), 'Resources') |
| 310 | 310 |
| 311 def GetBundlePlistPath(self): | 311 def GetBundlePlistPath(self): |
| 312 """Returns the qualified path to the bundle's plist file. E.g. | 312 """Returns the qualified path to the bundle's plist file. E.g. |
| 313 Chromium.app/Contents/Info.plist. Only valid for bundles.""" | 313 Chromium.app/Contents/Info.plist. Only valid for bundles.""" |
| 314 assert self._IsBundle() | 314 assert self._IsBundle() |
| 315 if self.spec['type'] in ('executable', 'loadable_module'): | 315 if self.spec['type'] in ('executable', 'loadable_module') or \ |
| 316 self.IsIosFramework(): |
| 316 return os.path.join(self.GetBundleContentsFolderPath(), 'Info.plist') | 317 return os.path.join(self.GetBundleContentsFolderPath(), 'Info.plist') |
| 317 else: | 318 else: |
| 318 return os.path.join(self.GetBundleContentsFolderPath(), | 319 return os.path.join(self.GetBundleContentsFolderPath(), |
| 319 'Resources', 'Info.plist') | 320 'Resources', 'Info.plist') |
| 320 | 321 |
| 321 def GetProductType(self): | 322 def GetProductType(self): |
| 322 """Returns the PRODUCT_TYPE of this target.""" | 323 """Returns the PRODUCT_TYPE of this target.""" |
| 323 if self._IsIosAppExtension(): | 324 if self._IsIosAppExtension(): |
| 324 assert self._IsBundle(), ('ios_app_extension flag requires mac_bundle ' | 325 assert self._IsBundle(), ('ios_app_extension flag requires mac_bundle ' |
| 325 '(target %s)' % self.spec['target_name']) | 326 '(target %s)' % self.spec['target_name']) |
| (...skipping 675 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1001 | 1002 |
| 1002 def _GetIOSPostbuilds(self, configname, output_binary): | 1003 def _GetIOSPostbuilds(self, configname, output_binary): |
| 1003 """Return a shell command to codesign the iOS output binary so it can | 1004 """Return a shell command to codesign the iOS output binary so it can |
| 1004 be deployed to a device. This should be run as the very last step of the | 1005 be deployed to a device. This should be run as the very last step of the |
| 1005 build.""" | 1006 build.""" |
| 1006 if not (self.isIOS and | 1007 if not (self.isIOS and |
| 1007 (self.spec['type'] == 'executable' or self._IsXCTest()) or | 1008 (self.spec['type'] == 'executable' or self._IsXCTest()) or |
| 1008 self.IsIosFramework()): | 1009 self.IsIosFramework()): |
| 1009 return [] | 1010 return [] |
| 1010 | 1011 |
| 1012 postbuilds = [] |
| 1013 product_name = self.GetFullProductName() |
| 1011 settings = self.xcode_settings[configname] | 1014 settings = self.xcode_settings[configname] |
| 1015 |
| 1016 # Xcode expects XCTests to be copied into the TEST_HOST dir. |
| 1017 if self._IsXCTest(): |
| 1018 source = os.path.join("${BUILT_PRODUCTS_DIR}", product_name) |
| 1019 test_host = os.path.dirname(settings.get('TEST_HOST')); |
| 1020 xctest_destination = os.path.join(test_host, 'PlugIns', product_name) |
| 1021 postbuilds.extend(['ditto %s %s' % (source, xctest_destination)]) |
| 1022 |
| 1012 key = self._GetIOSCodeSignIdentityKey(settings) | 1023 key = self._GetIOSCodeSignIdentityKey(settings) |
| 1013 if not key: | 1024 if not key: |
| 1014 return [] | 1025 return postbuilds |
| 1015 | 1026 |
| 1016 # Warn for any unimplemented signing xcode keys. | 1027 # Warn for any unimplemented signing xcode keys. |
| 1017 unimpl = ['OTHER_CODE_SIGN_FLAGS'] | 1028 unimpl = ['OTHER_CODE_SIGN_FLAGS'] |
| 1018 unimpl = set(unimpl) & set(self.xcode_settings[configname].keys()) | 1029 unimpl = set(unimpl) & set(self.xcode_settings[configname].keys()) |
| 1019 if unimpl: | 1030 if unimpl: |
| 1020 print 'Warning: Some codesign keys not implemented, ignoring: %s' % ( | 1031 print 'Warning: Some codesign keys not implemented, ignoring: %s' % ( |
| 1021 ', '.join(sorted(unimpl))) | 1032 ', '.join(sorted(unimpl))) |
| 1022 | 1033 |
| 1023 return ['%s code-sign-bundle "%s" "%s" "%s"' % ( | 1034 if self._IsXCTest(): |
| 1035 # For device xctests, Xcode copies two extra frameworks into $TEST_HOST. |
| 1036 test_host = os.path.dirname(settings.get('TEST_HOST')); |
| 1037 frameworks_dir = os.path.join(test_host, 'Frameworks') |
| 1038 platform_root = self._XcodePlatformPath(configname) |
| 1039 frameworks = \ |
| 1040 ['Developer/Library/PrivateFrameworks/IDEBundleInjection.framework', |
| 1041 'Developer/Library/Frameworks/XCTest.framework'] |
| 1042 for framework in frameworks: |
| 1043 source = os.path.join(platform_root, framework) |
| 1044 destination = os.path.join(frameworks_dir, os.path.basename(framework)) |
| 1045 postbuilds.extend(['ditto %s %s' % (source, destination)]) |
| 1046 |
| 1047 # Then re-sign everything with 'preserve=True' |
| 1048 postbuilds.extend(['%s code-sign-bundle "%s" "%s" "%s" "%s" %s' % ( |
| 1049 os.path.join('${TARGET_BUILD_DIR}', 'gyp-mac-tool'), key, |
| 1050 settings.get('CODE_SIGN_ENTITLEMENTS', ''), |
| 1051 settings.get('PROVISIONING_PROFILE', ''), destination, True) |
| 1052 ]) |
| 1053 plugin_dir = os.path.join(test_host, 'PlugIns') |
| 1054 targets = [os.path.join(plugin_dir, product_name), test_host] |
| 1055 for target in targets: |
| 1056 postbuilds.extend(['%s code-sign-bundle "%s" "%s" "%s" "%s" %s' % ( |
| 1057 os.path.join('${TARGET_BUILD_DIR}', 'gyp-mac-tool'), key, |
| 1058 settings.get('CODE_SIGN_ENTITLEMENTS', ''), |
| 1059 settings.get('PROVISIONING_PROFILE', ''), target, True) |
| 1060 ]) |
| 1061 |
| 1062 postbuilds.extend(['%s code-sign-bundle "%s" "%s" "%s" "%s" %s' % ( |
| 1024 os.path.join('${TARGET_BUILD_DIR}', 'gyp-mac-tool'), key, | 1063 os.path.join('${TARGET_BUILD_DIR}', 'gyp-mac-tool'), key, |
| 1025 settings.get('CODE_SIGN_ENTITLEMENTS', ''), | 1064 settings.get('CODE_SIGN_ENTITLEMENTS', ''), |
| 1026 settings.get('PROVISIONING_PROFILE', '')) | 1065 settings.get('PROVISIONING_PROFILE', ''), |
| 1027 ] | 1066 os.path.join("${BUILT_PRODUCTS_DIR}", product_name), False) |
| 1067 ]) |
| 1068 return postbuilds |
| 1028 | 1069 |
| 1029 def _GetIOSCodeSignIdentityKey(self, settings): | 1070 def _GetIOSCodeSignIdentityKey(self, settings): |
| 1030 identity = settings.get('CODE_SIGN_IDENTITY') | 1071 identity = settings.get('CODE_SIGN_IDENTITY') |
| 1031 if not identity: | 1072 if not identity: |
| 1032 return None | 1073 return None |
| 1033 if identity not in XcodeSettings._codesigning_key_cache: | 1074 if identity not in XcodeSettings._codesigning_key_cache: |
| 1034 output = subprocess.check_output( | 1075 output = subprocess.check_output( |
| 1035 ['security', 'find-identity', '-p', 'codesigning', '-v']) | 1076 ['security', 'find-identity', '-p', 'codesigning', '-v']) |
| 1036 for line in output.splitlines(): | 1077 for line in output.splitlines(): |
| 1037 if identity in line: | 1078 if identity in line: |
| (...skipping 630 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1668 if toolset == 'target': | 1709 if toolset == 'target': |
| 1669 iphoneos_config_dict['xcode_settings']['SDKROOT'] = 'iphoneos' | 1710 iphoneos_config_dict['xcode_settings']['SDKROOT'] = 'iphoneos' |
| 1670 return targets | 1711 return targets |
| 1671 | 1712 |
| 1672 def CloneConfigurationForDeviceAndEmulator(target_dicts): | 1713 def CloneConfigurationForDeviceAndEmulator(target_dicts): |
| 1673 """If |target_dicts| contains any iOS targets, automatically create -iphoneos | 1714 """If |target_dicts| contains any iOS targets, automatically create -iphoneos |
| 1674 targets for iOS device builds.""" | 1715 targets for iOS device builds.""" |
| 1675 if _HasIOSTarget(target_dicts): | 1716 if _HasIOSTarget(target_dicts): |
| 1676 return _AddIOSDeviceConfigurations(target_dicts) | 1717 return _AddIOSDeviceConfigurations(target_dicts) |
| 1677 return target_dicts | 1718 return target_dicts |
| OLD | NEW |