5 # This script automates creating universal binaries of LyX on Mac.
6 # Author: Bennett Helm (and extended by Konrad Hofbauer)
7 # modified by Stephan Witt
8 # Last modified: 9 July 2010
10 Qt4SourceVersion="qt-everywhere-opensource-src-4.7.1"
11 Qt4BuildSubDir="qt-4.7.1-build"
14 # * a decent checkout of LyX sources (probably you have it already)
15 # * Qt4 - build with shared or static libraries for the used platforms (default: i386 and ppc)
16 # or - an unpacked source tree of Qt4 in $QT4SOURCEDIR or in the sibling directory (variable Qt4SourceVersion)
17 # * for aspell support:
18 # the aspell sources placed in a sibling directory (variable ASpellSourceVersion)
19 # * for hunspell support:
20 # the hunspell sources placed in a sibling directory (variable HunSpellSourceVersion)
21 # * for dictionary deployment (per default thesauri only):
22 # - aspell: the dictionary files of macports (in /opt/local/share/aspell and /opt/local/lib/aspell-0.60)
23 # - hunspell: the dictionary files in the sibling directory Dictionaries/dict
24 # - mythes: the data and idx files in the sibling directory Dictionaries/thes
26 LyXConfigureOptions="--enable-warnings --enable-optimization=-Os --with-included-gettext --with-x=no"
27 AspellConfigureOptions="--enable-warnings --enable-optimization=-O0 --enable-debug --disable-nls --enable-compile-in-filters --disable-pspell-compatibility"
28 HunspellConfigureOptions="--with-warnings --disable-nls --with-included-gettext --disable-static"
29 Qt4ConfigureOptions="-opensource -silent -shared -release -fast -no-exceptions"
30 Qt4ConfigureOptions="${Qt4ConfigureOptions} -no-webkit -no-qt3support -no-javascript-jit -no-dbus"
31 Qt4ConfigureOptions="${Qt4ConfigureOptions} -nomake examples -nomake demos -nomake docs -nomake tools"
33 aspell_dictionaries="no"
34 hunspell_dictionaries="no"
36 aspell_deployment="yes"
37 hunspell_deployment="yes"
38 thesaurus_deployment="yes"
42 MACOSX_DEPLOYMENT_TARGET="10.4" # Tiger support is default
43 SDKROOT="/Developer/SDKs/MacOSX10.5.sdk" # Leopard build is default
46 echo Build script for LyX on Mac OS X
48 echo Optional arguments:
49 echo " --aspell-deployment=yes|no ." default yes
50 echo " --with-qt4-frameworks=yes|no" default no
51 echo " --qt4-deployment=yes|no ...." default yes
52 echo " --with-macosx-target=TARGET " default 10.4 "(Tiger)"
53 echo " --with-sdkroot=SDKROOT ....." default 10.5 "(Leopard)"
54 echo " --with-arch=ARCH ..........." default ppc,i386
55 echo " --with-build-path=PATH ....." default \${lyx-src-dir}/../lyx-build
56 echo " --with-dmg-location=PATH ..." default \${build-path}
58 echo "All other arguments with -- are passed to configure"
59 echo "including the defaults: ${LyXConfigureOptions}"
64 while [ $# -gt 0 ]; do
66 --with-qt4-frameworks=*)
67 configure_qt4_frameworks=`echo ${1}|cut -d= -f2`
68 if [ "$configure_qt4_frameworks" = "yes" ]; then
75 QTDIR=`echo ${1}|cut -d= -f2`
78 --with-macosx-target=*)
79 MACOSX_DEPLOYMENT_TARGET=`echo ${1}|cut -d= -f2`
83 SDKROOT=`echo ${1}|cut -d= -f2`
86 SDKROOT="/Developer/SDKs/MacOSX10.4u.sdk"
92 SDKROOT="/Developer/SDKs/MacOSX${SDKROOT}.sdk"
100 --aspell-deployment=*)
101 aspell_deployment=`echo ${1}|cut -d= -f2`
102 aspell_dictionaries=$aspell_deployment
105 --hunspell-deployment=*)
106 hunspell_deployment=`echo ${1}|cut -d= -f2`
107 hunspell_dictionaries=$hunspell_deployment
110 --thesaurus-deployment=*)
111 thesaurus_deployment=`echo ${1}|cut -d= -f2`
115 qt4_deployment=`echo ${1}|cut -d= -f2`
119 ARCH=`echo ${1}|cut -d= -f2|tr ',' ' '`
120 ARCH_LIST="${ARCH_LIST} ${ARCH}"
123 --with-dmg-location=*)
124 DMGLocation=`echo ${1}|cut -d= -f2`
128 LyxBuildDir=`echo ${1}|cut -d= -f2`
135 LyXConfigureOptions="${LyXConfigureOptions} ${1}"
136 aspell_deployment="no"
140 LyXConfigureOptions="${LyXConfigureOptions} ${1}"
141 hunspell_deployment="no"
145 LyXConfigureOptions="${LyXConfigureOptions} ${1}"
154 # Set these variables -- to
155 # (1) the location of your Qt4 installation
156 # (2) the location of resulting DMG
157 # (3) the version of private aspell installation
158 # (to define the location assign ASpellSourceDir instead)
159 # (4) the list of architectures to build for
161 if [ "${configure_qt4_frameworks}" != "yes" ]; then
162 QtInstallDir=${QTDIR:-"/opt/qt4"}
164 QtFrameworkVersion="4"
165 ASpellSourceVersion="aspell-0.60.6"
166 HunSpellSourceVersion="hunspell-1.2.12"
168 ARCH_LIST=${ARCH_LIST:-"ppc i386"}
173 # detection of script home
174 LyxSourceDir=${1:-`dirname "$0"`}
175 if [ ! -d "${LyxSourceDir}" ]; then
176 echo Missing LyX source directory.
179 case "${LyxSourceDir}" in
181 LyxSourceDir=`dirname "${LyxSourceDir}"`
185 */development|development)
186 LyxSourceDir=`dirname "${LyxSourceDir}"`
187 LyxSourceDir=`cd "${LyxSourceDir}";pwd`
190 LyxSourceDir=`cd "${LyxSourceDir}";pwd`
194 LyxBuildDir=${LyxBuildDir:-`dirname "${LyxSourceDir}"`/lyx-build}
195 DMGLocation=${DMGLocation:-"${LyxBuildDir}"}
197 ASpellSourceDir=${ASPELLDIR:-`dirname "${LyxSourceDir}"`/${ASpellSourceVersion}}
198 ASpellInstallDir=${ASpellInstallDir:-"${LyxBuildDir}"/SpellChecker.lib}
199 HunSpellSourceDir=${HUNSPELLDIR:-`dirname "${LyxSourceDir}"`/${HunSpellSourceVersion}}
200 HunSpellInstallDir=${HunSpellInstallDir:-"${LyxBuildDir}"/SpellChecker.lib}
201 Qt4SourceDir=${QT4SOURCEDIR:-`dirname "${LyxSourceDir}"`/${Qt4SourceVersion}}
202 Qt4BuildDir=${Qt4BuildDir:-"${LyxBuildDir}"/${Qt4BuildSubDir:-"qt4-build"}}
203 DictionarySourceDir=${DICTIONARYDIR:-`dirname "${LyxSourceDir}"`/Dictionaries}
205 ASpellInstallHdr="${ASpellInstallDir}/include/aspell.h"
206 HunSpellInstallHdr="${HunSpellInstallDir}/include/hunspell/hunspell.h"
208 if [ -z "${LyXVersion}" ]; then
209 LyXVersion=`grep AC_INIT "${LyxSourceDir}"/configure.ac | cut -d, -f2 | tr -d " ()"`
210 LyXVersionSuffix=`echo "${LyXVersion}" | cut -d. -f1-2`
211 LyXVersionSuffix="${LyXVersionSuffix:-${LyXVersion}}"
215 LyxBase="${LyxName}-${LyXVersion}"
216 LyxApp="${LyxBase}.app"
217 LyxAppDir="${LyxBuildDir}"/"${LyxBase}"
218 LyxBuildDir="${LyxAppDir}.build"
219 LyxAppPrefix="${LyxAppDir}.app"
220 # if zip file is needed... remove the comment sign
221 #LyxAppZip="${LyxAppPrefix}.zip"
223 BuildSystem=`"${LyxSourceDir}/config/config.guess"`
225 # ---------------------------------
226 # DON'T MODIFY ANYTHING BELOW HERE!
227 # ---------------------------------
229 # don't change order here...
230 QtLibraries="QtSvg QtXml QtGui QtNetwork QtCore"
234 BACKGROUND="${LyxAppDir}.app/Contents/Resources/images/banner.png"
236 # Check for existing SDKs
237 SDKs=`echo /Developer/SDKs/MacOSX10*sdk`
242 MACOSX_DEPLOYMENT_TARGET=${MACOSX_DEPLOYMENT_TARGET:-"10.5"}; export MACOSX_DEPLOYMENT_TARGET
243 case "${MACOSX_DEPLOYMENT_TARGET}" in
245 SDKROOT="/Developer/SDKs/MacOSX10.6.sdk"; export SDKROOT
248 SDKROOT=${SDKROOT:-"/Developer/SDKs/MacOSX10.5.sdk"}; export SDKROOT
253 MACOSX_DEPLOYMENT_TARGET=${MACOSX_DEPLOYMENT_TARGET:-"10.4"}; export MACOSX_DEPLOYMENT_TARGET
254 SDKROOT=${SDKROOT:-"/Developer/SDKs/MacOSX10.5.sdk"}; export SDKROOT
257 echo Unknown or missing SDK for Mac OS X.
261 MYCFLAGS="-mmacosx-version-min=${MACOSX_DEPLOYMENT_TARGET}"
263 # These variables define the identifiers of the
264 # system (both Intel and PowerPC) to compile for.
265 # (Note: darwin8 is 10.4; darwin9 is 10.5.)
266 # Only change these if necessary
268 HostSystem_i386="i686-apple-darwin8"
269 HostSystem_ppc="powerpc-apple-darwin8"
271 updateDictionaries() {
272 TMP_DIR="/tmp/lyx-build-$$"
273 mkdir -p "$1"/dict "$1"/thes
274 mkdir -p "$TMP_DIR" && (
275 for pack in "$1"/*.zip ; do
278 cd "$TMP_DIR" && unzip "${pack}" de_DE_comb.zip thes_de_DE_v2.zip
279 cd "$1"/dict && unzip -o "$TMP_DIR"/de_DE_comb.zip &&\
280 for suffix in .aff .dic ; do mv de_DE_comb$suffix de_DE$suffix; done
281 cd "$1"/thes && unzip -o "$TMP_DIR"/thes_de_DE_v2.zip
284 cd "$TMP_DIR" && unzip "${pack}" pl_PL.zip thes_pl_PL_v2.zip
285 cd "$1"/dict && unzip -o "$TMP_DIR"/pl_PL.zip
286 cd "$1"/thes && unzip -o "$TMP_DIR"/thes_pl_PL_v2.zip
289 cd "$TMP_DIR" && unzip "${pack}" fr_FR.zip thes_fr_FR_v2.zip
290 cd "$1"/dict && unzip -o "$TMP_DIR"/fr_FR.zip
291 cd "$1"/thes && unzip -o "$TMP_DIR"/thes_fr_FR_v2.zip
294 cd "$TMP_DIR" && unzip "${pack}" es_ES.zip es_MX.zip thes_es_ES_v2.zip
295 cd "$1"/dict && unzip -o "$TMP_DIR"/es_ES.zip
296 cd "$1"/dict && unzip -o "$TMP_DIR"/es_MX.zip
297 cd "$1"/thes && unzip -o "$TMP_DIR"/thes_es_ES_v2.zip
300 cd "$TMP_DIR" && unzip "${pack}" pt_PT.zip
301 cd "$1"/dict && unzip -o "$TMP_DIR"/pt_PT.zip
302 cd "$1"/dict && unzip -o "$1"/pt_BR.zip
303 cd "$1"/thes && unzip -o "$1"/thes_pt_PT_v2.zip
306 cd "$TMP_DIR" && unzip "${pack}" it_IT.zip
307 cd "$1"/dict && unzip -o "$TMP_DIR"/it_IT.zip
308 cd "$1"/thes && unzip -o "$1"/thes_it_IT_v2.zip
311 cd "$TMP_DIR" && unzip "${pack}" ru_RU.zip
312 cd "$1"/dict && unzip -o "$TMP_DIR"/ru_RU.zip
313 cd "$1"/thes && tar xvf "$1"/thes_ru_RU_v2.tar.bz2
316 cd "$TMP_DIR" && unzip "${pack}" en_AU.zip en_CA.zip en_GB.zip en_NZ.zip en_US.zip
317 for zipfile in en_AU.zip en_CA.zip en_GB.zip en_NZ.zip en_US.zip ; do
318 ( cd "$1"/dict && unzip -o "$TMP_DIR/$zipfile" )
320 cd "$1"/thes && unzip -o "$1"/thes_en_US_v2.zip
323 cd "$TMP_DIR" && unzip -l "${pack}" | while read len date time zipfile ; do
327 cd "$TMP_DIR" && unzip -o "${pack}" "$zipfile"
328 cd "$1"/thes && unzip -o "$TMP_DIR"/"$zipfile"
330 [a-z][a-z]_[A-Z][A-Z].zip)
332 cd "$TMP_DIR" && unzip -o "${pack}" "$zipfile"
333 cd "$1"/dict && unzip -o "$TMP_DIR"/"$zipfile"
337 # echo Ignore dictionary package `basename "${pack}"`
345 if [ "${configure_qt4_frameworks}" != "yes" -a -d "${Qt4SourceDir}" -a ! -d "${Qt4BuildDir}" ]; then
346 echo Build Qt4 library ${Qt4SourceDir}
347 if [ "${QtInstallDir}" = "${Qt4BuildDir}" ]; then
348 echo Bad install directory for Qt.
349 echo Must be different from build directory "${Qt4BuildDir}".
353 mkdir -p "${Qt4BuildDir}" && cd "${Qt4BuildDir}"
354 for arch in ${ARCH_LIST} ; do
355 ARCHS="${ARCHS} -arch ${arch}"
357 echo configure options:
358 echo ${Qt4ConfigureOptions} ${ARCHS} -prefix "${QtInstallDir}"
359 echo yes | "${Qt4SourceDir}"/configure ${Qt4ConfigureOptions} ${ARCHS} -prefix "${QtInstallDir}"
362 cd "${QtInstallDir}" && (
365 for libnm in ${QtLibraries} ; do
366 test -d ${libnm} -o -L ${libnm} || ln -s ../lib/${libnm}.framework/Headers ${libnm}
371 # updateDictionaries "${DictionarySourceDir}"
374 if [ -d "${HunSpellSourceDir}" -a ! -f "${HunSpellInstallHdr}" ]; then
375 # we have a private HunSpell source tree at hand...
376 # so let's build and install it
377 if [ -z "${HunSpellVersion}" ]; then
378 HunSpellVersion=`grep AC_INIT "${HunSpellSourceDir}"/configure.ac | cut -d, -f2|tr -d " ()"`
381 HunSpellName="Hunspell"
382 HunSpellBase="${HunSpellName}-${HunSpellVersion}"
384 echo Build hunspell library ${HunSpellBase}
385 echo configure options:
386 echo --prefix="${HunSpellInstallDir}" ${HunspellConfigureOptions}
388 cd "${HunSpellSourceDir}"
390 # ----------------------------------------
391 # Build HunSpell for different architectures
392 # ----------------------------------------
393 FILE_LIST="libhunspell-1.2.0.dylib"
395 for arch in ${ARCH_LIST} ; do
397 CPPFLAGS="${SDKROOT:+-isysroot ${SDKROOT}} -arch ${arch} ${MYCFLAGS}"; export CPPFLAGS
398 LDFLAGS="${SDKROOT:+-isysroot ${SDKROOT}} -arch ${arch} ${MYCFLAGS}"; export LDFLAGS
399 HOSTSYSTEM=`eval "echo \\$HostSystem_$arch"`
400 "${HunSpellSourceDir}/configure"\
401 --prefix="${HunSpellInstallDir}"\
402 ${HunspellConfigureOptions}
403 #--host="${HOSTSYSTEM}" ${BuildSystem:+"--build=${BuildSystem}"}
404 make && make install${strip}
405 for file in ${FILE_LIST} ; do
406 if [ -f "${HunSpellInstallDir}"/lib/${file} ]; then
407 mv "${HunSpellInstallDir}"/lib/${file}\
408 "${HunSpellInstallDir}"/lib/${file}-${arch}
410 echo Cannot build and install HunSpell for ${arch}.
415 # -------------------------
416 # Create universal binaries
417 # -------------------------
418 for file in ${FILE_LIST} ; do
420 for arch in ${ARCH_LIST} ; do
421 OBJ_LIST="${OBJ_LIST} lib/${file}-${arch}"
424 cd "${HunSpellInstallDir}"
425 lipo -create ${OBJ_LIST} -o lib/${file}
426 # check for the "missing link"...
427 test -f lib/libhunspell.dylib || (cd lib ; ln -s libhunspell-1.2.dylib libhunspell.dylib)
433 for arch in ${ARCH_LIST} ; do
434 rm -f "${HunSpellInstallDir}"/lib/*-${arch}
438 if [ -d "${ASpellSourceDir}" -a ! -f "${ASpellInstallHdr}" -a "yes" = "${aspell_deployment}" ]; then
439 # we have a private ASpell source tree at hand...
440 # so let's build and install it
441 if [ -z "${ASpellVersion}" ]; then
442 ASpellVersion=`grep AC_INIT "${ASpellSourceDir}"/configure.ac | cut -d, -f2|tr -d " ()"`
446 ASpellBase="${ASpellName}-${ASpellVersion}"
448 echo Build aspell library ${ASpellBase}
449 echo configure options:
450 echo --prefix="${ASpellInstallDir}" ${AspellConfigureOptions}
452 # ASpell builds inplace only :(
453 cd "${ASpellSourceDir}"
455 # ----------------------------------------
456 # Build ASpell for different architectures
457 # ----------------------------------------
458 FILE_LIST="libaspell.15.dylib"
460 for arch in ${ARCH_LIST} ; do
462 CPPFLAGS="${SDKROOT:+-isysroot ${SDKROOT}} -arch ${arch} ${MYCFLAGS}"; export CPPFLAGS
463 LDFLAGS="${SDKROOT:+-isysroot ${SDKROOT}} -arch ${arch} ${MYCFLAGS}"; export LDFLAGS
464 HOSTSYSTEM=`eval "echo \\$HostSystem_$arch"`
465 CXXFLAGS=-g "${ASpellSourceDir}/configure"\
466 --prefix="${ASpellInstallDir}"\
467 ${AspellConfigureOptions}
468 #--host="${HOSTSYSTEM}" ${BuildSystem:+"--build=${BuildSystem}"}
469 make && make install${aspellstrip}
470 for file in ${FILE_LIST} ; do
471 if [ -f "${ASpellInstallDir}"/lib/${file} ]; then
472 mv "${ASpellInstallDir}"/lib/${file}\
473 "${ASpellInstallDir}"/lib/${file}-${arch}
475 echo Cannot build and install ASpell for ${arch}.
480 # -------------------------
481 # Create universal binaries
482 # -------------------------
483 for file in ${FILE_LIST} ; do
485 for arch in ${ARCH_LIST} ; do
486 OBJ_LIST="${OBJ_LIST} lib/${file}-${arch}"
489 cd "${ASpellInstallDir}"
490 lipo -create ${OBJ_LIST} -o lib/${file}
496 for arch in ${ARCH_LIST} ; do
497 rm -f "${ASpellInstallDir}"/lib/*-${arch}
505 echo "Frameworks/${1}.framework"
508 if [ ! -f "${LyxSourceDir}"/configure -o "${LyxSourceDir}"/configure -ot "${LyxSourceDir}"/configure.ac ]; then
509 ( cd "${LyxSourceDir}" && sh autogen.sh )
511 find "${LyxSourceDir}" -name Makefile.am -print | while read file ; do
512 dname=`dirname "$file"`
513 if [ "$dname/Makefile.in" -ot "$file" ]; then
514 ( cd "${LyxSourceDir}" && sh autogen.sh )
520 FILE_LIST="lyx lyxclient tex2lyx"
521 BUNDLE_PATH="Contents/MacOS"
522 LYX_BUNDLE_PATH="${LyxAppPrefix}/${BUNDLE_PATH}"
525 if [ -n "${LyxAppZip}" -a -f "${LyxAppZip}" ]; then rm "${LyxAppZip}"; fi
526 if [ -d "${LyxAppPrefix}" ]; then rm -rf "${LyxAppPrefix}"; fi
528 # -------------------------------------
529 # Build LyX for different architectures
530 # -------------------------------------
532 if [ -d "${ASpellInstallDir}" -a "yes" = "${aspell_deployment}" ]; then
533 ASpellFramework=`framework_name Aspell`
534 ASpellFramework=`basename "${ASpellFramework}"`
535 ConfigureExtraInc="--with-extra-inc=${ASpellInstallDir}/include"
536 ConfigureExtraLib="--with-extra-lib=${ASpellInstallDir}/lib"
537 LyXConfigureOptions="${LyXConfigureOptions} --with-aspell-framework=${ASpellFramework}"
540 if [ -d "${HunSpellInstallDir}" -a "yes" = "${hunspell_deployment}" ]; then
541 HunSpellFramework=`framework_name Hunspell`
542 HunSpellFramework=`basename "${HunSpellFramework}"`
543 ConfigureExtraInc="--with-extra-inc=${HunSpellInstallDir}/include"
544 ConfigureExtraLib="--with-extra-lib=${HunSpellInstallDir}/lib"
545 # LyXConfigureOptions="${LyXConfigureOptions} --with-hunspell-framework=${HunSpellFramework}"
547 LyXConfigureOptions="${LyXConfigureOptions} ${ConfigureExtraInc}"
548 LyXConfigureOptions="${LyXConfigureOptions} ${ConfigureExtraLib}"
550 for arch in ${ARCH_LIST} ; do
552 if [ -d "${LyxBuildDir}" ]; then rm -r "${LyxBuildDir}"; fi
553 mkdir "${LyxBuildDir}" && cd "${LyxBuildDir}"
555 CPPFLAGS="${SDKROOT:+-isysroot ${SDKROOT}} -arch ${arch} ${MYCFLAGS}"
556 LDFLAGS="${SDKROOT:+-isysroot ${SDKROOT}} -arch ${arch} ${MYCFLAGS}"
557 HOSTSYSTEM=`eval "echo \\$HostSystem_$arch"`
559 if [ "$configure_qt4_frameworks" = "yes" ]; then
560 export QT4_CORE_CFLAGS="-FQtCore"
561 export QT4_CORE_LIBS="-framework QtCore"
562 export QT4_FRONTEND_CFLAGS="-FQtGui"
563 export QT4_FRONTEND_LIBS="-framework QtGui"
565 CPPFLAGS="${CPPFLAGS} -I${SDKROOT}/Library/Frameworks/QtCore.framework/Headers"
566 CPPFLAGS="${CPPFLAGS} -I${SDKROOT}/Library/Frameworks/QtGui.framework/Headers"
568 LDFLAGS="${LDFLAGS} -framework Carbon -framework AppKit"
570 echo LDFLAGS="${LDFLAGS}"
572 echo CPPFLAGS="${CPPFLAGS}"
574 echo CONFIGURE_OPTIONS="${LyXConfigureOptions}" ${QtInstallDir:+"--with-qt4-dir=${QtInstallDir}"}
575 "${LyxSourceDir}/configure"\
576 --prefix="${LyxAppPrefix}" --with-version-suffix="-${LyXVersionSuffix}"\
577 ${QtInstallDir:+"--with-qt4-dir=${QtInstallDir}"} \
578 ${LyXConfigureOptions}\
579 --host="${HOSTSYSTEM}" --build="${BuildSystem}" --enable-build-type=rel && \
580 make -j2 && make install${strip}
581 for file in ${FILE_LIST} ; do
582 if [ -f "${LYX_BUNDLE_PATH}/${file}" ]; then
583 mv "${LYX_BUNDLE_PATH}/${file}"\
584 "${LYX_BUNDLE_PATH}/${file}-${arch}"
586 echo ERROR: Cannot build and install LyX for ${arch}.
593 content_directory() {
595 content=`dirname "${target}"`
596 content=`dirname "${content}"`
600 private_framework() {
601 fwdir=`framework_name "$1"`
604 condir=`content_directory "${target}"`
605 libnm=`basename "${source}"`
606 mkdir -p "${condir}/${fwdir}"
607 if [ ! -f "${condir}/${fwdir}/${libnm}" ]; then
608 cp -p "${source}" "${condir}/${fwdir}"
609 echo Set library id in "${condir}/${fwdir}/${libnm}"
610 install_name_tool -id "@executable_path/../${fwdir}/${libnm}" "${condir}/${fwdir}/${libnm}"
612 echo Correct library id reference to "${libnm}" in "${target}"
613 install_name_tool -change "${source}" "@executable_path/../${fwdir}/${libnm}" "${target}"
617 source="${QtInstallDir}"
619 version="Versions/${QtFrameworkVersion}/"
620 condir=`content_directory "${target}"`
621 mkdir -p "${condir}/Resources"
622 test -f "${condir}/Resources/qt.conf" || cat - > "${condir}/Resources/qt.conf" <<-EOF
626 if [ ! -d "${condir}/PlugIns" ]; then
627 mkdir -p "${condir}/PlugIns"
628 find "${source}/plugins" -name \*.dylib -print | while read libname ; do
629 echo Copy plugin "${libname}"
630 dylib=`basename "${libname}"`
631 dirname=`dirname "${libname}"`
632 dirname=`basename "${dirname}"`
633 mkdir -p "${condir}/PlugIns/${dirname}"
634 cp -p "${libname}" "${condir}/PlugIns/${dirname}"
637 for libnm in ${QtLibraries} ; do
638 fwdir=`framework_name "$libnm"`
639 dirname=`dirname "${fwdir}"`
640 mkdir -p "${condir}/${dirname}"
641 dirname=`basename "${fwdir}"`
642 test -d "${condir}/${fwdir}" || (
643 echo Copy framework "${source}/lib/"`basename "${fwdir}"`
644 cp -pR "${source}/lib/"`basename "${fwdir}"` "${condir}/${fwdir}"
645 echo Set library id in "${condir}/${fwdir}/${version}${libnm}"
646 install_name_tool -id "@executable_path/../${fwdir}/${version}${libnm}" "${condir}/${fwdir}/${version}${libnm}"
647 find "${condir}/PlugIns" "${condir}/"`dirname "${fwdir}"` -name Headers -prune -o -type f -print | while read filename ; do
648 otool -L "${filename}" 2>/dev/null | while read library ; do
649 # pattern match for: /path/to/qt4/lib/QtGui.framework/Versions/4/QtGui (compatibility version 4.6.0, current version 4.6.2)
651 *"${libnm}"*"("*")"*)
652 echo Correct library id reference to "${libnm}" in "${filename}"
653 install_name_tool -change\
654 "${source}/lib/${dirname}/${version}${libnm}"\
655 "@executable_path/../${fwdir}/${version}${libnm}"\
662 echo Correct library id reference to "${libnm}" in "${target}"
663 install_name_tool -change\
664 "${source}/lib/${dirname}/${version}${libnm}"\
665 "@executable_path/../${fwdir}/${version}${libnm}"\
670 # -------------------------
671 # Create universal binaries
672 # -------------------------
673 convert_universal() {
675 for file in ${FILE_LIST} ; do
677 for arch in ${ARCH_LIST} ; do
678 if [ -f "${BUNDLE_PATH}/${file}-${arch}" ]; then
679 OBJ_LIST="${OBJ_LIST} ${BUNDLE_PATH}/${file}-${arch}"
682 if [ -n "${OBJ_LIST}" ]; then
683 lipo -create ${OBJ_LIST} -o "${BUNDLE_PATH}/${file}"
685 if [ -d "${ASpellInstallDir}" -a "yes" = "${aspell_deployment}" ]; then
686 private_framework Aspell "${ASpellInstallDir}/lib/libaspell.15.dylib" "${LYX_BUNDLE_PATH}/${file}"
688 if [ -d "${HunSpellInstallDir}" -a "yes" = "${hunspell_deployment}" ]; then
689 private_framework Hunspell "${HunSpellInstallDir}/lib/libhunspell-1.2.0.dylib" "${LYX_BUNDLE_PATH}/${file}"
691 if [ -d "${QtInstallDir}/lib/QtCore.framework/Versions/${QtFrameworkVersion}" -a "yes" = "${qt4_deployment}" ]; then
692 deploy_qtlibs "${LYX_BUNDLE_PATH}/${file}"
694 otool -L "${BUNDLE_PATH}/${file}" | while read reference ; do
695 case "${reference}" in
696 *"${LyxBuildDir}"*"("*")")
697 echo ERROR: Bad reference to "${reference}" found!!
702 for arch in ${ARCH_LIST} ; do
703 rm -f ${BUNDLE_PATH}/*-${arch}
707 copy_dictionaries() {
708 if [ -d "${ASpellInstallDir}" -a "yes" = "${aspell_dictionaries}" ]; then
709 ASpellResources="${LyxAppPrefix}/Contents/Resources"
710 # try to reuse macports dictionaries for now
711 if [ -d /opt/local/lib/aspell-0.60 ]; then ASpellInstallDir=/opt/local ; fi
712 mkdir -p "${ASpellResources}"
713 echo Copy Aspell dictionaries from "${ASpellInstallDir}"
714 mkdir -p "${ASpellResources}"/data "${ASpellResources}"/dict
715 cp -p -r "${ASpellInstallDir}/lib/aspell-0.60"/* "${ASpellResources}"/data
716 cp -p -r "${ASpellInstallDir}/share/aspell"/* "${ASpellResources}"/dict
718 if [ -d "${HunSpellInstallDir}" -a "yes" = "${hunspell_dictionaries}" ]; then
719 HunSpellResources="${LyxAppPrefix}/Contents/Resources"
720 if [ -d "${DictionarySourceDir}" ]; then
721 updateDictionaries "${DictionarySourceDir}"
722 cp -p -r "${DictionarySourceDir}/dict" "${HunSpellResources}"
725 if [ -d "${DictionarySourceDir}" -a "yes" = "${thesaurus_deployment}" ]; then
726 MyThesResources="${LyxAppPrefix}/Contents/Resources"
727 cp -p -r "${DictionarySourceDir}/thes" "${MyThesResources}"
731 function set_bundle_display_options() {
733 tell application "Finder"
734 set f to POSIX file ("${1}" as string) as alias
737 tell container window
738 set toolbar visible to false
739 set statusbar visible to false
740 set current view to icon view
742 set the bounds to {20, 50, $2, $3}
745 set icon size of the icon view options of container window to 64
746 set arrangement of the icon view options of container window to not arranged
747 set position of item "${LyxName}.app" to {100,$4}
748 set position of item "Applications" to {280,$4}
749 set background picture of the icon view options\
750 of container window to file "background.png" of folder "Pictures"
751 set the bounds of the container window to {0, 0, $2, $3}
752 update without registering applications
761 function make_dmg() {
764 BGSIZE=`file "$BACKGROUND" | awk -F , '/PNG/{print $2 }' | tr x ' '`
765 BG_W=`echo ${BGSIZE} | awk '{print $1 }'`
766 BG_H=`echo ${BGSIZE} | awk '{h = $2 + 20 ;print h }'`
767 BG_Y=`echo ${BGSIZE} | awk '{y = $2 - 60 ;print y }'`
769 rm -f "${DMGNAME}.sparseimage" "${DMGNAME}.dmg"
771 hdiutil create -type SPARSE -size ${DMGSIZE:-"250m"} -fs HFS+ -volname "${LyxBase}" "${DMGNAME}"
772 # Unmount currently mounted disk image
773 test -d /Volumes/"${LyxBase}" && umount /Volumes/"${LyxBase}"
775 # Mount the disk image
776 hdiutil attach "${DMGNAME}.sparseimage"
778 # Obtain device information
779 DEVS=$(hdiutil attach "${DMGNAME}.sparseimage" | cut -f 1)
780 DEV=$(echo $DEVS | cut -f 1 -d ' ')
781 VOLUME=$(mount |grep ${DEV} | cut -f 3 -d ' ')
783 # copy in the application bundle
784 cp -Rp "${LyxAppDir}.app" "${VOLUME}/${LyxName}.app"
786 # copy in background image
787 mkdir -p "${VOLUME}/Pictures"
788 cp "${BACKGROUND}" "${VOLUME}/Pictures/background.png"
789 # symlink applications
790 ln -s /Applications/ "${VOLUME}"/Applications
791 set_bundle_display_options "${VOLUME}" ${BG_W} ${BG_H} ${BG_Y}
792 mv "${VOLUME}/Pictures" "${VOLUME}/.Pictures"
794 # Unmount the disk image
795 hdiutil detach ${DEV}
797 # Convert the disk image to read-only
798 hdiutil convert "${DMGNAME}.sparseimage" -format UDBZ -o "${DMGNAME}.dmg"
799 rm -f "${DMGNAME}.sparseimage"
806 # ------------------------------
807 # Building distribution packages
808 # ------------------------------
810 test -n "${LyxAppZip}" && (
811 cd "${LyxAppPrefix}" && zip -r "${LyxAppZip}" .
814 test -n "${DMGLocation}" && (
815 make_dmg "${DMGLocation}"
816 if [ -d "${QtInstallDir}/lib/QtCore.framework/Versions/${QtFrameworkVersion}" -a "yes" = "${qt4_deployment}" ]; then
817 rm -f "${DMGLocation}/${DMGNAME}+qt4.dmg"
818 echo move to "${DMGLocation}/${DMGNAME}+qt4.dmg"
819 mv "${DMGLocation}/${DMGNAME}.dmg" "${DMGLocation}/${DMGNAME}+qt4.dmg"
820 #for libnm in ${QtLibraries} ; do
821 # fwdir=`framework_name "$libnm"`
822 # rm -rf "${LyxAppDir}.app/Contents/${fwdir}"
824 #make_dmg "${DMGLocation}"