Files
arpack-ng/configure.ac
T
Franck HOUSSEN aa970cefa6 ILP64 support. (#165)
The idea is:
- cmake      generates arpackdef.h from arpackdef.cmake.h.in
- autoheader generates arpackdef.h from arpackdef.autotools.h[.in]
- arpack includes arpackdef.h when/where needed:
  - #define provide c_int/a_int according to architecture.
  - all f90 who need to include "arpackdef.h" must be moved to F90.
    Note: by convention, F90 are preprocessed (f90 are not).
- MPI does not support ILP64: integer*4 must be imposed in all
  calls involving MPI (f90 example/test code).

To enable ILP64 users to compile/link, arpackdef.h is added in
the arpack installation (make install).
2018-12-29 13:55:40 +01:00

289 lines
10 KiB
Plaintext

AC_PREREQ(2.67)
AC_INIT([ARPACK-NG],[3.6.0],[https://github.com/opencollab/arpack-ng/issues/],[arpack-ng],[https://github.com/opencollab/arpack-ng/])
AC_CONFIG_SRCDIR([SRC/version.h])
AC_CONFIG_AUX_DIR([build-aux])
AC_CONFIG_MACRO_DIR([m4])
AC_CONFIG_LINKS([TESTS/testA.mtx:TESTS/testA.mtx])
AC_CONFIG_HEADER([arpackdef.autotools.h]) # Autoheader : generate arpackdef.autotools.h.in to handle #ifdef
AM_INIT_AUTOMAKE([foreign])
AM_MAINTAINER_MODE
dnl Checks for standard programs.
dnl Autoconf was designed with the fundamental fact that compiler (= language support) is NOT an option.
AC_PROG_FC
AC_PROG_CC
AC_PROG_CXX
dnl Check for BLAS libraries
AX_BLAS([], [AC_MSG_ERROR([cannot find BLAS libraries])])
dnl Check for LAPACK libraries
AX_LAPACK([], [AC_MSG_ERROR([cannot find LAPACK libraries])])
AC_ARG_VAR(INTERFACE64, [set to 1 to use the 64-bit integer interface (ILP64) for ARPACK, BLAS and LAPACK])
if test x"$INTERFACE64" == x"1"; then
AX_CHECK_COMPILE_FLAG(-fdefault-integer-8, FFLAGS="$FFLAGS -fdefault-integer-8",
AX_CHECK_COMPILE_FLAG(-i8, FFLAGS="$FFLAGS -i8",
AC_MSG_WARN([configure does not know how to make your Fortran compiler use 64-bit integers: set it manually via FFLAGS.])))
AX_CHECK_COMPILE_FLAG(-fdefault-integer-8, FCFLAGS="$FCFLAGS -fdefault-integer-8",
AX_CHECK_COMPILE_FLAG(-i8, FCFLAGS="$FCFLAGS -i8",
AC_MSG_WARN([configure does not know how to make your Fortran compiler use 64-bit integers: set it manually via FCFLAGS.])))
AC_DEFINE([INTERFACE64],[1],['INTERFACE64 is enabled']) # Add a #define (or #undef) for INTERFACE64 in arpackdef.autotools.h.in (autoheader)
else
INTERFACE64=0
fi
AC_ARG_VAR(LIBSUFFIX, [suffix to add to ARPACK libraries names])
AC_ARG_VAR(SYMBOLSUFFIX, [suffix to add to ARPACK, BLAS and LAPACK function names])
ifdef([LT_INIT], [], [
errprint([error: you must have libtool 2.4.2 or a more recent version
])
m4exit([1])])
LT_PREREQ([2.4.2])
LT_INIT([win32-dll])
dnl See if compiling parpack
AC_ARG_ENABLE([mpi],
[AS_HELP_STRING(
[--enable-mpi],
[build parallel version of arpack with MPI])],
[],
[AS_VAR_SET([enable_mpi], [no])])
AS_IF([test x"$enable_mpi" != x"no"], [
AC_LANG_PUSH([Fortran 77])
AX_MPI([], AC_MSG_ERROR([could not compile a Fortran MPI test program]))
AC_SUBST([MPI_Fortran_LIBS], [$MPILIBS])
F77=$MPIF77
AC_LANG_POP([Fortran 77])
])
AM_CONDITIONAL([MPI], [test x"$enable_mpi" != x"no"])
AM_CONDITIONAL([BLACS], [false])
dnl See if compiling with ISO_C_BINDING support
AC_ARG_ENABLE([icb],
[AC_HELP_STRING([--enable-icb],
[build support for *[ae]upd_c with ISO_C_BINDING])],
[AS_VAR_SET([enable_icb], [$enableval])],
[AS_VAR_SET([enable_icb], [no])])
dnl See if compiling matrix market example based on ICB
AC_ARG_ENABLE([icb-exmm],
[AC_HELP_STRING([--enable-icb-exmm],
[matrix market example based on ISO_C_BINDING])],
[
AS_VAR_SET([enable_icb_exmm], [$enableval])
AS_VAR_SET([enable_icb], [$enableval])
],
[AS_VAR_SET([enable_icb_exmm], [no])])
AM_CONDITIONAL([ICBEXMM], [test x"$enable_icb_exmm" != x"no"])
if test x"$enable_icb_exmm" != x"no"; then
PKG_CHECK_MODULES([EIGEN3], [eigen3 >= 3.2]) dnl Go get eigen3.pc
AC_SUBST([EIGEN3_CFLAGS]) dnl Define EIGEN3_CFLAGS in Makefile.am
dnl TODO: How to pass /path/to/eigen from EIGEN3_CFLAGS to AC_CHECK_HEADERS ?...
dnl AC_CHECK_HEADERS(
dnl [eigen3/Eigen/Sparse], [],
dnl [AC_MSG_ERROR([Error: eigen3/Eigen/Sparse not found])]
dnl )
dnl AC_CHECK_HEADERS(
dnl [eigen3/Eigen/IterativeLinearSolvers], [],
dnl [AC_MSG_ERROR([Error: eigen3/Eigen/IterativeLinearSolvers not found])]
dnl )
dnl AC_CHECK_HEADERS(
dnl [eigen3/Eigen/SparseLU], [],
dnl [AC_MSG_ERROR([Error: eigen3/Eigen/SparseLU not found])]
dnl )
dnl AC_CHECK_HEADERS(
dnl [eigen3/Eigen/SparseQR], [],
dnl [AC_MSG_ERROR([Error: eigen3/Eigen/SparseQR not found])]
dnl )
fi
AM_CONDITIONAL([ICB], [test x"$enable_icb" != x"no"])
if test x"$enable_icb" != x"no"; then
AC_LANG_PUSH([Fortran])
AC_MSG_CHECKING([for iso_c_binding module compilation])
AC_LINK_IFELSE(
[
AC_LANG_PROGRAM(
[],
[
USE iso_c_binding
IMPLICIT NONE
INTEGER(C_INT) :: a
a = 1
]
)
],
[AC_MSG_RESULT([yes])],
[
AC_MSG_RESULT([no])
AC_MSG_ERROR([Fortran compiler does not support iso_c_binding])
]
)
AC_LANG_POP([Fortran])
if test x"$enable_mpi" != x"no"; then
AC_LANG_PUSH([Fortran])
AX_MPI([], AC_MSG_ERROR([could not compile a Fortran MPI test program]))
FC=$MPIFC
AC_FC_WRAPPERS dnl set FCLIBS
AC_LANG_POP([Fortran])
AC_LANG_PUSH([C])
AX_MPI([], AC_MSG_ERROR([could not compile a C MPI test program]))
AC_SUBST([MPI_C_LIBS], ["$MPILIBS $FCLIBS"])
CC=$MPICC
AC_LANG_POP([C])
AC_LANG_PUSH([C++])
AX_MPI([], AC_MSG_ERROR([could not compile a C++ MPI test program]))
AC_SUBST([MPI_CXX_LIBS], ["$MPILIBS $FCLIBS"])
CXX=$MPICXX
AC_LANG_POP([C++])
AC_LANG_PUSH([C])
AC_MSG_CHECKING([for MPI_Comm_c2f function])
AC_LINK_IFELSE(
[
AC_LANG_PROGRAM(
[[#include <mpi.h>]],
[[MPI_Comm c_comm; MPI_Comm_c2f(c_comm)]]
)
],
[AC_MSG_RESULT([yes])],
[
AC_MSG_RESULT([no])
AC_MSG_ERROR([symbol MPI_Comm_c2f does not exist])
]
)
AC_LANG_POP([C])
fi
AX_CXX_COMPILE_STDCXX(11)
else
# ICB saves you from old-fashion-boring-cumbersome-fortran/C crap...
if test x"$SYMBOLSUFFIX" != x""; then
dnl Need to rely on non-F77 features
AC_FC_LINE_LENGTH(unlimited)
FFLAGS="$FFLAGS $ac_cv_fc_line_length"
AX_CHECK_COMPILE_FLAG(-cpp, FFLAGS="$FFLAGS -cpp",
AX_CHECK_COMPILE_FLAG(-fpp, FFLAGS="$FFLAGS -fpp",
AC_MSG_WARN([configure does not know how to enable your Fortran compiler's preprocessor: set it manually via FFLAGS.])))
SCALARFUNS="naitr napps naup2 naupd nconv neigh neupd ngets statn saitr sapps saup2 saupd sconv seigt seupd sgets stats getv0 sortc sortr sesrt stqrb"
COMPLEXFUNS="naitr napps naup2 naupd neigh neupd ngets statn getv0 sortc"
BLASFUNS1="axpy copy gemv geqr2 lacpy lae2 lahqr lanhs larnv lartg lascl laset lasrt scal trevc trmm trsen gbmv gbtrf gbtrs gttrf gttrs pttrf pttrs"
BLASFUNS2="dot ger labad laev2 lamch lanst lanv2 lapy2 larf larfg lasr nrm2 orm2r rot steqr swap"
BLASFUNS3="dotc geru unm2r"
BLASFUNS4="COPY LABAD LAMCH LANHS LANV2 LARFG ROT GEMV"
BLASFUNS5="scnrm2 dznrm2 csscal zdscal"
FUNS1="$SCALARFUNS $BLASFUNS1 $BLASFUNS2"
for f in $FUNS1
do
FFLAGS="$FFLAGS -Ds$f=s$f$SYMBOLSUFFIX -Dd$f=d$f$SYMBOLSUFFIX"
done
FUNS2="$COMPLEXFUNS $BLASFUNS1 $BLASFUNS3"
for f in $FUNS2
do
FFLAGS="$FFLAGS -Dc$f=c$f$SYMBOLSUFFIX -Dz$f=z$f$SYMBOLSUFFIX"
done
for f in $BLASFUNS4
do
FFLAGS="$FFLAGS -DS$f=S$f$SYMBOLSUFFIX -DD$f=D$f$SYMBOLSUFFIX"
done
for f in $BLASFUNS5
do
FFLAGS="$FFLAGS -D$f=$f$SYMBOLSUFFIX -D$f=$f$SYMBOLSUFFIX"
done
fi
dnl Both a lowercase and uppercase variable are needed
dnl since the macro changes the case of the whole expression
symbolsuffix=$SYMBOLSUFFIX
AC_F77_FUNC(sgemm$SYMBOLSUFFIX, sgemmsuff)
AC_F77_FUNC(snaupd$SYMBOLSUFFIX, snaupdsuff)
AC_F77_FUNC(sneupd$SYMBOLSUFFIX, sneupdsuff)
AC_F77_FUNC(dnaupd$SYMBOLSUFFIX, dnaupdsuff)
AC_F77_FUNC(dneupd$SYMBOLSUFFIX, dneupdsuff)
AC_F77_FUNC(cheev$SYMBOLSUFFIX, cheevsuff)
dnl Needed for BLAS check and for tests (even when suffix is empty)
CFLAGS="$CFLAGS -Dsgemm=$sgemmsuff -Dsnaupd=$snaupdsuff -Dsneupd=$sneupdsuff -Ddnaupd=$dnaupdsuff -Ddneupd=$dneupdsuff -Dcheev=$cheevsuff"
fi
m4_ifdef([PKG_INSTALLDIR], [PKG_INSTALLDIR], [AC_SUBST([pkgconfigdir], [${libdir}/pkgconfig])])
AC_CONFIG_FILES([arpack$LIBSUFFIX.pc:arpack.pc.in], [], [LIBSUFFIX="$LIBSUFFIX"])
AC_CONFIG_FILES([
SRC/Makefile
UTIL/Makefile
TESTS/Makefile
EXAMPLES/Makefile
EXAMPLES/BAND/Makefile
EXAMPLES/COMPLEX/Makefile
EXAMPLES/NONSYM/Makefile
EXAMPLES/SIMPLE/Makefile
EXAMPLES/SVD/Makefile
EXAMPLES/SYM/Makefile
])
if test x"$enable_icb" != x"no"; then
AC_CONFIG_FILES([ICB/Makefile])
fi
if test x"$enable_icb_exmm" != x"no"; then
AC_CONFIG_FILES([EXAMPLES/MATRIX_MARKET/Makefile])
fi
if test x"$enable_mpi" != x"no"; then
AC_CONFIG_FILES([
PARPACK/Makefile
PARPACK/SRC/MPI/Makefile
PARPACK/SRC/BLACS/Makefile
PARPACK/UTIL/MPI/Makefile
PARPACK/UTIL/BLACS/Makefile
PARPACK/TESTS/MPI/Makefile
PARPACK/EXAMPLES/MPI/Makefile
PARPACK/EXAMPLES/BLACS/Makefile
])
fi
AC_OUTPUT([
Makefile
])
# After AC_OUTPUT (autoconf is done) : generate arpackdef.h (for fortran) from arpackdef.autotools.h.in (for C)
AX_GEN_ARPACKDEF()
AC_MSG_RESULT([
--------------------------------------------------
Configuration summary for $PACKAGE_NAME ($VERSION)
--------------------------------------------------
Installation prefix : $prefix
MPI enabled : $enable_mpi
ICB enabled : $enable_icb
INTERFACE64 : $INTERFACE64
F77 : $F77
FFLAGS : $FFLAGS
FC : $FC
FCFLAGS : $FCFLAGS
CC : $CC
CFLAGS : $CFLAGS
CXX : $CXX
CXXFLAGS : $CXXFLAGS
BLAS : $BLAS_LIBS
LAPACK : $LAPACK_LIBS
EIGEN : $EIGEN3_CFLAGS
LIBS : $LIBS
LDADD : $LDADD
--------------------------------------------------
Configuration OK
--------------------------------------------------
])