Index: trunk/pylib/gyp/xcodeproj_file.py |
=================================================================== |
--- trunk/pylib/gyp/xcodeproj_file.py (revision 830) |
+++ trunk/pylib/gyp/xcodeproj_file.py (working copy) |
@@ -2163,21 +2163,21 @@ |
# filetype : used for explicitFileType in the project file |
# prefix : the prefix for the file name |
# suffix : the suffix for the filen ame |
- # set_xc_exe_prefix : bool to say if EXECUTABLE_PREFIX should be set to the |
- # prefix value. |
_product_filetypes = { |
'com.apple.product-type.application': ['wrapper.application', |
- '', '.app', False], |
+ '', '.app'], |
'com.apple.product-type.bundle': ['wrapper.cfbundle', |
- '', '.bundle', False], |
+ '', '.bundle'], |
'com.apple.product-type.framework': ['wrapper.framework', |
- '', '.framework', False], |
+ '', '.framework'], |
'com.apple.product-type.library.dynamic': ['compiled.mach-o.dylib', |
- 'lib', '.dylib', True], |
+ 'lib', '.dylib'], |
'com.apple.product-type.library.static': ['archive.ar', |
- 'lib', '.a', False], |
+ 'lib', '.a'], |
'com.apple.product-type.tool': ['compiled.mach-o.executable', |
- '', '', False], |
+ '', ''], |
+ 'com.googlecode.gyp.xcode.bundle': ['compiled.mach-o.dylib', |
+ '', '.so'], |
} |
def __init__(self, properties=None, id=None, parent=None, |
@@ -2195,8 +2195,39 @@ |
products_group = pbxproject.ProductsGroup() |
if products_group != None: |
- (filetype, prefix, suffix, set_xc_exe_prefix) = \ |
+ (filetype, prefix, suffix) = \ |
self._product_filetypes[self._properties['productType']] |
+ # Xcode does not have a distinct type for loadable modules that are |
+ # pure BSD targets (not in a bundle wrapper). GYP allows such modules |
+ # to be specified by setting a target type to loadable_module without |
+ # having mac_bundle set. These are mapped to the pseudo-product type |
+ # com.googlecode.gyp.xcode.bundle. |
+ # |
+ # By picking up this special type and converting it to a dynamic |
+ # library (com.apple.product-type.library.dynamic) with fix-ups, |
+ # single-file loadable modules can be produced. |
+ # |
+ # MACH_O_TYPE is changed to mh_bundle to produce the proper file type |
+ # (as opposed to mh_dylib). In order for linking to succeed, |
+ # DYLIB_CURRENT_VERSION and DYLIB_COMPATIBILITY_VERSION must be |
+ # cleared. They are meaningless for type mh_bundle. |
+ # |
+ # Finally, the .so extension is forcibly applied over the default |
+ # (.dylib), unless another forced extension is already selected. |
+ # .dylib is plainly wrong, and .bundle is used by loadable_modules in |
+ # bundle wrappers (com.apple.product-type.bundle). .so seems an odd |
+ # choice because it's used as the extension on many other systems that |
+ # don't distinguish between linkable shared libraries and non-linkable |
+ # loadable modules, but there's precedent: Python loadable modules on |
+ # Mac OS X use an .so extension. |
+ if self._properties['productType'] == 'com.googlecode.gyp.xcode.bundle': |
+ self._properties['productType'] = \ |
+ 'com.apple.product-type.library.dynamic' |
+ self.SetBuildSetting('MACH_O_TYPE', 'mh_bundle') |
+ self.SetBuildSetting('DYLIB_CURRENT_VERSION', '') |
+ self.SetBuildSetting('DYLIB_COMPATIBILITY_VERSION', '') |
+ if force_extension == None: |
+ force_extension = suffix[1:] |
if force_extension is not None: |
# If it's a wrapper (bundle), set WRAPPER_EXTENSION. |