lyx_mirror/development/LyX-Mac-binary-release.sh
Stephan Witt c4d0213301 build script for universal binary release with spellchecker included
git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@34101 a592a061-630c-0410-9148-cb99ea01b6c8
2010-04-09 12:09:11 +00:00

342 lines
10 KiB
Bash

#!/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}
)