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
#
#****************************************************************************
|