1#! /bin/sh
2
3## Attention à garder -static-libgcc et -static-libstdc++ dans LDFLAGS et
4## DL_LDFLAGS lors des mises à jour de ce fichier
5## Garder aussi BINDIR dans DEFAULT_LFLAGS (pour UMFPACK)
6
7# Exit immediately on any error.
8set -e
9
10: ${SED="/bin/sed"}
11
12# Get path to the mkoctfile shell script
13MKOCTFILE_PATH=$(dirname $(readlink -f "$0"))
14OCTAVE_PREFIX="$MKOCTFILE_PATH/octave64/mingw64"
15
16# Get Octave version
17current_octave_version=$(grep "^OCTAVE_VERSION" "$MKOCTFILE_PATH/versions.mk")
18eval $(echo "$current_octave_version" | tr -d '[:space:]')
19
20DEFAULT_BINDIR="$OCTAVE_PREFIX/bin"
21DEFAULT_INCLUDEDIR="$OCTAVE_PREFIX/include"
22DEFAULT_LIBDIR="$OCTAVE_PREFIX/lib"
23DEFAULT_OCTINCLUDEDIR="$OCTAVE_PREFIX/include/octave-${OCTAVE_VERSION}/octave"
24DEFAULT_OCTLIBDIR="$OCTAVE_PREFIX/lib/octave/${OCTAVE_VERSION}"
25
26if [ -n "$OCTAVE_HOME" ]; then
27  DEFAULT_BINDIR="`echo $DEFAULT_BINDIR | $SED "s,^$OCTAVE_PREFIX,$OCTAVE_HOME,"`"
28  DEFAULT_INCLUDEDIR="`echo $DEFAULT_INCLUDEDIR | $SED "s,^$OCTAVE_PREFIX,$OCTAVE_HOME,"`"
29  DEFAULT_LIBDIR="`echo $DEFAULT_LIBDIR | $SED "s,^$OCTAVE_PREFIX,$OCTAVE_HOME,"`"
30  DEFAULT_OCTINCLUDEDIR="`echo $DEFAULT_OCTINCLUDEDIR | $SED "s,^$OCTAVE_PREFIX,$OCTAVE_HOME,"`"
31  DEFAULT_OCTLIBDIR="`echo $DEFAULT_OCTLIBDIR | $SED "s,^$OCTAVE_PREFIX,$OCTAVE_HOME,"`"
32fi
33
34: ${BINDIR=$DEFAULT_BINDIR}
35: ${INCLUDEDIR=$DEFAULT_INCLUDEDIR}
36: ${LIBDIR=$DEFAULT_LIBDIR}
37: ${OCTINCLUDEDIR=$DEFAULT_OCTINCLUDEDIR}
38: ${OCTLIBDIR=$DEFAULT_OCTLIBDIR}
39
40DEFAULT_INCFLAGS="-I$OCTINCLUDEDIR/.. -I$OCTINCLUDEDIR"
41if [ "$INCLUDEDIR" != /usr/include ]; then
42  DEFAULT_INCFLAGS="$DEFAULT_INCFLAGS -I$INCLUDEDIR"
43fi
44
45DEFAULT_LFLAGS="-L$OCTLIBDIR -L$BINDIR"
46if [ "$LIBDIR" != /usr/lib ]; then
47  DEFAULT_LFLAGS="$DEFAULT_LFLAGS -L$LIBDIR"
48fi
49
50# Default values for these variables are filled in when Octave is
51# compiled.
52
53: ${EXEEXT=""}
54
55: ${CPPFLAGS=""}
56: ${INCFLAGS=$DEFAULT_INCFLAGS}
57: ${F77="x86_64-w64-mingw32-gfortran"}
58: ${FFLAGS="-O"}
59: ${FPICFLAG=""}
60: ${CC="x86_64-w64-mingw32-gcc"}
61: ${CFLAGS="-g -O2"}
62: ${CPICFLAG=""}
63: ${CXX="x86_64-w64-mingw32-g++"}
64: ${CXXFLAGS="-g -O2"}
65: ${CXXPICFLAG=""}
66: ${XTRA_CFLAGS=""}
67: ${XTRA_CXXFLAGS=""}
68: ${AR="x86_64-w64-mingw32-ar"}
69: ${RANLIB="x86_64-w64-mingw32-ranlib"}
70
71: ${DEPEND_FLAGS="-M"}
72: ${DEPEND_EXTRA_SED_PATTERN=""}
73
74: ${DL_LD="x86_64-w64-mingw32-g++"}
75: ${DL_LDFLAGS="-shared -Wl,--export-all-symbols -Wl,--enable-auto-import -Wl,--enable-runtime-pseudo-reloc -static-libgcc -static-libstdc++"}
76
77: ${RLD_FLAG="-Wl,-rpath -Wl,$OCTAVE_PREFIX/lib/octave/${OCTAVE_VERSION}"}
78: ${RDYNAMIC_FLAG="-rdynamic"}
79: ${LIBOCTAVE=-loctave}
80: ${LIBOCTINTERP=-loctinterp}
81: ${READLINE_LIBS=-lreadline}
82: ${LAPACK_LIBS="-llapack"}
83: ${BLAS_LIBS="-lblas -lxerbla"}
84: ${FFTW3_LDFLAGS=""}
85: ${FFTW3_LIBS="-lfftw3"}
86: ${FFTW3F_LDFLAGS=""}
87: ${FFTW3F_LIBS="-lfftw3f"}
88: ${LIBS="-lm -lgfortran -llapack -lgdi32 -lws2_32 -luser32 -lkernel32"}
89: ${FLIBS="-lm -lgfortran -llapack -lmingw32 -lmoldname -lmingwex -lmsvcrt -luser32 -lkernel32 -ladvapi32 -lshell32"}
90: ${LD_CXX="x86_64-w64-mingw32-g++"}
91: ${LDFLAGS="-Wl,--enable-auto-import -Wl,--enable-runtime-pseudo-reloc-v2 -Wl,--allow-multiple-definition -static-libgcc -static-libstdc++"}
92: ${LD_STATIC_FLAG=""}
93: ${LFLAGS=$DEFAULT_LFLAGS}
94: ${F77_INTEGER_8_FLAG=""}
95
96: ${ALL_FFLAGS="$FFLAGS $F77_INTEGER_8_FLAG"}
97
98: ${ALL_CFLAGS="$INCFLAGS $XTRA_CFLAGS $CFLAGS"}
99
100: ${ALL_CXXFLAGS="$INCFLAGS $XTRA_CXXFLAGS $CXXFLAGS"}
101
102: ${ALL_LDFLAGS="$LD_STATIC_FLAG $CPICFLAG $LDFLAGS"}
103
104: ${OCTAVE_LIBS="$LIBOCTINTERP $LIBOCTAVE $SPECIAL_MATH_LIB"}
105
106# Local variables.
107
108FFTW_LIBS="$FFTW3_LDFLAGS $FFTW3_LIBS $FFTW3F_LDFLAGS $FFTW3F_LIBS"
109
110usage_msg="usage: mkoctfile [options] file ..."
111
112version_msg="mkoctfile, version $OCTAVE_VERSION"
113
114cfiles=
115ccfiles=
116f77files=
117objfiles=
118libfiles=
119octfiles=
120octfile=
121outputfile=
122incflags=
123defs=
124ldflags=
125dbg=:
126pass_on_options=
127strip=false
128no_oct_file_strip_on_this_platform=false
129link=true
130link_stand_alone=false
131output_ext=".oct"
132depend=false
133compile=true
134
135if [ $# -eq 0 ]; then
136  echo $usage_msg 1>&2
137  exit 1
138fi
139
140if [ $# -eq 1 ]; then
141  case "$1" in
142    -v | -version | --version)
143      echo $version_msg 1>&2
144      exit 0
145    ;;
146  esac
147fi
148
149while [ $# -gt 0 ]; do
150  file=
151  case "$1" in
152    *.c)
153      file=$1
154      cfiles="$cfiles $file"
155    ;;
156    *.cc | *.C | *.cpp)
157      file=$1
158      ccfiles="$ccfiles $file"
159    ;;
160    *.f | *.F | *.f90 | *.F90)
161      file=$1
162      f77files="$f77files $file"
163    ;;
164    *.o)
165      file=$1
166      objfiles="$objfiles $file"
167    ;;
168    *.a)
169      file=$1
170      libfiles="$libfiles $file"
171    ;;
172    -d | -debug | --debug | -v | -verbose | --verbose)
173      dbg=echo
174    ;;
175    -h | -\? | -help | --help)
176      echo $usage_msg 1>&2
177      cat << EOF
178
179Options:
180
181  -h, -?, --help          Print this message.
182
183  -IDIR                   Add -IDIR to compile commands.
184
185  -idirafter DIR          Add -idirafter DIR to compile commands.
186
187  -DDEF                   Add -DDEF to compile commands.
188
189  -lLIB                   Add -lLIB to link command.
190
191  -LDIR                   Add -LDIR to link command.
192
193  -RDIR                   Add -RDIR to link command.
194
195  -g                      Enable debugging option for all compilers.
196
197  -pthread                Add -pthread to link command.
198
199  -W...                   Pass flags to the compiler such as -Wa,OPTION.
200
201  -Wl,...                 Pass flags to the linker such as -Wl,-rpath=...
202
203  -M, --depend            Generate dependency files (.d) for C and C++
204                          source files.
205
206  -c, --compile           Compile, but do not link.
207
208  --link-stand-alone      Link a stand-alone executable file.
209
210  -s, --strip             Strip output file.
211
212  --mex                   Create a MEX file.  
213                          Set the default output extension to ".mex".
214
215  -o FILE, --output FILE  Output file name.  Default extension is .oct
216                          (or .mex if --mex is specified) unless linking
217                          a stand-alone executable.
218
219  -p VAR, --print VAR     Print configuration variable VAR.  Recognized
220                          variables are:
221
222                            ALL_CFLAGS                FFTW3F_LDFLAGS
223                            ALL_CXXFLAGS              FFTW3F_LIBS
224                            ALL_FFLAGS                FLIBS
225                            ALL_LDFLAGS               FPICFLAG
226                            BLAS_LIBS                 INCFLAGS
227                            CC                        LAPACK_LIBS
228                            CFLAGS                    LDFLAGS
229                            CPICFLAG                  LD_CXX
230                            CPPFLAGS                  LD_STATIC_FLAG
231                            CXX                       LFLAGS
232                            CXXFLAGS                  LIBCRUFT
233                            CXXPICFLAG                LIBOCTAVE
234                            DEPEND_EXTRA_SED_PATTERN  LIBOCTINTERP
235                            DEPEND_FLAGS              LIBS
236                            DL_LD                     OCTAVE_LIBS
237                            DL_LDFLAGS                RDYNAMIC_FLAG
238                            EXEEXT                    READLINE_LIBS
239                            F77                       RLD_FLAG
240                            F77_INTEGER_8_FLAG        SED
241                            FFLAGS                    XTRA_CFLAGS
242                            FFTW3_LDFLAGS             XTRA_CXXFLAGS
243                            FFTW3_LIBS
244
245  -v, --verbose           Echo commands as they are executed.
246
247  FILE                    Compile or link FILE.  Recognized file types are:
248
249                            .c    C source
250                            .cc   C++ source
251                            .C    C++ source
252                            .cpp  C++ source
253                            .f    Fortran source (fixed form)
254                            .F    Fortran source (fixed form)
255                            .f90  Fortran source (free form)
256                            .F90  Fortran source (free form)
257                            .o    object file
258                            .a    library file
259
260EOF
261      exit 0
262    ;;
263    -I*)
264      incflags="$incflags $1"
265    ;;
266    -idirafter)
267      shift
268      if [ $# -gt 0 ]; then
269        incflags="$incflags -idirafter $1"
270      else
271        echo "mkoctfile: include directory name missing" 1>&2
272      fi
273    ;;
274    -D*)
275      defs="$defs $1"
276    ;;
277    -[lLR]* | -Wl,*)
278      ldflags="$ldflags $1"
279    ;;
280    -pthread)
281      ldflags="$ldflags $1"
282    ;;
283    -M | -depend | --depend)
284      depend=true
285      compile=false
286    ;;
287    -o | -ouput | --output)
288      shift
289      if [ $# -gt 0 ]; then
290        outputfile="$1"
291      else
292        echo "mkoctfile: output file name missing" 1>&2
293      fi
294    ;;
295    -p | -print | --print)
296      shift
297      if [ $# -gt 0 ]; then
298        eval echo \${$1}
299        exit 0
300      else
301        echo "mkoctfile: --print requires argument" 1>&2
302        exit 1
303      fi
304    ;;
305    -s | -strip | --strip)
306      if $no_oct_file_strip_on_this_platform; then
307        echo "mkoctfile: stripping disabled on this platform" 1>&2
308      else
309        strip=true
310      fi
311    ;;
312    -c | -compile | --compile)
313      link=false
314    ;;
315    -g)
316      ALL_CFLAGS="$ALL_CFLAGS -g"
317      ALL_CXXFLAGS="$ALL_CXXFLAGS -g"
318      ALL_FFLAGS="$ALL_FFLAGS -g"
319    ;;
320    -link-stand-alone | --link-stand-alone)
321      link_stand_alone=true
322    ;;
323    -mex | --mex)
324      incflags="$incflags -I."
325      output_ext=".mex"
326    ;;
327    -W*)
328      pass_on_options="$pass_on_options $1"
329    ;;
330    *)
331      echo "mkoctfile: unrecognized argument $1" 1>&2
332      exit 1
333    ;;
334  esac
335  if [ -n "$file" ]; then
336    if [ -z "$octfile" ]; then
337      octfile="$file"
338    fi
339  fi
340  shift
341done
342
343if $link_stand_alone; then
344  if [ -n "$outputfile" ]; then
345    output_option="-o $outputfile"
346  fi
347else
348  if [ -n "$outputfile" ]; then
349    octfile="$outputfile"
350    case "$octfile" in
351      *$output_ext)
352      ;;
353      *)
354        octfile="$octfile$output_ext"
355      ;;
356    esac
357  else
358    octfile=`basename $octfile`
359    octfile=`echo $octfile | $SED 's,\.[^.]*$,,'`$output_ext
360  fi
361fi
362
363# Generate dependency files for C and C++ files.
364
365if $depend; then
366  if [ -n "$cfiles" ]; then
367    for f in $cfiles; do
368      b=`echo $f | $SED 's,\.c$,,'`
369      d=$b.d
370      cmd="rm -f $d"
371      $dbg $cmd
372      eval $cmd
373      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"
374      $dbg $cmd
375      eval $cmd
376    done
377  fi
378
379  if [ -n "$ccfiles" ]; then
380    for f in $ccfiles; do
381      case $f in
382        *.cc)
383          b=`echo $f | $SED 's,\.cc$,,'`
384        ;;
385        *.C)
386          b=`echo $f | $SED 's,\.C$,,'`
387        ;;
388        *.cpp)
389          b=`echo $f | $SED 's,\.cpp$,,'`
390        ;;
391      esac
392      d=$b.d
393      cmd="rm -f $d"
394      $dbg $cmd
395      eval $cmd
396      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"
397      $dbg $cmd
398      eval $cmd
399    done
400  fi
401  # If generating dependencies, that's all we do.
402  exit 0
403fi
404
405# Compile Fortran, C, and C++ files.  Add the name of each object file
406# that is produced to the overall list of object files.
407
408if [ -n "$f77files" ]; then
409  for f in $f77files; do
410    case $f in
411      *.f)
412        b=`echo $f | $SED 's,.*/,,; s,\.f$,,'`
413      ;;
414      *.F)
415        b=`echo $f | $SED 's,.*/,,; s,\.F$,,'`
416      ;;
417      *.f90)
418        b=`echo $f | $SED 's,.*/,,; s,\.f90$,,'`
419      ;;
420      *.F90)
421        b=`echo $f | $SED 's,.*/,,; s,\.F90$,,'`
422      ;;
423    esac
424    if [ -n "$F77" ]; then
425      if [ -n "$outputfile" ]; then
426        if $link; then
427          o=$b.o
428        else
429          o=$outputfile
430        fi
431      else
432        o=$b.o
433      fi
434      objfiles="$objfiles $o"
435      cmd="$F77 -c $FPICFLAG $ALL_FFLAGS $incflags $defs $pass_on_options $f -o $o"
436      $dbg $cmd
437      eval $cmd
438    else
439      echo "mkoctfile: no way to compile Fortran file $f" 1>&2
440    fi
441  done
442fi
443
444if [ -n "$cfiles" ]; then
445  for f in $cfiles; do
446    if [ -n  "$CC" ]; then
447      b=`echo $f | $SED 's,.*/,,; s,\.c$,,'`
448      if [ -n "$outputfile" ]; then
449        if $link; then
450          o=$b.o
451        else
452          o=$outputfile
453        fi
454      else
455        o=$b.o
456      fi
457      objfiles="$objfiles $o"
458      cmd="$CC -c $CPPFLAGS $CPICFLAG $ALL_CFLAGS $pass_on_options $incflags $defs $f -o $o"
459      $dbg $cmd
460      eval $cmd
461    else
462      echo "mkoctfile: no way to compile C++ file $f" 1>&2
463    fi
464  done
465fi
466
467if [ -n "$ccfiles" ]; then
468  for f in $ccfiles; do
469    if [ -n "$CXX" ]; then
470      case $f in
471        *.cc)
472          b=`echo $f | $SED 's,.*/,,; s,\.cc$,,'`
473        ;;
474        *.C)
475          b=`echo $f | $SED 's,.*/,,; s,\.C$,,'`
476        ;;
477        *.cpp)
478          b=`echo $f | $SED 's,.*/,,; s,\.cpp$,,'`
479        ;;
480      esac
481      if [ -n "$outputfile" ]; then
482        if $link; then
483          o=$b.o
484        else
485          o=$outputfile
486        fi
487      else
488        o=$b.o
489      fi
490      objfiles="$objfiles $o"
491      cmd="$CXX -c $CPPFLAGS $CXXPICFLAG $ALL_CXXFLAGS $pass_on_options $incflags $defs $f -o $o"
492      $dbg $cmd
493      eval $cmd
494    else
495      echo "mkoctfile: no way to compile C++ file $f" 1>&2
496    fi
497  done
498fi
499
500## Uncomment the following group of lines if you get `Text file busy'
501## errors from ld.  This may happen if the .oct file is currently
502## running while you are trying to recompile it.  We try moving first,
503## since on some systems (HP-UX, maybe others) it is possible to
504## rename running programs but not remove them.
505
506## if [ -f "$octfile" ]; then
507##   cmd="mv $octfile $octfile.bak"
508##   $dbg $cmd
509##   eval $cmd
510##   cmd="rm -f $octfile.bak"
511##   $dbg $cmd
512##   eval $cmd
513## fi
514
515# Link all the object files.
516
517if $link && [ -n "$objfiles" ]; then
518  if $link_stand_alone; then
519    if [ -n "$LD_CXX" ]; then
520      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"
521      $dbg $cmd
522      eval $cmd
523    else
524      echo "mkoctfile: no way to link stand-alone executable file" 1>&2
525      exit 1
526    fi
527  else
528    LINK_DEPS="$LFLAGS $OCTAVE_LIBS $LDFLAGS $LAPACK_LIBS $BLAS_LIBS $FFTW_LIBS $LIBS $FLIBS"
529    cmd="$DL_LD $DL_LDFLAGS $pass_on_options -o $octfile $objfiles $libfiles $ldflags $LINK_DEPS"
530    $dbg $cmd
531    eval $cmd
532  fi
533
534# Maybe strip it.
535
536  if $strip; then
537    cmd="strip $octfile"
538    $dbg $cmd
539    eval $cmd
540  fi
541fi
542
543exit 0
544