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