--- /dev/null
+#!/bin/sh
+
+# set -x
+
+# This script automates creating universal binaries of LyX on Mac.
+# Author: Bennett Helm (and extended by Konrad Hofbauer)
+# modified by Stephan Witt
+# Last modified: 17 April 2010
+
+# Prerequisite:
+# * a decent checkout of LyX sources (probably you have it already)
+# * Qt4 - build with static libraries for the used platforms (i386 and ppc)
+# * for aspell support:
+# the aspell sources placed in a sibling directory (variable ASpellSourceVersion)
+
+# Set these variables -- to
+# (1) the location of your Qt4 installation and optionally
+# (2) the location of resulting DMG
+# (3) the version of private aspell installation
+# (to define the location assign ASpellSourceDir instead)
+# (4) the list of architectures to build for
+
+QtInstallDir=${QTDIR:-"/opt/qt4"}
+DMGLocation=.. # one level above LyxSourceDir
+ASpellSourceVersion="aspell-0.60.6"
+ARCH_LIST="ppc i386"
+
+GetText="--with-included-gettext"
+ConfigureOptions="--enable-warnings --enable-optimization=-Os"
+
+# strip="-strip"
+
+# detection of script home
+LyxSourceDir=${1:-`dirname "$0"`}
+if [ ! -d "${LyxSourceDir}" ]; then
+ echo Missing LyX source directory.
+ exit 2
+fi
+case "${LyxSourceDir}" in
+/*/development)
+ LyxSourceDir=`dirname "${LyxSourceDir}"`
+ ;;
+/*)
+ ;;
+*/development|development)
+ LyxSourceDir=`dirname "${LyxSourceDir}"`
+ LyxSourceDir=`cd "${LyxSourceDir}";pwd`
+ ;;
+*)
+ LyxSourceDir=`cd "${LyxSourceDir}";pwd`
+ ;;
+esac
+
+ASpellSourceDir=${ASpellSourceDir:-`dirname "${LyxSourceDir}"`/${ASpellSourceVersion}}
+ASpellInstallDir=${ASpellInstallDir:-`dirname "${LyxSourceDir}"`/${ASpellSourceVersion}.lib}
+
+if [ ! -f "${LyxSourceDir}"/configure ]; then
+ ( cd "${LyxSourceDir}" && sh autogen.sh )
+fi
+if [ -z "${LyXVersion}" ]; then
+ LyXVersion=`grep AC_INIT "${LyxSourceDir}"/configure.ac | cut -d, -f2 | tr -d " ()"`
+fi
+
+LyxName="LyX"
+LyxBase="${LyxName}-${LyXVersion}"
+LyxApp="${LyxBase}.app"
+LyxAppDir=`dirname "${LyxSourceDir}"`/"${LyxBase}"
+LyxBuildDir="${LyxAppDir}.build"
+LyxAppPrefix="${LyxAppDir}.app"
+# if zip file is needed... remove the comment sign
+#LyxAppZip="${LyxAppPrefix}.zip"
+
+BuildSystem=`"${LyxSourceDir}/config/config.guess"`
+
+# ---------------------------------
+# DON'T MODIFY ANYTHING BELOW HERE!
+# ---------------------------------
+
+# These variables define the identifiers of the
+# system (both Intel and PowerPC) to compile for.
+# (Note: darwin8 is 10.4; darwin9 is 10.5.)
+# Only change these if necessary
+
+HostSystem_i386="i686-apple-darwin8"
+HostSystem_ppc="powerpc-apple-darwin8"
+
+# Check for existing SDKs
+# 10.6 cannot be used for 10.4 currently
+SDKs=`echo /Developer/SDKs/MacOSX10*sdk`
+case "$SDKs" in
+*10.6*)
+ MACOSX_DEPLOYMENT_TARGET="10.5"; export MACOSX_DEPLOYMENT_TARGET
+ SDKROOT="/Developer/SDKs/MacOSX10.5.sdk"; export SDKROOT
+ ;;
+*10.5*)
+ MACOSX_DEPLOYMENT_TARGET="10.4"; export MACOSX_DEPLOYMENT_TARGET
+ SDKROOT="/Developer/SDKs/MacOSX10.4u.sdk"; export SDKROOT
+ ;;
+*)
+ echo Unknown or missing SDK for Mac OS X.
+ exit 1
+ ;;
+esac
+
+if [ -d "${ASpellSourceDir}" -a ! -d "${ASpellInstallDir}" ]; then
+ # we have a private ASpell source tree at hand...
+ # so let's build and install it
+ if [ -z "${ASpellVersion}" ]; then
+ ASpellVersion=`grep AC_INIT "${ASpellSourceDir}"/configure.ac | cut -d, -f2|tr -d " ()"`
+ fi
+
+ ASpellName="Aspell"
+ ASpellBase="${ASpellName}-${ASpellVersion}"
+ ASpellLib="${ASpellBase}.lib"
+ ASpellLibDir=`dirname "${ASpellSourceDir}"`/"${ASpellBase}"
+ ASpellLibPrefix="${ASpellInstallDir:-${ASpellLibDir}.lib}"
+
+ # Clear Output
+ if [ -n "${ASpellLibZip}" -a -f "${ASpellLibZip}" ]; then rm "${ASpellLibZip}"; fi
+ if [ -d "${ASpellLibPrefix}" ]; then rm -r "${ASpellLibPrefix}"; fi
+
+ # ASpell builds inplace only :(
+ cd "${ASpellSourceDir}" && make distclean
+
+ # ----------------------------------------
+ # Build ASpell for different architectures
+ # ----------------------------------------
+ FILE_LIST="libaspell.15.dylib libpspell.15.dylib"
+
+ for arch in ${ARCH_LIST} ; do
+ LDFLAGS="${SDKROOT:+-isysroot ${SDKROOT}} -arch ${arch}"; export LDFLAGS
+ LDFLAGS="${CPPFLAGS}"; export LDFLAGS
+ HOSTSYSTEM=`eval "echo \\$HostSystem_$arch"`
+ "${ASpellSourceDir}/configure"\
+ --prefix="${ASpellLibPrefix}"\
+ ${ConfigureOptions}\
+ ${GetText} --host="${HOSTSYSTEM}" ${BuildSystem:+"--build=${BuildSystem}"} --enable-build-type=rel
+ make && make install${strip}
+ for file in ${FILE_LIST} ; do
+ if [ -f "${ASpellLibPrefix}"/lib/${file} ]; then
+ mv "${ASpellLibPrefix}"/lib/${file}\
+ "${ASpellLibPrefix}"/lib/${file}-${arch}
+ else
+ echo Cannot build and install ASpell for ${arch}.
+ exit 1
+ fi
+ done
+ make distclean
+ done
+ # -------------------------
+ # Create universal binaries
+ # -------------------------
+ for file in ${FILE_LIST} ; do
+ OBJ_LIST=
+ for arch in ${ARCH_LIST} ; do
+ OBJ_LIST="${OBJ_LIST} lib/${file}-${arch}"
+ done
+ (
+ cd "${ASpellLibPrefix}"
+ lipo -create ${OBJ_LIST} -o lib/${file}
+ )
+ done
+ # --------
+ # Clean up
+ # --------
+ for arch in ${ARCH_LIST} ; do
+ rm -f "${ASpellLibPrefix}"/lib/*-${arch}
+ done
+fi
+
+# Clear Output
+if [ -n "${LyxAppZip}" -a -f "${LyxAppZip}" ]; then rm "${LyxAppZip}"; fi
+if [ -d "${LyxAppPrefix}" ]; then rm -r "${LyxAppPrefix}"; fi
+
+# -------------------------------------
+# Build LyX for different architectures
+# -------------------------------------
+FILE_LIST="lyx lyxclient tex2lyx"
+
+if [ -d "${ASpellInstallDir}" ]; then
+ ConfigureOptions="${ConfigureOptions} --with-extra-inc=${ASpellInstallDir}/include"
+ ConfigureOptions="${ConfigureOptions} --with-extra-lib=${ASpellInstallDir}/lib"
+fi
+
+for arch in ${ARCH_LIST} ; do
+
+ if [ -d "${LyxBuildDir}" ]; then rm -r "${LyxBuildDir}"; fi
+ mkdir "${LyxBuildDir}" && cd "${LyxBuildDir}"
+
+ CPPFLAGS="${SDKROOT:+-isysroot ${SDKROOT}} -arch ${arch}"; export CPPFLAGS
+ LDFLAGS="${CPPFLAGS}"; export LDFLAGS
+ HOSTSYSTEM=`eval "echo \\$HostSystem_$arch"`
+
+ echo LDFLAGS="${LDFLAGS}"
+ echo CPPFLAGS="${CPPFLAGS}"
+ "${LyxSourceDir}/configure"\
+ --prefix="${LyxAppPrefix}" --with-version-suffix="-${LyXVersion}"\
+ ${QtInstallDir:+"--with-qt4-dir=${QtInstallDir}"} \
+ ${ConfigureOptions}\
+ ${GetText} --host="${HOSTSYSTEM}" --build="${BuildSystem}" --enable-build-type=rel
+ make && make install${strip}
+ for file in ${FILE_LIST} ; do
+ if [ -f "${LyxAppPrefix}"/Contents/MacOS/${file} ]; then
+ mv "${LyxAppPrefix}"/Contents/MacOS/${file}\
+ "${LyxAppPrefix}"/Contents/MacOS/${file}-${arch}
+ else
+ echo Cannot build and install LyX for ${arch}.
+ exit 1
+ fi
+ done
+done
+
+# -------------------------
+# Create universal binaries
+# -------------------------
+
+ASpellFramework="Frameworks/Aspell.framework"
+if [ -d "${ASpellInstallDir}" ]; then
+ ASpellDyLib=`basename "${ASpellInstallDir}/lib/"libaspell.*.dylib`
+ mkdir -p "${LyxAppPrefix}"/Contents/${ASpellFramework}/lib
+ cp -p "${ASpellInstallDir}/lib/${ASpellDyLib}" "${LyxAppPrefix}"/Contents/${ASpellFramework}/lib
+ install_name_tool -id "@executable_path/../${ASpellFramework}/lib/${ASpellDyLib}" "${LyxAppPrefix}"/Contents/${ASpellFramework}/lib/"${ASpellDyLib}"
+fi
+
+for file in ${FILE_LIST} ; do
+ OBJ_LIST=
+ for arch in ${ARCH_LIST} ; do
+ OBJ_LIST="${OBJ_LIST} Contents/MacOS/${file}-${arch}"
+ done
+ (
+ cd "${LyxAppPrefix}" &&
+ lipo -create ${OBJ_LIST} -o "${LyxAppPrefix}"/Contents/MacOS/${file}
+ )
+ if [ -d "${ASpellInstallDir}" ]; then
+ install_name_tool -change \
+ "${ASpellInstallDir}/lib/${ASpellDyLib}" "@executable_path/../${ASpellFramework}/${ASpellDyLib}" \
+ "${LyxAppPrefix}"/Contents/MacOS/${file}
+ fi
+done
+
+if [ -d "${ASpellInstallDir}" ]; then
+ if [ -d /opt/local/lib/aspell-0.60 ]; then ASpellInstallDir=/opt/local ; fi
+ mkdir -p "${LyxAppPrefix}"/Contents/${ASpellFramework}/lib
+ cp -p -r "${ASpellInstallDir}/lib/aspell-0.60" "${LyxAppPrefix}"/Contents/${ASpellFramework}/lib
+ mkdir -p "${LyxAppPrefix}"/Contents/${ASpellFramework}/share
+ cp -p -r "${ASpellInstallDir}/share/aspell" "${LyxAppPrefix}"/Contents/${ASpellFramework}/share
+fi
+
+# --------
+# Clean up
+# --------
+
+for arch in ${ARCH_LIST} ; do
+ rm -f "${LyxAppPrefix}"/Contents/MacOS/*-${arch}
+done
+
+# ------------------------------
+# Building distribution packages
+# ------------------------------
+
+test -n "${LyxAppZip}" && (
+ cd "${LyxAppPrefix}" && zip -r "${LyxAppZip}" .
+)
+
+DMGNAME="${LyxBase}-Uncompressed.dmg"
+DMGSIZE="350m"
+COMPRESSEDDMGNAME="${LyxBase}.dmg"
+BACKGROUND="${LyxBase}.app/Contents/Resources/images/banner.png"
+
+function set_bundle_display_options() {
+ osascript <<-EOF
+ tell application "Finder"
+ set f to POSIX file ("${1}" as string) as alias
+ tell folder f
+ open
+ tell container window
+ set toolbar visible to false
+ set statusbar visible to false
+ set current view to icon view
+ delay 1 -- sync
+ set the bounds to {20, 50, $2, $3}
+ end tell
+ delay 1 -- sync
+ set icon size of the icon view options of container window to 64
+ set arrangement of the icon view options of container window to not arranged
+ set position of item "${LyxName}.app" to {100,$4}
+ set position of item "Applications" to {280,$4}
+ set background picture of the icon view options\
+ of container window to file "background.png" of folder "Pictures"
+ set the bounds of the container window to {0, 0, $2, $3}
+ update without registering applications
+ delay 5 -- sync
+ close
+ end tell
+ delay 5 -- sync
+ end tell
+EOF
+
+}
+
+test -n "${DMGLocation}" && (
+ cd "${DMGLocation}"
+
+ BGSIZE=`file "$BACKGROUND" | awk -F , '/PNG/{print $2 }' | tr x ' '`
+ BG_W=`echo ${BGSIZE} | awk '{print $1 }'`
+ BG_H=`echo ${BGSIZE} | awk '{h = $2 + 20 ;print h }'`
+ BG_Y=`echo ${BGSIZE} | awk '{y = $2 - 60 ;print y }'`
+
+ rm -f ${DMGNAME}
+ rm -f ${COMPRESSEDDMGNAME}
+
+ hdiutil create -size ${DMGSIZE:-"250m"} -fs HFS+ -volname "${LyxBase}" "${DMGNAME}"
+ # Unmount currently mounted disk image
+ test -d /Volumes/"${LyxBase}" && umount /Volumes/"${LyxBase}"
+
+ # Mount the disk image
+ hdiutil attach ${DMGNAME}
+
+ # Obtain device information
+ DEVS=$(hdiutil attach ${DMGNAME} | cut -f 1)
+ DEV=$(echo $DEVS | cut -f 1 -d ' ')
+ VOLUME=$(mount |grep ${DEV} | cut -f 3 -d ' ')
+
+ # copy in the application bundle
+ cp -Rp ${LyxBase}.app ${VOLUME}/${LyxName}.app
+
+ # copy in background image
+ mkdir -p ${VOLUME}/Pictures
+ cp ${BACKGROUND} ${VOLUME}/Pictures/background.png
+ # symlink applications
+ ln -s /Applications/ ${VOLUME}/Applications
+ set_bundle_display_options ${VOLUME} ${BG_W} ${BG_H} ${BG_Y}
+ mv ${VOLUME}/Pictures ${VOLUME}/.Pictures
+
+ # Unmount the disk image
+ hdiutil detach ${DEV}
+
+ # Convert the disk image to read-only
+ hdiutil convert ${DMGNAME} -format UDBZ -o ${COMPRESSEDDMGNAME}
+ rm -f ${DMGNAME}
+)