[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: f2c and autotools



Il 13/03/2013 16:01, Mathieu Malaterre ha scritto:
> Hi there,
> 
>   I am trying to work on #702882
> 
>   Upstream is basically doing:
> 
> if test "$internal_f2c" = "no"; then
>   AC_CHECK_LIB([f2c], [f77_alloc_], [],
>      AC_CHECK_LIB([f2c], [f77_alloc], [],
>         AC_CHECK_LIB([f2c], [F77_ALLOC_], [],
>            AC_CHECK_LIB([f2c], [F77_ALLOC], [],
>               [AC_MSG_RESULT(not found, trying to use -lf2c anyway.)]))))
>   LDFLAGS="${LDFLAGS}"
> else  AC_DEFINE([INTERNAL_F2C], [1], [Define to 1 if you use the internal
> F2C library])
> fi
> 
> 
>   As explained in #702882#5, this fails on debian system since one
> cannot link to f2c without first defining a MAIN__ symbol. Has anyone
> work on autotools and f2c issue on debian in the past ? How should one
> use the autotools *F77* macros to handle this case ?

As far as I can see there is no fortran code in the igraph package and as far as I know all the *F77* *FC* macros are useful only to detect proper setup for a specific
fortran compiler.

I do not think the check above is properly done. However to make it pass, you should (see the attached patch):
1) use C compiler in AC_CHECK_LIB (an AC_LANG_POP(C++) was missing)
2) force the AC_CHECK_LIB to create a MAIN__ function instead of main (the -Dmain=MAIN__ flags is used for that)
3) check for a function that is in libf2c (e.g., f_open)
4) use the -Dmain=MAIN__ flags wherever you are issuing checks that involves linking libf2c

This however is only part of the problem: you still have to solve the issue of providing the correct flags/the correct source at compile time.

I do not know what is the best way to deal with this kind of problems in Debian.

Bests,
	Giulio.
--- a/configure.ac
+++ b/configure.ac
@@ -169,7 +169,7 @@
     ])
   ])
 fi
-AC_LANG_PUSH([C++])
+AC_LANG_POP([C++])
 
 tls_support=no
 HAVE_TLS=0
@@ -211,40 +211,57 @@
             [internal_glpk=no],
             [internal_glpk=yes])
 
+F2C_CPPFLAGS=""
 if test "$internal_f2c" = "no"; then
   AC_CHECK_LIB([f2c], [f77_alloc_], [],
      AC_CHECK_LIB([f2c], [f77_alloc], [],
         AC_CHECK_LIB([f2c], [F77_ALLOC_], [],
            AC_CHECK_LIB([f2c], [F77_ALLOC], [],
-	      [AC_MSG_RESULT(not found, trying to use -lf2c anyway.)]))))
+	      [
+
+  CPPFLAGS_TMP="$CPPFLAGS"
+  CPPFLAGS="-Dmain=MAIN__"
+  AC_CHECK_LIB([f2c], [f_open], [],
+	      [AC_MSG_RESULT(not found, trying to use -lf2c anyway.)])
+  CPPFLAGS="$CPPFLAGS_TMP"
+  F2C_CPPFLAGS="-Dmain=MAIN__"
+]))))
   LDFLAGS="${LDFLAGS}"
 else
   AC_DEFINE([INTERNAL_F2C], [1], [Define to 1 if you use the internal F2C library])
 fi
 
 if test "$internal_blas" = "no"; then
+  CPPFLAGS_TMP="$CPPFLAGS"
+  CPPFLAGS="$CPPFLAGS $F2C_CPPFLAGS"
   AC_CHECK_LIB([blas], [daxpy_], [],
      AC_CHECK_LIB([blas], [daxpy], [],
         AC_CHECK_LIB([blas], [DAXPY_], [],
            AC_CHECK_LIB([blas], [DAXPY], [],
 	      [AC_MSG_RESULT(not found, trying to use -lblas anyway.)]))))
   LDFLAGS="${LDFLAGS} -lblas"
+  CPPFLAGS="$CPPFLAGS_TMP"
 else
   AC_DEFINE([INTERNAL_BLAS], [1], [Define to 1 if you use the internal BLAS library])
 fi
 
 if test "$internal_lapack" = "no"; then
+  CPPFLAGS_TMP="$CPPFLAGS"
+  CPPFLAGS="$CPPFLAGS $F2C_CPPFLAGS"
   AC_CHECK_LIB([lapack], [dlarnv_], [],
      AC_CHECK_LIB([lapack], [dlarnv], [],
         AC_CHECK_LIB([lapack], [DLARNV_], [],
            AC_CHECK_LIB([lapack], [DLARNV], [],
 	      [AC_MSG_RESULT(not found, trying to use -llapack anyway.)]))))
   LDFLAGS="${LDFLAGS} -llapack"
+  CPPFLAGS="$CPPFLAGS_TMP"
 else
   AC_DEFINE([INTERNAL_LAPACK], [1], [Define to 1 if you use the internal LAPACK library])
 fi
 
 if test "$internal_arpack" = "no"; then
+  CPPFLAGS_TMP="$CPPFLAGS"
+  CPPFLAGS="$CPPFLAGS $F2C_CPPFLAGS"
   if test "$tls_support" = "yes"; then
     AC_MSG_ERROR([Thread-local storage only supported with internal ARPACK library])
   fi
@@ -254,12 +271,15 @@
            AC_CHECK_LIB([arpack], [DSAUPD], [],
 	      [AC_MSG_RESULT(not found, trying to use -larpack anyway.)]))))
   LDFLAGS="${LDFLAGS} -larpack"
+  CPPFLAGS="$CPPFLAGS_TMP"
 else
   AC_DEFINE([INTERNAL_ARPACK], [1], [Define to 1 if you use the internal ARPACK library])
 fi
 
 glpk_support=no
 if test "$internal_glpk" = "no"; then
+  CPPFLAGS_TMP="$CPPFLAGS"
+  CPPFLAGS="$CPPFLAGS $F2C_CPPFLAGS"
   AC_CHECK_LIB([glpk], [glp_read_mps], [
     AC_CHECK_HEADER([glpk.h], [
       AC_EGREP_CPP(yes, [
@@ -274,6 +294,7 @@
       ])
     ])
   ])
+  CPPFLAGS="$CPPFLAGS_TMP"
 else
   AC_DEFINE([HAVE_GLPK], [1], [Define to 1 if you have the GLPK library])
   AC_DEFINE([INTERNAL_GLPK], [1], [Define to 1 if you use the internal GLPK library])

Reply to: