Index: pylib/gyp/xcode_emulation.py |
diff --git a/pylib/gyp/xcode_emulation.py b/pylib/gyp/xcode_emulation.py |
index 859cd5a93722e9c1efb9f4cb210be180e03e7b11..684e9bd0149158c71ad2ba2438a16697fd0eb719 100644 |
--- a/pylib/gyp/xcode_emulation.py |
+++ b/pylib/gyp/xcode_emulation.py |
@@ -238,6 +238,8 @@ class XcodeSettings(object): |
return '.' + self.spec.get('product_extension', wrapper_extension) |
elif self.spec['type'] == 'executable': |
return '.' + self.spec.get('product_extension', 'app') |
+ elif self.spec['type'] == 'extension': |
+ return '.' + self.spec.get('product_extension', 'appex') |
else: |
assert False, "Don't know extension for '%s', target '%s'" % ( |
self.spec['type'], self.spec['target_name']) |
@@ -284,7 +286,7 @@ class XcodeSettings(object): |
"""Returns the qualified path to the bundle's plist file. E.g. |
Chromium.app/Contents/Info.plist. Only valid for bundles.""" |
assert self._IsBundle() |
- if self.spec['type'] in ('executable', 'loadable_module'): |
+ if self.spec['type'] in ('executable', 'extension', 'loadable_module'): |
return os.path.join(self.GetBundleContentsFolderPath(), 'Info.plist') |
else: |
return os.path.join(self.GetBundleContentsFolderPath(), |
@@ -295,12 +297,14 @@ class XcodeSettings(object): |
if self._IsBundle(): |
return { |
'executable': 'com.apple.product-type.application', |
+ 'extension': 'com.apple.product-type.app-extension', |
'loadable_module': 'com.apple.product-type.bundle', |
'shared_library': 'com.apple.product-type.framework', |
}[self.spec['type']] |
else: |
return { |
'executable': 'com.apple.product-type.tool', |
+ 'extension': 'com.apple.product-type.app-extension', |
'loadable_module': 'com.apple.product-type.library.dynamic', |
'shared_library': 'com.apple.product-type.library.dynamic', |
'static_library': 'com.apple.product-type.library.static', |
@@ -309,10 +313,12 @@ class XcodeSettings(object): |
def GetMachOType(self): |
"""Returns the MACH_O_TYPE of this target.""" |
# Weird, but matches Xcode. |
- if not self._IsBundle() and self.spec['type'] == 'executable': |
+ if not self._IsBundle() and (self.spec['type'] == 'executable' or |
+ self.spec['type'] == 'extension'): |
return '' |
return { |
'executable': 'mh_execute', |
+ 'extension': 'mh_execute', |
'static_library': 'staticlib', |
'shared_library': 'mh_dylib', |
'loadable_module': 'mh_bundle', |
@@ -324,7 +330,7 @@ class XcodeSettings(object): |
assert self._IsBundle() |
if self.spec['type'] in ('shared_library') or self.isIOS: |
path = self.GetBundleContentsFolderPath() |
- elif self.spec['type'] in ('executable', 'loadable_module'): |
+ elif self.spec['type'] in ('executable', 'extension', 'loadable_module'): |
path = os.path.join(self.GetBundleContentsFolderPath(), 'MacOS') |
return os.path.join(path, self.GetExecutableName()) |
@@ -333,6 +339,7 @@ class XcodeSettings(object): |
return '.' + self.spec['product_extension'] |
return { |
'executable': '', |
+ 'extension': '', |
'static_library': '.a', |
'shared_library': '.dylib', |
'loadable_module': '.so', |
@@ -341,6 +348,7 @@ class XcodeSettings(object): |
def _GetStandaloneExecutablePrefix(self): |
return self.spec.get('product_prefix', { |
'executable': '', |
+ 'extension': '', |
'static_library': 'lib', |
'shared_library': 'lib', |
# Non-bundled loadable_modules are called foo.so for some reason |
@@ -352,8 +360,8 @@ class XcodeSettings(object): |
"""Returns the name of the non-bundle binary represented by this target. |
E.g. hello_world. Only valid for non-bundles.""" |
assert not self._IsBundle() |
- assert self.spec['type'] in ( |
- 'executable', 'shared_library', 'static_library', 'loadable_module'), ( |
+ assert self.spec['type'] in ('executable', 'extension', 'shared_library', |
+ 'static_library', 'loadable_module'), ( |
'Unexpected type %s' % self.spec['type']) |
target = self.spec['target_name'] |
if self.spec['type'] == 'static_library': |
@@ -794,6 +802,16 @@ class XcodeSettings(object): |
for directory in framework_dirs: |
ldflags.append('-F' + directory.replace('$(SDKROOT)', sdk_root)) |
+ if sdk_root and self.spec['type'] == "extension": |
+ # Adds the link flags for extensions. These flags are common for all |
+ # extensions and provide loader and main function. |
+ # These flags reflect the compilation options used by xcode to compile |
+ # extensions. |
+ ldflags.append('-lpkstart ' + sdk_root + |
+ '/System/Library/PrivateFrameworks/PlugInKit.framework/PlugInKit') |
+ ldflags.append('-fapplication-extension ' + |
+ '-Xlinker -rpath -Xlinker @executable_path/../../Frameworks') |
+ |
self._Appendf(ldflags, 'CLANG_CXX_LIBRARY', '-stdlib=%s') |
self.configname = None |
@@ -870,6 +888,8 @@ class XcodeSettings(object): |
default_strip_style = 'non-global' |
elif self.spec['type'] == 'executable': |
default_strip_style = 'all' |
+ elif self.spec['type'] == 'extension': |
+ default_strip_style = 'all' |
strip_style = self._Settings().get('STRIP_STYLE', default_strip_style) |
strip_flags = { |
@@ -921,7 +941,8 @@ class XcodeSettings(object): |
"""Return a shell command to codesign the iOS output binary so it can |
be deployed to a device. This should be run as the very last step of the |
build.""" |
- if not (self.isIOS and self.spec['type'] == "executable"): |
+ if not (self.isIOS and (self.spec['type'] == "executable" or |
+ self.spec['type'] == "extension")): |
return [] |
settings = self.xcode_settings[configname] |
@@ -1402,7 +1423,11 @@ def _GetXcodeEnv(xcode_settings, built_products_dir, srcroot, configuration, |
env['SDKROOT'] = '' |
if spec['type'] in ( |
- 'executable', 'static_library', 'shared_library', 'loadable_module'): |
+ 'executable', |
+ 'extension', |
+ 'static_library', |
+ 'shared_library', |
+ 'loadable_module'): |
env['EXECUTABLE_NAME'] = xcode_settings.GetExecutableName() |
env['EXECUTABLE_PATH'] = xcode_settings.GetExecutablePath() |
env['FULL_PRODUCT_NAME'] = xcode_settings.GetFullProductName() |