← Back to team overview

openlp-core team mailing list archive

[Merge] lp:~springermac/openlp/packaging-mac into lp:openlp/packaging

 

Jonathan Springer has proposed merging lp:~springermac/openlp/packaging-mac into lp:openlp/packaging.

Requested reviews:
  OpenLP Core (openlp-core)

For more details, see:
https://code.launchpad.net/~springermac/openlp/packaging-mac/+merge/223145

Link mudraw binary to bundled libraries on Mac OS X
Add Retina support for Mac
Add bzrignore
-- 
https://code.launchpad.net/~springermac/openlp/packaging-mac/+merge/223145
Your team OpenLP Core is requested to review the proposed merge of lp:~springermac/openlp/packaging-mac into lp:openlp/packaging.
=== added file '.bzrignore'
--- .bzrignore	1970-01-01 00:00:00 +0000
+++ .bzrignore	2014-06-14 03:50:20 +0000
@@ -0,0 +1,36 @@
+*.pyc
+*.*~
+\#*\#
+*.eric4project
+*.eric5project
+*.ropeproject
+*.e4*
+.eric4project
+.komodotools
+*.komodoproject
+list
+openlp.org 2.0.e4*
+documentation/build/html
+documentation/build/doctrees
+*.log*
+dist
+OpenLP.egg-info
+build
+resources/innosetup/Output
+_eric4project
+.pylint.d
+*.qm
+openlp/core/resources.py.old
+*.qm
+resources/windows/warnOpenLP.txt
+openlp.cfg
+.idea
+openlp.pro
+.kdev4
+tests.kdev4
+*.nja
+*.orig
+__pycache__
+*.dll
+*.DS_Store
+config.ini

=== modified file 'osx/Info.plist'
--- osx/Info.plist	2012-06-09 19:02:47 +0000
+++ osx/Info.plist	2014-06-14 03:50:20 +0000
@@ -1,125 +1,124 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd";>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd";>
 <plist version="1.0">
 <dict>
-
-        <key>CFBundleDocumentTypes</key>
-        <array>
-                <dict>
-                        <key>CFBundleTypeExtension</key>
-                        <array>
-                                <string>osz</string>
-                        </array>
-                        <key>CFBundleTypeIconFiles</key>
-                        <array>
-                                <string>OpenLP.icns</string>
-                        </array>
-                        <key>CFBundleTypeName</key>
-                        <string>OpenLP Service</string>
-                        <key>CFBundleTypeRole</key>
-                        <string>Viewer</string>
-                        <key>LSHandlerRank</key>
-                        <string>Owner</string>
-                        <key>LSItemContentTypes</key>
-                        <array>
-                                <string>org.openlp.osz</string>
-                        </array>
-                </dict>
-                <dict>
-                        <key>CFBundleTypeExtension</key>
-                        <array>
-                                <string>otz</string>
-                        </array>
-                        <key>CFBundleTypeIconFiles</key>
-                        <array>
-                                <string>OpenLP.icns</string>
-                        </array>
-                        <key>CFBundleTypeName</key>
-                        <string>OpenLP Theme</string>
-                        <key>CFBundleTypeRole</key>
-                        <string>Viewer</string>
-                        <key>LSHandlerRank</key>
-                        <string>Owner</string>
-                        <key>LSItemContentTypes</key>
-                        <array>
-                                <string>org.openlp.otz</string>
-                        </array>
-                </dict>
-        </array>
-
-        <key>UTExportedTypeDeclarations</key>
-        <array>
-                <dict>
-                        <key>UTTypeIdentifier</key>
-                        <string>org.openlp.osz</string>
-                        <key>UTTypeDescription</key>
-                        <string>OpenLP Service</string>
-                        <key>UTTypeConformsTo</key>
-                        <array>
-                                <string>public.data</string>
-                                <string>public.content</string>
-                        </array>
-                        <key>UTTypeTagSpecification</key>
-                        <dict>
-                                <key>public.filename-extension</key>
-                                <array>
-                                        <string>osz</string>
-                                </array>
-                                <key>public.mime-type</key>
-                                <array>
-                                        <string>application/x-openlp-service</string>
-                                </array>
-                        </dict>
-                </dict>
-                <dict>
-                        <key>UTTypeIdentifier</key>
-                        <string>org.openlp.otz</string>
-                        <key>UTTypeDescription</key>
-                        <string>OpenLP Theme</string>
-                        <key>UTTypeConformsTo</key>
-                        <array>
-                                <string>public.data</string>
-                                <string>public.content</string>
-                        </array>
-                        <key>UTTypeTagSpecification</key>
-                        <dict>
-                                <key>public.filename-extension</key>
-                                <array>
-                                        <string>otz</string>
-                                </array>
-                                <key>public.mime-type</key>
-                                <array>
-                                        <string>application/x-openlp-theme</string>
-                                </array>
-                        </dict>
-                </dict>
-        </array>
-
-<key>CFBundleIdentifier</key>
-<string>org.openlp</string>
-<key>CFBundleShortVersionString</key>
-<string>%(openlp_version)s</string>
-<key>CFBundleVersion</key>
-<string>%(openlp_version)s</string>
-<key>CFBundleInfoDictionaryVersion</key>
-<string>6.0</string>
-<key>CFBundleDisplayName</key>
-<string>OpenLP</string>
-<key>CFBundleIconFile</key>
-<string>OpenLP.icns</string>
-<key>CFBundleExecutable</key>
-<string>MacOS/OpenLP</string>
-<key>CFBundleName</key>
-<string>OpenLP</string>
-<key>CFBundleGetInfoString</key>
-<string>OpenLP %(openlp_version)s</string>
-<key>LSHasLocalizedDisplayName</key>
-<false/>
-<key>NSAppleScriptEnabled</key>
-<false/>
-<key>CFBundlePackageType</key>
-<string>APPL</string>
-<key>LSBackgroundOnly</key>
-<false/>
+	<key>CFBundleDocumentTypes</key>
+	<array>
+		<dict>
+			<key>CFBundleTypeExtension</key>
+			<array>
+				<string>osz</string>
+			</array>
+			<key>CFBundleTypeIconFiles</key>
+			<array>
+				<string>OpenLP.icns</string>
+			</array>
+			<key>CFBundleTypeName</key>
+			<string>OpenLP Service</string>
+			<key>CFBundleTypeRole</key>
+			<string>Viewer</string>
+			<key>LSHandlerRank</key>
+			<string>Owner</string>
+			<key>LSItemContentTypes</key>
+			<array>
+				<string>org.openlp.osz</string>
+			</array>
+		</dict>
+		<dict>
+			<key>CFBundleTypeExtension</key>
+			<array>
+				<string>otz</string>
+			</array>
+			<key>CFBundleTypeIconFiles</key>
+			<array>
+				<string>OpenLP.icns</string>
+			</array>
+			<key>CFBundleTypeName</key>
+			<string>OpenLP Theme</string>
+			<key>CFBundleTypeRole</key>
+			<string>Viewer</string>
+			<key>LSHandlerRank</key>
+			<string>Owner</string>
+			<key>LSItemContentTypes</key>
+			<array>
+				<string>org.openlp.otz</string>
+			</array>
+		</dict>
+	</array>
+	<key>UTExportedTypeDeclarations</key>
+	<array>
+		<dict>
+			<key>UTTypeIdentifier</key>
+			<string>org.openlp.osz</string>
+			<key>UTTypeDescription</key>
+			<string>OpenLP Service</string>
+			<key>UTTypeConformsTo</key>
+			<array>
+				<string>public.data</string>
+				<string>public.content</string>
+			</array>
+			<key>UTTypeTagSpecification</key>
+			<dict>
+				<key>public.filename-extension</key>
+				<array>
+					<string>osz</string>
+				</array>
+				<key>public.mime-type</key>
+				<array>
+					<string>application/x-openlp-service</string>
+				</array>
+			</dict>
+		</dict>
+		<dict>
+			<key>UTTypeIdentifier</key>
+			<string>org.openlp.otz</string>
+			<key>UTTypeDescription</key>
+			<string>OpenLP Theme</string>
+			<key>UTTypeConformsTo</key>
+			<array>
+				<string>public.data</string>
+				<string>public.content</string>
+			</array>
+			<key>UTTypeTagSpecification</key>
+			<dict>
+				<key>public.filename-extension</key>
+				<array>
+					<string>otz</string>
+				</array>
+				<key>public.mime-type</key>
+				<array>
+					<string>application/x-openlp-theme</string>
+				</array>
+			</dict>
+		</dict>
+	</array>
+	<key>CFBundleIdentifier</key>
+	<string>org.openlp</string>
+	<key>CFBundleShortVersionString</key>
+	<string>%(openlp_version)s</string>
+	<key>CFBundleVersion</key>
+	<string>%(openlp_version)s</string>
+	<key>CFBundleInfoDictionaryVersion</key>
+	<string>6.0</string>
+	<key>CFBundleDisplayName</key>
+	<string>OpenLP</string>
+	<key>CFBundleIconFile</key>
+	<string>OpenLP.icns</string>
+	<key>CFBundleExecutable</key>
+	<string>MacOS/OpenLP</string>
+	<key>CFBundleName</key>
+	<string>OpenLP</string>
+	<key>CFBundleGetInfoString</key>
+	<string>OpenLP %(openlp_version)s</string>
+	<key>LSHasLocalizedDisplayName</key>
+	<false/>
+	<key>NSAppleScriptEnabled</key>
+	<false/>
+	<key>CFBundlePackageType</key>
+	<string>APPL</string>
+	<key>LSBackgroundOnly</key>
+	<true/>
+	<key>NSHighResolutionCapable</key>
+	<true/>
 </dict>
 </plist>

=== modified file 'osx/macosx-builder.py'
--- osx/macosx-builder.py	2014-05-30 08:59:26 +0000
+++ osx/macosx-builder.py	2014-06-14 03:50:20 +0000
@@ -93,6 +93,11 @@
     Required for PDF support in OpenLP. Install using macports, or use the
     '--mudraw-bin' option of this script to point to the mudraw binary.
 
+MachOLib
+    Python library to analyze and edit Mach-O headers, the executable format
+    used by Mac OS X. Used to relink the mudraw binary from MuPDF to the bundled
+    libraries. Install using macports or pip.
+
 config.ini.default
     The configuration file contains settings of the version string to include
     in the bundle as well as directory and file settings for different
@@ -126,6 +131,9 @@
 from configparser import ConfigParser
 from argparse import ArgumentParser
 
+from macholib.MachO import MachO
+from macholib.util import flipwritable, in_system_path
+
 
 def _which(command):
     """
@@ -451,9 +459,58 @@
         self._print_verbose('... mudraw')
         if self.mudraw_bin and os.path.isfile(self.mudraw_bin):
             copy(os.path.join(self.mudraw_bin), os.path.join(self.dist_path, 'mudraw'))
+            self.relink_mudraw()
         else:
             self._print('... WARNING: mudraw not found')
 
+    def relink_mudraw(self):
+        """
+        Relink mudraw to bundled libraries
+        """
+        self._print('Linking mudraw with bundled libraries...')
+        libname = os.path.join(self.dist_path, 'mudraw')
+        distname = os.path.relpath(self.dist_path, libname)
+        self._print_verbose('... mudraw path %s', libname)
+
+        # Determine how many directories up is the directory with shared
+        # dynamic libraries. '../'
+        # E.g.  ./qt4_plugins/images/ -> ./../../
+        parent_dir = ''
+        # Check if distname is not only base filename.
+        if os.path.dirname(distname):
+            parent_level = len(os.path.dirname(distname).split(os.sep))
+            parent_dir = parent_level * (os.pardir + os.sep)
+
+        def match_func(pth):
+            """
+            For system libraries leave path unchanged.
+            """
+            # Match non system dynamic libraries.
+            if not in_system_path(pth):
+                # Use relative path to dependend dynamic libraries bases on
+                # location of the executable.
+                pth = os.path.join('@loader_path', parent_dir, os.path.basename(pth))
+                self._print_verbose('... %s', pth)
+                return pth
+
+        # Rewrite mach headers with @loader_path.
+        dll = MachO(libname)
+        dll.rewriteLoadCommands(match_func)
+
+        # Write changes into file.
+        # Write code is based on macholib example.
+        try:
+            self._print_verbose('... writing new library paths')
+            f = open(dll.filename, 'rb+')
+            for header in dll.headers:
+                f.seek(0)
+                dll.write(f)
+            f.seek(0, 2)
+            f.flush()
+            f.close()
+        except Exception:
+            pass
+
     def update_translations(self):
         """
         Update the translations.


Follow ups