From fb43bbbf6c7529cb0165b5c7f3e0be5cfaf00626 Mon Sep 17 00:00:00 2001 From: Stephan Witt Date: Wed, 14 Apr 2010 13:22:00 +0000 Subject: [PATCH] tiger support on mac snow leopard, include Qt4 frameworks, smart build script with parameters git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@34132 a592a061-630c-0410-9148-cb99ea01b6c8 --- INSTALL.MacOSX | 32 +- config/spell.m4 | 11 + development/LyX-Mac-binary-release.sh | 410 ++++++++++++++++++-------- src/AspellChecker.cpp | 22 +- src/support/Path.cpp | 9 +- src/support/linkback/LinkBackServer.m | 4 + 6 files changed, 355 insertions(+), 133 deletions(-) diff --git a/INSTALL.MacOSX b/INSTALL.MacOSX index fd515b728c..4c02c4a716 100644 --- a/INSTALL.MacOSX +++ b/INSTALL.MacOSX @@ -21,8 +21,8 @@ so steps 2 and 3 can be skipped in these cases. Those wanting to build developmental versions must have automake and gettext as well. -1. Qt/Mac Opensource Edition, version 4. This library is GPL- -licensed and can be downloaded from +1. Qt/Mac Opensource Edition, version 4. +This library is GPL-licensed and can be downloaded from . To compile it, create a directory where you want to install QT4. In the following, the full path to this directory is called /path/to/QT4 @@ -32,8 +32,19 @@ Qt source hierarcy, and enter: ./configure -static -no-exceptions -nomake examples -nomake tools -nomake demos -prefix /path/to/QT4 make make install - cd /path/to/QT4/lib - rm *.la + rm /path/to/QT4/lib/*.la + + with Qt4.6.2 and snow leopard it becomes: + + CC=gcc-4.0 OBJC=gcc-4.0 CXX=g++-4.0\ + ./configure -opensource -silent -static -release -universal -fast\ + -sdk /Developer/SDKs/MacOSX10.4u.sdk\ + -no-framework -no-exceptions -no-webkit -no-qt3support -no-javascript-jit -no-dbus\ + -nomake examples -nomake demos -nomake docs\ + -nomake tools\ + -prefix /path/to/QT4 + make + make install 2. [Needed only for developmental builds:] automake, version 1.10 or higher (check with automake --version). Probably the easiest @@ -56,6 +67,13 @@ the simplest way is through MacPorts: sudo port install pkgconfig +5. To build with included spell checker (ASpell): +The aspell library is GPL-licensed and can be downloaded from +ftp://ftp.gnu.org/gnu/aspell or one of the mirrors. +At the time of writing aspell-0.60.tar.gz is the current version. +Unpack the tarball in the same directory where you placed the +svn checkout or LyX tarball. + BUILD INSTRUCTIONS In what follows, /path/to/LyX.app is the location where you want LyX @@ -75,8 +93,8 @@ Then, cd to the top of the LyX source hierarchy, and enter: make make install-strip -(Note that the --with-version-suffix=-1.6 option will result in LyX's -user's directory being located at ~/Library/Application Support/LyX-1.6) +(Note that the --with-version-suffix=-2.0 option will result in LyX's +user's directory being located at ~/Library/Application Support/LyX-2.0) (b) Developmental Versions (svn checkouts) @@ -91,7 +109,7 @@ If you did not install pkg-config, first set the LDFLAGS variable: Then, cd to the top of the LyX source hierarchy, and enter: ./autogen.sh - ./configure --prefix=/path/to/LyX.app --with-version-suffix=-1.6 --with-qt4-dir=/path/to/QT4 --with-included-gettext --enable-optimization=-O2 --disable-stdlib-debug + ./configure --prefix=/path/to/LyX.app --with-version-suffix=-2.0 --with-qt4-dir=/path/to/QT4 --with-included-gettext --enable-optimization=-O2 --disable-stdlib-debug make make install-strip diff --git a/config/spell.m4 b/config/spell.m4 index 0a94bc057a..e06fb23dfd 100644 --- a/config/spell.m4 +++ b/config/spell.m4 @@ -67,12 +67,23 @@ AC_DEFUN([CHECK_WITH_HUNSPELL], fi ]) + ### Check if we want spell libraries, prefer new aspell or hunspell AC_DEFUN([LYX_CHECK_SPELL_ENGINES], [ CHECK_WITH_ASPELL AM_CONDITIONAL(USE_ASPELL, $lyx_use_aspell) + if $lyx_use_aspell ; then +### Check for aspell framework name + LYX_WITH_DIR([aspell-framework],[name of aspell framework],aspell_framework, NONE) + if ! test "x${lyx_cv_aspell_framework}" = xNONE; then + AC_DEFINE_UNQUOTED([ASPELL_FRAMEWORK], "${lyx_cv_aspell_framework}") + else + AC_DEFINE(ASPELL_FRAMEWORK, [""], [Define as name of aspell framework]) + fi + fi + CHECK_WITH_ENCHANT AM_CONDITIONAL(USE_ENCHANT, $lyx_use_enchant) diff --git a/development/LyX-Mac-binary-release.sh b/development/LyX-Mac-binary-release.sh index 50b2b5335f..15eda536b4 100644 --- a/development/LyX-Mac-binary-release.sh +++ b/development/LyX-Mac-binary-release.sh @@ -9,26 +9,90 @@ # Prerequisite: # * a decent checkout of LyX sources (probably you have it already) -# * Qt4 - build with static libraries for the used platforms (i386 and ppc) +# * Qt4 - build with shared or static libraries for the used platforms (i386 and ppc) # * for aspell support: # the aspell sources placed in a sibling directory (variable ASpellSourceVersion) +ConfigureOptions="--enable-warnings --enable-optimization=-Os --with-included-gettext" +dict_deployment="yes" +qt4_deployment="yes" +MACOSX_DEPLOYMENT_TARGET="10.4" # Tiger support is default + +usage() { + echo Build script for LyX on Mac OS X + echo + echo Optional arguments: + echo " --tiger-support=yes|no ....." default yes + echo " --dict-deployment=yes|no ..." default yes + echo " --qt4-deployment=yes|no ...." default yes + echo " --with-arch=ARCH ..........." default ppc,i386 + echo " --with-build-path=PATH ....." default \${lyx-src-dir}/../lyx-build + echo " --with-dmg-location=PATH ..." default \${build-path} + echo + echo "All other arguments with -- are passed to configure" + echo "including the defaults: ${ConfigureOptions}" + echo + exit 0 +} + +while [ $# -gt 0 ]; do + case "${1}" in + --with-qt4-dir=*) + QTDIR=`echo ${1}|cut -d= -f2` + shift + ;; + --tiger-support=[Nn][Oo]) + MACOSX_DEPLOYMENT_TARGET="" + MYCFLAGS="" + shift + ;; + --dict-deployment=*) + dict_deployment=`echo ${1}|cut -d= -f2` + shift + ;; + --qt4-deployment=*) + qt4_deployment=`echo ${1}|cut -d= -f2` + shift + ;; + --with-arch=*) + ARCH=`echo ${1}|cut -d= -f2|tr ',' ' '` + ARCH_LIST="${ARCH_LIST} ${ARCH}" + shift + ;; + --with-dmg-location=*) + DMGLocation=`echo ${1}|cut -d= -f2` + shift + ;; + --with-build-path=*) + LyxBuildDir=`echo ${1}|cut -d= -f2` + shift + ;; + --help) + usage + ;; + --*) + ConfigureOptions="${ConfigureOptions} ${1}" + shift + ;; + *) + break + ;; + esac +done + # Set these variables -- to -# (1) the location of your Qt4 installation and optionally +# (1) the location of your Qt4 installation # (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 +QtFrameworkVersion="4" ASpellSourceVersion="aspell-0.60.6" -ARCH_LIST="ppc i386" +ARCH_LIST=${ARCH_LIST:-"ppc i386"} -GetText="--with-included-gettext" -ConfigureOptions="--enable-warnings --enable-optimization=-Os" - -# strip="-strip" +strip="-strip" # detection of script home LyxSourceDir=${1:-`dirname "$0"`} @@ -51,8 +115,11 @@ case "${LyxSourceDir}" in ;; esac -ASpellSourceDir=${ASpellSourceDir:-`dirname "${LyxSourceDir}"`/${ASpellSourceVersion}} -ASpellInstallDir=${ASpellInstallDir:-`dirname "${LyxSourceDir}"`/${ASpellSourceVersion}.lib} +LyxBuildDir=${LyxBuildDir:-`dirname "${LyxSourceDir}"`/lyx-build} +DMGLocation=${DMGLocation:-"${LyxBuildDir}"} + +ASpellSourceDir=${ASPELLDIR:-`dirname "${LyxSourceDir}"`/${ASpellSourceVersion}} +ASpellInstallDir=${ASpellInstallDir:-"${LyxBuildDir}"/${ASpellSourceVersion}.lib} if [ ! -f "${LyxSourceDir}"/configure ]; then ( cd "${LyxSourceDir}" && sh autogen.sh ) @@ -64,7 +131,7 @@ fi LyxName="LyX" LyxBase="${LyxName}-${LyXVersion}" LyxApp="${LyxBase}.app" -LyxAppDir=`dirname "${LyxSourceDir}"`/"${LyxBase}" +LyxAppDir="${LyxBuildDir}"/"${LyxBase}" LyxBuildDir="${LyxAppDir}.build" LyxAppPrefix="${LyxAppDir}.app" # if zip file is needed... remove the comment sign @@ -84,13 +151,27 @@ BuildSystem=`"${LyxSourceDir}/config/config.guess"` HostSystem_i386="i686-apple-darwin8" HostSystem_ppc="powerpc-apple-darwin8" +DMGNAME="${LyxBase}-Uncompressed.dmg" +DMGSIZE="550m" +COMPRESSEDDMGNAME="${LyxBase}.dmg" +BACKGROUND="${LyxAppDir}.app/Contents/Resources/images/banner.png" + # 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 + MACOSX_DEPLOYMENT_TARGET=${MACOSX_DEPLOYMENT_TARGET:-"10.5"}; export MACOSX_DEPLOYMENT_TARGET + case "${MACOSX_DEPLOYMENT_TARGET}" in + 10.5) + SDKROOT="/Developer/SDKs/MacOSX10.5.sdk"; export SDKROOT + ;; + 10.4) + SDKROOT="/Developer/SDKs/MacOSX10.4u.sdk"; export SDKROOT + CC=gcc-4.0 ; export CC + CXX=g++-4.0 ; export CXX + OBJC=gcc-4.0 ; export OBJC + ;; + esac ;; *10.5*) MACOSX_DEPLOYMENT_TARGET="10.4"; export MACOSX_DEPLOYMENT_TARGET @@ -101,6 +182,7 @@ case "$SDKs" in exit 1 ;; esac +MYCFLAGS="-mmacosx-version-min=${MACOSX_DEPLOYMENT_TARGET}" if [ -d "${ASpellSourceDir}" -a ! -d "${ASpellInstallDir}" ]; then # we have a private ASpell source tree at hand... @@ -111,13 +193,12 @@ if [ -d "${ASpellSourceDir}" -a ! -d "${ASpellInstallDir}" ]; then ASpellName="Aspell" ASpellBase="${ASpellName}-${ASpellVersion}" - ASpellLib="${ASpellBase}.lib" - ASpellLibDir=`dirname "${ASpellSourceDir}"`/"${ASpellBase}" - ASpellLibPrefix="${ASpellInstallDir:-${ASpellLibDir}.lib}" + + echo Build aspell library ${ASpellBase} # Clear Output if [ -n "${ASpellLibZip}" -a -f "${ASpellLibZip}" ]; then rm "${ASpellLibZip}"; fi - if [ -d "${ASpellLibPrefix}" ]; then rm -r "${ASpellLibPrefix}"; fi + if [ -d "${ASpellInstallDir}" ]; then rm -r "${ASpellInstallDir}"; fi # ASpell builds inplace only :( cd "${ASpellSourceDir}" && make distclean @@ -128,18 +209,18 @@ if [ -d "${ASpellSourceDir}" -a ! -d "${ASpellInstallDir}" ]; then FILE_LIST="libaspell.15.dylib libpspell.15.dylib" for arch in ${ARCH_LIST} ; do + CPPFLAGS="${SDKROOT:+-isysroot ${SDKROOT}} -arch ${arch} ${MYCFLAGS}"; export CPPFLAGS LDFLAGS="${SDKROOT:+-isysroot ${SDKROOT}} -arch ${arch}"; export LDFLAGS - LDFLAGS="${CPPFLAGS}"; export LDFLAGS HOSTSYSTEM=`eval "echo \\$HostSystem_$arch"` "${ASpellSourceDir}/configure"\ - --prefix="${ASpellLibPrefix}"\ + --prefix="${ASpellInstallDir}"\ ${ConfigureOptions}\ - ${GetText} --host="${HOSTSYSTEM}" ${BuildSystem:+"--build=${BuildSystem}"} --enable-build-type=rel + --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} + if [ -f "${ASpellInstallDir}"/lib/${file} ]; then + mv "${ASpellInstallDir}"/lib/${file}\ + "${ASpellInstallDir}"/lib/${file}-${arch} else echo Cannot build and install ASpell for ${arch}. exit 1 @@ -156,7 +237,7 @@ if [ -d "${ASpellSourceDir}" -a ! -d "${ASpellInstallDir}" ]; then OBJ_LIST="${OBJ_LIST} lib/${file}-${arch}" done ( - cd "${ASpellLibPrefix}" + cd "${ASpellInstallDir}" lipo -create ${OBJ_LIST} -o lib/${file} ) done @@ -164,108 +245,186 @@ if [ -d "${ASpellSourceDir}" -a ! -d "${ASpellInstallDir}" ]; then # Clean up # -------- for arch in ${ARCH_LIST} ; do - rm -f "${ASpellLibPrefix}"/lib/*-${arch} + rm -f "${ASpellInstallDir}"/lib/*-${arch} done fi -# Clear Output -if [ -n "${LyxAppZip}" -a -f "${LyxAppZip}" ]; then rm "${LyxAppZip}"; fi -if [ -d "${LyxAppPrefix}" ]; then rm -r "${LyxAppPrefix}"; fi +framework_name() { + echo "Frameworks/${1}.framework" +} -# ------------------------------------- -# Build LyX for different architectures -# ------------------------------------- FILE_LIST="lyx lyxclient tex2lyx" +BUNDLE_PATH="Contents/MacOS" +LYX_BUNDLE_PATH="${LyxAppPrefix}/${BUNDLE_PATH}" +build_lyx() { + # Clear Output + if [ -n "${LyxAppZip}" -a -f "${LyxAppZip}" ]; then rm "${LyxAppZip}"; fi + if [ -d "${LyxAppPrefix}" ]; then rm -rf "${LyxAppPrefix}"; fi -if [ -d "${ASpellInstallDir}" ]; then - ConfigureOptions="${ConfigureOptions} --with-extra-inc=${ASpellInstallDir}/include" - ConfigureOptions="${ConfigureOptions} --with-extra-lib=${ASpellInstallDir}/lib" -fi + # ------------------------------------- + # Build LyX for different architectures + # ------------------------------------- -for arch in ${ARCH_LIST} ; do + if [ -d "${ASpellInstallDir}" ]; then + ASpellFramework=`framework_name Aspell` + ASpellFramework=`basename "${ASpellFramework}"` + ConfigureOptions="${ConfigureOptions} --with-extra-inc=${ASpellInstallDir}/include" + ConfigureOptions="${ConfigureOptions} --with-extra-lib=${ASpellInstallDir}/lib" + ConfigureOptions="${ConfigureOptions} --with-aspell-framework=${ASpellFramework}" + fi - if [ -d "${LyxBuildDir}" ]; then rm -r "${LyxBuildDir}"; fi - mkdir "${LyxBuildDir}" && cd "${LyxBuildDir}" + for arch in ${ARCH_LIST} ; do - CPPFLAGS="${SDKROOT:+-isysroot ${SDKROOT}} -arch ${arch}"; export CPPFLAGS - LDFLAGS="${CPPFLAGS}"; export LDFLAGS - HOSTSYSTEM=`eval "echo \\$HostSystem_$arch"` + if [ -d "${LyxBuildDir}" ]; then rm -r "${LyxBuildDir}"; fi + mkdir "${LyxBuildDir}" && cd "${LyxBuildDir}" - 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 + CPPFLAGS="${SDKROOT:+-isysroot ${SDKROOT}} -arch ${arch} ${MYCFLAGS}"; export CPPFLAGS + LDFLAGS="${SDKROOT:+-isysroot ${SDKROOT}} -arch ${arch}"; export LDFLAGS + HOSTSYSTEM=`eval "echo \\$HostSystem_$arch"` + + echo LDFLAGS="${LDFLAGS}" + echo CPPFLAGS="${CPPFLAGS}" + echo CONFIGURE_OPTIONS="${ConfigureOptions}" + "${LyxSourceDir}/configure"\ + --prefix="${LyxAppPrefix}" --with-version-suffix="-${LyXVersion}"\ + ${QtInstallDir:+"--with-qt4-dir=${QtInstallDir}"} \ + ${ConfigureOptions}\ + --host="${HOSTSYSTEM}" --build="${BuildSystem}" --enable-build-type=rel + make && make install${strip} + for file in ${FILE_LIST} ; do + if [ -f "${LYX_BUNDLE_PATH}/${file}" ]; then + mv "${LYX_BUNDLE_PATH}/${file}"\ + "${LYX_BUNDLE_PATH}/${file}-${arch}" + else + echo ERROR: Cannot build and install LyX for ${arch}. + exit 1 + fi + done done -done +} + +content_directory() { + target="$1" + content=`dirname "${target}"` + content=`dirname "${content}"` + echo "${content}" +} + +private_framework() { + fwdir=`framework_name "$1"` + source="$2" + target="$3" + condir=`content_directory "${target}"` + libnm=`basename "${source}"` + mkdir -p "${condir}/${fwdir}" + if [ ! -f "${condir}/${fwdir}/${libnm}" ]; then + cp -p "${source}" "${condir}/${fwdir}" + echo Set library id in "${condir}/${fwdir}/${libnm}" + install_name_tool -id "@executable_path/../${fwdir}/${libnm}" "${condir}/${fwdir}/${libnm}" + fi + echo Correct library id reference to "${libnm}" in "${target}" + install_name_tool -change "${source}" "@executable_path/../${fwdir}/${libnm}" "${target}" +} + +deploy_qtlibs() { + source="${QtInstallDir}" + target="$1" + version="Versions/${QtFrameworkVersion}/" + condir=`content_directory "${target}"` + mkdir -p "${condir}/Resources" + test -f "${condir}/Resources/qt.conf" || cat - > "${condir}/Resources/qt.conf" <<-EOF +[Paths] +Plugins = PlugIns +EOF + if [ ! -d "${condir}/PlugIns" ]; then + mkdir -p "${condir}/PlugIns" + find "${source}/plugins" -name \*.dylib -print | while read libname ; do + echo Copy plugin "${libname}" + dylib=`basename "${libname}"` + dirname=`dirname "${libname}"` + dirname=`basename "${dirname}"` + mkdir -p "${condir}/PlugIns/${dirname}" + cp -p "${libname}" "${condir}/PlugIns/${dirname}" + done + fi + # don't change order here... + for libnm in QtSvg QtXml QtGui QtNetwork QtCore ; do + fwdir=`framework_name "$libnm"` + dirname=`basename "${fwdir}"` + test -d "${condir}/${fwdir}" || ( + echo Copy framework "${source}/lib/"`basename "${fwdir}"` + cp -pR "${source}/lib/"`basename "${fwdir}"` "${condir}/${fwdir}" + echo Set library id in "${condir}/${fwdir}/${version}${libnm}" + install_name_tool -id "@executable_path/../${fwdir}/${version}${libnm}" "${condir}/${fwdir}/${version}${libnm}" + find "${condir}/PlugIns" "${condir}/"`dirname "${fwdir}"` -name Headers -prune -o -type f -print | while read filename ; do + otool -L "${filename}" 2>/dev/null | while read library ; do + # pattern match for: /path/to/qt4/lib/QtGui.framework/Versions/4/QtGui (compatibility version 4.6.0, current version 4.6.2) + case "${library}" in + *"${libnm}"*"("*")"*) + echo Correct library id reference to "${libnm}" in "${filename}" + install_name_tool -change\ + "${source}/lib/${dirname}/${version}${libnm}"\ + "@executable_path/../${fwdir}/${version}${libnm}"\ + "${filename}" + ;; + esac + done + done + ) + echo Correct library id reference to "${libnm}" in "${target}" + install_name_tool -change\ + "${source}/lib/${dirname}/${version}${libnm}"\ + "@executable_path/../${fwdir}/${version}${libnm}"\ + "${target}" + 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}" +convert_universal() { + cd "${LyxAppPrefix}" + for file in ${FILE_LIST} ; do + OBJ_LIST= + for arch in ${ARCH_LIST} ; do + if [ -f "${BUNDLE_PATH}/${file}-${arch}" ]; then + OBJ_LIST="${OBJ_LIST} ${BUNDLE_PATH}/${file}-${arch}" + fi + done + if [ -n "${OBJ_LIST}" ]; then + lipo -create ${OBJ_LIST} -o "${BUNDLE_PATH}/${file}" + fi + if [ -d "${ASpellInstallDir}" ]; then + private_framework Aspell "${ASpellInstallDir}/lib/libaspell.15.dylib" "${LYX_BUNDLE_PATH}/${file}" + fi + if [ -d "${QtInstallDir}/lib/QtCore.framework/Versions/${QtFrameworkVersion}" -a "yes" = "${qt4_deployment}" ]; then + deploy_qtlibs "${LYX_BUNDLE_PATH}/${file}" + fi + otool -L "${BUNDLE_PATH}/${file}" | while read reference ; do + case "${reference}" in + *"${LyxBuildDir}"*"("*")") + echo ERROR: Bad reference to "${reference}" found!! + ;; + esac + done 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} + for arch in ${ARCH_LIST} ; do + rm -f ${BUNDLE_PATH}/*-${arch} + done +} + +copy_dictionaries() { + if [ -d "${ASpellInstallDir}" -a "yes" = "${dict_deployment}" ]; then + ASpellFramework=`framework_name Aspell` + ASpellResources="${LyxAppPrefix}/Contents/${ASpellFramework}/Resources" + # try to reuse macports dictionaries for now + if [ -d /opt/local/lib/aspell-0.60 ]; then ASpellInstallDir=/opt/local ; fi + mkdir -p "${ASpellResources}" + echo Copy Aspell dictionaries from "${ASpellInstallDir}" + cp -p -r "${ASpellInstallDir}/lib/aspell-0.60" "${ASpellResources}"/data + cp -p -r "${ASpellInstallDir}/share/aspell" "${ASpellResources}"/dict 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 @@ -295,11 +454,10 @@ function set_bundle_display_options() { delay 5 -- sync end tell EOF - } -test -n "${DMGLocation}" && ( - cd "${DMGLocation}" +function make_dmg() { + cd "${1}" BGSIZE=`file "$BACKGROUND" | awk -F , '/PNG/{print $2 }' | tr x ' '` BG_W=`echo ${BGSIZE} | awk '{print $1 }'` @@ -309,20 +467,20 @@ test -n "${DMGLocation}" && ( rm -f ${DMGNAME} rm -f ${COMPRESSEDDMGNAME} - hdiutil create -size ${DMGSIZE:-"250m"} -fs HFS+ -volname "${LyxBase}" "${DMGNAME}" + hdiutil create -type SPARSE -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} + hdiutil attach ${DMGNAME}.sparseimage # Obtain device information - DEVS=$(hdiutil attach ${DMGNAME} | cut -f 1) + DEVS=$(hdiutil attach ${DMGNAME}.sparseimage | 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 + cp -Rp ${LyxAppDir}.app ${VOLUME}/${LyxName}.app # copy in background image mkdir -p ${VOLUME}/Pictures @@ -336,6 +494,20 @@ test -n "${DMGLocation}" && ( hdiutil detach ${DEV} # Convert the disk image to read-only - hdiutil convert ${DMGNAME} -format UDBZ -o ${COMPRESSEDDMGNAME} - rm -f ${DMGNAME} + hdiutil convert ${DMGNAME}.sparseimage -format UDBZ -o ${COMPRESSEDDMGNAME} + rm -f ${DMGNAME}.sparseimage +} + +build_lyx +convert_universal +copy_dictionaries + +# ------------------------------ +# Building distribution packages +# ------------------------------ + +test -n "${LyxAppZip}" && ( + cd "${LyxAppPrefix}" && zip -r "${LyxAppZip}" . ) + +test -n "${DMGLocation}" && make_dmg "${DMGLocation}" diff --git a/src/AspellChecker.cpp b/src/AspellChecker.cpp index 71475544a4..4c16630aaf 100644 --- a/src/AspellChecker.cpp +++ b/src/AspellChecker.cpp @@ -91,13 +91,29 @@ AspellConfig * getConfig() AspellConfig * config = new_aspell_config(); #ifdef __APPLE__ char buf[2048] ; + bool have_dict = false; +#ifdef ASPELL_FRAMEWORK + char * framework = ASPELL_FRAMEWORK ; - if ( getPrivateFrameworkPathName(buf, sizeof(buf), "Aspell.framework") ) { + if ( strlen(framework) && getPrivateFrameworkPathName(buf, sizeof(buf), framework) ) { lyx::support::FileName const base(buf); + lyx::support::FileName const data(base.absFilename() + "/Resources/data"); + lyx::support::FileName const dict(base.absFilename() + "/Resources/dict"); + LYXERR(Debug::FILES, "aspell bundle path: " << buf); + have_dict = dict.isDirectory() && data.isDirectory(); + if (have_dict) { + aspell_config_replace(config, "dict-dir", dict.absFilename().c_str()); + aspell_config_replace(config, "data-dir", data.absFilename().c_str()); + LYXERR(Debug::FILES, "aspell dict: " << dict); + } + } +#endif + if ( !have_dict ) { + lyx::support::FileName const base("/opt/local"); // check for mac-ports data lyx::support::FileName const data(base.absFilename() + "/lib/aspell-0.60"); lyx::support::FileName const dict(base.absFilename() + "/share/aspell"); - LYXERR(Debug::FILES, "aspell bundle path: " << buf); - if (dict.isDirectory() && data.isDirectory()) { + have_dict = dict.isDirectory() && data.isDirectory(); + if (have_dict) { aspell_config_replace(config, "dict-dir", dict.absFilename().c_str()); aspell_config_replace(config, "data-dir", data.absFilename().c_str()); LYXERR(Debug::FILES, "aspell dict: " << dict); diff --git a/src/support/Path.cpp b/src/support/Path.cpp index 7bac78aa37..36837f6f9a 100644 --- a/src/support/Path.cpp +++ b/src/support/Path.cpp @@ -72,18 +72,19 @@ int getPrivateFrameworkPathName(char * buf, unsigned len, char const * framework { // Get our application's main bundle from Core Foundation CFBundleRef myAppsBundle = CFBundleGetMainBundle(); + int result = 0 ; if (NULL != myAppsBundle) { CFURLRef baseURL = CFBundleCopyPrivateFrameworksURL( myAppsBundle ); if (NULL != baseURL) { CFURLRef bundleURL = CFURLCreateCopyAppendingPathComponent( kCFAllocatorSystemDefault, baseURL, - CFStringCreateWithCString(kCFAllocatorSystemDefault, framework, kCFStringEncodingMacRoman), + CFStringCreateWithCString( kCFAllocatorSystemDefault, framework, CFStringGetSystemEncoding() ), false ); - if ( NULL != bundleURL && CFURLGetFileSystemRepresentation(bundleURL, TRUE, (UInt8*)buf, len) ) { - return 1 ; + if (NULL != bundleURL) { + result = CFURLGetFileSystemRepresentation( bundleURL, TRUE, (UInt8*)buf, len ); } } } - return 0; + return result; } #endif diff --git a/src/support/linkback/LinkBackServer.m b/src/support/linkback/LinkBackServer.m index 4ca9e6bca5..3fe26a1fdc 100644 --- a/src/support/linkback/LinkBackServer.m +++ b/src/support/linkback/LinkBackServer.m @@ -94,7 +94,11 @@ NSString* FindLinkBackServer(NSString* bundleIdentifier, NSString* serverName, N NSString* ret = nil ; NSFileManager* fm = [NSFileManager defaultManager] ; +#if defined(__GNUC__) && (__GNUC__ == 4 && __GNUC_MINOR__ >= 2) NSArray* contents = [fm contentsOfDirectoryAtPath: dir error: nil] ; +#else + NSArray* contents = [fm directoryContentsAtPath: dir] ; +#endif int idx ; NSLog(@"searching for %@ in folder: %@", serverName, dir) ;