MacOS X App Octave Shell Script

From Octave
Revision as of 17:15, 23 June 2012 by Bpabbott (talk | contribs)
Jump to navigation Jump to search

The script below is intended to be part of a MacOS X App bundle for Octave. This script is called by the App launcher script. The script is responsible for initializing the shell environment and running Octave.

The scripts name is "octave" and its location in the App bundle is Octave-x.y.z.app/Contents/Resources/bin/octave. Where x.y.z refers to the version of the bundled Octave.

#!/bin/sh
# Copyright (C) 2007-2008, Thomas Treichl and Paul Kienzle
# Copyright (C) 2009-2011, Thomas Treichl
# Copyright (C) 2012, Ben Abbott
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
# General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; If not, see <http://www.gnu.org/licenses/>.

# Checks if Octave is started from a file that is a link or if this
# file has been taken directly to startup the Octave program.

VER="3.7.0+"
if [ -L "$0" ] ; then
 ROOT="$(dirname $(readlink -f "$0"))"
else
 ROOT="$(cd "$(dirname "$0")" 2>/dev/null && pwd)"
fi
ROOT="$(dirname "${ROOT}")"

# Remove MacPorts from the path
PATH="/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/X11/bin"

# Setting up various path information variables that are needed to
# startup the Octave program.
OCTAVE_HOME="${ROOT}"
PATH="${ROOT}/bin:${PATH}"
if [ -z ${DYLD_FALLBACK_LIBRARY_PATH} ]; then
  DYLD_FALLBACK_LIBRARY_PATH="${ROOT}/lib"
else
  DYLD_FALLBACK_LIBRARY_PATH="${ROOT}/lib:${DYLD_FALLBACK_LIBRARY_PATH}"
fi
DYLD_FALLBACK_LIBRARY_PATH="${ROOT}/lib/octave/$VER:${DYLD_FALLBACK_LIBRARY_PATH}"
DYLD_FALLBACK_LIBRARY_PATH="${ROOT}/lib/gcc44:${DYLD_FALLBACK_LIBRARY_PATH}"
if [ -z ${DYLD_FRAMEWORK_PATH} ]; then
  DYLD_FRAMEWORK_PATH="${ROOT}/Library/Frameworks"
else
  DYLD_FRAMEWORK_PATH="${ROOT}/Library/Frameworks:${DYLD_FRAMEWORK_PATH}"
fi

# Setting up various path information variables that are needed to run
# the "mkoctfile" and "mex" commands from within the Octave program.
INCLUDEDIR="\"${ROOT}/include/Octave-${VER}\""
CFLAGS="-I\"${ROOT}/include/curl\" -I\"${ROOT}/include/readline\" ${CFLAGS}"
FFLAGS="-I\"${ROOT}/include/curl\" -I\"${ROOT}/include/readline\" ${FFLAGS}"
CPPFLAGS="-I\"${ROOT}/include/curl\" -I\"${ROOT}/include/readline\" ${CPPFLAGS}"
CXXFLAGS="-I\"${ROOT}/include/curl\" -I\"${ROOT}/include/readline\" ${CXXFLAGS}"
LDFLAGS="-L\"${ROOT}/lib\" -L\"${ROOT}/lib/octave/$VER\" ${LDFLAGS}"
XTRA_CXXFLAGS=" "

OCT_LINK_OPTS="\"${ROOT}/lib/gcc44/libstdc++.6.dylib\""
OCTLIBDIR="\"${ROOT}/lib/octave/${VER}\""
LIBDIR="\"${ROOT}/lib\""
OCTINCLUDEDIR="\"${ROOT}/include/Octave-${VER}/octave\""
# These default include paths are set by mkoctfile-2.9.12 automatically
# CFLAGS="-I${ROOT}/include -I${ROOT}/include/octave/$VER"

# Fortran stuff. FIXME - spaces in LIBDIR?
FLIBS="-L${LIBDIR} -L${LIBDIR}/gcc44/gcc/x86_64-apple-darwin11/4.4.6 -L${LIBDIR}/gcc44/gcc/x86_64-apple-darwin11/4.4.6/../../.. -lm -lgfortranbegin -lgfortran"

# Setting up other variables that are needed to run the Octave program
# or mkoctfile and to install packages.
DL_LDFLAGS="-bundle -bundle_loader \"${ROOT}/bin/octave-$VER\""
SED="/usr/bin/sed"
CC=`mkoctfile -p CC`
CXX=`mkoctfile -p CXX`
F77=`mkoctfile -p F77`
CC="$(basename $CC)"
CXX="$(basename $CXX)"
F77="$(basename $F77)"
CC=\"${ROOT}/bin/$CC\"
CXX=\"${ROOT}/bin/$CXX\"
F77=\"${ROOT}/bin/$F77\"

# Ghostscript stuff
GS_LIB="${ROOT}/share/ghostscript/9.05/Resource/Init"
GS_LIB="${GS_LIB}:${ROOT}/share/ghostscript/9.05/Resource"
if [ -z ${GS_FONTPATH} ]; then
  GS_FONTPATH="${GS_LIB}:${ROOT}/share/ghostscript/fonts:${ROOT}/share/ghostscript/Resource/Font"
else
  GS_FONTPATH="${GS_LIB}:${ROOT}/share/ghostscript/fonts:${ROOT}/share/ghostscript/Resource/Font:${GS_FONTPATH}"
fi
# Add /usr/X11/share/fonts to GS_FONTPATH ?
GS_OPTIONS="-sGenericResourceDir=\"${ROOT}/share/ghostscript/9.05/Resource/\""
GS_OPTIONS="${GS_OPTIONS} -sFontResourceDir=\"${ROOT}/share/ghostscript/9.05/Resource/Font/\""

# Gnuplot stuff
GNUTERM=aqua
GNUTERMAPP="${ROOT}/Applications/AquaTerm.app"
AQUATERM_PATH="${GNUTERMAPP}"

# If AquaTerm is running, use AppleScript to tell it to quit. This is done to ensure
# the AquaTerm which is running is part of the app bundle.
osascript 2>&1>/dev/null <<EOF
  tell application "System Events" to set ProcessList to get name of every process
  if ProcessList contains "AquaTerm" then
    quit application "AquaTerm" 
    delay 0.5
  end if
EOF
open "${GNUTERMAPP}"

# Invoke Octave, preserving spaces in all the input arguments.
OCTAVE_HOME="${OCTAVE_HOME}" PATH="${PATH}" \
 DYLD_FALLBACK_LIBRARY_PATH="${DYLD_FALLBACK_LIBRARY_PATH}" \
 CC="${CC}" CXX="${CXX}" F77="${F77}" \
 LD_CXX="${CXX}" DL_LD="${CXX}" \
 CFLAGS="${CFLAGS}" CPPFLAGS="${CPPFLAGS}" \
 CXXFLAGS="${CXXFLAGS}" XTRA_CXXFLAGS="${XTRA_CXXFLAGS}" \
 FFLAGS="${FFLAGS}" LDFLAGS="${LDFLAGS}" FLIBS="${FLIBS}" \
 DL_LDFLAGS="${DL_LDFLAGS}" \
 INCLUDEDIR="${INCLUDEDIR}" LIBDIR="${LIBDIR}" \
 OCTINCLUDEDIR="${OCTINCLUDEDIR}" OCTLIBDIR="${OCTLIBDIR}" \
 OCT_LINK_OPTS="${OCT_LINK_OPTS}" \
 SED="$SED" MAGICK_HOME="${ROOT}" \
 FONTCONFIG_PATH="${ROOT}/etc/fonts" \
 GS_FONTPATH="${GS_FONTPATH}" GS_LIB="${GS_LIB}" GS_OPTIONS="${GS_OPTIONS}" \
 DYLD_FRAMEWORK_PATH="${DYLD_FRAMEWORK_PATH}" \
 AQUATERM_PATH="${AQUATERM_PATH}" \
 GNUTERM="${GNUTERM}" \
 GNUTERMAPP="${GNUTERMAPP}" \
 "${ROOT}/bin/octave-$VER" "$@"

# Use AppleScript to kill the icon in the dock.
# FIXME - how to replace "Octave-3.7.0+" with "Octave-$VER"
osascript 2>&1>/dev/null <<EOF
  tell application "Octave-3.7.0+"
    quit
  end tell
EOF