1AC_DEFUN([AC_CHECK_ABINIT],
2[
3  AC_MSG_CHECKING([for Abinit support])
4  AC_ARG_WITH([abinit],
5            [AS_HELP_STRING([--with-abinit=ARG],[ABINIT directory (with include and lib subdirs)])],
6            [AB_PATH=$withval],
7            [AB_PATH="no"])
8
9  AC_ARG_WITH([abinit_include],
10            [AS_HELP_STRING([--with-abinit-include=ARG],[specific ABINIT include directory])],
11            [AB_PATH_INC=$withval],
12            [AB_PATH_INC=""])
13
14  AC_ARG_WITH([abinit_libdir],
15            [AS_HELP_STRING([--with-abinit-libdir=ARG],[specific ABINIT library directory])],
16            [AB_PATH_LIBDIR=$withval],
17            [AB_PATH_LIBDIR=""])
18  AC_MSG_RESULT($AB_PATH)
19
20  dnl In case ABINIT is demanded, we test Lapack first.
21  if test "z$AB_PATH" != "zno" ; then
22    AC_REQUIRE([ACX_LAPACK])
23    if test x"$acx_lapack_ok" = xno; then
24      AC_WARN([ABINIT support has been disabled since Lapack is not available.])
25      AB_PATH="no"
26    fi
27  fi
28  dnl We also test ETSF_IO
29  if test "z$AB_PATH" != "zno" ; then
30
31    AC_REQUIRE([AC_CHECK_ETSF_IO])
32    if test x"$ac_etsf_io_ok" = xno; then
33      AC_WARN([ABINIT support may not compile since ETSF_IO is not available.])
34    fi
35  fi
36  dnl We also test LibXC
37  if test "z$AB_PATH" != "zno" ; then
38
39    AC_REQUIRE([AC_CHECK_LIBXC])
40    if test x"$ac_libxc_ok" = xno; then
41      AC_WARN([ABINIT support may not compile since LibXC is not available.])
42    fi
43  fi
44
45  if test "z$AB_PATH" != "zno" ; then
46    AS_IF([test "z$AB_PATH" = "zyes"],[AB_PATH="/opt/etsf/abinit"])
47    AS_IF([test "z$AB_PATH_LIBDIR" = "z"],[AB_PATH_LIBDIR="$AB_PATH/lib"])
48    AS_IF([test "z$AB_PATH_INC" = "z"],[AB_PATH_INC="$AB_PATH/include"])
49
50    dnl First thing is to test the header files.
51    CPPFLAGS_SVG=$CPPFLAGS
52    CPPFLAGS="$CPPFLAGS -I$AB_PATH_INC"
53    AC_CHECK_HEADER([ab6_invars.h],
54                    [ac_abinit_parser_header="ab6_invars.h"],
55                    [ac_abinit_parser_header="no"])
56    if test $ac_abinit_parser_header = "no" ; then
57      AC_CHECK_HEADER([ab7_invars.h],
58                      [ac_abinit_parser_header="ab7_invars.h"],
59                      [ac_abinit_parser_header="no"])
60    fi
61    CPPFLAGS=$CPPFLAGS_SVG
62
63    dnl Try to guess the lib name.
64    AB_LIBRARY="abinis"
65    AB_LIBRARY_VERSION=6
66    if test -f $AB_PATH_LIBDIR/libabinit6.a ; then
67      AB_LIBRARY="abinit6"
68    fi
69    if test -f $AB_PATH_LIBDIR/libabinit7.a ; then
70      AB_LIBRARY="abinit7"
71      AB_LIBRARY_VERSION=7
72    fi
73
74    dnl Try to find the missing dependencies in libabinis.a.
75    AC_FC_WRAPPERS()
76    AC_FC_FUNC([wrtout])
77    AC_FC_FUNC([leave_new])
78    AC_FC_FUNC([timab])
79    AC_FC_FUNC([psp_from_data])
80
81    AC_LANG_PUSH([C])
82
83    LIBS_SVG=$LIBS
84    LIBS="$LIBS_SVG -L$AB_PATH_LIBDIR -l$AB_LIBRARY $ETSF_IO_LIBS $LIBXC_LIBS $LAPACK_LIBS $BLAS_LIBS $FCLIBS"
85    CFLAGS_SVG=$CFLAGS
86    CFLAGS="$CFLAGS -Wno-error"
87
88    dnl Look for the parser in libabinis.
89    AC_MSG_CHECKING([for parser capabilities in lib$AB_LIBRARY.a from $AB_PATH_LIBDIR])
90    AC_LINK_IFELSE([AC_LANG_SOURCE([
91void $wrtout()
92{
93}
94void $leave_new()
95{
96}
97void $timab()
98{
99}
100void $psp_from_data()
101{
102}
103int main(int argc, const char **argv)
104{
105  ab${AB_LIBRARY_VERSION}_invars_new_from_file();
106  return 0;
107}
108])], [ac_abinit_parser_ok=yes], [ac_abinit_parser_ok=no])
109    AC_MSG_RESULT([$ac_abinit_parser_ok])
110
111    dnl Look for specific functions in the parser routines.
112    if test $ac_abinit_parser_ok = "yes" ; then
113        AC_MSG_CHECKING([for invars.new_from_file_with_pseudo() routine in lib$AB_LIBRARY.a])
114        AC_LINK_IFELSE([AC_LANG_SOURCE([
115            void $wrtout()
116            {
117            }
118            void $leave_new()
119            {
120            }
121            void $timab()
122            {
123            }
124            void $psp_from_data()
125            {
126            }
127            int main(int argc, const char **argv)
128            {
129              ab${AB_LIBRARY_VERSION}_invars_new_from_file_with_pseudo();
130                return 0;
131            }
132            ])], [ac_abinit_invars_has_new_with_pseudo=yes],
133               [ac_abinit_invars_has_new_with_pseudo=no])
134        AC_MSG_RESULT([$ac_abinit_invars_has_new_with_pseudo])
135        AC_DEFINE([HAVE_NEW_WITH_PSEUDO], [], [If set, we can call ab_invars_new_from_file_with_pseudo()])
136    fi
137
138    LIBS=$LIBS_SVG
139    CFLAGS=$CFLAGS_SVG
140
141    AC_LANG_POP([C])
142
143    AS_IF([test "z$ac_abinit_parser_header" != "zno" -a "z$ac_abinit_parser_ok" = "zyes"],
144          [ac_abinit_parser=yes],
145          [ac_abinit_parser=no])
146    AS_IF([test "z$ac_abinit_parser" = "zyes"],
147          [AB_LIBS="-L$AB_PATH_LIBDIR -l$AB_LIBRARY $LIBXC_LIBS $ETSF_IO_LIBS $LAPACK_LIBS $BLAS_LIBS";
148           AB_CPPFLAGS="-I$AB_PATH_INC"],
149          [])
150
151    dnl For buit-in symmetry routines.
152    ABI_FC_MODULE_MANGLING()
153    ac_abinit=yes
154  else
155    ac_abinit=no
156  fi
157])
158