LAM/MPI logo

LAM/MPI General User's Mailing List Archives

  |   Home   |   Download   |   Documentation   |   FAQ   |   all just in this list

From: Lei_at_[hidden]
Date: 2005-08-12 01:04:06


Oh, mex is attached. And the error message from Matlab
(don't know if it is helpful at all):

      planet/earth elements:

             none

      sun elements:

             none
***** MPI_Init NOT called. Calling ...

------------------------------------------------------------------------
       Segmentation violation detected at Thu Aug 11 23:01:37 2005
------------------------------------------------------------------------

Configuration:
  MATLAB Version: 7.0.4.352 (R14) Service Pack 2
  MATLAB License: 114984
  Operating System: Linux 2.4.22 #2 SMP Sat Sep 27 01:26:05 PDT 2003 i686
  Window System: The XFree86 Project, Inc (40399016), display
localhost:12.0
  Current Visual: 0x23 (class 4, depth 24)
  Processor ID: x86 Family 15 Model 2 Stepping 9, GenuineIntel
  Virtual Machine: Java 1.5.0 with Sun Microsystems Inc. Java
HotSpot(TM) Clien
t VM
    (mixed mode, sharing)
  Default Charset: UTF-8

Register State:
  eax = 00000000 ebx = bfffa564
  ecx = 42139c90 edx = 081021b8
  esi = 081021b8 edi = 00009c40
  ebp = bfffa560 esp = bfffa540
  eip = 4a7b583a flg = 00010246

Stack Trace:
  [0] View.mexglx:0x4a7b583a(0x4a80fa01, 0x4a7b6a65, 0xbfffa878, 0x08102150)

This error was detected while a MEX-file was running. If the MEX-file
is not an official MathWorks function, please examine its source code
for errors. Please consult the External Interfaces Guide for information
on debugging MEX-files.

If it is an official MathWorks function, please
follow these steps in reporting this problem to The MathWorks so
that we have the best chance of correcting it:

  1. Send this crash report to segv_at_[hidden] for automated analysis.
     For your convenience, this information has been recorded in:
       /home/pan/matlab_crash_dump.4081

  2. Also, if the problem is reproducible, send the crash report to
     support_at_[hidden] along with:
       - A specific list of steps that will reproduce the problem
       - Any M, MEX, MDL or other files required to reproduce the problem
       - Any error messages displayed to the command window
     A technical support engineer will contact you with further information.

Thank you for your assistance. Please save your workspace and restart
MATLAB before continuing your work.

Error in ==> viewsol at 81
                        [ms(csp1).RadList, ms(csp1).ViewFactors, ...

>>

Lei_at_ICS wrote:

>Jeff Squyres wrote:
>
>
>
>>Arrgh. That's a real bummer. What is mex -- is it a wrapper compiler
>>like mpicc?
>>
>>It looks like mex doesn't want to accept the -pthread switch.
>>
>>Well, I was really hoping to avoid a manual assembly of flags, but you
>>may need to do that. We have automated ways of getting the flags out
>>of mpicc (and you could filter out -pthread), but that may or may not
>>be sufficient. That is, if the bottom-level compiler does not link in
>>the pthreads library, LAM may not link properly.
>>
>>Specifically, you can run your mpicc command line below and add
>>"-showme" to see what mpicc is actually invoking underneath. Try
>>simply eliminating -pthread from the underlying command and see if it
>>links properly (I suspect that it won't).
>>
>>Let me know what happens and let's go from there.
>>
>>
>>
>>
>I defined MEX to be:
>MEX = mex -L/home/packages/LAM-MPI/intel/lib -llammpio -llamf77mpi -lmpi
>-llam -lutil
>and
>CFLAGS += -I/home/packages/LAM-MPI/intel/include
>using info. from mpicc -showme, less -pthread).
>
>This is seems to be working.
>
>But a more serious problem arises. MPI_Init() crashes Matlab.
>This is the C code:
>int error=0, mp_init=0;
>int argc=2, num_proc, my_rank;
>char **argv;
>
>MPI_Initialized(&mp_init);
>if(mp_init == 1)
>printf("***** MPI_Init called.\n");
>else {
>printf("***** MPI_Init NOT called. Calling ...\n");
>MPI_Init(&argc, &argv);
>printf("***** Now MPI_Init called.\n");
>}
>
>
>
>"***** MPI_Init NOT called. Calling ..." is printed out
>before crashing.
>
>Is it because I faked argc and argv (this C code is called
>from another C code, which is called by Matlab via MEX,
>so I don't have any real argc and argv)?
>
>Or is it because of the following (quoted from this group):
>
>-----
>3.4.3 Dynamic/Embedded Environments
>
>In LAM/MPI version 7.1.1, some RPI modules may utilize an additional
>memory manager mechanism (see Section 3.3.1, page 15 for more details).
>This can cause problems when running MPI processes as dynamically
>loaded modules. For example, when running a LAM/MPI program as a MEX
>function in a Matlab environment, normal Unix linker semantics create
>situations where both the default Unix and the memory management
>systems are used. This typically results in process failure.
>
>Note that this only occurs when LAM/MPI processes are used in a dynamic
>environment and an additional memory manager is included in LAM/MPI.
>This appears to occur because of normal Unix semantics; the only way to
>avoid it is to use the --with-memory-manager parameter to LAM�s
>configure script, specifying either �none� or �external� as its value.
>See the LAM/MPI Installation Guide for more details.
>-----
>
>Please help!
>
>Thanks,
>
>-Lei
>
>
>
>
>
>
>>On Aug 5, 2005, at 2:07 PM, Lei_at_ICS wrote:
>>
>>
>>
>>
>>
>>>Thanks! This sounds like a simple solution.
>>>
>>>I tried it and got some errors:
>>>
>>>/home/packages/LAM-MPI/intel/bin/mpicc -f ../mexopts_linux.sh -V5 -v
>>>-D_LINUX_ -I/usr/local/matlab/extern/include -DMATLAB View.o Viewx.o
>>>BuildCavityLists.o BuildCombinedLists.o BuildRadMatrixIndexVectors.o
>>>ComputeElementGeometryProperties.o CreateParticipatingInternalChbdys.o
>>>DetermineViewUpdateMode.o GenerateRadList.o
>>>InitRadMatrixCavityPartition.o InternalChbdysInternalGridPtrLookup.o
>>>ReorderInternalChbdys.o SetAllUpdateFlags.o UpdateInternalChbdys.o
>>>Vfact.o View3d.o ../db_/imdb.a ../DataSet/DataSet.a
>>>../EnumDefinitions/EnumDefinitions.a ../dbx_/imdbx.a ../shared/utils.a
>>>
>>> mex: -pthread not a valid option.
>>>
>>> Usage:
>>> MEX [option1 ... optionN] sourcefile1 [... sourcefileN]
>>> [objectfile1 ... objectfileN] [libraryfile1 ... libraryfileN]
>>>
>>> or (to build an Ada S-function):
>>> MEX [-v] [-g] -ada <sfcn>.ads
>>>
>>> Use the -help option for more information, or consult the MATLAB
>>>External Interfaces Guide.
>>>
>>>/home/packages/LAM-MPI/intel/bin/mpicc: No such file or directory
>>>gmake: *** [View] Error 1
>>>~
>>>
>>>
>>>If I setenv LAMCC mex
>>>
>>>I get:
>>>
>>>losangeles[24]% mpicc
>>>
>>> mex: -pthread not a valid option.
>>>
>>> Usage:
>>> MEX [option1 ... optionN] sourcefile1 [... sourcefileN]
>>> [objectfile1 ... objectfileN] [libraryfile1 ... libraryfileN]
>>>
>>> or (to build an Ada S-function):
>>> MEX [-v] [-g] -ada <sfcn>.ads
>>>
>>> Use the -help option for more information, or consult the MATLAB
>>>External Interfaces Guide.
>>>
>>>mpicc: No such file or directory
>>>losangeles[25]%
>>>
>>>But if I setenv LAMCC gcc
>>>I get:
>>>
>>>losangeles[27]% mpicc
>>>/usr/lib/gcc-lib/i386-redhat-linux/3.2/../../../crt1.o: In function
>>>`_start':
>>>/usr/lib/gcc-lib/i386-redhat-linux/3.2/../../../crt1.o(.text+0x18):
>>>undefined reference to `main'
>>>collect2: ld returned 1 exit status
>>>mpicc: No such file or directory
>>>losangeles[28]%
>>>
>>>Yes, mex is a script provided by Matlab. But I am not able to
>>>modify it yet. Any further suggestions on how to solve it problem?
>>>
>>>Thanks a lot,
>>>
>>>-Lei
>>>
>>>
>>>Jeff Squyres wrote:
>>>
>>>
>>>
>>>
>>>
>>>>On Aug 3, 2005, at 9:52 PM, Lei_at_ICS wrote:
>>>>
>>>>
>>>>
>>>>
>>>>
>>>>
>>>>
>>>>>I compiled View3d.c using mpicc -c View3d.c,
>>>>>I then compiled View.c and linked the entire thing
>>>>>using mex. When it executes, I got an error:
>>>>>??? Invalid MEX-file '/home/pan/IMOS/delivery/View.mexglx':
>>>>>/home/pan/IMOS/delivery/View.mexglx: undefined symbol: MPI_Init.
>>>>>
>>>>>This is obvious, because I did not link with the MPI libraries.
>>>>>
>>>>>So my question is: How do I modify mex to work with MPI,
>>>>>or how do I modify mpicc to work with mex? Is there another
>>>>>option?
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>Is mex another wrapper compiler, similar to mpicc?
>>>>
>>>>If so, what you might want to do is set mpicc's underlying compiler to
>>>>be mex, and then link your application with mpicc (i.e., layer the
>>>>wrapper compilers).
>>>>
>>>>You can do this by setting the environment variable LAMCC to "mex" (or
>>>>whatever the executable name is that you use to compile/link Mex
>>>>applications).
>>>>
>>>>
>>>>
>>>>
>>>>
>>>>
>>>>
>>>_______________________________________________
>>>This list is archived at http://www.lam-mpi.org/MailArchives/lam/
>>>
>>>
>>>
>>>
>>>
>>
>>
>>
>>
>
>_______________________________________________
>This list is archived at http://www.lam-mpi.org/MailArchives/lam/
>


#!/bin/sh
#
# Name:
# mex compilation program for MATLAB C and Fortran language MEX-files
#
# Usage:
# MEX [option1 ... optionN] sourcefile1 [... sourcefileN]
# [objectfile1 ... objectfileN] [libraryfile1 ... libraryfileN]
#
# Description:
# MEX compiles and links source files into a shared library called a
# MEX-file, executable from within MATLAB. The resulting file has a
# platform-dependent extension, as shown in the table below:
#
# solaris - .mexsol
# hpux - .mexhpux
# glnx86 - .mexglx
# glnxi64 - .mexi64
# glnxa64 - .mexa64
# Mac OS X - .mexmac
# Windows - .dll
#
# The first file name given (less any file name extension) will be the name
# of the resulting MEX-file. Additional source, object, or library files can
# be given to satisfy external references. On Windows, either C or Fortran,
# but not both, may be specified. On UNIX, both C and Fortran source files
# can be specified when building a MEX-file. If C and Fortran are mixed, the
# first source file given determines the entry point exported from the
# MEX-file (MATLAB loads and runs a different entry point symbol for C or
# Fortran MEX-files).
#
# Both an options file and command line options affect the behavior of MEX.
# The options file contains a list of variables that are passed as arguments
# to various tools such as the compiler, linker, and other platform-
# dependent tools (such as the resource linker on Windows). Command line
# options to MEX may also affect what arguments are passed to these tools,
# or may control other aspects of MEX's behavior.
#
# Command Line Options:
# Options available on all platforms:
#
# -ada <sfcn.ads>
# Use this option to compile a Simulink S-function written in Ada, where
# <sfcn.ads> is the Package Specification for the S-function. When this
# option is specified, only the -v (verbose) and -g (debug) options are
# relevant. All other options are ignored. See
# $MATLAB/simulink/ada/examples/README for examples and info on
# supported compilers and other requirements.
# -argcheck
# Add argument checking. This adds code so that arguments passed
# incorrectly to MATLAB API functions will cause assertion failures.
# Adds -DARGCHECK to the C compiler flags, and adds
# $MATLAB/extern/src/mwdebug.c to the list of source files. (C functions
# only).
# -c
# Compile only. Creates an object file but not a MEX-file.
# -D<name>
# Define a symbol name to the C preprocessor. Equivalent to a
# "#define <name>" directive in the source.
# -D<name>#<value>
# Define a symbol name and value to the C preprocessor. Equivalent to a
# "#define <name> <value>" directive in the source.
# -f <optionsfile>
# Specify location and name of options file to use. Overrides MEX's
# default options file search mechanism.
# -g
# Create a debuggable MEX-file. If this option is specified, MEX appends
# the value of options file variables ending in DEBUGFLAGS with their
# corresponding base variable. (For example, the value of LINKDEBUGFLAGS
# would be appended to the LINKFLAGS variable before calling the
# linker.) This option also disables MEX's default behavior of
# optimizing built object code.
# -h[elp]
# Print this message.
# -I<pathname>
# Add <pathname> to the list of directories to search for #include
# files.
# -inline
# Inline matrix accessor functions (mx*). The MEX-function generated
# may not be compatible with future versions of MATLAB.
# -n
# No execute mode. Print out any commands that MEX would otherwise have
# executed, but do not actually execute any of them.
# -O
# Optimize the object code by including the optimization flags listed in
# the options file. If this option is specified, MEX appends the value
# of options file variables ending in OPTIMFLAGS with their
# corresponding base variable. (For example, the value of LINKOPTIMFLAGS
# would be appended to the LINKFLAGS variable before calling the
# linker.) Note that optimizations are enabled by default, are disabled
# by the -g option, but are reenabled by -O.
# -outdir <dirname>
# Place all output files in directory <dirname>. The directory will
# be created if it does not exist.
# -output <resultname>
# Create MEX-file named <resultname> (an appropriate MEX-file extension
# is automatically appended). Overrides MEX's default MEX-file naming
# mechanism.
# -setup
# Interactively specify the compiler options file to use as default for
# future invocations of MEX by placing it in "<UserProfile>\Application
# Data\MathWorks\MATLAB\<rel_version>" (for Windows) or
# $HOME/.matlab/<rel_version> (for UNIX). <rel_version> is the base
# release version like R14. When this option is specified, no other
# command line input is accepted.
# -U<name>
# Remove any initial definition of the C preprocessor symbol <name>.
# (Inverse of the -D option.)
# -v
# Print the values for important internal variables after the options
# file is processed and all command line arguments are considered.
# Prints each compile step and final link step fully evaluated to see
# which options and files were used. Very useful for debugging.
# -V5
# Compile a MATLAB 5-style MEX-file. This option is intended as an aid
# to migration, and is not recommended as a permanent solution.
# <name>#<value>
# Override an options file variable for variable <name>. See the
# platform-dependent discussion of options files below for more details.
# This option is processed after the options file is processed and all
# command line arguments are considered.
#
# Additional options available on Windows platforms:
#
# @<rspfile>
# Include contents of the text file <rspfile> as command line arguments
# to MEX.
#
# Additional options available on Unix platforms:
#
# -D<name>=<value>
# Define a symbol name and value to the C preprocessor. Equivalent to a
# "#define <name> <value>" directive in the source.
# -cxx
# Specify that the gateway routine is in C. Use the C++ linker to link
# the mex file.
# -fortran
# Specify that the gateway routine is in Fortran. This will override
# what the script normally assumes, which is that the first source file
# in the list is the gateway routine.
# -l<name>
# Link with object library "lib<name>" (for "ld(1)").
# -L<directory>
# Add <directory> to the list of directories containing object-library
# routines (for linking using "ld(1)").
# <name>=<value>
# Override an options file variable for variable <name>. See the
# platform-dependent discussion of options files below for more details.
#
# Options File Details:
# On Windows:
# The options file is written as a DOS batch file. If the -f option is not
# used to specify the options file name and location, then MEX searches
# for an options file named mexopts.bat in the following directories: the
# current directory, then the directory "<UserProfile>\Application
# Data\MathWorks\MATLAB\<rel_version>". <rel_version> is the base release
# version like R14. Any variable specified in the options file can be
# overridden at the command line by use of the <name>#<value> command
# line argument. If <value> has spaces in it, then it should be wrapped in
# double quotes (e.g., COMPFLAGS#"opt1 opt2"). The definition can rely on
# other variables defined in the options file; in this case the variable
# referenced should have a prepended "$" (e.g., COMPFLAGS#"$COMPFLAGS opt2").
#
# Note: The options files in $MATLAB\bin\mexopts named *engmatopts.bat are
# special case options files that can be used with MEX (via the -f option)
# to generate stand-alone MATLAB Engine and MATLAB MAT-API executables.
# Such executables are given a ".exe" extension.
#
# On UNIX:
# The options file is written as a UNIX shell script. If the -f option is
# not used to specify the options file name and location, then MEX
# searches for an options file named mexopts.sh in the following
# directories: the current directory (.), then $HOME/.matlab/<rel_verison>,
# then $MATLAB/bin. <rel_version> is the base release version like R14. Any
# variable specified in the options file can be overridden at the command
# line by use of the <name>=<def> command line argument. If <def> has
# spaces in it, then it should be wrapped in single quotes (e.g.,
# CFLAGS='opt1 opt2'). The definition can rely on other variables defined
# in the options file; in this case the variable referenced should have a
# prepended "$" (e.g., CFLAGS='$CFLAGS opt2').
#
# Note: The options files in $MATLAB/bin named engopts.sh and matopts.sh
# are special case options files that can be used with MEX (via the -f
# option) to generate stand-alone MATLAB Engine and MATLAB MAT-API
# executables. Such executables are not given any default extension.
#
# Examples:
# The following command will compile "myprog.c" into "myprog.mexsol" (when
# run under Solaris):
#
# mex myprog.c
#
# When debugging, it is often useful to use "verbose" mode as well
# as include symbolic debugging information:
#
# mex -v -g myprog.c
#
# Files:
# mexopts.sh, Mex options file that is
# $HOME/.matlab/<rel_version>/mexopts.sh, source from from the first
# $MATLAB/bin/mexopts.sh file in the list. It allows
# the user to set the values
# for important directories,
# files, and environment
# variables. See
# $MATLAB/bin/mexopts.sh
# for a template.
# matlab/extern/include/mex.h Header file for MEX files.
# matlab/extern/lib/sol2/mapfile Map file to specify export
# symbols on Solaris platform.
#
# See Also:
# MATLAB API User's Guide
#
# Copyright 1984-2004 The MathWorks, Inc.
# $Revision: 1.108.4.12 $ $Date: 2004/04/25 21:30:57 $
#____________________________________________________________________________
    arg0_=$0

    tmpbase=/tmp/mex.$LOGNAME.$$
#
    abort='rm -rf $files_to_remove $basename.o > /dev/null 2>&1; \
          echo ""; \
          echo " mex: interrupted."; \
          echo ""'
#
    trap "eval $abort; exit 1" 1 2 3 15
#
#========================= archlist.sh (start) ============================
#
# usage: archlist.sh
#
# abstract: This Bourne Shell script creates the variable ARCH_LIST.
#
# note(s): 1. This file is always imbedded in another script
#
# Copyright 1997-2004 The MathWorks, Inc.
# $Revision: 1.9.4.4 $ $Date: 2004/07/08 01:06:10 $
#----------------------------------------------------------------------------
#
    ARCH_LIST='sol2 hpux glnx86 glnxi64 glnxa64 mac'
#=======================================================================
# Functions:
# check_archlist ()
#=======================================================================
    check_archlist () { # Sets ARCH. If first argument contains a valid
                        # arch then ARCH is set to that value else
                        # an empty string. If there is a second argument
                        # do not output any warning message. The most
                        # common forms of the first argument are:
                        #
                        # ARCH=arch
                        # MATLAB_ARCH=arch
                        # argument=-arch
                        #
                        # Always returns a 0 status.
                        #
                        # usage: check_archlist arch=[-]value [noprint]
                        #
        if [ $# -gt 0 ]; then
            arch_in=`expr "$1" : '.*=\(.*\)'`
            if [ "$arch_in" != "" ]; then
                ARCH=`echo "$ARCH_LIST EOF $arch_in" | awk '
#-----------------------------------------------------------------------
        { for (i = 1; i <= NF; i = i + 1)
              if ($i == "EOF")
                  narch = i - 1
          for (i = 1; i <= narch; i = i + 1)
                if ($i == $NF || "-" $i == $NF) {
                    print $i
                    exit
                }
        }'`
#-----------------------------------------------------------------------
               if [ "$ARCH" = "" -a $# -eq 1 ]; then
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
echo ' '
echo " Warning: $1 does not specify a valid architecture - ignored . . ."
echo ' '
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
               fi
            else
                ARCH=""
            fi
        else
            ARCH=""
        fi
#
        return 0
    }
#=======================================================================
#========================= archlist.sh (end) ==============================
#
#========================== version.sh (start) ============================
#
# usage: version [-b]
#
# abstract: This POSIX Shell script function returns the MATLAB
# release version. Any bad options are ignored without
# warning.
#
# The version is assumed to be of the form:
#
# R<integer>[<noninteger>]
#
# options:
#
# b - return just R<integer> or the base version.
#
# note(s): 1. This file is always imbedded in another script
#
# Copyright 1992-2003 The MathWorks, Inc.
# $Revision: 1.1.6.2 $ $Date: 2004/07/08 01:06:11 $
#----------------------------------------------------------------------------
#
version () {
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    ver='R14'
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    if [ $# -eq 1 ]; then
        if [ "$1" = '-b' ]; then
            expr "$ver" : '\(R[0-9]*\).*$'
            return $?
        fi
    fi
    echo "$ver"
    return 0
}
#========================== version.sh (end) ==============================
    REL_VERSION=`version -b`
#
#============================================================================
# FUNCTION DEFINITIONS
#============================================================================
#
#****************************************************************************
#
# NOTE: A call to cleanup MUST precede any call to exit within this script,
# except for within trap calls.
  cleanup () {
#
# Clean up temporary and intermediate files (usually in preparation
# for exiting)
#
    trap "eval $abort; exit 1" 1 2 3 15
    rm -rf $files_to_remove > /dev/null 2>&1
    }
# end cleanup ()
#
#****************************************************************************
#
  describe () {
#
    case "$1" in
        internal_error_1)
    echo ''
    echo 'Internal error 1: We could not determine the path of the'
    echo ' MATLAB root directory.'
    echo ''
    echo " original command path = $arg0_"
    echo " current command path = $filename"
    echo ''
    echo ' Please contact:'
    echo ''
    echo ' MathWorks Technical Support'
    echo ''
    echo ' for further assistance.'
    echo ''
            ;;
        internal_error_2)
    echo ''
    echo 'Internal error 2: Could not determine the path of the'
    echo ' MATLAB root directory.'
    echo ''
    echo " original command path = $filename"
    echo " current command path = $filename"
    echo ''
    echo ' Please contact:'
    echo ''
    echo ' MathWorks Technical Support'
    echo ''
    echo ' for further assistance.'
    echo ''
            ;;
        internal_error_3)
    echo ''
    echo 'Internal error 3: More than $maxlinks links in path to'
    echo " this script. That's too many!"
    echo ''
    echo " original command path = $filename"
    echo " current command path = $filename"
    echo ''
    echo ' Please contact:'
    echo ''
    echo ' MathWorks Technical Support'
    echo ''
    echo ' for further assistance.'
    echo ''
            ;;
        unknown_architecture)
    echo ''
    echo ' Sorry! We could not determine the machine architecture'
    echo ' for your host. Please contact:'
    echo ''
    echo ' MathWorks Technical Support'
    echo ''
    echo ' for further assistance.'
    echo ''
            ;;
        no_util_scripts)
    echo ''
    echo ' Sorry! We could not determine the machine architecture'
    echo ' for your host, because one of the utilities'
    echo ''
    echo ' $MATLAB/bin/util/arch.sh'
    echo ''
    echo ' or'
    echo ''
    echo ' $MATLAB/bin/util/oscheck.sh'
    echo ''
    echo ' could not be found. Please make sure that your'
    echo ' installation is not corrupted. If you specified'
    echo ' the value of $MATLAB in the command line, please'
    echo ' make sure you specified the right value.'
    echo ''
    echo ' Here'
    echo ''
    echo " MATLAB = $MATLAB"
    echo ''
    echo ' Please contact:'
    echo ''
    echo ' MathWorks Technical Support'
    echo ''
    echo ' if you need assistance.'
    echo ''
            ;;
        unknown_arch)
    echo ''
    echo " mex: machine architecture '$Arch' not supported."
    echo ''
            ;;
        invalid_options_file)
    echo ''
    echo ' Error: An invalid options file name was specified:'
    echo " $2 is not a normal file or does not exist."
    echo ''
            ;;
        no_options_file)
    echo ''
    echo ' Sorry! No options file was found for mex.'
    echo ' The mex script must be able to source'
    echo ' an options file to define compiler flags'
    echo ' and other settings. This options file'
    echo " is normally found in MATLAB/bin/$OPTSFILE_NAME."
    echo ' Please check to make sure that your installation'
    echo ' is complete and includes this file.'
    echo ''
    echo ' Here'
    echo ''
    echo " MATLAB = $MATLAB"
    echo ''
    echo ' Please contact:'
    echo ''
    echo ' MathWorks Technical Support'
    echo ''
    echo ' for further assistance.'
    echo ''
            ;;
        final_options)
            if [ "$SOURCE_DIR" = "none" ]; then
    echo '----------------------------------------------------------------'
    echo "-> options file specified on command line:"
    echo " FILE = $OPTIONS_FILE"
            elif [ "$SOURCE_DIR" != "" ]; then
    echo "-> $OPTSFILE_NAME sourced from directory (DIR = $SOURCE_DIR)"
    echo " FILE = $SOURCE_DIReval/$OPTSFILE_NAME"
            else
    echo "-> options file not found ($OPTSFILE_NAME looked for)."
            fi
    echo '----------------------------------------------------------------'
    echo "-> MATLAB = $MATLAB"
    echo "-> CC = $CC"
    echo "-> CC flags:"
    echo " CFLAGS = $CFLAGS"
    echo " CDEBUGFLAGS = $CDEBUGFLAGS"
    echo " COPTIMFLAGS = $COPTIMFLAGS"
    echo " CLIBS = $CLIBS"
    echo " arguments = $cc_flags"
    echo "-> CXX = $CXX"
    echo "-> CXX flags:"
    echo " CXXFLAGS = $CXXFLAGS"
    echo " CXXDEBUGFLAGS = $CXXDEBUGFLAGS"
    echo " CXXOPTIMFLAGS = $CXXOPTIMFLAGS"
    echo " CXXLIBS = $CXXLIBS"
    echo " arguments = $cxx_flags"
    echo "-> FC = $FC"
    echo "-> FC flags:"
    echo " FFLAGS = $FFLAGS"
    echo " FDEBUGFLAGS = $FDEBUGFLAGS"
    echo " FOPTIMFLAGS = $FOPTIMFLAGS"
    echo " FLIBS = $FLIBS"
    echo " arguments = $fc_flags"
    echo "-> LD = $LD"
    echo "-> Link flags:"
    echo " LDFLAGS = $LDFLAGS"
    echo " LDDEBUGFLAGS = $LDDEBUGFLAGS"
    echo " LDOPTIMFLAGS = $LDOPTIMFLAGS"
    echo " LDEXTENSION = $LDEXTENSION"
    echo " arguments = $libs"
    echo "-> LDCXX = $LDCXX"
    echo "-> Link flags:"
    echo " LDCXXFLAGS = $LDCXXFLAGS"
    echo " LDCXXDEBUGFLAGS = $LDCXXDEBUGFLAGS"
    echo " LDCXXOPTIMFLAGS = $LDCXXOPTIMFLAGS"
    echo " LDCXXEXTENSION = $LDCXXEXTENSION"
    echo " arguments = $libs"
    echo '----------------------------------------------------------------'
    echo ''
            ;;
        assuming_c_source)
    echo ''
    echo ' Warning: No source files in argument list.'
    echo ''
    echo ' Assuming C source code. To override this assumption, use'
    echo ' -fortran.'
    echo ' or'
    echo ' -cxx'
    echo ''
            ;;
        meaningless_output_flag)
    echo ''
    echo ' Warning: -output ignored (no MEX-file is being created).'
    echo ''
            ;;
        assuming_matlab_6)
    echo ' Assuming fully MATLAB 6 compliant MEX-file. To override'
    echo ' this assumption, use -V5.'
    echo ''
            ;;
        status)
    echo ""
    echo " mex: $stat"
            ;;
        help)
    cat<<'EOF'

Usage:
  MEX [option1 ... optionN] sourcefile1 [... sourcefileN]
      [objectfile1 ... objectfileN] [libraryfile1 ... libraryfileN]

Description:
  MEX compiles and links source files into a shared library called a
  MEX-file, executable from within MATLAB. The resulting file has a
  platform-dependent extension, as shown in the table below:

    solaris - .mexsol
    hpux - .mexhpux
    glnx86 - .mexglx
    glnxi64 - .mexi64
    Mac OS X - .mexmac
    Windows - .dll

  The first file name given (less any file name extension) will be the name
  of the resulting MEX-file. Additional source, object, or library files can
  be given to satisfy external references. On Windows, either C or Fortran,
  but not both, may be specified. On UNIX, both C and Fortran source files
  can be specified when building a MEX-file. If C and Fortran are mixed, the
  first source file given determines the entry point exported from the
  MEX-file (MATLAB loads and runs a different entry point symbol for C or
  Fortran MEX-files).

  Both an options file and command line options affect the behavior of MEX.
  The options file contains a list of variables that are passed as arguments
  to various tools such as the compiler, linker, and other platform-
  dependent tools (such as the resource linker on Windows). Command line
  options to MEX may also affect what arguments are passed to these tools,
  or may control other aspects of MEX's behavior.

Command Line Options:
  Options available on all platforms:

  -ada <sfcn.ads>
      Use this option to compile a Simulink S-function written in Ada, where
      <sfcn.ads> is the Package Specification for the S-function. When this
      option is specified, only the -v (verbose) and -g (debug) options are
      relevant. All other options are ignored. See
      $MATLAB/simulink/ada/examples/README for examples and info on
      supported compilers and other requirements.
  -argcheck
      Add argument checking. This adds code so that arguments passed
      incorrectly to MATLAB API functions will cause assertion failures.
      Adds -DARGCHECK to the C compiler flags, and adds
      $MATLAB/extern/src/mwdebug.c to the list of source files. (C functions
      only).
  -c
      Compile only. Creates an object file but not a MEX-file.
  -D<name>
      Define a symbol name to the C preprocessor. Equivalent to a
      "#define <name>" directive in the source.
  -D<name>#<value>
      Define a symbol name and value to the C preprocessor. Equivalent to a
      "#define <name> <value>" directive in the source.
  -f <optionsfile>
      Specify location and name of options file to use. Overrides MEX's
      default options file search mechanism.
  -g
      Create a debuggable MEX-file. If this option is specified, MEX appends
      the value of options file variables ending in DEBUGFLAGS with their
      corresponding base variable. (For example, the value of LINKDEBUGFLAGS
      would be appended to the LINKFLAGS variable before calling the
      linker.) This option also disables MEX's default behavior of
      optimizing built object code.
  -h[elp]
      Print this message.
  -I<pathname>
      Add <pathname> to the list of directories to search for #include
      files.
  -inline
      Inline matrix accessor functions (mx*). The MEX-function generated
      may not be compatible with future versions of MATLAB.
  -n
      No execute mode. Print out any commands that MEX would otherwise have
      executed, but do not actually execute any of them.
  -O
      Optimize the object code by including the optimization flags listed in
      the options file. If this option is specified, MEX appends the value
      of options file variables ending in OPTIMFLAGS with their
      corresponding base variable. (For example, the value of LINKOPTIMFLAGS
      would be appended to the LINKFLAGS variable before calling the
      linker.) Note that optimizations are enabled by default, are disabled
      by the -g option, but are reenabled by -O.
  -outdir <dirname>
      Place all output files in directory <dirname>.
  -output <resultname>
      Create MEX-file named <resultname> (an appropriate MEX-file extension
      is automatically appended). Overrides MEX's default MEX-file naming
      mechanism.
  -setup
      Interactively specify the compiler options file to use as default for
      future invocations of MEX by placing it in "<UserProfile>\Application
      Data\MathWorks\MATLAB\<rel_version>" (for Windows) or
      $HOME/.matlab/<rel_version> (for UNIX). <rel_version> is the base
      release version like R14. When this option is specified, no other
      command line input is accepted.
  -U<name>
      Remove any initial definition of the C preprocessor symbol <name>.
      (Inverse of the -D option.)
  -v
      Print the values for important internal variables after the options
      file is processed and all command line arguments are considered.
      Prints each compile step and final link step fully evaluated to see
      which options and files were used. Very useful for debugging.
  -V5
      Compile a MATLAB 5-style MEX-file. This option is intended as an aid
      to migration, and is not recommended as a permanent solution.
  <name>#<value>
      Override an options file variable for variable <name>. See the
      platform-dependent discussion of options files below for more details.
      This option is processed after the options file is processed and all
      command line arguments are considered.

Additional options available on Windows platforms:

  @<rspfile>
      Include contents of the text file <rspfile> as command line arguments
      to MEX.

Additional options available on Unix platforms:

  -D<name>=<value>
      Define a symbol name and value to the C preprocessor. Equivalent to a
      "#define <name> <value>" directive in the source.
  -fortran
      Specify that the gateway routine is in Fortran. This will override
      what the script normally assumes, which is that the first source file
      in the list is the gateway routine.
  -l<name>
      Link with object library "lib<name>" (for "ld(1)").
  -L<directory>
      Add <directory> to the list of directories containing object-library
      routines (for linking using "ld(1)").
  <name>=<value>
      Override an options file variable for variable <name>. See the
      platform-dependent discussion of options files below for more details.

Options File Details:
  On Windows:
    The options file is written as a DOS batch file. If the -f option is not
    used to specify the options file name and location, then MEX searches
    for an options file named mexopts.bat in the following directories: the
    current directory, then the directory "<UserProfile>\Application
    Data\MathWorks\MATLAB\<rel_version>". <rel_version> is the base release
    version like R14. Any variable specified in the options file can be
    overridden at the command line by use of the <name>#<value> command
    line argument. If <value> has spaces in it, then it should be wrapped
    in double quotes (e.g., COMPFLAGS#"opt1 opt2"). The definition can rely
    on other variables defined in the options file; in this case the
    variable referenced should have a prepended "$" (e.g.,
    COMPFLAGS#"$COMPFLAGS opt2").

    Note: The options files in $MATLAB\bin\mexopts named *engmatopts.bat are
    special case options files that can be used with MEX (via the -f option)
    to generate stand-alone MATLAB Engine and MATLAB MAT-API executables.
    Such executables are given a ".exe" extension.

  On UNIX:
    The options file is written as a UNIX shell script. If the -f option is
    not used to specify the options file name and location, then MEX
    searches for an options file named mexopts.sh in the following
    directories: the current directory (.), then $HOME/.matlab/<rel_version>,
    then $MATLAB/bin. <rel_version> is the base release version like R14.
    Any variable specified in the options file can be overridden at the
    command line by use of the <name>=<def> command line argument. If
    <def> has spaces in it, then it should be wrapped in single quotes
    (e.g., CFLAGS='opt1 opt2'). The definition can rely on other variables
    defined in the options file; in this case the variable referenced should
    have a prepended "$" (e.g., CFLAGS='$CFLAGS opt2').

    Note: The options files in $MATLAB/bin named engopts.sh and matopts.sh
    are special case options files that can be used with MEX (via the -f
    option) to generate stand-alone MATLAB Engine and MATLAB MAT-API
    executables. Such executables are not given any default extension.

Examples:
    The following command will compile "myprog.c" into "myprog.mexsol" (when
    run under Solaris):

      mex myprog.c

    When debugging, it is often useful to use "verbose" mode as well
    as include symbolic debugging information:

      mex -v -g myprog.c
EOF
            ;;
        usage)
    cat<<'EOF'

    Usage:
      MEX [option1 ... optionN] sourcefile1 [... sourcefileN]
          [objectfile1 ... objectfileN] [libraryfile1 ... libraryfileN]

    or (to build an Ada S-function):
      MEX [-v] [-g] -ada <sfcn>.ads

    Use the -help option for more information, or consult the MATLAB External Interfaces Guide.

EOF
            ;;
        file_not_found)
    echo ''
    echo " mex: $file not a normal file or does not exist."
    echo ''
            ;;
        compile_stage)
    echo "-> $compile_command"
    echo ''
            ;;
        failed_compile)
    echo ''
    echo " mex: compile of '$file' failed."
    echo ''
            ;;
        link_stage)
    echo "-> $LD $LDFLAGS -o $mex_file $libetc"
    echo ''
            ;;
        failed_link)
    echo ''
    echo " mex: link of '$mex_file' failed."
    echo ''
            ;;
        postlink_stage)
    echo "-> $POSTLINK_CMDS"
    echo ''
            ;;
        invalid_ada_flag)
    echo ''
    echo ' Error: An invalid Ada S-function file name was specified:'
    echo " $2 is not a normal file or does not exist."
    echo ''
            ;;
        ada_needs_gnu_make)
    echo ''
    echo ' Error: Need GNU make properly installed and available on path '
    echo " to build Ada S-function '$ada_sfcn'"
    echo ''
            ;;
        ada_build_failure)
    echo ''
    echo " mex: Failed to build Ada S-Function '$ada_sfcn'"
    echo ''
            ;;
        fortran_cannot_change_entrypt)
    echo ''
    echo ' Warning: -entrypt ignored (FORTRAN entry point cannot be overridden).'
    echo ''
            ;;
        cannot_create_outdir)
    echo ''
    echo " Error: Could not create OUTDIR = $OUTDIR"
    echo ''
            ;;
        cannot_create_temp)
    echo ''
    echo " Error: Could not create TEMP = $TEMP"
    echo ''
            ;;
        *)
    echo ''
    echo " Internal error 4: unimplemented message $1"
    echo ''
            ;;
    esac
  }
# end describe ()
#
#****************************************************************************
#
  smart_quote () {
#
# Return a quoted version of the input string if it has spaces in it.
#
    if [ $# -gt 1 ]; then
        echo \"$*\"
    else
        echo $1
    fi
  }
# end smart_quote ()
#
#****************************************************************************
#
  get_root_dir () {
#
# Determine the path of the MATLAB root directory - always one directory
# up from the path to this command.
#
    filename=$1
#
# Now it is either a file or a link to a file.
#
    cpath=`pwd`
#
# Follow up to 8 links before giving up. Same as BSD 4.3
#
    n=1
    maxlinks=8
    while [ $n -le $maxlinks ]
    do
#
# Get directory correctly!
#
        newdir=`echo "$filename" | awk '
                        { tail = $0
                          np = index (tail, "/")
                          while ( np != 0 ) {
                             tail = substr (tail, np + 1, length (tail) - np)
                             if (tail == "" ) break
                             np = index (tail, "/")
                          }
                          head = substr ($0, 1, length ($0) - length (tail))
                          if ( tail == "." || tail == "..")
                             print $0
                          else
                             print head
                        }'`
        if [ ! "$newdir" ]; then
            newdir="."
        fi
        (cd $newdir) > /dev/null 2>&1
        if [ $? -ne 0 ]; then
            describe internal_error_1 >&2
            cleanup
            exit 1
        fi
        cd $newdir
#
# Need the function pwd - not the built in one
#
        newdir=`/bin/pwd`
#
        newbase=`expr //$filename : '.*/\(.*\)' \| $filename`
        lscmd=`ls -l $newbase 2>/dev/null`
        if [ ! "$lscmd" ]; then
            describe internal_error_2 >&2
            cleanup
            exit 1
        fi
#
# Check for link portably
#
        if [ `expr "$lscmd" : '.*->.*'` -ne 0 ]; then
            filename=`echo "$lscmd" | awk '{ print $NF }'`
        else
#
# It's a file
#
            dir="$newdir"
            command="$newbase"
#
            cd $dir/..
            MATLAB=`/bin/pwd`; export MATLAB
            break
        fi
        n=`expr $n + 1`
    done
    if [ $n -gt $maxlinks ]; then
        describe internal_error_3 >&2
        cleanup
        exit 1
    fi
#
    cd $cpath
  }
# end get_root_dir ()
#
#****************************************************************************
#
  get_entrypt () {
#
# Set up the entry point based on the input argument
#
    if [ "$1" = "FORTRAN" ]; then
#
# The gateway routine is in Fortran; use Fortran entry point
#
        MAPFILE='fexport.map'
    else
#
# C, C++ and Ada entry points are the same
#
        MAPFILE=$entrypt'.map'
        ENTRYPOINT=$entrypt
    fi
  }
# end get_entrypt ()
#
#****************************************************************************
#
  determine_options_file () {
# Source options file (default is $OPTSFILE_NAME) and get values for the
# following local variables
#
# MATLAB (MATLAB root directory)
# CC (C compiler)
# CFLAGS (C compiler options)
# COPTIMFLAGS (Compiler optimization flags)
# CDEBUGFLAGS (Compiler debugging flags)
# CLIBS (C libraries for linking)
# CXX (C++ compiler)
# CXXFLAGS (C++ compiler options)
# CXXOPTIMFLAGS (Compiler optimization flags)
# CXXDEBUGFLAGS (Compiler debugging flags)
# CXXLIBS (C++ libraries for linking)
# FC (Fortran compiler)
# FFLAGS (Fortran options)
# FOPTIMFLAGS (Compiler optimization flags)
# FDEBUGFLAGS (Compiler debugging flags)
# FLIBS (Fortran libraries for linking)
# LD (Linker command)
# LDFLAGS (Linker options)
# LDOPTIMFLAGS (Compiler optimization flags)
# LDDEBUGFLAGS (Compiler debugging flags)
# LDEXTENSION (Extension to add to output filename)
#
# The search order for the options file is:
#
# -f optionsfile (file specified with -f command line option)
# ./$OPTSFILE_NAME ($OPTSFILE_NAME in current directory)
# $HOME/.matlab/<rel_version>/$OPTSFILE_NAME ($OPTSFILE_NAME in user's matlab preferences directory)
# $MATLAB/bin/$OPTSFILE_NAME ($OPTSFILE_NAME file in MATLAB bin directory)
#
#
    if [ -f ./$OPTSFILE_NAME ]; then
        SOURCE_DIR='.'
        SOURCE_DIReval=`pwd`
        OPTIONS_FILE="./$OPTSFILE_NAME"
    elif [ -f $HOME/.matlab/$REL_VERSION/$OPTSFILE_NAME ]; then
        SOURCE_DIR='$HOME/.matlab/$REL_VERSION'
        SOURCE_DIReval=$HOME/.matlab/$REL_VERSION
        OPTIONS_FILE="$HOME/.matlab/$REL_VERSION/$OPTSFILE_NAME"
    elif [ -f $MATLAB/bin/$OPTSFILE_NAME ]; then
#
# NOTE: At this point we will use the MATLAB determined earlier to
# source the file. After that the value in that file if not
# null will be used.
#
        SOURCE_DIR='$MATLAB/bin'
        SOURCE_DIReval=$MATLAB/bin
        OPTIONS_FILE="$MATLAB/bin/$OPTSFILE_NAME"
    else
        describe no_options_file >&2
        cleanup
        exit 1
    fi
  }
# end determine_options_file ()
#
#****************************************************************************
#
  get_arch () {
    if [ "$ARCH" = "" ]; then # No command line override given
        if [ ! -f $MATLAB/bin/util/arch.sh ]; then
            describe no_util_scripts >&2
            cleanup
            exit 1
        fi
        . $MATLAB/bin/util/arch.sh
        if [ "$Arch" = "unknown" ]; then
            describe unknown_architecture >&2
            cleanup
            exit 1
        fi
    else # Use command line override
        Arch=$ARCH
    fi
    if [ ! -f $MATLAB/bin/util/oscheck.sh ]; then
        describe no_util_scripts >&2
        cleanup
        exit 1
    fi
    if [ "$verbose" = "1" ]; then
        temp_file=$tmpbase.b
        files_to_remove="$files_to_remove $temp_file"
        . $MATLAB/bin/util/oscheck.sh
        if [ "$oscheck_status" = "1" ]; then
            cleanup
            exit 1
        fi
    fi
  }
# end get_arch ()
#
#****************************************************************************
#
  eval_assignments () {
#
# Source the file of argument variables, name=[def]
#
    if [ -f $tmpbase.a ]; then
        . $tmpbase.a
    fi

#
# Make sure that LD is fully evaluated to handle LD=$COMPILER assignment
# Some platforms also use the special LDCXX variable for C++ files
#
    LD="`eval echo $LD`"
    LDCXX="`eval echo $LDCXX`"

#
# If TEMP is defined be sure that TEMP has been created.
#
    if [ "$TEMP" != "" ]; then
        (cd $TEMP) > /dev/null 2>&1
        if [ $? -ne 0 ]; then
            mkdir -p $TEMP 2>/dev/null
            if [ $? -ne 0 ]; then
                describe cannot_create_temp >&2
                cleanup
                exit 1
            fi
        fi
    fi
  }
# end eval_assignments ()
#
#****************************************************************************
#
  build_ada_s_function () {
#
#
    mex_ext=`expr $LDEXTENSION : '\.\(.*\)'`
    ada_build_args="MATLAB_ROOT=$MATLAB ARCH=$ARCH MEX_EXT=$mex_ext "
    ada_build_args="$ada_build_args ADA_SFCN=$ada_sfcn "
#
# Determine GNAT Compiler Version
#
    gnatVer=`gnatmake -v 2>&1 | grep GNATMAKE | awk '{print $2}'`
    ada_build_args="$ada_build_args GNAT_VER=$gnatVer "
#
    if [ "$debug" = "1" ]; then
        ada_build_args="$ada_build_args DEBUG=1 "
    fi
#
    if [ "$verbose" = "1" ]; then
        ada_build_args="$ada_build_args VERBOSE=1 "
    fi
#
    if [ "$OUTDIR" != "" ]; then
        ada_build_args="$ada_build_args OUTPUT_DIR=$OUTDIR "
    fi
#
    if [ "$include_dirs" != "" ]; then
        ada_build_args="$ada_build_args INCLUDES=\"$include_dirs\" "
    fi
    makefile="$MATLAB/simulink/ada/interface/gnat_unix.mk"
#
# Verify that make exists and is gnu make
#
    makeVer='make --version | paste -s -d" " -'
    makeOk='expr "$makeVer" : "^GNU Make version .*"'
    if [ "$makeOk" = "0" ]; then
        describe ada_needs_gnu_make >&2
        cleanup
        exit 1
    fi
    echo " "
    echo "### Starting build for Ada S-function $ada_sfcn"
    ada_build_cmd="make -f $makefile $ada_build_args"
    if [ "$verbose" = "1" ]; then
        echo " "
        echo " $ada_build_cmd"
        echo " "
    fi
    eval "$ada_build_cmd"
    if [ $? -ne 0 ]; then
        describe ada_build_failure >&2
        cleanup
        exit 1
    else
        echo "### Successfully built Ada S-function $ada_sfcn"
        echo " "
    fi
  }
# end build_ada_s_function ()
#
#****************************************************************************
#
  error_check () {
#
# Check for errors in calling syntax
#
    if [ "$argcheck" = "1" -a "$cfiles" != "1" ]; then
        stat="Argument checking not possible without C source files."
    fi
    if [ "$inlined" = "1" -a "$cfiles" != "1" ]; then
        stat="Inlining not possible without C source files."
    fi
    if [ "$argcheck" = "1" -a "$inlined" = "1" ]; then
        stat="Argument checking and inlining are mutually exclusive."
    fi
    if [ "$files" != "" -a "$cfiles" != "1" -a "$cxxfiles" != "1" -a "$ffiles" != "1" ]; then
        cfiles=1
        if [ "$verbose" != "" ]; then
            describe assuming_c_source
            if [ "$v5_compat" != "1" ]; then
                describe assuming_matlab_6
            fi
        fi
    fi
    if [ "$stat" != "OK" ]; then # An error occurred.
        if [ "$stat" != "" ]; then
            describe status >&2
        fi
        describe usage >&2
        cleanup
        exit 1
    fi
  }
# end error_check ()
#
#****************************************************************************
#
  get_name () {
#
# If there is already a mex name, -output was used: supply an appropriate
# MEX-file extension if necessary. (Warn if -c was also used.)
# Otherwise, use the first file name to determine the MEX-file name.
# If there are no files, don't complain (error_check comes later).
#
    if [ "$mex_file" != "" ]; then
        if [ "$compile_only" = "1" ]; then
            describe meaningless_output_flag
        fi
        ext=`expr "$mex_file" : ".*$LDEXTENSION$"`
        if [ "$ext" = "0" ]; then
            mex_file=$mex_file$LDEXTENSION
        fi
    elif [ "$1" != "" ]; then
        ext=`expr "$1" : '\.*[^.].*\.\([^.]*\)$'`
        mex_file=`expr "//$1" : ".*/\(.*\)\.${ext}$" \| "//$1" : ".*/\(.*\)"`
        mex_file=$mex_file$LDEXTENSION
    fi
    if [ "$OUTDIR" != "" ]; then
        mex_file="$OUTDIR/$mex_file"
    fi
    mex_file=`smart_quote $mex_file`
  }
# end get_name ()
#
#****************************************************************************
#
  get_includes () {
#
# Determine which include directories to specify
#
    include_dirs="$include_dirs -I`smart_quote $MATLAB/$MEX_INCLUDE_DIR`"
    if [ -d $MATLAB/simulink ]; then
        include_dirs="$include_dirs -I`smart_quote $MATLAB/simulink/include`"
    fi
    if [ -d $MATLAB/codegen ]; then
        include_dirs="$include_dirs -I`smart_quote $MATLAB/codegen/external/common`"
    fi
  }
# end get_includes ()
#
#****************************************************************************
#
  compile () {
    trap "eval $abort; exit 1" 1 2 3 15
#
# For each file, compile source files and add other files
# to the list of link options.
#
    file="$1"
    if [ ! -f "$file" ]; then
        describe file_not_found >&2
        cleanup
        exit 1
    fi
#
# determine extension and basename
#
    ext=`expr "$file" : '\.*[^.].*\.\([^.]*\)$'`
    if [ "$ext" = "" ]; then
        ext=`expr "$file" : '\.*[^.].*\.\(so\)[.0-9]*$'`
    fi
    basename=`expr "//$file" : ".*/\(.*\)\.${ext}$" \| //$file : ".*/\(.*\)"`
#
    if [ "$TEMP" != "" -a "$compile_only" != "1" ]; then
        basename=$TEMP/$basename$$
    elif [ "$OUTDIR" != "" ]; then
        basename=$OUTDIR/$basename
    fi

    basename=`smart_quote $basename`
#
# Source file extensions: .c .C .cc .cxx .cpp .f .for .F .f90 .F90
#
    case "$ext" in
        c) # c source file.
#
# determine whether to optimize or debug
#
            if [ "$debug" != "1" ]; then
                flags="$COPTIMFLAGS"
            elif [ "$optimize" = "1" ]; then
                flags="$CDEBUGFLAGS $COPTIMFLAGS"
            else
                flags="$CDEBUGFLAGS"
            fi
#
# Determine final compile command for C source code.
#
            flags="-DMATLAB_MEX_FILE $CFLAGS $cc_flags $flags"
            compile_command="$CC -c $include_dirs $flags $file"
            ;;
        cc | cpp | cxx | C) # C++ source file
#
# determine whether to optimize or debug
#
            if [ "$debug" != "1" ]; then
                flags="$CXXOPTIMFLAGS"
            elif [ "$optimize" = "1" ]; then
                flags="$CXXDEBUGFLAGS $CXXOPTIMFLAGS"
            else
                flags="$CXXDEBUGFLAGS"
            fi
#
# Determine final compile command for C++ source code.
#
            flags="-DMATLAB_MEX_FILE $CXXFLAGS $cxx_flags $flags"
            compile_command="$CXX -c $include_dirs $flags $file"
            ;;
        f | for | F | f90 | F90) # Fortran source file.
#
# determine whether to optimize or debug
#
            if [ "$debug" != "1" ]; then
                flags="$FOPTIMFLAGS"
            elif [ "$optimize" = "1" ]; then
                flags="$FDEBUGFLAGS $FOPTIMFLAGS"
            else
                flags="$FDEBUGFLAGS"
            fi
#
# Determine final compile command for Fortran source code.
#
            flags="$FFLAGS $fc_flags $flags"
            compile_command="$FC -c $include_dirs $flags $file"
            ;;
        *)
#
# Object files: Don't need to do anything except add to compiled list
#
            objs="$objs $file"
            return 0
            ;;
    esac
#
    if [ "$TEMP" != "" -a "$compile_only" != "1" ]; then
        compile_command="$compile_command -o $basename.o"
    elif [ "$OUTDIR" != "" ]; then
        compile_command="$compile_command -o $basename.o"
    fi
#
    if [ "$verbose" = "1" -o "$no_execute" = "true" ]; then
        describe compile_stage
    fi
#
    if [ "$no_execute" != "true" ]; then eval "$compile_command"; fi
    if [ $? -ne 0 ]; then
        describe failed_compile >&2
        cleanup
        exit 1
    fi
    if [ "$compile_only" != "1" ]; then
        files_to_remove="$files_to_remove $basename.o"
    fi
    objs="$objs $basename.o"
  }
# end compile ()
#
#****************************************************************************
#
  link () {
    trap "eval $abort; exit 1" 1 2 3 15
#
# Link stage
#
    if [ "$cfiles" = "1" ]; then
        libs="$libs $CLIBS"
    fi
    if [ "$cxxfiles" = "1" ]; then
        libs="$libs $CXXLIBS"
    fi
    if [ "$ffiles" = "1" ]; then
        libs="$libs $FLIBS"
    fi
    libetc="$objs $libs"

#
# determine whether to optimize or debug
#
    if [ "$debug" != "1" ]; then
        LDFLAGS="$LDOPTIMFLAGS $LDFLAGS"
    elif [ "$optimize" = "1" ]; then
        LDFLAGS="$LDDEBUGFLAGS $LDOPTIMFLAGS $LDFLAGS"
    else
        LDFLAGS="$LDDEBUGFLAGS $LDFLAGS"
    fi
    if [ "$verbose" = "1" -o "$no_execute" = "true" ]; then
        describe link_stage
    fi
    if [ "$no_execute" != "true" ]; then eval "$LD $LDFLAGS $ld_flags -o $mex_file $libetc"; fi
    if [ $? -ne 0 ]; then
        describe failed_link >&2
        cleanup
        exit 1
    fi
  }
# end link ()
#
#****************************************************************************
#
# On sol2 add the C++ Template Repository to the remove list under the
# right conditions.
#
# Sun uses a template repository to store template instances between
# separate compilations so that template instances are compiled only when
# necessary.
#
# It is controlled by the directory of the output file.
#
# Note: if TEMP and OUTDIR are both defined TEMP takes precedence.
#
# Necessary conditions for deletion:
#
# 1. Must compile at least one C++ file. ($cxxfiles = "1")
# 2. Must link. ($compile_only != "!")
#
# case 1: SUNWS_CACHE_NAME is undefined
#
# ./SunWS_cache - No TEMP or OUTDIR defined
# $TEMP/SunWS_cache - TEMP defined
# $OUTDIR/SunWS_cache - TEMP not defined but OUTDIR defined
#
# case 2: SUNWS_CACHE_NAME is defined
#
# ./$SUNWS_CACHE_NAME - No TEMP or OUTDIR defined
# $TEMP/$SUNWS_CACHE_NAME - TEMP defined
# $OUTDIR/$SUNWS_CACHE_NAME - TEMP not defined but OUTDIR defined
#
  add_template_to_rmlist () { # If the conditions are right add the template
                              # repository to the files_to_remove list.
                              # Used only on sol2.
#
        if [ "$cxxfiles" = "1" -a "$compile_only" != "1" ]; then
            if [ "$SUNWS_CACHE_NAME" != "" ]; then
                cache_name=$SUNWS_CACHE_NAME
            else
                cache_name=SunWS_cache
            fi
            if [ "$TEMP" = "" -a "$OUTDIR" = "" ]; then
                files_to_remove="$files_to_remove ./$cache_name"
            elif [ "$TEMP" != "" ]; then
                files_to_remove="$files_to_remove $TEMP/$cache_name"
            else
                files_to_remove="$files_to_remove $OUTDIR/$cache_name"
            fi
        fi
  }
#****************************************************************************
#
# Main routine
#
#
# Initialize some variables
#
    OPTSFILE_NAME='mexopts.sh'
#
    MEX_INCLUDE_DIR='extern/include'
#
    stat="OK"
#
   ARCH=
    Arch='Undetermined'
    verbose=0
#
# Use a C entry point by default
#
    gateway_lang=C
    entrypt=mexFunction
#
    arg_count=$#
    while [ "$stat" = "OK" -a $# -gt 0 ]; do
#
# Parse input arguments. The routine may need the next two arguments,
# as in -f optionsfile and -o mexfilename.
#
        case "$1" in
            -argcheck)
                argcheck=1
                cc_flags="$cc_flags -DARGCHECK"
                cxx_flags="$cxx_flags -DARGCHECK"
                ;;
            -c)
                compile_only=1
                ;;
            -D*) # Compiler flags.
                lhs=`expr "$1" : '\(-D[a-zA-Z0-9_]*\).*'`
                mid=`expr "$1" : '-D[a-zA-Z0-9_]*\([=\#]\).*$'`
                rhs=`expr "$1" : '-D[a-zA-Z0-9_]*[=\#]\(.*\)$'`
                
                if [ "$mid" != "" ]; then
                    mid="="
                fi

                cc_flags="$cc_flags $lhs$mid$rhs"
                cxx_flags="$cxx_flags $lhs$mid$rhs"
                fc_flags="$fc_flags $lhs$mid$rhs"

                if [ "$lhs" = "-DV5_COMPAT" ]; then
                    stat="Please use -V5 rather than directly passing"
                    stat="$stat -DV5_COMPAT."
                fi
                if [ "$lhs" = "-DARRAY_ACCESS_INLINING" ]; then
                    stat="Please use -inline rather than directly passing"
                    stat="$stat -DARRAY_ACCESS_INLINING."
                fi
                ;;
            -U*) # Compiler flags.
                cc_flags="$cc_flags $1"
                cxx_flags="$cxx_flags $1"
                fc_flags="$fc_flags $1"
                ;;
            -I*) # Include directories
                include_dirs="$include_dirs `smart_quote $1`"
                ;;
            -f)
                if [ -f "$2" ]; then
                    OPTIONS_FILE="$2"
                    SOURCE_DIR='none'
                else
                    describe invalid_options_file >& 2
                    cleanup
                    exit 1
                fi
                shift
                ;;
            -cxx)
                cxxfiles=1
                gateway_lang=C
                ;;
            -fortran)
                ffiles=1
                gateway_lang=FORTRAN
                ;;
            -[g]*) # Use debugging flags.
                debug=1
                ;;
            -h | -help) # -help: Help option.
                describe "help"
                cleanup
                exit 0
                ;;
            -inline)
                cc_flags="$cc_flags -DARRAY_ACCESS_INLINING"
                cxx_flags="$cxx_flags -DARRAY_ACCESS_INLINING"
                inlined=1
                ;;
            -[Ll]*)
                libs="$libs $1"
                ;;
            -Wl* | -R*) # allow other linker options
                libs="$libs $1"
                ;;
            -n) # output name
                no_execute="true"
                ;;
            -nohg) # ignored for compatibility with mbuild
                ;;
            -o | -output) # mexfile name
                mex_file=$2
                shift
                ;;
            -outdir) # output directory
                if [ $# -lt 2 ]; then
                    describe usage >&2
                    cleanup
                    exit 1
                fi
                OUTDIR=$2
                (cd $OUTDIR) > /dev/null 2>&1
                if [ $? -ne 0 ]; then
                    mkdir -p $OUTDIR 2>/dev/null
                    if [ $? -ne 0 ]; then
                        describe cannot_create_outdir >&2
                        cleanup
                        exit 1
                    fi
                fi
                shift
                ;;
            -O) # Use optimization flags.
                optimize=1
                ;;
            -setup)
                if [ $arg_count -ne 2 -a $arg_count -ne 1 ]; then
                    describe usage >&2
                    cleanup
                    exit 1
                else
                    SETUP_OPTIONS_FILE=$2
                    if [ ! "$MATLAB" ]; then # If no MATLAB='' was used
                        get_root_dir $arg0_
                    fi
                    TMW_ROOT=$MATLAB
                    #
                    # source the setup_options_file finction declaration
                    #
                    . $MATLAB/bin/optsetup.sh
                    #
                    setup_options_file $SETUP_OPTIONS_FILE
                    cleanup
                    exit 0
                fi
                ;;
            -silent) # really not verbose - undocumented
                verbose=
                ;;
            -v)
                verbose=1
                ;;
            -v3.5)
                stat="The -v3.5 option is no longer supported."
                ;;
            -v4)
                stat="The -v4 option is no longer supported."
                ;;
            -V5)
                cc_flags="$cc_flags -DV5_COMPAT"
                cxx_flags="$cxx_flags -DV5_COMPAT"
                v5_compat=1
                ;;
            -ada)
                gateway_lang=ADA
                if [ -f "$2" ]; then
                    ada_sfcn=$2
                else
                    describe invalid_ada_flag >& 2
                    cleanup
                    exit 1
                fi
                shift
                ;;
            -entrypt)
                if [ "$2" != "mexFunction" -a "$2" != "mexLibrary" ]; then
                     stat="-entrypt argument must be either 'mexFunction' or 'mexLibrary'"
                fi
                entrypt=$2
                shift
                ;;
            -*)
                check_archlist argument=$1 noprint
                if [ "$ARCH" = "" ]; then
                    stat="$1 not a valid option."
                fi
                ;;
            ARCH[=\#]*)
                rhs=`expr "$1" : '[a-zA-Z0-9_]*[=\#]\(.*\)$'`
                ARCH="`eval echo $rhs`"
                ;;
            MATLAB[=\#]*)
                mlrhs=`expr "$1" : '[a-zA-Z0-9_]*[=\#]\(.*\)$'`
                MATLAB="`eval echo $mlrhs`"
                ;;
            *[=\#]*)
                lhs=`expr "$1" : '\([a-zA-Z0-9_]*\)[=\#].*'`
                rhs=`expr "$1" : '[a-zA-Z0-9_]*[=\#]\(.*\)$'`
                echo $lhs='"'$rhs'"' >> $tmpbase.a
                files_to_remove="$files_to_remove $tmpbase.a"
                ;;
            *.c) # c source file.
                cfiles='1'
                files="$files $1"
                ;;
            *.C | *.cc | *.cpp | *.cxx) # C++ source file.
                cxxfiles='1'
                files="$files $1"
                ;;
            *.f | *.for | *.F | *.f90 | *.F90) # FORTRAN source file.
                if [ "$ffiles" != "1" -a "$cfiles" != "1" -a "$cxxfiles" != "1" ]; then
                    gateway_lang=FORTRAN
                fi
                ffiles='1'
                files="$files $1"
                ;;
            *.o) # object files
                files="$files $1"
                ;;
            *) # other files
                libs="$libs `smart_quote $1`"
                ;;
        esac
    shift
    done
    if [ $# -eq 0 -a "$files" = "" -a "$stat" = "OK" ]; then
        stat="no file name given."
    fi
    if [ "$gateway_lang" = "FORTRAN" -a "$entrypt" != "mexFunction" ]; then
        describe fortran_cannot_change_entrypt
        entrypt=mexFunction
    fi
#
# It is now safe to use functions, since we have parsed all of the
# input arguments. (The use of functions corrupts $# and $* on
# HP-UX 9.0x systems.)
#
    if [ ! "$MATLAB" ]; then # If no MATLAB='' was used
        get_root_dir $arg0_
    fi
#
    if [ ! "$OPTIONS_FILE" ]; then # If no -f optionsfile was used
        determine_options_file
    fi
#
    . $OPTIONS_FILE # Source file to determine $MATLAB
    get_arch # Call $MATLAB/bin/util/arch.sh
#
    get_entrypt $gateway_lang # Determine MEX-file entry pt
#
    if [ "$ffiles" = "1" ]; then
        COMPILER='$FC'
    elif [ "$cxxfiles" = "1" ]; then
        COMPILER='$CXX'
    else
        COMPILER='$CC'
    fi
#
    . $OPTIONS_FILE # Source options file
#
    eval_assignments # Evaluate VAR=value arguments

    get_name $files # Determine MEX-file name

#
# Ada
#
    if [ "$gateway_lang" = "ADA" ]; then
        build_ada_s_function
        cleanup
        exit 0
    fi
#
    if [ "$verbose" = "1" ]; then
        describe final_options
    fi
#
    error_check # Check calling syntax errors
#
    get_includes # Determine include directories
#
    if [ "$compile_only" != "1" ]; then
        if [ "$gateway_lang" = "C" ]; then
            files="$files $MATLAB/extern/src/mexversion.c"
        else
            files="$files $MATLAB/extern/lib/$Arch/version4.o"
        fi
    fi
    if [ "$argcheck" = "1" ]; then
        files="$files $MATLAB/extern/src/mwdebug.c"
    fi
#
# On sol2 add the C++ template repository to the remove list under
# the right conditions.
#
    if [ "$Arch" = "sol2" ]; then
        add_template_to_rmlist
    fi
#
# From this point on, we need to put traps in each function. The IBM
# resets traps on entry to each function, so we need to safeguard
# any functions we call after compiling. This includes compile(),
# link(), and cleanup().
#
    set $files
    for file in $*
    do
        compile $file # Process each file in list
    done
#
    if [ "$compile_only" != "1" ]; then
        link # Perform linking

        # Perform any POSTLINK_CMDS; ":" is the empty/null command which
        # we initialize POSTLINK_CMDS to in order to allow for concatenation
        # of multiple postlink commands such as
        #
        # POSTLINK_CMDS='$POSTLINK_CMDS;my_command'
        #
        # if POSTLINK_CMDS were initially empty in the above command, the
        # result would be ";my_command" which isn't legal.
        if [ "$POSTLINK_CMDS" != ":" -a "$POSTLINK_CMDS" != "" ]; then
            if [ "$verbose" = "1" -o "$no_execute" = "true" ]; then
                describe postlink_stage
            fi
            if [ "$no_execute" != "true" ]; then
                eval "$POSTLINK_CMDS";
            fi
        fi
    fi
#
    cleanup
    exit 0
#
#****************************************************************************