dynare/windows/deps/mkoctfile64

546 lines
14 KiB
Bash
Executable File

#! /bin/sh
## Make sure to keep -static-libgcc, -static-libstdc++ and -static-libgfortran
## in DL_LDFLAGS when updating this file.
## Do not add -shared in LDFLAGS (i.e. this file should mimick “mkoctfile
## --link-stand-alone”, see the top of mex/build/configure.ac).
## Also keep BINDIR in DEFAULT_LDFLAGS (for UMFPACK).
# Exit immediately on any error.
set -e
: ${SED="/bin/sed"}
# Get path to the mkoctfile shell script
MKOCTFILE_PATH=$(dirname $(readlink -f "$0"))
OCTAVE_PREFIX="$MKOCTFILE_PATH/octave64/mingw64"
# Get Octave version
current_octave_version=$(grep "^OCTAVE_VERSION" "$MKOCTFILE_PATH/versions.mk")
eval $(echo "$current_octave_version" | tr -d '[:space:]')
DEFAULT_BINDIR="$OCTAVE_PREFIX/bin"
DEFAULT_INCLUDEDIR="$OCTAVE_PREFIX/include"
DEFAULT_LIBDIR="$OCTAVE_PREFIX/lib"
DEFAULT_OCTINCLUDEDIR="$OCTAVE_PREFIX/include/octave-${OCTAVE_VERSION}/octave"
DEFAULT_OCTLIBDIR="$OCTAVE_PREFIX/lib/octave/${OCTAVE_VERSION}"
if [ -n "$OCTAVE_HOME" ]; then
DEFAULT_BINDIR="`echo $DEFAULT_BINDIR | $SED "s,^$OCTAVE_PREFIX,$OCTAVE_HOME,"`"
DEFAULT_INCLUDEDIR="`echo $DEFAULT_INCLUDEDIR | $SED "s,^$OCTAVE_PREFIX,$OCTAVE_HOME,"`"
DEFAULT_LIBDIR="`echo $DEFAULT_LIBDIR | $SED "s,^$OCTAVE_PREFIX,$OCTAVE_HOME,"`"
DEFAULT_OCTINCLUDEDIR="`echo $DEFAULT_OCTINCLUDEDIR | $SED "s,^$OCTAVE_PREFIX,$OCTAVE_HOME,"`"
DEFAULT_OCTLIBDIR="`echo $DEFAULT_OCTLIBDIR | $SED "s,^$OCTAVE_PREFIX,$OCTAVE_HOME,"`"
fi
: ${BINDIR=$DEFAULT_BINDIR}
: ${INCLUDEDIR=$DEFAULT_INCLUDEDIR}
: ${LIBDIR=$DEFAULT_LIBDIR}
: ${OCTINCLUDEDIR=$DEFAULT_OCTINCLUDEDIR}
: ${OCTLIBDIR=$DEFAULT_OCTLIBDIR}
DEFAULT_INCFLAGS="-I$OCTINCLUDEDIR/.. -I$OCTINCLUDEDIR"
if [ "$INCLUDEDIR" != /usr/include ]; then
DEFAULT_INCFLAGS="$DEFAULT_INCFLAGS -I$INCLUDEDIR"
fi
DEFAULT_LDFLAGS="-L$OCTLIBDIR -L$BINDIR"
if [ "$LIBDIR" != /usr/lib ]; then
DEFAULT_LDFLAGS="$DEFAULT_LDFLAGS -L$LIBDIR"
fi
# Default values for these variables are filled in when Octave is
# compiled.
: ${EXEEXT=""}
: ${CPPFLAGS=""}
: ${INCFLAGS=$DEFAULT_INCFLAGS}
: ${F77="x86_64-w64-mingw32-gfortran"}
: ${FFLAGS="-g -O2 -std=legacy"}
: ${FPICFLAG=""}
: ${CC="x86_64-w64-mingw32-gcc"}
: ${CFLAGS="-g -O2"}
: ${CPICFLAG=""}
: ${CXX="x86_64-w64-mingw32-g++"}
: ${CXXFLAGS="-g -O2"}
: ${CXXPICFLAG=""}
: ${XTRA_CFLAGS="-fopenmp"}
: ${XTRA_CXXFLAGS="-fopenmp"}
: ${AR="x86_64-w64-mingw32-ar"}
: ${RANLIB="x86_64-w64-mingw32-ranlib"}
: ${DEPEND_FLAGS="-M"}
: ${DEPEND_EXTRA_SED_PATTERN=""}
: ${DL_LD="x86_64-w64-mingw32-g++"}
: ${DL_LDFLAGS="-shared -static-libgcc -static-libstdc++ -static-libgfortran"}
: ${RLD_FLAG=""}
: ${RDYNAMIC_FLAG=""}
: ${LIBOCTAVE=-loctave}
: ${LIBOCTINTERP=-loctinterp}
: ${READLINE_LIBS=-lreadline}
: ${LAPACK_LIBS="-llapack"}
: ${BLAS_LIBS="-lblas -lxerbla"}
: ${FFTW3_LDFLAGS=""}
: ${FFTW3_LIBS="-lfftw3"}
: ${FFTW3F_LDFLAGS=""}
: ${FFTW3F_LIBS="-lfftw3f"}
: ${LIBS="-lpsapi -lgdi32 -lm"}
: ${FLIBS="-lm -lgfortran -lmingw32 -lmoldname -lmingwex -lmsvcrt -lquadmath -lpthread -ladvapi32 -lshell32 -luser32 -lkernel32"}
: ${LD_CXX="x86_64-w64-mingw32-g++"}
: ${LDFLAGS=$DEFAULT_LDFLAGS}
: ${LD_STATIC_FLAG=""}
: ${LFLAGS=$DEFAULT_LDFLAGS}
: ${F77_INTEGER_8_FLAG=""}
: ${ALL_FFLAGS="$FFLAGS $F77_INTEGER_8_FLAG"}
: ${ALL_CFLAGS="$INCFLAGS $XTRA_CFLAGS $CFLAGS"}
: ${ALL_CXXFLAGS="$INCFLAGS $XTRA_CXXFLAGS $CXXFLAGS"}
: ${ALL_LDFLAGS="$LD_STATIC_FLAG $CPICFLAG $LDFLAGS"}
: ${OCTAVE_LIBS="$LIBOCTINTERP $LIBOCTAVE $SPECIAL_MATH_LIB"}
# Local variables.
FFTW_LIBS="$FFTW3_LDFLAGS $FFTW3_LIBS $FFTW3F_LDFLAGS $FFTW3F_LIBS"
usage_msg="usage: mkoctfile [options] file ..."
version_msg="mkoctfile, version $OCTAVE_VERSION"
cfiles=
ccfiles=
f77files=
objfiles=
libfiles=
octfiles=
octfile=
outputfile=
incflags=
defs=
ldflags=
dbg=:
pass_on_options=
strip=false
no_oct_file_strip_on_this_platform=false
link=true
link_stand_alone=false
output_ext=".oct"
depend=false
compile=true
if [ $# -eq 0 ]; then
echo $usage_msg 1>&2
exit 1
fi
if [ $# -eq 1 ]; then
case "$1" in
-v | -version | --version)
echo $version_msg
exit 0
;;
esac
fi
while [ $# -gt 0 ]; do
file=
case "$1" in
*.c)
file=$1
cfiles="$cfiles $file"
;;
*.cc | *.C | *.cpp)
file=$1
ccfiles="$ccfiles $file"
;;
*.f | *.F | *.f90 | *.F90)
file=$1
f77files="$f77files $file"
;;
*.o)
file=$1
objfiles="$objfiles $file"
;;
*.a)
file=$1
libfiles="$libfiles $file"
;;
-d | -debug | --debug | -v | -verbose | --verbose)
dbg=echo
;;
-h | -\? | -help | --help)
echo $usage_msg 1>&2
cat << EOF
Options:
-h, -?, --help Print this message.
-IDIR Add -IDIR to compile commands.
-idirafter DIR Add -idirafter DIR to compile commands.
-DDEF Add -DDEF to compile commands.
-lLIB Add -lLIB to link command.
-LDIR Add -LDIR to link command.
-RDIR Add -RDIR to link command.
-g Enable debugging option for all compilers.
-pthread Add -pthread to link command.
-W... Pass flags to the compiler such as -Wa,OPTION.
-Wl,... Pass flags to the linker such as -Wl,-rpath=...
-M, --depend Generate dependency files (.d) for C and C++
source files.
-c, --compile Compile, but do not link.
--link-stand-alone Link a stand-alone executable file.
-s, --strip Strip output file.
--mex Create a MEX file.
Set the default output extension to ".mex".
-o FILE, --output FILE Output file name. Default extension is .oct
(or .mex if --mex is specified) unless linking
a stand-alone executable.
-p VAR, --print VAR Print configuration variable VAR. Recognized
variables are:
ALL_CFLAGS FFTW3F_LDFLAGS
ALL_CXXFLAGS FFTW3F_LIBS
ALL_FFLAGS FLIBS
ALL_LDFLAGS FPICFLAG
BLAS_LIBS INCFLAGS
CC LAPACK_LIBS
CFLAGS LDFLAGS
CPICFLAG LD_CXX
CPPFLAGS LD_STATIC_FLAG
CXX LFLAGS
CXXFLAGS LIBCRUFT
CXXPICFLAG LIBOCTAVE
DEPEND_EXTRA_SED_PATTERN LIBOCTINTERP
DEPEND_FLAGS LIBS
DL_LD OCTAVE_LIBS
DL_LDFLAGS RDYNAMIC_FLAG
EXEEXT READLINE_LIBS
F77 RLD_FLAG
F77_INTEGER_8_FLAG SED
FFLAGS XTRA_CFLAGS
FFTW3_LDFLAGS XTRA_CXXFLAGS
FFTW3_LIBS
-v, --verbose Echo commands as they are executed.
FILE Compile or link FILE. Recognized file types are:
.c C source
.cc C++ source
.C C++ source
.cpp C++ source
.f Fortran source (fixed form)
.F Fortran source (fixed form)
.f90 Fortran source (free form)
.F90 Fortran source (free form)
.o object file
.a library file
EOF
exit 0
;;
-I*)
incflags="$incflags $1"
;;
-idirafter)
shift
if [ $# -gt 0 ]; then
incflags="$incflags -idirafter $1"
else
echo "mkoctfile: include directory name missing" 1>&2
fi
;;
-D*)
defs="$defs $1"
;;
-[lLR]* | -Wl,*)
ldflags="$ldflags $1"
;;
-pthread)
ldflags="$ldflags $1"
;;
-M | -depend | --depend)
depend=true
compile=false
;;
-o | -ouput | --output)
shift
if [ $# -gt 0 ]; then
outputfile="$1"
else
echo "mkoctfile: output file name missing" 1>&2
fi
;;
-p | -print | --print)
shift
if [ $# -gt 0 ]; then
eval echo \${$1}
exit 0
else
echo "mkoctfile: --print requires argument" 1>&2
exit 1
fi
;;
-s | -strip | --strip)
if $no_oct_file_strip_on_this_platform; then
echo "mkoctfile: stripping disabled on this platform" 1>&2
else
strip=true
fi
;;
-c | -compile | --compile)
link=false
;;
-g)
ALL_CFLAGS="$ALL_CFLAGS -g"
ALL_CXXFLAGS="$ALL_CXXFLAGS -g"
ALL_FFLAGS="$ALL_FFLAGS -g"
;;
-link-stand-alone | --link-stand-alone)
link_stand_alone=true
;;
-mex | --mex)
incflags="$incflags -I."
output_ext=".mex"
;;
-W*)
pass_on_options="$pass_on_options $1"
;;
*)
echo "mkoctfile: unrecognized argument $1" 1>&2
exit 1
;;
esac
if [ -n "$file" ]; then
if [ -z "$octfile" ]; then
octfile="$file"
fi
fi
shift
done
if $link_stand_alone; then
if [ -n "$outputfile" ]; then
output_option="-o $outputfile"
fi
else
if [ -n "$outputfile" ]; then
octfile="$outputfile"
case "$octfile" in
*$output_ext)
;;
*)
octfile="$octfile$output_ext"
;;
esac
else
octfile=`basename $octfile`
octfile=`echo $octfile | $SED 's,\.[^.]*$,,'`$output_ext
fi
fi
# Generate dependency files for C and C++ files.
if $depend; then
if [ -n "$cfiles" ]; then
for f in $cfiles; do
b=`echo $f | $SED 's,\.c$,,'`
d=$b.d
cmd="rm -f $d"
$dbg $cmd
eval $cmd
cmd="$CC $DEPEND_FLAGS $CPPFLAGS $ALL_CFLAGS $incflags $def $f | $SED $DEPEND_EXTRA_SED_PATTERN -e 's,^[^:]*/\(.*\.o\):,\1:,' -e 's,$b\.o,pic/& & $d,g' > $d-t && mv $d-t $d"
$dbg $cmd
eval $cmd
done
fi
if [ -n "$ccfiles" ]; then
for f in $ccfiles; do
case $f in
*.cc)
b=`echo $f | $SED 's,\.cc$,,'`
;;
*.C)
b=`echo $f | $SED 's,\.C$,,'`
;;
*.cpp)
b=`echo $f | $SED 's,\.cpp$,,'`
;;
esac
d=$b.d
cmd="rm -f $d"
$dbg $cmd
eval $cmd
cmd="$CXX $DEPEND_FLAGS $CPPFLAGS $ALL_CXXFLAGS $incflags $defs $f | $SED $DEPEND_EXTRA_SED_PATTERN -e 's,^[^:]*/\(.*\.o\):,\1:,' -e 's,$b\.o,pic/& & $d,g' > $d-t && mv $d-t $d"
$dbg $cmd
eval $cmd
done
fi
# If generating dependencies, that's all we do.
exit 0
fi
# Compile Fortran, C, and C++ files. Add the name of each object file
# that is produced to the overall list of object files.
if [ -n "$f77files" ]; then
for f in $f77files; do
case $f in
*.f)
b=`echo $f | $SED 's,.*/,,; s,\.f$,,'`
;;
*.F)
b=`echo $f | $SED 's,.*/,,; s,\.F$,,'`
;;
*.f90)
b=`echo $f | $SED 's,.*/,,; s,\.f90$,,'`
;;
*.F90)
b=`echo $f | $SED 's,.*/,,; s,\.F90$,,'`
;;
esac
if [ -n "$F77" ]; then
if [ -n "$outputfile" ]; then
if $link; then
o=$b.o
else
o=$outputfile
fi
else
o=$b.o
fi
objfiles="$objfiles $o"
cmd="$F77 -c $FPICFLAG $ALL_FFLAGS $incflags $defs $pass_on_options $f -o $o"
$dbg $cmd
eval $cmd
else
echo "mkoctfile: no way to compile Fortran file $f" 1>&2
fi
done
fi
if [ -n "$cfiles" ]; then
for f in $cfiles; do
if [ -n "$CC" ]; then
b=`echo $f | $SED 's,.*/,,; s,\.c$,,'`
if [ -n "$outputfile" ]; then
if $link; then
o=$b.o
else
o=$outputfile
fi
else
o=$b.o
fi
objfiles="$objfiles $o"
cmd="$CC -c $CPPFLAGS $CPICFLAG $ALL_CFLAGS $pass_on_options $incflags $defs $f -o $o"
$dbg $cmd
eval $cmd
else
echo "mkoctfile: no way to compile C++ file $f" 1>&2
fi
done
fi
if [ -n "$ccfiles" ]; then
for f in $ccfiles; do
if [ -n "$CXX" ]; then
case $f in
*.cc)
b=`echo $f | $SED 's,.*/,,; s,\.cc$,,'`
;;
*.C)
b=`echo $f | $SED 's,.*/,,; s,\.C$,,'`
;;
*.cpp)
b=`echo $f | $SED 's,.*/,,; s,\.cpp$,,'`
;;
esac
if [ -n "$outputfile" ]; then
if $link; then
o=$b.o
else
o=$outputfile
fi
else
o=$b.o
fi
objfiles="$objfiles $o"
cmd="$CXX -c $CPPFLAGS $CXXPICFLAG $ALL_CXXFLAGS $pass_on_options $incflags $defs $f -o $o"
$dbg $cmd
eval $cmd
else
echo "mkoctfile: no way to compile C++ file $f" 1>&2
fi
done
fi
## Uncomment the following group of lines if you get `Text file busy'
## errors from ld. This may happen if the .oct file is currently
## running while you are trying to recompile it. We try moving first,
## since on some systems (HP-UX, maybe others) it is possible to
## rename running programs but not remove them.
## if [ -f "$octfile" ]; then
## cmd="mv $octfile $octfile.bak"
## $dbg $cmd
## eval $cmd
## cmd="rm -f $octfile.bak"
## $dbg $cmd
## eval $cmd
## fi
# Link all the object files.
if $link && [ -n "$objfiles" ]; then
if $link_stand_alone; then
if [ -n "$LD_CXX" ]; then
cmd="$LD_CXX $CPPFLAGS $ALL_CXXFLAGS $RDYNAMIC_FLAG $ALL_LDFLAGS $pass_on_options $output_option $objfiles $libfiles $ldflags $LFLAGS $RLD_FLAG $OCTAVE_LIBS $LAPACK_LIBS $BLAS_LIBS $FFTW_LIBS $READLINE_LIBS $LIBS $FLIBS"
$dbg $cmd
eval $cmd
else
echo "mkoctfile: no way to link stand-alone executable file" 1>&2
exit 1
fi
else
LINK_DEPS="$LFLAGS $OCTAVE_LIBS $LDFLAGS $LAPACK_LIBS $BLAS_LIBS $FFTW_LIBS $LIBS $FLIBS"
cmd="$DL_LD $DL_LDFLAGS $pass_on_options -o $octfile $objfiles $libfiles $ldflags $LINK_DEPS"
$dbg $cmd
eval $cmd
fi
# Maybe strip it.
if $strip; then
cmd="strip $octfile"
$dbg $cmd
eval $cmd
fi
fi
exit 0