You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

1050 lines
28 KiB

#!/usr/bin/env bash
# configure script
# note: has nothing to do with GNU autoconf
if [[ -z $LOGFILE ]]; then
exec 2> /dev/null 3>&1
else
exec 3> >(while read TEXT ; do echo $TEXT ; echo $(date +"%d.%m.%Y %H:%M:%S") $TEXT >> $LOGFILE; done)
exec 2>> $LOGFILE
fi
shopt -s nullglob
export LC_ALL=C
printhelp() {
cat << EOF
\`configure' configures handyG to adapt to many kinds of systems.
Usage: ./configure [OPTION]... [VAR=VALUE]...
To assign environment variables (e.g., CC, CFLAGS...), specify them as
VAR=VALUE. See below for descriptions of some of the useful variables.
Defaults for the options are specified in brackets.
Installation directories:
--prefix=PREFIX install files in PREFIX [/usr/]
--mmprefix=PREFIX install files in for Mathematica
[\$UserBaseDirectory/Kernel/]
By default, \`make install' will install all the files in
\`/usr/local/bin', \`/usr/local/lib' etc. You can specify
an installation prefix other than \`/usr/local' using \`--prefix',
for instance \`--prefix=\$HOME'.
For better control, use the options below.
--moduledir=DIR Fortran module files (compiler specific)
--quad uses quadruple precision (128 bit) as the
working precision. This is not compatible with
the GiNaC interface.
Fine tuning of the installation directories:
System types:
--32 forces 32-bit compilation
--64 forces 64-bit compilation
--native do optimize code for the host machine
Optional Packages:
--with-mcc activates Mathematica interface
--with-ginac activates GiNaC interface for testing
--debug compile with debug flags and without optimization
Some influential environment variables:
FC Fortran compiler command
FFLAGS Fortran compiler flags
LD linker command
LDFLAGS linker flags, e.g. -L<lib dir> if you have libraries in a
nonstandard directory <lib dir>
CC C compiler command
CFLAGS C compiler flags
CXX C++ compiler command
CXXFLAGS C++ compiler flags
FPATH Path to put Fortran modules
PKG_CONFIG_PATH
directories to add to pkg-config's search path
Use these variables to override the choices made by \`configure' or to help
it to find libraries and programs with nonstandard names/locations.
Report bugs to <yannick.ulrich@psi.ch>.
EOF
exit
}
CONF_DIR="${0%/*}"
CONF_OS="`uname -s`"
HAVE_GINAC=false
HAVE_MCC=false
CONF_BITS=
CONF_QUAD=false
CONF_FFLAGS=$FFLAGS
CONF_CFLAGS=$CFLAGS
CONF_CXXFLAGS=$CXXFLAGS
CONF_LFLAGS=$LDFLAGS
CONF_FC=$FC
CONF_CC=$CC
CONF_CXX=$CXX
CONF_LD=$LD
CONF_MODDIR=$FPATH
if [ "$CONF_OS" == "Darwin" ]; then
CONF_PREFIX=/usr/local/
else
CONF_PREFIX=/usr/
fi
allargs="$@"
NATIVE=false
DEBUG=false
COVERAGE=false
STATIC=false
for arg in "$@" ; do
case "$arg" in
--debug)
DEBUG=true ;;
--prefix=*)
CONF_PREFIX="${arg#--prefix=}" ;;
--moduledir=*)
CONF_MODDIR="${arg#--moduledir=}" ;;
--with-ginac)
HAVE_GINAC=true ;;
--with-mcc)
HAVE_MCC=true ;;
--mmprefix=*)
CONF_MMPREFIX="${arg#--mmprefix=}" ;;
--static)
if [ "$CONF_OS" == "Darwin" ]; then
echo "--static does not work for macOS"
exit 1
fi
STATIC=true ;;
--native)
NATIVE=true ;;
--32)
CONF_BITS="-m32" ;;
--64)
CONF_BITS="-m64" ;;
--quad)
CONF_QUAD=true ;;
--coverage)
COVERAGE=true ;;
--ci)
echo "Running in CI configuration. Will not perform speed tests!" 1>&3
HAVE_MCC=true
HAVE_GINAC=true
DEBUG=true
COVERAGE=true ;;
--help )
printhelp ;;
-*)
echo "Warning: $arg is not a valid option." 1>&3
printhelp ;;
*=*)
eval "$arg" ;;
*)
echo "Warning: $arg is not a valid argument." 1>&3
printhelp ;;
esac
done
test=test$$
trap "rm -fr $test* =." 0 1 2 3 15
HAVE_GIT=false
if type -P git &>/dev/null ; then
if [ -d .git ]; then
HAVE_GIT=true
fi
if [ -f .git ]; then
HAVE_GIT=true
fi
fi
# This will be set by git-archive
VTAG="$Format: %D, %h$"
if $HAVE_GIT ; then
VERSION=`git describe --tag`
COMMIT=`git log -1 --pretty=format:"%h"`
elif [[ "$VTAG" == *"HEAD"* ]]; then
VERSION=`echo $VTAG | perl -lpe 's/.*?(, tag: ([^,]*))?,.*? ([a-f\d]+)$/\2/g'`
COMMIT=` echo $VTAG | perl -lpe 's/.*?(, tag: ([^,]*))?,.*? ([a-f\d]+)$/\3/g'`
if [ -z "$VERSION" ]; then
VERSION="untagged-$COMMIT"
fi
else
VERSION="v?.?.?"
COMMIT="unknown"
fi
if $COVERAGE ; then
$DEBUG || echo "Warning: --coverage implies --debug!" 1>&3
DEBUG=true
fi
## look for some programs
findprog() {
echo -n "looking for $1... " 1>&3
var="$2"
set -- ${!var:+"${!var}"} "${@:3}"
for prog in "$@" ; do
echo "Checking option $prog in path" 1>&2
full="`type -P "$prog"`" && {
echo "$full" 1>&3
printf -v "CONF_$var" "%q" "$full"
return 0
}
done
echo "no $@ in your path" 1>&3
return 1
}
findlib() {
echo -n "looking for lib$1... " 1>&3
for flag in $CONF_LFLAGS ; do
case "$flag" in
-L* )
libfolder=${flag/-L/}
echo "Checking folder $libfolder" 1>&2
if [ -f "$libfolder/lib$1.so" ] ; then
path=`readlink -f -- "$libfolder/lib$1.so"`
echo "Found SO in folder $libfolder" 1>&2
echo $path 1>&3
printf -v "CONF_$2" "%q" "$path"
return 0
fi
if [ -f "$libfolder/lib$1.a" ] ; then
path=`readlinf -f -- "$libfolder/lib$1.a"`
echo "Found A in folder $libfolder" 1>&2
echo $path 1>&3
printf -v "CONF_$2" "%q" "$path"
return 0
fi
;;
esac
done
echo "not found" 1>&3
return 1
}
addflag() {
eval "CONF_$1=\"${@:2} \${CONF_$1}\""
}
gnuflags() {
eval addflag FFLAGS -cpp # C pre-processor
eval addflag FFLAGS -pedantic-errors -std=f2008 # folow f08 strictly
eval addflag FFLAGS -J build # where to put mods
eval addflag FFLAGS -Werror -Wall # make every warning an error
eval addflag FFLAGS -Wno-uninitialized -Wno-unused-dummy-argument
eval addflag FFLAGS -ffree-line-length-0
}
if [ -z $FC ]; then
findprog fortran FC ifort gfortran || exit 1
fi
set -- `eval $CONF_FC --version -c | sed '/^$/d;s/([^)]*)//;q' 2>&1`
case "$1,$2,$3" in
GNU,Fortran,[123].*)
echo "Only version >= 4 are supported" 1>&3
exit
;;
GNU,Fortran,4.*)
echo "Code optimisation is *not* suported on gfortran 4" 1>&3
gnuflags
eval addflag $CONF_BITS
if $DEBUG ; then
eval addflag FFLAGS -g -O0
eval addflag FFLAGS -ffpe-trap=invalid,overflow
eval addflag FFLAGS -fdump-core -fbacktrace
eval addflag FFLAGS -frange-check
eval addflag FFLAGS -DDEBUG
else
eval addflag FFLAGS -DRELEASE
$NATIVE && eval addflag FFLAGS -march=native -mtune=native
fi
if $COVERAGE ; then
echo "Coverage analytics is currently only supported for gcc" 1>&3
exit 1
fi
;;
GNU,Fortran,*)
gnuflags
eval addflag FFLAGS -Wno-maybe-uninitialized
eval addflag $CONF_BITS
if $DEBUG ; then
eval addflag FFLAGS -g -O0
eval addflag FFLAGS -ffpe-trap=invalid,overflow
eval addflag FFLAGS -fdump-core -fbacktrace
eval addflag FFLAGS -fcheck=all -frange-check
eval addflag FFLAGS -DDEBUG
else
eval addflag FFLAGS -DRELEASE -O3
$NATIVE && eval addflag FFLAGS -march=native -mtune=native
fi
if $COVERAGE ; then
eval addflag FFLAGS --coverage
eval addflag LFLAGS -lgcov
fi
;;
ifort*)
eval addflag FFLAGS -module build
eval addflag FFLAGS -fpp
eval addflag FFLAGS -stand f03
eval addflag $CONF_BITS
if $DEBUG ; then
eval addflag FFLAGS -g -O0
eval addflag FFLAGS -DDEBUG
else
eval addflag FFLAGS -DRELEASE -O3 -fast
$NATIVE && eval addflag FFLAGS -xHost
fi
if $HAVE_GINAC ; then
echo "Option --with-ginac is incompatible with ifort, disabling" 1>&3
HAVE_GINAC=false
fi
if $HAVE_MCC ; then
echo "Option --with-mcc is incompatible with ifort, disabling" 1>&3
HAVE_MCC=false
fi
if $COVERAGE ; then
echo "Coverage analytics is currently only supported for gcc" 1>&3
exit 1
fi
;;
*)
echo "Unknown compiler" 1>&3
exit
;;
esac
echo -n "extracting the Fortran libraries... " 1>&3
rm -fr $test*
echo "Trying the following program as $test.f90" 1>&2
tee $test.f90 << _EOF_ 1>&2
program test
integer i
common /uscore/ i
call exit(i)
end
_EOF_
echo "Executing $CONF_FC `$STATIC && echo "--static" || true` -v -o $test $test.f90" 1>&2
while read line ; do
echo "Parsing line $line" 1>&2
set -- ${line//[:,()]/ }
[[ "$1" =~ (/collect2|/ld|^ld)$ ]] && while test $# -gt 1 ; do
shift
case "$1" in
*.o | -lc*)
;;
-l* | -L* | *.a)
echo "Found linker flag $1" 1>&2
FLDFLAGS+=" $1" ;;
-Bstatic | -Bdynamic | *.ld)
echo "Found linker flag $1" 1>&2
FLDFLAGS+=" -Wl,$1" ;;
/*)
echo "Found linker flag $1" 1>&2
FLDFLAGS+=" -L$1" ;;
-rpath*)
echo "Found linker flag $1" 1>&2
FLDFLAGS+=" -Wl,$1,$2"
shift ;;
-dynamic-linker)
shift ;;
esac
done
if [[ "$line" == *"-fintrinsic-modules-path"* ]]; then
set -- ${line//[:,()]/ }
while test $# -gt 1 ; do
shift
case "$1" in
-fintrinsic-modules-path )
echo "Found module path $1" 1>&2
CONF_MODPATH=$2
;;
esac
done
fi
done < <(eval $CONF_FC `$STATIC && echo "--static" || true` -v -o $test $test.f90 2>&1)
echo "ok" 1>&3
eval addflag LFLAGS "$LDFLAGS $CONF_LDFLAGS $FLDFLAGS -L$CONF_PREFIX/lib"
if [[ -z "$CONF_MODDIR" ]]; then
if [[ ! -z "$CONF_MODPATH" ]]; then
echo -n "checking whether module path is in prefix... " 1>&3
if [[ "${CONF_MODPATH##$CONF_PREFIX}" != "${CONF_MODPATH}" ]]; then
echo " yes" 1>&3
CONF_MODDIR=$CONF_MODPATH
else
echo " no" 1>&3
CONF_MODDIR=
fi
fi
fi
findprog pkg-config PKGCONFIG pkg-config
if [[ -z "$CONF_MODDIR" ]]; then
if [[ -z "$CONF_PKGCONFIG" ]]; then
echo "*************************************************" 1>&3
echo "Warning! pkg-config not found! This may lead to " 1>&3
echo "difficulties when you try to compile your own " 1>&3
echo "code. You will need to run " 1>&3
echo " " 1>&3
echo " $CONF_FC -I$CONF_PREFIX/include " 1>&3
echo " " 1>&3
echo "every time. " 1>&3
echo "*************************************************" 1>&3
fi
fi
if ( $HAVE_GINAC || $HAVE_MCC ); then
if [ -z $CC ]; then
findprog gcc CC clang gcc || exit 1
fi
if [ -z $CXX ]; then
findprog g++ CXX clang++ g++ || exit 1
fi
eval addflag CFLAGS "-std=c99"
## does Fortran append underscores to symbols?
echo -n "does $CONF_FC append underscores... " 1>&3
echo "Trying the following program as $test-c.c" 1>&2
tee $test-c.c << _EOF_ 1>&2
int uscore_ = 95;
int uscore = 59;
_EOF_
for CONF_BITS in ${CONF_BITS:--m64 -m32} ; do
echo "Executing $CONF_CC $CONF_CFLAGS $CONF_BITS -c $test-c.c" 1>&2
eval $CONF_CC $CONF_CFLAGS $CONF_BITS -c $test-c.c 1>&2 || continue
echo "Executing $CONF_FC -o $test $test.f90 $test-c.o" 1>&2
eval $CONF_FC -o $test $test.f90 $test-c.o 1>&2 && break
done
if [[ ! -x "$test" ]]; then
echo "error: linking failed. Please check logfile $LOGFILE." 1>&3
fi
./$test
case $? in
95)
echo "yes" 1>&3
CONF_NOUNDERSCORE=0 ;;
59)
echo "no" 1>&3
CONF_NOUNDERSCORE=1 ;;
*)
echo "error linking Fortran and C" 1>&3
exit 1 ;;
esac
else
CONF_CC=
CONF_CXX=
CONF_CFLAGS=
CONF_NOUNDERSCORE=
fi
if $HAVE_MCC ; then
PATH=$PATH:/Applications/Mathematica.app/Contents/MacOS/ findprog mathematica MATH math MathKernel math10 math11
eval addflag FFLAGS -DHAVE_MM
# Checking Mathematica system id
echo -n "what is $CONF_MATH SystemID... " 1>&3
echo "Trying the following program as $test.m" 1>&2
tee $test.m << _EOF_ 1>&2
Print["SYSID "<>ToString[\$SystemID]];
Print["INSTDIR "<>ToString[\$InstallationDirectory]];
Print["USERDIR "<>ToString[\$UserBaseDirectory]];
_EOF_
$CONF_MATH < $test.m > $test.log
echo "Mathematica returned" 1>&2
cat $test.log 1>&2
CONF_MATH_SYS=`cat $test.log | grep "SYSID" | sed 's/.*SYSID //'`
CONF_MATH_DIR=`cat $test.log | grep "INSTDIR" | sed 's/.*INSTDIR //'`
CONF_MATH_USR=`cat $test.log | grep "USERDIR" | sed 's/.*USERDIR //'`
[[ -z "$CONF_MMPREFIX" ]] && \
CONF_MMPREFIX=${CONF_MMPREFIX:=$CONF_MATH_USR/Kernel}
echo $CONF_MATH_SYS 1>&3
# Finding mcc
CONF_COMPAD=$CONF_MATH_DIR/SystemFiles/Links/MathLink/DeveloperKit/$CONF_MATH_SYS/CompilerAdditions/
PATH=$CONF_COMPAD:$PATH findprog mcc MCC mcc
echo -n "looking for MLDK directory... " 1>&3
echo "Running $CONF_MCC --internals" 1>&2
$CONF_MCC --internals | sed "s/-lpthread -lrt/-lrt -lpthread -lrt/g" > $test.int
cat $test.int 1>&2
CONF_MLDK=`cat $test.int | grep "MLDK Directory" | cut -f2 -d":"`
echo $CONF_MLDK 1>&3
arch=`cat $test.int | grep "Library Bit Type:" | cut -f2 -d":"` ; \
CONF_MCC_CFLAGS=`cat $test.int | grep "Compile Flags$arch:" | cut -f2 -d":"`
CONF_MCC_LFLAGS=`cat $test.int | grep "Linker Libraries" | cut -f2 -d":"`
CONF_MCC_LFLAGS="$CONF_MCC_LFLAGS"
if [ ! -z $CONF_BITS ]; then
if [ "$CONF_BITS" -ne "$MCC_BITS" ]; then
echo "mcc wants $MCC_BITS ($arch), $CONF_BITS selected." 1>&3
exit 1
fi
fi
if [[ $CONF_MCC_LFLAGS == *"uuid"* ]]; then
if ! findlib uuid UUID ; then
echo -n "improvising uuid... " 1>&3
CONF_MLIBDIR=$CONF_MATH_DIR/SystemFiles/Libraries/$CONF_MATH_SYS/
if [ -f $CONF_MLIBDIR/libuuid.a ]; then
CONF_MCC_LFLAGS="-L$CONF_MLIBDIR $CONF_MCC_LFLAGS"
echo "okay" 1>&3
else
echo "failed" 1>&3
exit 1
fi
fi
fi
# Finding MPREP
PATH=$CONF_COMPAD:$PATH findprog mprep MPREP mprep
## can we do MathLink compilations
echo -n "do we have working MathLink... " 1>&3
echo "Trying the following program as $test.tm" 1>&2
tee $test.tm << _EOF_ 1>&2
:Begin:
:Function: test
:Pattern: Test[i_Integer]
:Arguments: {i}
:ArgumentTypes: {Integer}
:ReturnType: Integer
:End:
#include "mathlink.h"
static int test(const int i) {
return i + 1;
}
int main(int argc, char **argv) {
return MLMain(argc, argv);
}
_EOF_
echo "Executing $CONF_MPREP $test.tm" 1>&2
$CONF_MPREP $test.tm > $test.tm.c
echo "Executing $CONF_CC $CONF_MCC_CFLAGS $CONF_CFLAGS -c $test.tm.c" 1>&2
$CONF_CC $CONF_MCC_CFLAGS $CONF_CFLAGS -c $test.tm.c
echo "Executing $CONF_CC `$STATIC && echo "--static" || true` -o $test.math $test.tm.o $CONF_MCC_LFLAGS" 1>&2
$CONF_CC `$STATIC && echo "--static" || true` -o $test.math $test.tm.o $CONF_MCC_LFLAGS
if [[ -x "$test.math" ]] ; then
if $STATIC ; then
if ldd $test.math | grep -q "/" ; then
echo "no, can't compile static binaries" 1>&3
CONF_ML=0
exit 1;
fi
fi
echo "yes" 1>&3
CONF_ML=1
else
echo "no" 1>&3
CONF_ML=0
exit 1;
fi
fi
CONF_LD=${LD:-$CONF_FC}
if $CONF_QUAD ; then
echo -n "does $CONF_FC support quad-precision... " 1>&3
rm -fr $test*
echo "Trying the following program as $test.f90" 1>&2
tee $test.f90 << _EOF_ 1>&2
program test
real(selected_real_kind(30,32)) a, b
a = 2D0**(52/2+2)
b = a + 1/a
if( a .eq. b ) stop 1
end
_EOF_
echo "Running $CONF_FC $CONF_FFLAGS -o $test $test.f90" 1>&2
$CONF_FC $CONF_FFLAGS -o $test $test.f90 1>&2
if [[ ! -x "$test" ]]; then
echo "no. Compilation failed."
fi
./$test 1>&2 && {
echo "yes" 1>&3
eval addflag FFLAGS -DKINDREAL=16 -DKINDINT=8
} || {
echo "no. Running failed" 1>&3
exit 1
}
$HAVE_MCC && eval addflag CFLAGS -DHAVE_QUAD
fi
if $HAVE_GINAC ; then
eval addflag CXXFLAGS "-std=c++11"
if [[ ! -z "$CONF_PKGCONFIG" ]]; then
echo -n "Does pkg-config know about GiNaC... " 1>&3
if $CONF_PKGCONFIG --atleast-version=1.7.4 ginac ; then
echo "yes" 1>&3
eval addflag CXXFLAGS `$CONF_PKGCONFIG --cflags ginac`
eval addflag LFLAGS `$CONF_PKGCONFIG --libs ginac`
FOUND_GINAC=true
CONF_GINAC=`$CONF_PKGCONFIG --variable=libdir ginac`
else
echo "no" 1>&3
FOUND_GINAC=false
fi
fi
if ! $FOUND_GINAC ; then
findlib ginac GINAC && findlib cln CLN && FOUND_GINAC=true
eval addflag LFLAGS "-L`dirname $CONF_GINAC`"
eval addflag LFLAGS "-L`dirname $CONF_CLN`"
eval addflag LFLAGS "-lginac -lcln"
fi
if $FOUND_GINAC; then
CONF_LD=${LD:-$CONF_CXX}
echo -n "Checking if GiNaC works... " 1>&3
echo "Trying the following program as $test.ginac.cpp" 1>&2
tee $test.ginac.cpp << _EOF_ 1>&2
#include <ginac/ginac.h>
#include <iostream>
#include <cln/cln.h>
typedef struct {double r,i;} complex_t;
typedef struct {complex_t c; signed char i0;} inum_t;
complex_t geval_(inum_t * z, int* n) {
cln::cl_inhibit_floating_point_underflow = true;
GiNaC::lst w,s;
for(long i=0;i<(*n)-1;i++)
{
GiNaC::ex zz;
if (abs(z->c.i) < 1e-15)
w.append((z->c.r));
else
w.append((z->c.r)+(z->c.i)*GiNaC::I);
s.append(z->i0);
z++;
}
GiNaC::ex ans = GiNaC::G(w,s,z->c.r).evalf();
return {
.r = GiNaC::ex_to<GiNaC::numeric>(GiNaC::evalf(GiNaC::real_part(ans))).to_double(),
.i = GiNaC::ex_to<GiNaC::numeric>(GiNaC::evalf(GiNaC::imag_part(ans))).to_double()
};
}
int main() {
// Test 1
GiNaC::ex ans = GiNaC::G(0.3,0.5,0.7);
ans -= 0.2876820724517808812+3.1415926535897932385*GiNaC::I;
ans = GiNaC::abs(ans);
// Test 2
inum_t x[] = {
{ .c = {.r = 0.73, .i=0}, .i0 = -1 },
{ .c = {.r = 0.00, .i=0}, .i0 = +1 },
{ .c = {.r = 1.00, .i=0}, .i0 = +1 }
};
int n=3;
complex_t cans = geval_(&x[0],&n);
float del = (2.2982889094420660-cans.r)*(2.2982889094420660-cans.r) + (0.98869296399417417-cans.i)*(0.98869296399417417-cans.i);
if (ans>1e-15) return 1;
if (del>1e-15) return 2;
return 0;
}
_EOF_
echo "Running $CONF_CXX $CONF_CXXFLAGS $CONF_BITS -c $test.ginac.cpp" 1>&2
$CONF_CXX $CONF_CXXFLAGS $CONF_BITS -c $test.ginac.cpp
echo "Running $CONF_LD -o $test.ginac $test.ginac.o $CONF_LFLAGS" 1>&2
$CONF_LD -o $test.ginac $test.ginac.o $CONF_LFLAGS
if [[ ! -x "$test.ginac" ]]; then
echo "error compiling GiNaC" 1>&3
exit 1
fi
./$test.ginac
case $? in
0)
echo "yes" 1>&3
eval addflag FFLAGS "-DHAVE_GINAC" ;;
1)
echo "no" 1>&3
exit 1 ;;
2)
echo "no. Try updating your GiNaC version" 1>&3
exit 1 ;;
*)
echo "error running GiNaC" 1>&3
exit 1 ;;
esac
else
echo "GiNaC could not be found" 1>&3
exit 1
fi
fi
if $HAVE_GINAC && $HAVE_MCC; then
eval addflag LFLAGS -lrt
fi
if [[ ! -z "$CONF_PKGCONFIG" ]]; then
cat > handyg.pc <<EOF
prefix=$CONF_PREFIX
exec_prefix=\${prefix}
libdir=\${exec_prefix}/lib
includedir=\${prefix}/include
Name: handyG
Description: Numerical evaluation of GPL
Version: 0.1.0
Libs: -L\${libdir} -lhandyg
Cflags: -I\${includedir}
EOF
fi
if $COVERAGE ; then
findprog gcov GCOV gcov gcov-7 gcov-6 gcov-5 gcov-34 || exit 1
if ! findlib gcov LGCOV ; then
echo "can't perform coverage tests without libgcov. Please specify using \$LFLAGS" 1>&3
exit 1
fi
if ! findprog lcov LCOV lcov ; then
echo "graphical coverage report won't be supported" 1>&3
HAVE_LCOV=false
else
if ! findprog genhtml GENHTML genhtml ; then
echo "graphical coverage report won't be supported" 1>&3
HAVE_LCOV=false
else
HAVE_LCOV=true
fi
fi
fi
echo "creating makefile" 1>&3
cat 1>&2 <<EOF
The makefile was created through $0 $allargs on `date` by `whoami`
handyG version $VERSION
The following capabilities are supported:
EOF
$HAVE_MCC && echo " * mcc / MathLink interface" 1>&2
$HAVE_GINAC && echo " * GiNaC test interface" 1>&2
$COVERAGE && echo " * coverage reporting" 1>&2
$CONF_QUAD && echo " * quadrouple precision" 1>&2
$HAVE_LCOV && echo " * lcov coverage reporting" 1>&2
$DEBUG && echo " * debugging mode" 1>&2
$NATIVE && echo " * native compilation" 1>&2
cat 1>&2 <<EOF
The following compilers are used
> AR=ar rcs
> FC=$CONF_FC
> CC=$CONF_CC
> CXX=$CONF_CXX
> LD=$CONF_LD
> MPREP=$CONF_MPREP
> MATH=$CONF_MATH
> GCOV=$CONF_GCOV
> LCOV=$CONF_LCOV
> GENHTML=$CONF_GENHTML
with the following flags
> FFLAGS=$CONF_FFLAGS
> CFLAGS=$CONF_CFLAGS
> CXXFLAGS=$CONF_CXXFLAGS
> LFLAGS=$CONF_LFLAGS
> MCFLAGS=$CONF_MCC_CFLAGS
> MLFLAGS=$CONF_MCC_LFLAGS
> PREFIX=$CONF_PREFIX
> MMPREFIX=$CONF_MMPREFIX
> MODDIR=$CONF_MODDIR
EOF
cat > makefile <<EOF
# Generated through $0 $allargs on `date` by `whoami`
AR=ar rcs
FC=$CONF_FC
CC=$CONF_CC
CXX=$CONF_CXX
LD=$CONF_LD
MPREP=$CONF_MPREP
MATH=$CONF_MATH
GCOV=$CONF_GCOV
LCOV=$CONF_LCOV
GENHTML=$CONF_GENHTML
FFLAGS=$CONF_FFLAGS
CFLAGS=$CONF_CFLAGS
CXXFLAGS=$CONF_CXXFLAGS
LFLAGS=$CONF_LFLAGS
MCFLAGS=$CONF_MCC_CFLAGS
MLFLAGS=$CONF_MCC_LFLAGS
PREFIX=$CONF_PREFIX
MMPREFIX=$CONF_MMPREFIX
MODDIR=$CONF_MODDIR
files=globals.o ieps.o utils.o shuffle.o maths_functions.o mpl_module.o gpl_module.o handyg.o
objects = \$(addprefix build/,\$(files))
all: libhandyg.a handyg.mod ${CONF_MPREP:+handyG} geval test
EOF
function mkdep ()
{
echo -n "build/$1.o build/$1.mod:" >> makefile
shift
for item in "$@" ; do
echo -n " build/$item.mod" >> makefile
done
echo >> makefile
}
mkdep ieps globals
mkdep shuffle globals ieps
mkdep utils globals ieps
mkdep maths_functions globals ieps utils
mkdep mpl_module globals ieps
mkdep gpl_module globals ieps utils shuffle maths_functions mpl_module
mkdep handyg globals ieps gpl_module maths_functions
mkdep geval handyg
cat >> makefile <<EOF
libhandyg.a:\$(objects)
@echo "AR \$@"
@\$(AR) \$@ \$^
handyg.mod: build/handyg.mod
cp \$< \$@
# rules to make object files into /build
build/%.mod build/%.o: src/%.f90
@echo "F90 \$@"
@\$(FC) \$(FFLAGS) -c \$< -o \$@
build/ttools.mod build/tools.o: checks/tools.f90 handyg.mod
@echo "F90 \$@"
@\$(FC) \$(FFLAGS) -Wno-unused-function -c \$< -o \$@
build/%.o: checks/%.f90 handyg.mod build/tools.o
@echo "F90 \$@"
@\$(FC) \$(FFLAGS) -Wno-unused-function -c \$< -o \$@
build/%.o: src/%.cpp
@echo "C++ \$@"
@\$(CC) \$(CXXFLAGS) -c \$< -o \$@
geval: libhandyg.a build/geval.o
@echo "LD \$@"
@\$(LD) `$STATIC && echo "--static" || true` -o \$@ build/geval.o -L. -lhandyg \$(LFLAGS)
EOF
$HAVE_MCC && cat >> makefile <<EOF
build/%.tm.c: src/%.tm
@echo "MPREP \$@"
@cat \$< | sed '/:Begin:/,/:End:/ s/Real/Real$($CONF_QUAD && echo 128)/g' \\
| sed 's/__VERSION__/$VERSION/g' | \$(MPREP) > \$@
build/mathlink.o: build/mathlink.tm.c
@echo "CC \$<"
@\$(CC) \$(MCFLAGS) \$(CFLAGS) -o \$@ -c \$<
handyG: build/mathlink.o libhandyg.a
@echo "LD \$@"
@\$(LD) `$STATIC && echo "--static" || true` \$< libhandyg.a -o \$@ \$(LFLAGS) \$(MLFLAGS)
EOF
echo -n "testdep=" >> makefile
echo -n "build/tools.o " >> makefile
echo -n "build/test-chenref.o " >> makefile
$HAVE_GINAC && echo -n "build/ginac.o " >> makefile
$HAVE_GINAC && echo -n "build/test-chen.o " >> makefile
$HAVE_GINAC && echo -n "build/test-chenff.o " >> makefile
$HAVE_GINAC && echo -n "build/test-muone.o " >> makefile
$HAVE_GINAC && echo -n "build/test-muoneNP.o " >> makefile
cat >> makefile <<EOF
build/test.o: checks/test.f90 \$(testdep)
test: \$(objects) \$(testdep) build/test.o
@echo "LD \$@"
@\$(LD) -o \$@ \$^ \$(LFLAGS)
install: libhandyg.a handyg.mod ${CONF_MPREP:+handyG} geval
mkdir -p \$(PREFIX)
mkdir -p \$(PREFIX)/bin
cp geval \$(PREFIX)/bin/geval
mkdir -p \$(PREFIX)/lib
cp libhandyg.a \$(PREFIX)/lib/
mkdir -p \$(PREFIX)/include
cp handyg.mod \$(PREFIX)/include/
EOF
$HAVE_MCC && cat >> makefile <<EOF
mkdir -p \$(MMPREFIX)
cp handyg \$(MMPREFIX)
EOF
if [[ ! -z "$CONF_PKGCONFIG" ]]; then
cat >> makefile <<EOF
mkdir -p \$(PREFIX)/lib/pkgconfig
cp handyg.pc \$(PREFIX)/lib/pkgconfig
EOF
fi
if [[ ! -z "$CONF_MODDIR" ]]; then
cat >> makefile <<EOF
mkdir -p \$(MODDIR)
cp handyg.mod \$(MODDIR)
EOF
fi
echo "uninstall:" >> makefile
echo -ne "\t\trm -i " >> makefile
echo -n "\$(PREFIX)/lib/libhandyg.a " >> makefile
echo -n "\$(PREFIX)/include/handyg.mod " >> makefile
echo -n "\$(PREFIX)/bin/geval " >> makefile
$HAVE_MCC && echo -n "\$(MMPREFIX)/handyg" >> makefile
if [[ ! -z "$CONF_PKGCONFIG" ]]; then
echo -n "\$(PREFIX)/lib/pkgconfig " >> makefile
fi
if [[ ! -z "$CONF_MODDIR" ]]; then
echo -n "\$(MODDIR)/handyg.mod " >> makefile
fi
cat >> makefile <<EOF
check-mpl: test
./$< -mpl-test
check-gpl: test
./$< -gpl-test
check-chen: test
./$< -chen-test
EOF
$HAVE_GINAC && cat >> makefile <<EOF
check-ginac: test
./$< -ginac-tests
check-speed: test
./$< -speed-tests 5
check-hw: test
./$< -hw-tests
check-long: test
./$< -long-test
EOF
$HAVE_GINAC && echo "check: check-mpl check-gpl check-chen check-ginac" >> makefile \
|| echo "check: check-mpl check-gpl check-chen" >> makefile
if $COVERAGE ; then
cat >> makefile <<EOF
report/report.txt: test
mkdir -p report
./test -report > /dev/null
echo "Report generated on \`date\` by `whoami`." > \$@
EOF
for i in gpl_module ieps maths_functions mpl_module shuffle utils test
do
echo -e "\t\t\$(GCOV) build/$i.gcno >> \$@" >> makefile
echo -e "\t\tmv $i.f90.gcov report/" >> makefile
done
$HAVE_LCOV && cat >> makefile <<EOF
report/coverage.full.info: report/report.txt
\$(LCOV) --capture --directory build/ --output-file \$@
report/coverage.info: report/coverage.full.info
\$(LCOV) --remove \$< "\$\$(pwd)/checks/test-chenff.f90" -o \$@
report/lcov.report: report/coverage.info
\$(LCOV) --list \$< > \$@
cat \$@
report/index.html: report/coverage.info
\$(GENHTML) \$< --output-directory report
EOF
#cat \$@ | perl -nle "print \\\$\$1 if /Total:\\|(\\d+\\.?\\d+\\%)/"
echo -n "coverage: report/report.txt" >> makefile
$HAVE_LCOV && echo -n " report/coverage.info report/lcov.report report/index.html" >> makefile
echo >> makefile
fi
cat >> makefile <<EOF
clean:
@rm -f build/*.gcda build/*.gcno build/*.gcov
@rm -rf report/
@rm -f build/*.o build/*.mod build/*.c build/mcc.internals*
@rm -f test geval libhandyg.a handyG handyg.mod
distclean:
@rm -f build/*.gcda build/*.gcno build/*.gcov
@rm -rf report/
@rm -f build/*.o build/*.mod build/*.c build/mcc.internals*
@rm -f test geval libhandyg.a handyG handyg.mod
@rm -f makefile handyg.pc
EOF
echo "Configuration of handyG $VERSION done. Now type \"make\"." 1>&3