#! /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 1>&2 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