mirror of
				https://github.com/subsurface/subsurface.git
				synced 2025-02-19 22:16:15 +00:00 
			
		
		
		
	Add packaging files for MacOS
I couldn't figure out how the current packaging infrastructure was supposed to work, but with not too much work I could get the more standard gtk-mac-bundler to do what I wanted, so I added the support files needed for that and a little README on how to use them. The subsurface.sh and subsurface.bundle files are based on the launcher.sh and gtk-demo.bundle files from the gtk-mac-bundler release which is under GPLv2. Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
This commit is contained in:
		
							parent
							
								
									0559a6a783
								
							
						
					
					
						commit
						73f290be8f
					
				
					 4 changed files with 327 additions and 2 deletions
				
			
		|  | @ -3,18 +3,24 @@ | ||||||
| <plist version="1.0"> | <plist version="1.0"> | ||||||
| <dict> | <dict> | ||||||
| 	<key>CFBundleIconFile</key> | 	<key>CFBundleIconFile</key> | ||||||
| 	<string>Subsurface</string> | 	<string>Subsurface.icns</string> | ||||||
| 	<key>CFBundleName</key> | 	<key>CFBundleName</key> | ||||||
| 	<string>Subsurface</string> | 	<string>Subsurface</string> | ||||||
| 	<key>CFBundlePackageType</key> | 	<key>CFBundlePackageType</key> | ||||||
| 	<string>APPL</string> | 	<string>APPL</string> | ||||||
|         <key>CFBundleGetInfoString</key> |         <key>CFBundleGetInfoString</key> | ||||||
| 	<string>Rough divelog in C and Gtk</string> | 	<string>Multi Platform Divelog in C and Gtk</string> | ||||||
| 	<key>CFBundleSignature</key> | 	<key>CFBundleSignature</key> | ||||||
| 	<string>????</string> | 	<string>????</string> | ||||||
| 	<key>CFBundleExecutable</key> | 	<key>CFBundleExecutable</key> | ||||||
| 	<string>subsurface</string> | 	<string>subsurface</string> | ||||||
| 	<key>CFBundleIdentifier</key> | 	<key>CFBundleIdentifier</key> | ||||||
| 	<string>org.hohndel.subsurface</string> | 	<string>org.hohndel.subsurface</string> | ||||||
|  | 	<key>CFBundleInfoDictionaryVersion</key> | ||||||
|  | 	<string>1.0</string> | ||||||
|  | 	<key>CFBundleVersionString</key> | ||||||
|  | 	<string>2.0-rc1</string> | ||||||
|  | 	<key>CFBundleVersion</key> | ||||||
|  | 	<string>2.0</string> | ||||||
| </dict> | </dict> | ||||||
| </plist> | </plist> | ||||||
|  |  | ||||||
							
								
								
									
										16
									
								
								packaging/macosx/README
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								packaging/macosx/README
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,16 @@ | ||||||
|  | Creating a Subsurface bundle | ||||||
|  | 
 | ||||||
|  | install gtk-mac-bundler (this has been tested with version 0.7.0) and run | ||||||
|  | 
 | ||||||
|  | gtk-mac-bundler subsurface.bundle | ||||||
|  | 
 | ||||||
|  | This should install a self-contained Subsurface application under /Applications/Subsurface.app | ||||||
|  | You still need to manually build a DMG if you want to easily distribute this. | ||||||
|  | 
 | ||||||
|  | One important caveat is that (at least with MacPorts) you need to build pango like this: | ||||||
|  | 
 | ||||||
|  | sudo port install pango +builtin_modules +no_x11 +quart | ||||||
|  | 
 | ||||||
|  | Without the builtin modules the installed application fails to find the modules and doesn't render any text. | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
							
								
								
									
										135
									
								
								packaging/macosx/subsurface.bundle
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										135
									
								
								packaging/macosx/subsurface.bundle
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,135 @@ | ||||||
|  | <?xml version="1.0" standalone="no"?> <!--*- mode: xml -*--> | ||||||
|  | <app-bundle> | ||||||
|  | 
 | ||||||
|  |   <meta> | ||||||
|  |     <!-- Where to pick up the GTK+ installation, icon themes, | ||||||
|  |          etc. Note that "${env:JHBUILD_PREFIX}" is evaluated to the | ||||||
|  |          value of the environment variable JHBUILD_PREFIX. You can | ||||||
|  |          define additional prefixes and refer to them in paths | ||||||
|  |          throughout this file on the form "${prefix:name}". This is | ||||||
|  |          useful for installing certain libraries or even the | ||||||
|  |          application itself separately. Note that JHBUILD_PREFIX is | ||||||
|  |          defined by jhbuild, so it you are not using jhbuild you can | ||||||
|  |          either define your own or just hardcode the path here. | ||||||
|  |     --> | ||||||
|  |     <prefix name="default">/opt/local</prefix> | ||||||
|  | 
 | ||||||
|  |     <!-- The project directory is the default location of the created | ||||||
|  |          app. If you leave out the path, the current directory is | ||||||
|  |          used. Note the usage of an environment variable here again. | ||||||
|  |     --> | ||||||
|  |     <destination overwrite="yes">/Applications</destination> | ||||||
|  | 
 | ||||||
|  |     <image> | ||||||
|  |       <!-- Not implemented yet (DMG image). --> | ||||||
|  |     </image> | ||||||
|  | 
 | ||||||
|  |     <!-- Comment this out to keep the install names in binaries --> | ||||||
|  |     <run-install-name-tool/> | ||||||
|  | 
 | ||||||
|  |     <!-- Optionally specify a launcher script to use. If the | ||||||
|  |          application sets up everything needed itself, like | ||||||
|  |          environment variable, linker paths, etc, a launcher script is | ||||||
|  |          not needed. If the source path is left out, the default | ||||||
|  |          script will be used. | ||||||
|  |     --> | ||||||
|  |     <launcher-script>${project}/subsurface.sh</launcher-script > | ||||||
|  | 
 | ||||||
|  |     <!-- Not implemented: Optional runtime, could be python or mono | ||||||
|  |          for example. | ||||||
|  |     --> | ||||||
|  |     <!-- runtime copy="yes">/usr/bin/python</runtime --> | ||||||
|  |     <!-- Indicate the active gtk version to use. This is needed only | ||||||
|  |          for gtk+-3.0 projects. --> | ||||||
|  |     <gtk>gtk+-2.0</gtk> | ||||||
|  |   </meta> | ||||||
|  | 
 | ||||||
|  |   <!-- The special macro "${project}" refers to the directory where | ||||||
|  |        this bundle file is located. The application name and bundle | ||||||
|  |        identifier are taken from the plist file. | ||||||
|  |   --> | ||||||
|  |   <plist>${project}/Info.plist</plist> | ||||||
|  | 
 | ||||||
|  |   <main-binary dest="${bundle}/Contents/MacOS">${project}/../../subsurface</main-binary> | ||||||
|  | 
 | ||||||
|  |   <!-- Copy in GTK+ modules.  Note the ${gtkdir} macro, which expands | ||||||
|  |        to the correct library subdirectory for the specified gtk | ||||||
|  |        version. | ||||||
|  |   --> | ||||||
|  |   <binary> | ||||||
|  |      ${prefix}/lib/${gtkdir}/modules/*.so | ||||||
|  |   </binary> | ||||||
|  | 
 | ||||||
|  |   <!-- Copy in GTK+ theme engines and print backends. Note the use of the | ||||||
|  |        "${pkg:module:variable}" macro, which evaluates to a pkg-config | ||||||
|  |        variable in the specified module. Note that any libraries that | ||||||
|  |        binaries link to are also copied in automatically.  Note also | ||||||
|  |        the included ${gtk} macro, which gets the correct package name | ||||||
|  |        to get. --> | ||||||
|  |   <binary> | ||||||
|  |     ${prefix}/lib/${gtkdir}/${pkg:${gtk}:gtk_binary_version}/engines/*.so | ||||||
|  |   </binary> | ||||||
|  |   <binary> | ||||||
|  |     ${prefix}/lib/${gtkdir}/${pkg:${gtk}:gtk_binary_version}/printbackends/*.so | ||||||
|  |   </binary> | ||||||
|  | 
 | ||||||
|  | <!-- Starting with 2.24, gdk-pixbuf installs into its own directory. --> | ||||||
|  |   <binary> | ||||||
|  |     ${prefix}/lib/gdk-pixbuf-2.0/${pkg:${gtk}:gtk_binary_version}/*.so | ||||||
|  |   </binary> | ||||||
|  | 
 | ||||||
|  |   <!-- Translation filenames, one for each program or library that you | ||||||
|  |        want to copy in to the bundle. The "dest" attribute is | ||||||
|  |        optional, as usual. Bundler will find all translations of that | ||||||
|  |        library/program under the indicated directory and copy them.--> | ||||||
|  |   <translations name="gtk20"> | ||||||
|  |     ${prefix}/share/locale | ||||||
|  |   </translations> | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |   <!-- Data to copy in, usually Glade/UI files, images, sounds files | ||||||
|  |        etc. The destination inside the bundle can be specified if the | ||||||
|  |        files should end up at a different location, by using the | ||||||
|  |        "dest" property. The destination must then start with the macro | ||||||
|  |        "${bundle}", which refers to the bundle root directory. | ||||||
|  |   --> | ||||||
|  |   <!-- data | ||||||
|  |     ${prefix}/share/gtk-demo | ||||||
|  |   </data --> | ||||||
|  | 
 | ||||||
|  |   <!-- Copy in the themes data. You may want to trim this to save space | ||||||
|  |        in your bundle. --> | ||||||
|  |   <data> | ||||||
|  |     ${prefix}/share/themes | ||||||
|  |   </data> | ||||||
|  | 
 | ||||||
|  |   <!-- Copy icons. Note that the .icns file is an Apple format which | ||||||
|  |        contains up to 4 sizes of icon. You can use | ||||||
|  |        /Developer/Applications/Utilities/Icon Composer.app to import | ||||||
|  |        artwork and create the file. --> | ||||||
|  |   <data dest="${bundle}/Contents/Resources"> | ||||||
|  |     ${project}/Subsurface.icns | ||||||
|  |   </data> | ||||||
|  | 
 | ||||||
|  |   <!-- This is where theme commands go. You can copy them in from your | ||||||
|  |        theme of choice if they provide and example, or you can just | ||||||
|  |        change the source path. --> | ||||||
|  | 
 | ||||||
|  |   <data dest="${bundle}/Contents/Resources/etc/${gtkdir}/gtkrc"> | ||||||
|  |     ${project}/gtkrc | ||||||
|  |   </data> | ||||||
|  | 
 | ||||||
|  |   <!-- Icon themes to copy. The "icons" property can be either of | ||||||
|  |        "auto", "all", or "none". All or none should be | ||||||
|  |        self-explanatory, while auto means that the script will try to | ||||||
|  |        figure out which icons are needed. This is done by getting all | ||||||
|  |        the strings from all copied binaries, and matching them against | ||||||
|  |        icon names. To be safe, you should use "all". "none" is useful | ||||||
|  |        if you want just the index.theme file but no icons, mostly | ||||||
|  |        needed for the "hicolor" base theme. | ||||||
|  |   > | ||||||
|  |   <icon-theme icons="auto"> | ||||||
|  |     Tango | ||||||
|  |   </icon-theme --> | ||||||
|  | 
 | ||||||
|  | </app-bundle> | ||||||
							
								
								
									
										168
									
								
								packaging/macosx/subsurface.sh
									
										
									
									
									
										Executable file
									
								
							
							
						
						
									
										168
									
								
								packaging/macosx/subsurface.sh
									
										
									
									
									
										Executable file
									
								
							|  | @ -0,0 +1,168 @@ | ||||||
|  | #!/bin/sh | ||||||
|  | 
 | ||||||
|  | if test "x$GTK_DEBUG_LAUNCHER" != x; then | ||||||
|  |     set -x | ||||||
|  | fi | ||||||
|  | 
 | ||||||
|  | if test "x$GTK_DEBUG_GDB" != x; then | ||||||
|  |     EXEC="gdb --args" | ||||||
|  | else | ||||||
|  |     EXEC=exec | ||||||
|  | fi | ||||||
|  | 
 | ||||||
|  | name=`basename "$0"` | ||||||
|  | tmp="$0" | ||||||
|  | tmp=`dirname "$tmp"` | ||||||
|  | tmp=`dirname "$tmp"` | ||||||
|  | bundle=`dirname "$tmp"` | ||||||
|  | bundle_contents="$bundle"/Contents | ||||||
|  | bundle_res="$bundle_contents"/Resources | ||||||
|  | bundle_lib="$bundle_res"/lib | ||||||
|  | bundle_bin="$bundle_res"/bin | ||||||
|  | bundle_data="$bundle_res"/share | ||||||
|  | bundle_etc="$bundle_res"/etc | ||||||
|  | 
 | ||||||
|  | #export DYLD_LIBRARY_PATH="$bundle_lib" | ||||||
|  | export XDG_CONFIG_DIRS="$bundle_etc"/xdg | ||||||
|  | export XDG_DATA_DIRS="$bundle_data" | ||||||
|  | export GTK_DATA_PREFIX="$bundle_res" | ||||||
|  | export GTK_EXE_PREFIX="$bundle_res" | ||||||
|  | export GTK_PATH="$bundle_res" | ||||||
|  | 
 | ||||||
|  | export GTK2_RC_FILES="$bundle_etc/gtk-2.0/gtkrc" | ||||||
|  | export GTK_IM_MODULE_FILE="$bundle_etc/gtk-2.0/gtk.immodules" | ||||||
|  | export GDK_PIXBUF_MODULE_FILE="$bundle_etc/gtk-2.0/gdk-pixbuf.loaders" | ||||||
|  | export PANGO_RC_FILE="$bundle_etc/pango/pangorc" | ||||||
|  | 
 | ||||||
|  | APP=name | ||||||
|  | I18NDIR="$bundle_data/locale" | ||||||
|  | # Set the locale-related variables appropriately: | ||||||
|  | unset LANG LC_MESSAGES LC_MONETARY LC_COLLATE | ||||||
|  | 
 | ||||||
|  | # Has a language ordering been set? | ||||||
|  | # If so, set LC_MESSAGES and LANG accordingly; otherwise skip it. | ||||||
|  | # First step uses sed to clean off the quotes and commas, to change - to _, and change the names for the chinese scripts from "Hans" to CN and "Hant" to TW. | ||||||
|  | APPLELANGUAGES=`defaults read .GlobalPreferences AppleLanguages | sed -En   -e 's/\-/_/' -e 's/Hant/TW/' -e 's/Hans/CN/' -e 's/[[:space:]]*\"?([[:alnum:]_]+)\"?,?/\1/p' ` | ||||||
|  | if test "$APPLELANGUAGES"; then | ||||||
|  |     # A language ordering exists. | ||||||
|  |     # Test, item per item, to see whether there is an corresponding locale. | ||||||
|  |     for L in $APPLELANGUAGES; do | ||||||
|  | 	#test for exact matches: | ||||||
|  |        if test -f "$I18NDIR/${L}/LC_MESSAGES/$APP.mo"; then | ||||||
|  | 	    export LANG=$L | ||||||
|  |             break | ||||||
|  |         fi | ||||||
|  | 	#This is a special case, because often the original strings are in US | ||||||
|  | 	#English and there is no translation file. | ||||||
|  | 	if test "x$L" == "xen_US"; then | ||||||
|  | 	    export LANG=$L | ||||||
|  | 	    break | ||||||
|  | 	fi | ||||||
|  | 	#OK, now test for just the first two letters: | ||||||
|  |         if test -f "$I18NDIR/${L:0:2}/LC_MESSAGES/$APP.mo"; then | ||||||
|  | 	    export LANG=${L:0:2} | ||||||
|  | 	    break | ||||||
|  | 	fi | ||||||
|  | 	#Same thing, but checking for any english variant. | ||||||
|  | 	if test "x${L:0:2}" == "xen"; then | ||||||
|  | 	    export LANG=$L | ||||||
|  | 	    break | ||||||
|  | 	fi; | ||||||
|  |     done | ||||||
|  | fi | ||||||
|  | unset APPLELANGUAGES L | ||||||
|  | 
 | ||||||
|  | # If we didn't get a language from the language list, try the Collation preference, in case it's the only setting that exists. | ||||||
|  | APPLECOLLATION=`defaults read .GlobalPreferences AppleCollationOrder` | ||||||
|  | if test -z ${LANG} -a -n $APPLECOLLATION; then | ||||||
|  |     if test -f "$I18NDIR/${APPLECOLLATION:0:2}/LC_MESSAGES/$APP.mo"; then | ||||||
|  | 	export LANG=${APPLECOLLATION:0:2} | ||||||
|  |     fi | ||||||
|  | fi | ||||||
|  | if test ! -z $APPLECOLLATION; then | ||||||
|  |     export LC_COLLATE=$APPLECOLLATION | ||||||
|  | fi | ||||||
|  | unset APPLECOLLATION | ||||||
|  | 
 | ||||||
|  | # Continue by attempting to find the Locale preference. | ||||||
|  | APPLELOCALE=`defaults read .GlobalPreferences AppleLocale` | ||||||
|  | 
 | ||||||
|  | if test -f "$I18NDIR/${APPLELOCALE:0:5}/LC_MESSAGES/$APP.mo"; then | ||||||
|  |     if test -z $LANG; then | ||||||
|  |         export LANG="${APPLELOCALE:0:5}" | ||||||
|  |     fi | ||||||
|  | 
 | ||||||
|  | elif test -z $LANG -a -f "$I18NDIR/${APPLELOCALE:0:2}/LC_MESSAGES/$APP.mo"; then | ||||||
|  |     export LANG="${APPLELOCALE:0:2}" | ||||||
|  | fi | ||||||
|  | 
 | ||||||
|  | #Next we need to set LC_MESSAGES. If at all possilbe, we want a full | ||||||
|  | #5-character locale to avoid the "Locale not supported by C library" | ||||||
|  | #warning from Gtk -- even though Gtk will translate with a | ||||||
|  | #two-character code. | ||||||
|  | if test -n $LANG; then | ||||||
|  | #If the language code matches the applelocale, then that's the message | ||||||
|  | #locale; otherwise, if it's longer than two characters, then it's | ||||||
|  | #probably a good message locale and we'll go with it. | ||||||
|  |     if test $LANG == ${APPLELOCALE:0:5} -o $LANG != ${LANG:0:2}; then | ||||||
|  | 	export LC_MESSAGES=$LANG | ||||||
|  | #Next try if the Applelocale is longer than 2 chars and the language | ||||||
|  | #bit matches $LANG | ||||||
|  |     elif test $LANG == ${APPLELOCALE:0:2} -a $APPLELOCALE > ${APPLELOCALE:0:2}; then | ||||||
|  | 	export LC_MESSAGES=${APPLELOCALE:0:5} | ||||||
|  | #Fail. Get a list of the locales in $PREFIX/share/locale that match | ||||||
|  | #our two letter language code and pick the first one, special casing | ||||||
|  | #english to set en_US | ||||||
|  |     elif test $LANG == "en"; then | ||||||
|  | 	export LC_MESSAGES="en_US" | ||||||
|  |     else | ||||||
|  | 	LOC=`find $PREFIX/share/locale -name $LANG???` | ||||||
|  | 	for L in $LOC; do | ||||||
|  | 	    export LC_MESSAGES=$L | ||||||
|  | 	done | ||||||
|  |     fi | ||||||
|  | else | ||||||
|  | #All efforts have failed, so default to US english | ||||||
|  |     export LANG="en_US" | ||||||
|  |     export LC_MESSAGES="en_US" | ||||||
|  | fi | ||||||
|  | CURRENCY=`echo $APPLELOCALE |  sed -En 's/.*currency=([[:alpha:]]+).*/\1/p'` | ||||||
|  | if test "x$CURRENCY" != "x"; then | ||||||
|  | #The user has set a special currency. Gtk doesn't install LC_MONETARY files, but Apple does in /usr/share/locale, so we're going to look there for a locale to set LC_CURRENCY to. | ||||||
|  |     if test -f /usr/local/share/$LC_MESSAGES/LC_MONETARY; then | ||||||
|  | 	if test -a `cat /usr/local/share/$LC_MESSAGES/LC_MONETARY` == $CURRENCY; then | ||||||
|  | 	    export LC_MONETARY=$LC_MESSAGES | ||||||
|  | 	fi | ||||||
|  |     fi | ||||||
|  |     if test -z "$LC_MONETARY"; then | ||||||
|  | 	FILES=`find /usr/share/locale -name LC_MONETARY -exec grep -H $CURRENCY {} \;` | ||||||
|  | 	if test -n "$FILES"; then | ||||||
|  | 	    export LC_MONETARY=`echo $FILES | sed -En 's%/usr/share/locale/([[:alpha:]_]+)/LC_MONETARY.*%\1%p'` | ||||||
|  | 	fi | ||||||
|  |     fi | ||||||
|  | fi | ||||||
|  | #No currency value means that the AppleLocale governs: | ||||||
|  | if test -z "$LC_MONETARY"; then | ||||||
|  |     LC_MONETARY=${APPLELOCALE:0:5} | ||||||
|  | fi | ||||||
|  | #For Gtk, which only looks at LC_ALL: | ||||||
|  | export LC_ALL=$LC_MESSAGES | ||||||
|  | 
 | ||||||
|  | unset APPLELOCALE FILES LOC | ||||||
|  | 
 | ||||||
|  | if test -f "$bundle_lib/charset.alias"; then | ||||||
|  |     export CHARSETALIASDIR="$bundle_lib" | ||||||
|  | fi | ||||||
|  | 
 | ||||||
|  | # Extra arguments can be added in environment.sh. | ||||||
|  | EXTRA_ARGS= | ||||||
|  | if test -f "$bundle_res/environment.sh"; then | ||||||
|  |   source "$bundle_res/environment.sh" | ||||||
|  | fi | ||||||
|  | 
 | ||||||
|  | # Strip out the argument added by the OS. | ||||||
|  | if /bin/expr "x$1" : '^x-psn_' > /dev/null; then | ||||||
|  |     shift 1 | ||||||
|  | fi | ||||||
|  | 
 | ||||||
|  | $EXEC "$bundle_contents/MacOS/$name-bin" "$@" $EXTRA_ARGS | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue