view src/mkoctfile.in.sh @ 15063:36cbcc37fdb8

Refactor configure.ac to make it more understandable. Use common syntax for messages in config.h Correct typos, refer to libraries in all caps, use two spaces after period. Follow Autoconf guidelines and place general tests before specific tests. * configure.ac, m4/acinclude.m4: Use common syntax for messages in config.h Correct typos, refer to libraries in all caps, use two spaces after period. Follow Autoconf guidelines and place general tests before specific tests.
author Rik <rik@octave.org>
date Tue, 31 Jul 2012 10:28:51 -0700
parents 1bf39e944e43
children 648dabbb4c6b
line wrap: on
line source

#! /bin/sh
##
## mkoctfile -- create a .oct file suitable for dynamic linking by
## Octave.
##
## Copyright (C) 1996-2012 John W. Eaton
##
## This file is part of Octave.
##
## Octave is free software; you can redistribute it and/or modify it
## under the terms of the GNU General Public License as published by the
## Free Software Foundation; either version 3 of the License, or (at
## your option) any later version.
##
## Octave is distributed in the hope that it will be useful, but WITHOUT
## ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
## FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
## for more details.
##
## You should have received a copy of the GNU General Public License
## along with Octave; see the file COPYING.  If not, see
## <http://www.gnu.org/licenses/>.

# Exit immediately on any error.

set -e

: ${SED=%OCTAVE_CONF_SED%}

OCTAVE_VERSION=%OCTAVE_CONF_VERSION%
OCTAVE_PREFIX=%OCTAVE_CONF_PREFIX%

DEFAULT_BINDIR=%OCTAVE_BINDIR%
DEFAULT_INCLUDEDIR=%OCTAVE_CONF_INCLUDEDIR%
DEFAULT_LIBDIR=%OCTAVE_CONF_LIBDIR%
DEFAULT_OCTINCLUDEDIR=%OCTAVE_CONF_OCTINCLUDEDIR%
DEFAULT_OCTLIBDIR=%OCTAVE_CONF_OCTLIBDIR%

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_LFLAGS="-L$OCTLIBDIR"
if [ "$LIBDIR" != /usr/lib ]; then
  DEFAULT_LFLAGS="$DEFAULT_LFLAGS -L$LIBDIR"
fi

# Default values for these variables are filled in when Octave is
# compiled.

: ${EXEEXT=%OCTAVE_CONF_EXEEXT%}

: ${CPPFLAGS=%OCTAVE_CONF_CPPFLAGS%}
: ${INCFLAGS=$DEFAULT_INCFLAGS}
: ${F77=%OCTAVE_CONF_F77%}
: ${FFLAGS=%OCTAVE_CONF_FFLAGS%}
: ${FPICFLAG=%OCTAVE_CONF_FPICFLAG%}
: ${CC=%OCTAVE_CONF_CC%}
: ${CFLAGS=%OCTAVE_CONF_CFLAGS%}
: ${CPICFLAG=%OCTAVE_CONF_CPICFLAG%}
: ${CXX=%OCTAVE_CONF_CXX%}
: ${CXXFLAGS=%OCTAVE_CONF_CXXFLAGS%}
: ${CXXPICFLAG=%OCTAVE_CONF_CXXPICFLAG%}
: ${XTRA_CFLAGS=%OCTAVE_CONF_XTRA_CFLAGS%}
: ${XTRA_CXXFLAGS=%OCTAVE_CONF_XTRA_CXXFLAGS%}

: ${DEPEND_FLAGS=%OCTAVE_CONF_DEPEND_FLAGS%}
: ${DEPEND_EXTRA_SED_PATTERN=%OCTAVE_CONF_DEPEND_EXTRA_SED_PATTERN%}

: ${DL_LD=%OCTAVE_CONF_DL_LD%}
: ${DL_LDFLAGS=%OCTAVE_CONF_MKOCTFILE_DL_LDFLAGS%}

: ${RDYNAMIC_FLAG=%OCTAVE_CONF_RDYNAMIC_FLAG%}
: ${LIBOCTAVE=-loctave}
: ${LIBOCTINTERP=-loctinterp}
: ${READLINE_LIBS=-lreadline}
: ${LIBCRUFT=-lcruft}
: ${LAPACK_LIBS=%OCTAVE_CONF_LAPACK_LIBS%}
: ${BLAS_LIBS=%OCTAVE_CONF_BLAS_LIBS%}
: ${FFTW3_LDFLAGS=%OCTAVE_CONF_FFTW3_LDFLAGS%}
: ${FFTW3_LIBS=%OCTAVE_CONF_FFTW3_LIBS%}
: ${FFTW3F_LDFLAGS=%OCTAVE_CONF_FFTW3F_LDFLAGS%}
: ${FFTW3F_LIBS=%OCTAVE_CONF_FFTW3F_LIBS%}
: ${LIBS=%OCTAVE_CONF_LIBS%}
: ${FLIBS=%OCTAVE_CONF_FLIBS%}
: ${OCTAVE_LINK_DEPS=%OCTAVE_CONF_OCTAVE_LINK_DEPS%}
: ${OCTAVE_LINK_OPTS=%OCTAVE_CONF_OCTAVE_LINK_OPTS%}
: ${OCT_LINK_DEPS=%OCTAVE_CONF_OCT_LINK_DEPS%}
: ${OCT_LINK_OPTS=%OCTAVE_CONF_OCT_LINK_OPTS%}
: ${LD_CXX=%OCTAVE_CONF_LD_CXX%}
: ${LDFLAGS=%OCTAVE_CONF_LDFLAGS%}
: ${LD_STATIC_FLAG=%OCTAVE_CONF_LD_STATIC_FLAG%}
: ${LFLAGS=$DEFAULT_LFLAGS}
: ${F77_INTEGER_8_FLAG=%OCTAVE_CONF_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 $LIBCRUFT"}

# 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=%NO_OCT_FILE_STRIP%
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_LIBS
                            ALL_CXXFLAGS              FLIBS
                            ALL_FFLAGS                FPICFLAG
                            ALL_LDFLAGS               INCFLAGS
                            BLAS_LIBS                 LAPACK_LIBS
                            CC                        LDFLAGS
                            CFLAGS                    LD_CXX
                            CPICFLAG                  LD_STATIC_FLAG
                            CPPFLAGS                  LFLAGS
                            CXX                       LIBCRUFT
                            CXXFLAGS                  LIBOCTAVE
                            CXXPICFLAG                LIBOCTINTERP
                            DEPEND_EXTRA_SED_PATTERN  LIBS
                            DEPEND_FLAGS              OCTAVE_LIBS
                            DL_LD                     OCTAVE_LINK_DEPS
                            DL_LDFLAGS                OCT_LINK_DEPS
                            EXEEXT                    RDYNAMIC_FLAG
                            F77                       READLINE_LIBS
                            F77_INTEGER_8_FLAG        SED
                            FFLAGS                    XTRA_CFLAGS
                            FFTW3_LDFLAGS             XTRA_CXXFLAGS
                            FFTW3_LIBS
                            FFTW3F_LDFLAGS

  -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 -loctinterp -loctave -lcruft $OCTAVE_LINK_OPTS $OCTAVE_LINK_DEPS"
      $dbg $cmd
      eval $cmd
    else
      echo "mkoctfile: no way to link stand-alone executable file" 1>&2
      exit 1
    fi
  else
    cmd="$DL_LD $DL_LDFLAGS $pass_on_options -o $octfile $objfiles $libfiles $ldflags $LFLAGS -loctinterp -loctave -lcruft $OCT_LINK_OPTS $OCT_LINK_DEPS"
    $dbg $cmd
    eval $cmd
  fi

# Maybe strip it.

  if $strip; then
    cmd="strip $octfile"
    $dbg $cmd
    eval $cmd
  fi
fi

exit 0