diff --git a/acinclude.m4 b/acinclude.m4 index 3e1b24d287..9d23dca2c0 100644 --- a/acinclude.m4 +++ b/acinclude.m4 @@ -128,6 +128,56 @@ define(FAST_VROUNDPD_PATTERN, [[znver[2-4]* | sandybridge* | ivybridge*]]) + +dnl FLINT_SET_LIBFLAGS(lib,lib-path,include-path,[library_alias]) +dnl ----------------------- +dnl Sets lib_LDFLAGS and lib_CPPFLAGS to include and link library. +dnl If pkg-config is available, lib_CFLAGS, lib_LIBS, lib_libdir, +dnl lib_includedir are also set and also sets lib_LIBS with the appropriate +dnl `-l' flag(s). Else, straight up use lib-path and include-path. + +AC_DEFUN([FLINT_SET_LIBFLAGS], +[tmpalias=m4_default([$4],[$1]) + +if test "x$PKG_CONFIG" != "x"; +then + if test "x$2" != "x"; + then + withpath="--with-path=$2" + fi + + # libdir + tmp=`$PKG_CONFIG --variable=libdir $withpath $1` dnl ' Fix Vim syntax + eval "${tmpalias}_libdir=\"\${tmp}\"" + + # includedir + tmp=`$PKG_CONFIG --variable=includedir $withpath $1` dnl ' Fix Vim syntax + eval "${tmpalias}_includedir=\"\${tmp}\"" + + # LIBS + tmp=`$PKG_CONFIG --libs-only-l $withpath $1` dnl ' Fix Vim syntax + eval "${tmpalias}_LIBS=\"\${tmp}\"" + + # LDFLAGS + tmp=`$PKG_CONFIG --libs-only-L $withpath $1` dnl ' Fix Vim syntax + eval "${tmpalias}_LDFLAGS=\"\${tmp}\"" + + # CPPFLAGS + tmp=`$PKG_CONFIG --cflags-only-other $withpath $1 | sed -n 's/\(-D\w\+\)\(\|=\w\+\)/\n\1\2\n/gp' | sed -n '/^-D/p'` dnl ' Fix Vim syntax + tmp="`$PKG_CONFIG --cflags-only-I $withpath $1` $tmp" dnl ' Fix Vim syntax + eval "${tmpalias}_CPPFLAGS=\"\${tmp}\"" + + # CFLAGS + tmp=`$PKG_CONFIG --cflags-only-other $withpath $1 | sed 's/\(-D\w\+\)\(\|=\w\+\)//g' | sed 's/ / /g'` dnl ' Fix Vim syntax + eval "${tmpalias}_CFLAGS=\"\${tmp}\"" +else + eval "${tmpalias}_LDFLAGS=\"-L\${2}\"" + eval "${tmpalias}_CPPFLAGS=\"-I\${3}\"" +fi +]) + + + dnl FLINT_CC_IS_GCC([action-if-true],[action-if-false]) dnl ----------------------- dnl Checks if compiler is GCC. diff --git a/configure.ac b/configure.ac index 65720e0f64..1afa2c6d79 100644 --- a/configure.ac +++ b/configure.ac @@ -148,6 +148,20 @@ then CXXFLAGS= fi +################################################################################ +# programs +################################################################################ + +dnl NOTE: The following line is invoked from LT_INIT +dnl AC_PROG_CC + +AC_PROG_MKDIR_P +AC_PATH_PROGS(PKG_CONFIG, [pkg-config pkgconf], []) +AC_ARG_VAR([PKG_CONFIG], [path to pkg-config or pkgconf]) + +FLINT_CC_IS_GCC +FLINT_CC_IS_CLANG + ################################################################################ # build system ################################################################################ @@ -336,19 +350,19 @@ esac], enable_fast_build="no") ################################################################################ -# packages +# library dependencies ################################################################################ +library_dependencies="gmp mpfr blas gc ntl" + AC_ARG_WITH(gmp_include, [AS_HELP_STRING([--with-gmp-include=DIR],[GMP include directory])], -CPPFLAGS="$CPPFLAGS -I$withval" -gmp_include_path="$withval" +gmp_includedir="$withval" ) AC_ARG_WITH(gmp_lib, [AS_HELP_STRING([--with-gmp-lib=DIR],[GMP library directory])], -LDFLAGS="$LDFLAGS -L$withval" -gmp_lib_path="$withval" +gmp_libdir="$withval" ) AC_ARG_WITH(gmp, @@ -359,12 +373,10 @@ then elif test "$with_gmp" = "yes"; then : -elif test -z "$gmp_include_path" && test -z "$gmp_lib_path"; +elif test -z "$gmp_includedir" && test -z "$gmp_libdir"; then - CPPFLAGS="$CPPFLAGS -I$withval/include" - LDFLAGS="$LDFLAGS -L$withval/lib" - gmp_include_path="$withval/include" - gmp_lib_path="$withval/lib" + gmp_includedir="$withval/include" + gmp_libdir="$withval/lib" with_gmp="yes" else AC_MSG_FAILURE([Cannot use --with-gmp along with --with-gmp-include or --with-gmp-lib.]) @@ -374,14 +386,12 @@ with_gmp="yes" AC_ARG_WITH(mpfr_include, [AS_HELP_STRING([--with-mpfr-include=DIR],[MPFR include directory])], -CPPFLAGS="$CPPFLAGS -I$withval" -mpfr_include_path="$withval" +mpfr_includedir="$withval" ) AC_ARG_WITH(mpfr_lib, [AS_HELP_STRING([--with-mpfr-lib=DIR],[MPFR library directory])], -LDFLAGS="$LDFLAGS -L$withval" -mpfr_lib_path="$withval" +mpfr_libdir="$withval" ) AC_ARG_WITH(mpfr, @@ -392,12 +402,10 @@ then elif test "$with_mpfr" = "yes"; then : -elif test -z "$mpfr_include_path" && test -z "$mpfr_lib_path"; +elif test -z "$mpfr_includedir" && test -z "$mpfr_libdir"; then - CPPFLAGS="$CPPFLAGS -I$withval/include" - LDFLAGS="$LDFLAGS -L$withval/lib" - mpfr_include_path="$withval/include" - mpfr_lib_path="$withval/lib" + mpfr_includedir="$withval/include" + mpfr_libdir="$withval/lib" with_mpfr="yes" else AC_MSG_FAILURE([Cannot use --with-mpfr along with --with-mpfr-include or --with-mpfr-lib.]) @@ -407,14 +415,12 @@ with_mpfr="yes" AC_ARG_WITH(blas_include, [AS_HELP_STRING([--with-blas-include=DIR],[Use BLAS and specify its include directory])], -CPPFLAGS="$CPPFLAGS -I$withval" -blas_include_path="$withval" +blas_includedir="$withval" ) AC_ARG_WITH(blas_lib, [AS_HELP_STRING([--with-blas-lib=DIR],[Use BLAS and specify its library directory])], -LDFLAGS="$LDFLAGS -L$withval" -blas_lib_path="$withval" +blas_libdir="$withval" ) AC_ARG_WITH(blas, @@ -424,16 +430,14 @@ then : elif test "$with_blas" = "no"; then - if test -n "$blas_include_path" || test -n "$blas_lib_path"; + if test -n "$blas_includedir" || test -n "$blas_libdir"; then AC_MSG_FAILURE([--with-blas-include or --with-blas-lib was specified but --with-blas=no.]) fi -elif test -z "$blas_include_path" && test -z "$blas_lib_path"; +elif test -z "$blas_includedir" && test -z "$blas_libdir"; then - CPPFLAGS="$CPPFLAGS -I$withval/include" - LDFLAGS="$LDFLAGS -L$withval/lib" - blas_include_path="$withval/include" - blas_lib_path="$withval/lib" + blas_includedir="$withval/include" + blas_libdir="$withval/lib" with_blas="yes" else AC_MSG_FAILURE([Cannot use --with-blas along with --with-blas-include or --with-blas-lib.]) @@ -441,22 +445,20 @@ fi, with_blas="no" ) -if test "$with_blas" != "no" || test -n "$blas_include_path" || test -n "$blas_lib_path"; +if test "$with_blas" != "no" || test -n "$blas_includedir" || test -n "$blas_libdir"; then with_blas="yes" fi AC_ARG_WITH(gc_include, [AS_HELP_STRING([--with-gc-include=DIR],[Use GC and specify its include directory])], -CPPFLAGS="$CPPFLAGS -I$withval" -gc_include_path="$withval", +gc_includedir="$withval", with_gc_include="no" ) AC_ARG_WITH(gc_lib, [AS_HELP_STRING([--with-gc-lib=DIR],[Use GC and specify its library directory])], -LDFLAGS="$LDFLAGS -L$withval" -gc_lib_path="$withval", +gc_libdir="$withval", with_gc_lib="no" ) @@ -467,16 +469,14 @@ then : elif test "$with_gc" = "no"; then - if test -n "$gc_include_path" || test -n "$gc_lib_path"; + if test -n "$gc_includedir" || test -n "$gc_libdir"; then AC_MSG_FAILURE([--with-gc-include or --with-gc-lib was specified but --with-gc=no.]) fi -elif test -z "$gc_include_path" && test -z "$gc_lib_path"; +elif test -z "$gc_includedir" && test -z "$gc_libdir"; then - CPPFLAGS="$CPPFLAGS -I$withval/include" - LDFLAGS="$LDFLAGS -L$withval/lib" - gc_include_path="$withval/include" - gc_lib_path="$withval/lib" + gc_includedir="$withval/include" + gc_libdir="$withval/lib" with_gc="yes" else AC_MSG_FAILURE([Cannot use --with-gc along with --with-gc-include or --with-gc-lib.]) @@ -484,21 +484,19 @@ fi, with_gc="no" ) -if test "$with_gc" != "no" || test -n "$gc_include_path" || test -n "$gc_lib_path"; +if test "$with_gc" != "no" || test -n "$gc_includedir" || test -n "$gc_libdir"; then with_gc="yes" fi AC_ARG_WITH(ntl_include, [AS_HELP_STRING([--with-ntl-include=DIR],[Use NTL (in tests) and specify its include directory])], -CPPFLAGS="$CPPFLAGS -I$withval" -ntl_include_path="$withval" +ntl_includedir="$withval" ) AC_ARG_WITH(ntl_lib, [AS_HELP_STRING([--with-ntl-lib=DIR],[Use NTL (in tests) and specify its library directory])], -LDFLAGS="$LDFLAGS -L$withval" -ntl_lib_path="$withval" +ntl_libdir="$withval" ) AC_ARG_WITH(ntl, @@ -508,16 +506,14 @@ then : elif test "$with_ntl" = "no"; then - if test -n "$ntl_include_path" || test -n "$ntl_lib_path"; + if test -n "$ntl_includedir" || test -n "$ntl_libdir"; then AC_MSG_FAILURE([--with-ntl-include or --with-ntl-lib was specified but --with-ntl=no.]) fi -elif test -z "$ntl_include_path" && test -z "$ntl_lib_path"; +elif test -z "$ntl_includedir" && test -z "$ntl_libdir"; then - CPPFLAGS="$CPPFLAGS -I$withval/include" - LDFLAGS="$LDFLAGS -L$withval/lib" - ntl_include_path="$withval/include" - ntl_lib_path="$withval/lib" + ntl_includedir="$withval/include" + ntl_libdir="$withval/lib" with_ntl="yes" else AC_MSG_FAILURE([Cannot use --with-ntl along with --with-ntl-include or --with-ntl-lib.]) @@ -525,11 +521,43 @@ fi, with_ntl="no" ) -if test "$with_ntl" != "no" || test -n "$ntl_include_path" || test -n "$ntl_lib_path"; +if test "$with_ntl" != "no" || test -n "$ntl_includedir" || test -n "$ntl_libdir"; then with_ntl="yes" fi +################################################################################ +# library specific flags +################################################################################ + +# FIXME: Not the prettiest solution for BLAS + +for lib in library_dependencies; +do + eval "with_lib=\"\${with_${lib}}\"" + eval "libdir=\"\${${lib}_libdir}\"" + eval "includedir=\"\${${lib}_includedir}\"" + + if test "$lib" = "blas"; + then + if test "$with_lib" = yes; + then + FLINT_SET_LIBFLAGS([cblas],[$libdir],[$includedir],[blas]) + fi + else + if test "$with_lib" = yes; + then + FLINT_SET_LIBFLAGS([$lib],[$libdir],[$includedir]) + fi + fi +done + +# It may be the case that the user does not have CBLAS but has OpenBLAS. +if test "$with_blas" = "yes" && test "x$PKG_CONFIG" != "x" && test "x$blas_LIB" = "x"; +then + FLINT_SET_LIBFLAGS([openblas],[$blas_libdir],[$blas_includedir],[blas]) +fi + ################################################################################ # architecture specifics ################################################################################ @@ -822,18 +850,6 @@ Please report at ]) esac -################################################################################ -# programs -################################################################################ - -dnl NOTE: The following line is invoked from LT_INIT -dnl AC_PROG_CC - -AC_PROG_MKDIR_P - -FLINT_CC_IS_GCC -FLINT_CC_IS_CLANG - ################################################################################ # environment variables ################################################################################ @@ -1028,9 +1044,11 @@ then fi ################################################################################ -# check libraries +# check libraries, set LIBS ################################################################################ +# PUSH CFLAGS +# # With certain CFLAGS, the compiler may return an error, thinking that the # compiler has not found the function in the library. save_CFLAGS="$CFLAGS" @@ -1133,7 +1151,7 @@ then ) fi -if test "$with_blas" = "yes"; +if test "$with_blas" = "yes" && test "x$blas_LIBS" = "x"; then AC_SEARCH_LIBS([cblas_dgemm],[cblas openblas blas],[], [AC_MSG_ERROR([BLAS library was not found. If you indeed have BLAS installed, please @@ -1142,13 +1160,22 @@ that we can either fix the issue or give a more proper error message.])] ) fi -if test "$with_ntl" = "yes"; +if test "$with_ntl" = "yes" && test "x$ntl_LIBS" = "x"; then FLINT_CHECK_NTL(,[AC_MSG_ERROR([NTL library was not found. If you indeed have NTL installed, please submit a bug report to so that we can either fix the issue or give a more proper error message.])]) fi +for lib in $library_dependencies; +do + eval "tmp=\"\${${lib}_LIBS}\"" # " Just to fix highlighting + LIBS="$LIBS $tmp" +done + +# Trim flags +LIBS=`echo "$LIBS" | tr ' ' '\n' | sort | uniq | xargs` + ################################################################################ # check settings and environment ################################################################################ @@ -1182,7 +1209,7 @@ operating system.])]) AC_CHECK_FUNCS([aligned_alloc _aligned_malloc]) ################################################################################ -# CFLAGS +# CFLAGS, CPPFLAGS and LDFLAGS ################################################################################ if test "$flint_cv_cc_is_clang" = "yes"; @@ -1192,6 +1219,21 @@ then [CFLAGS="-Werror=unknown-warning-option"]) fi +for lib in $library_dependencies; +do + eval "tmp=\"\${${lib}_CFLAGS}\"" # " Just to fix highlighting + for flag in $tmp; + do + AX_CHECK_COMPILE_FLAG([$flag],[save_CFLAGS="$flag $save_CFLAGS"]) + done + + eval "tmp=\"\${${lib}_CPPFLAGS}\"" # " Just to fix highlighting + CPPFLAGS="$CPPFLAGS $tmp" + + eval "tmp=\"\${${lib}_LDFLAGS}\"" # " Just to fix highlighting + LDFLAGS="$LDFLAGS $tmp" +done + if test "$enable_coverage" = "yes"; then AX_CHECK_COMPILE_FLAG([--coverage], @@ -1283,13 +1325,20 @@ then else AC_SUBST(UNROLL_LOOPS,0) fi + # POP CFLAGS CFLAGS="$save_CFLAGS" else + # POP CFLAGS CFLAGS="$save_CFLAGS" AX_CHECK_COMPILE_FLAG([$CFLAGS],[],AC_MSG_ERROR(["Couldn't compile with given CFLAGS!"])) AC_SUBST(UNROLL_LOOPS,0) fi +# Trim flags +LDFLAGS=`echo "$LDFLAGS" | tr ' ' '\n' | sort | uniq | xargs` +CFLAGS=`echo "$CFLAGS" | tr ' ' '\n' | sort | uniq | xargs` +CPPFLAGS=`echo "$CPPFLAGS" | tr ' ' '\n' | sort | uniq | xargs` + if test "$testcflags_set" = "no"; then TESTCFLAGS="$CFLAGS" @@ -1417,11 +1466,11 @@ AC_SUBST(FLINT_MAJOR_SO) AC_SUBST(FLINT_MINOR_SO) AC_SUBST(FLINT_PATCH_SO) -AC_SUBST(GMP_LIB_PATH,$gmp_lib_path) -AC_SUBST(MPFR_LIB_PATH,$mpfr_lib_path) -AC_SUBST(BLAS_LIB_PATH,$blas_lib_path) -AC_SUBST(GC_LIB_PATH,$gc_lib_path) -AC_SUBST(NTL_LIB_PATH,$ntl_lib_path) +AC_SUBST(GMP_LIB_PATH,$gmp_libdir) +AC_SUBST(MPFR_LIB_PATH,$mpfr_libdir) +AC_SUBST(BLAS_LIB_PATH,$blas_libdir) +AC_SUBST(GC_LIB_PATH,$gc_libdir) +AC_SUBST(NTL_LIB_PATH,$ntl_libdir) AC_SUBST(LIB_CPPFLAGS,["-DFLINT_NOSTDIO -DFLINT_NOSTDARG"])