summaryrefslogtreecommitdiffstats
path: root/packaging/osx-app.sh
blob: 51d97007987c3ce74162eb086af63973f80db95d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
#! /bin/bash
# Copyright 2005, Kees Cook <kees@outflux.net>
# Licensed under GNU General Public License
#
# Usage: osx-app [-s] /path/to/bin/inkscape Info.plist /path/to/packaging/macosx
#
# This attempts to build an Inkscape.app package for OSX, resolving
# Dynamic libraries, etc.  Strips the executable and libraries if
# '-s' is given.
#
# Thanks to GNUnet's "build_app" script for help with library dep resolution.
# https://gnunet.org/svn/GNUnet/contrib/OSX/build_app
# 
# Fixes and modifications to use Gimp.app style launcher:
#   Michael Wybrow <mjwybrow@users.sourceforge.net>
#
#
# Notes:
# The Info.plist file can be found in the base inkscape directory once
# configure has been run.
# The macosx directory is in the inkscape/packaging directory.
#
# When packaging Inkscape for OS X, configure should be run with the 
# "--enable-osxapp" option which sets the correct paths for support
# files inside the app bundle.
# 
# Thus, the usual use of this file would be to run it from the within the
# inkscape/packaging directory, substituting in the inkscape binary path:
# 	./osx-app.sh /path/to/bin/inkscape ../Info.plist macosx



# Handle some version specific details.
VERSION=`/usr/bin/sw_vers | grep ProductVersion | cut -f2 -d'.'`
if [ "$VERSION" -ge "4" ]; then
  # We're on Tiger (10.4) or later.
  # XCode behaves a little differently in Tiger and later.
  XCODEFLAGS="-configuration Deployment"
  SCRIPTEXECDIR="ScriptExec/build/Deployment/ScriptExec.app/Contents/MacOS"
  # libXinerama.1.dylib is not installed as part of X11 on Panther but
  # is introduced as a dependency if Inkscape is compiled on Tiger or
  # later.  Thus, add the library to the bundle for Panther users
  EXTRALIBS="/usr/X11R6/lib/libXinerama.1.dylib"
else
  # Panther (10.3) or earlier.
  XCODEFLAGS="-buildstyle Deployment"
  SCRIPTEXECDIR="ScriptExec/build/ScriptExec.app/Contents/MacOS"
  EXTRALIBS=""
fi


SW=/sw

# Package always has the same name.  Version information is stored in
# the Info.plist file which is filled in by the configure script.
pkg=Inkscape
package="$pkg.app"

# TODO: Rewrite handling of command line args and make more robust.

strip=false
if [ "$1" = "-s" ]; then
	strip=true
	shift
fi

binary="$1"
if [ ! -x "$binary" ]; then
        echo "Not executable: $binary" >&2
        exit 1
fi
shift

plist="$1"
if [ ! -f "$plist" ]; then
	echo "Need plist file" >&2
	exit 1
fi
shift

resdir=$1
if [ ! -d $resdir ]; then
	echo "Need the macosx packaging directory" >&2
	exit 1
fi
shift

# Fix a given executable or library to be relocatable
fixlib () {
if [ ! -d "$1" ]; then
  echo $1
  libs="`otool -L $1 | fgrep compatibility | cut -d\( -f1`"
  for lib in $libs; do
    echo "  $lib"
    base=`echo $lib | awk -F/ '{print $NF}'`
    first=`echo $lib | cut -d/ -f1-3`
    to=@executable_path/../lib/$base
    if [ $first != /usr/lib -a $first != /usr/X11R6 ]; then
      /usr/bin/install_name_tool -change $lib $to $1
      if [ "`echo $lib | fgrep libcrypto`" = "" ]; then
        /usr/bin/install_name_tool -id $to ../lib/$base
        for ll in $libs; do
          base=`echo $ll | awk -F/ '{print $NF}'`
          first=`echo $ll | cut -d/ -f1-3`
          to=@executable_path/../lib/$base
          if [ $first != /usr/lib -a $first != /usr/X11R6 -a "`echo $ll | fgrep libcrypto`" = "" ]; then
            /usr/bin/install_name_tool -change $ll $to ../lib/$base
          fi
        done
      fi
    fi
  done
fi
}



mkdir -p "$package"/Contents/MacOS
mkdir -p "$package"/Contents/Resources/bin
mkdir -p "$package"/Contents/Resources/lib
mkdir -p "$package"/Contents/Resources/locale

binname=`basename "$binary"`
binpath="$package/Contents/Resources/bin/inkscape-bin"

cp "$binary" "$binpath"


# Build and add the launcher.
(
  # Build fails if CC happens to be set (to anything other than CompileC)
  unset CC
  
  cd "$resdir/ScriptExec"
  xcodebuild $XCODEFLAGS clean build
)
cp "$resdir/$SCRIPTEXECDIR/ScriptExec" "$package/Contents/MacOS/Inkscape"

# Pull down all the share files
binary_dir=`dirname "$binary"`
rsync -av "$binary_dir/../share/$binname"/* "$package/Contents/Resources/"
cp "$plist" "$package/Contents/Info.plist"
rsync -av "$binary_dir/../share/locale"/* "$package/Contents/Resources/locale"

# PkgInfo must match bundle type and creator code from Info.plist
echo "APPLInks" > $package/Contents/PkgInfo

# Pull in extra requirements.
pkgetc="$package/Contents/Resources/etc"
mkdir -p $pkgetc/pango
cp $SW/etc/pango/pangox.aliases $pkgetc/pango/
# Need to adjust path and quote incase of spaces in path.
sed -e "s,$SW,\"\${CWD},g" -e 's,\.so ,.so" ,g' $SW/etc/pango/pango.modules > $pkgetc/pango/pango.modules
cat > $pkgetc/pango/pangorc <<END_PANGO
[Pango]
ModuleFiles = "\${HOME}/.inkscape-etc/pango.modules"
[PangoX]
AliasFiles = "\${HOME}/.inkscape-etc/pangox.aliases"
END_PANGO

# We use a modified fonts.conf file so only need the dtd
mkdir -p $pkgetc/fonts
cp /etc/fonts/fonts.dtd $pkgetc/fonts/

mkdir -p $pkgetc/gtk-2.0
sed -e "s,$SW,\${CWD},g" $SW/etc/gtk-2.0/gdk-pixbuf.loaders > $pkgetc/gtk-2.0/gdk-pixbuf.loaders
sed -e "s,$SW,\${CWD},g" $SW/etc/gtk-2.0/gtk.immodules > $pkgetc/gtk-2.0/gtk.immodules

for item in gnome-vfs-mime-magic gnome-vfs-2.0
do
  cp -r $SW/etc/$item $pkgetc/
done

pkglib="$package/Contents/Resources/lib"
mkdir -p $pkglib/pango/1.4.0/modules
cp $SW/lib/pango/1.4.0/modules/*.so $pkglib/pango/1.4.0/modules/

mkdir -p $pkglib/gtk-2.0/2.4.0/{engines,immodules,loaders}
cp -r $SW/lib/gtk-2.0/2.4.0/engines/* $pkglib/gtk-2.0/2.4.0/engines/
cp $SW/lib/gtk-2.0/2.4.0/immodules/*.so $pkglib/gtk-2.0/2.4.0/immodules/
cp $SW/lib/gtk-2.0/2.4.0/loaders/*.so $pkglib/gtk-2.0/2.4.0/loaders/

mkdir -p $pkglib/gnome-vfs-2.0/modules
cp $SW/lib/gnome-vfs-2.0/modules/*.so $pkglib/gnome-vfs-2.0/modules/

# Find out libs we need from fink (e.g. $SW) - loop until no changes
a=1
nfiles=0
endl=true
while $endl; do
  echo "Looking for dependencies. Round " $a
  libs="`otool -L $pkglib/gtk-2.0/2.4.0/loaders/* $pkglib/gtk-2.0/2.4.0/immodules/* $pkglib/gtk-2.0/2.4.0/engines/*.so $pkglib/pango/1.4.0/modules/* $pkglib/gnome-vfs-2.0/modules/* $package/Contents/Resources/lib/* $binary 2>/dev/null | fgrep compatibility | cut -d\( -f1 | grep $SW | sort | uniq`"
  cp -f $libs $package/Contents/Resources/lib
  let "a+=1"  
  nnfiles=`ls $package/Contents/Resources/lib | wc -l`
  if [ $nnfiles = $nfiles ]; then
    endl=false
  else
    nfiles=$nnfiles
  fi
done

for libfile in $EXTRALIBS
do
  cp -f $libfile $package/Contents/Resources/lib
done

if [ "$strip" = "true" ]; then
  chmod +w "$package"/Contents/Resources/lib/*.dylib
  strip -x "$package"/Contents/Resources/lib/*.dylib
  strip -ur "$binpath"
fi

# NOTE: This works for all the dylibs but causes GTK to crash at startup.
#       Instead we leave them with their original install_names and set
#       DYLD_LIBRARY_PATH within the app bundle before running Inkscape.
#
# Fix package deps
#(cd "$package/Contents/MacOS/bin"
# for file in *; do
#    fixlib "$file"
# done
# cd ../lib
# for file in *; do
#    fixlib "$file"
# done)

# Get all the icons and the rest of the script framework
rsync -av $resdir/Resources/* $package/Contents/Resources/


# Make an image
#/usr/bin/hdiutil create -srcfolder "$pkg.app" "$pkg.dmg"
( cd macosx && ./osx-dmg.sh )