diff --git a/packaging/osx/OpenRA.app/Contents/Info.plist b/packaging/osx/OpenRA.app/Contents/Info.plist new file mode 100755 index 0000000000..5b8182b3f7 --- /dev/null +++ b/packaging/osx/OpenRA.app/Contents/Info.plist @@ -0,0 +1,12 @@ + + + + + CFBundleIdentifier + OpenRA + CFBundleExecutable + OpenRA + CFBundleIconFile + OpenRA.icns + + diff --git a/packaging/osx/OpenRA.app/Contents/MacOS/OpenRA b/packaging/osx/OpenRA.app/Contents/MacOS/OpenRA new file mode 100755 index 0000000000..0fc1636097 --- /dev/null +++ b/packaging/osx/OpenRA.app/Contents/MacOS/OpenRA @@ -0,0 +1,16 @@ +#!/bin/bash + +# Where is the game we are trying to load? +GAME_DIR="/Users/paul/src/OpenRA/" + +# Find where we are and what we want to run +APP_PATH=`echo $0 | awk '{split($0,patharr,"/"); idx=1; while(patharr[idx+3] != "") { if (patharr[idx] != "/") {printf("%s/", patharr[idx]); idx++ }} }'` +EXE_DIR="$APP_PATH/Contents/MacOS/" + +# Override paths so mono can find itself and the libraries it depends on +export MONO_PATH="$APP_PATH/Contents/Frameworks/Mono.framework/Versions/2.6.3/lib/" +export LD_LIBRARY_PATH="$MONO":"$MONO_PATH" +export MONO_LOG_LEVEL=debug +# Run the game +cd $GAME_DIR +${EXE_DIR}mono OpenRA.Game.exe \ No newline at end of file diff --git a/packaging/osx/OpenRA.app/Contents/Resources/OpenRA.icns b/packaging/osx/OpenRA.app/Contents/Resources/OpenRA.icns new file mode 100755 index 0000000000..c5b938fbc0 Binary files /dev/null and b/packaging/osx/OpenRA.app/Contents/Resources/OpenRA.icns differ diff --git a/packaging/osx/package.sh b/packaging/osx/package.sh new file mode 100755 index 0000000000..5357e00df3 --- /dev/null +++ b/packaging/osx/package.sh @@ -0,0 +1,100 @@ +#!/bin/sh +# OpenRA Packaging script for osx +# Creates a .app bundle for OpenRA +# Patches and packages mono to work from within the app bundle + +# A list of the binaries that may contain references to dependencies in the gac +DEPS_LOCAL="OpenRA.Game.exe OpenRA.Gl.dll OpenRA.FileFormats.dll" + +# A list of external dependencies, (aside from mono) +# Note: references to frameworks are currently hardcoded in the .config hacking step +DEPS_FRAMEWORKS="/Library/Frameworks/Cg.framework /Library/Frameworks/SDL.framework" + +PACKAGING_DIR="osxbuild" +SYSTEM_MONO="/Library/Frameworks/Mono.framework/Versions/2.6.3" +LOCAL_MONO="$PACKAGING_DIR/OpenRA.app/Contents/Frameworks/Mono.framework/Versions/2.6.3" + + + +# Todo: make this go away when we kill the gac stuff +# dylibs referred to by dlls in the gac; won't show up to otool +GAC_DYLIBS="$SYSTEM_MONO/lib/libMonoPosixHelper.dylib $SYSTEM_MONO/lib/libgdiplus.dylib " + + + +mkdir -p $PACKAGING_DIR/OpenRA.app/ +cp -r ./packaging/osx/OpenRA.app/* $PACKAGING_DIR/OpenRA.app/ + +function patch_mono { + echo "Patching: "$1 + LIBS=$( otool -L $1 | grep /Library/Frameworks/Mono.framework/ | awk {'print $1'} ) + for i in $LIBS; do + install_name_tool -change $i @executable_path/../${i:9} $1 + done + for i in $LIBS; do + if [ ! -e $PACKAGING_DIR/OpenRA.app/Contents/${i:9} ]; then + mkdir -p $PACKAGING_DIR/OpenRA.app/Contents/`dirname ${i:9}` + cp $i $PACKAGING_DIR/OpenRA.app/Contents/`dirname ${i:9}` + patch_mono $PACKAGING_DIR/OpenRA.app/Contents/${i:9} + fi + done +} + +# Setup environment for mkbundle +# Force 32-bit build and set the pkg-config path for mono.pc +export AS="as -arch i386" +export CC="gcc -arch i386 -mmacosx-version-min=10.5 -isysroot /Developer/SDKs/MacOSX10.5.sdk" +export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/Library/Frameworks/Mono.framework/Versions/Current/lib/pkgconfig/ +export PATH=/sw/bin:/sw/sbin:$PATH + +# Copy and patch mono +echo "Copying and patching mono..." + +mkdir -p "$LOCAL_MONO/bin/" +cp "$SYSTEM_MONO/bin/mono" "$PACKAGING_DIR/OpenRA.app/Contents/MacOS/" +patch_mono "$PACKAGING_DIR/OpenRA.app/Contents/MacOS/mono" + +# Copy the gac dylibs into the app bundle +for i in $GAC_DYLIBS; do + mkdir -p $PACKAGING_DIR/OpenRA.app/Contents/`dirname ${i:9}` + cp $i $PACKAGING_DIR/OpenRA.app/Contents/`dirname ${i:9}` + patch_mono $PACKAGING_DIR/OpenRA.app/Contents/${i:9} +done + + +# Find the dlls that are used by the game; copy them into the app bundle and patch/package any dependencies +echo "Determining dlls used by the game..." + +DLL_DIR="$LOCAL_MONO/lib" + +# This is a huge hack, but reliably gets us the dlls to include +DLLS=`mkbundle --deps --static -z -c -o OpenRA $DEPS_LOCAL | grep "embedding: "` +for i in $DLLS; do + if [ "$i" != "embedding:" ]; then + cp $i $DLL_DIR + if [ -e "$i.config" ]; then + CONFIG="$DLL_DIR/`basename $i`.config" + echo "Patching config `basename $CONFIG`" + # Remove any references to the hardcoded mono framework; the game will look in the right location anyway + #sed "s/\/Library\/Frameworks\/Mono.framework\/Versions\/2.6.3\/lib\///" "$i.config" > "${CONFIG}_1" + sed "s/\/Library\/Frameworks\/Mono.framework/..\/Mono.framework/" "$i.config" > "${CONFIG}" +# sed "s/\/Library\/Frameworks\/Cg.framework/..\/Cg.framework/" "${CONFIG}_1" > "${CONFIG}_2" +# sed "s/\/Library\/Frameworks\/SDL.framework/..\/SDL.framework/" "${CONFIG}_2" > $CONFIG +# rm "${CONFIG}_1" "${CONFIG}_2" + fi + fi +done + + +# Remove the files themselves that we accidentally copied over +for i in $DEPS_LOCAL; do + rm "$DLL_DIR/$i" +done + +# Copy external frameworks +#echo "Copying external frameworks..." +#for i in $DEPS_FRAMEWORKS; do +# cp -RL $i $PACKAGING_DIR/OpenRA.app/Contents/${i:9} +#done + +echo "All Done!"