1dnl -*- Autoconf -*-
2dnl Copyright (C) 2007-2010, 2017 Sam Steingold
3dnl Copyright (C) 2017-2018 Bruno Haible
4dnl This is free software, distributed under the GNU GPL v2+
5
6AC_PREREQ([2.61])
7
8dnl Download location of the newest libffcall release.
9AC_DEFUN([CL_LIBFFCALL_DOWNLOAD_URL],
10  [https://ftp.gnu.org/gnu/libffcall/libffcall-2.1.tar.gz])
11
12AC_DEFUN([CL_FFCALL],[
13  AC_ARG_WITH([ffcall],
14    [AS_HELP_STRING([[--with-ffcall]],[use GNU libffcall (default is YES, if present)])],
15    [cl_use_ffcall=$withval],
16    [cl_use_ffcall=default])
17  if test $cl_use_ffcall != no; then
18    cl_save_CPPFLAGS="$CPPFLAGS"
19    cl_save_LIBS="$LIBS"
20    found_libffcall=
21    dnl First, search for libffcall (installed by libffcall >= 2.0).
22    AC_LIB_LINKFLAGS([ffcall])
23    AC_LIB_APPENDTOVAR([LIBS], [$LIBFFCALL])
24    unset ac_cv_header_avcall_h
25    unset ac_cv_header_callback_h
26    AC_CHECK_HEADERS([avcall.h callback.h])
27    if test "$ac_cv_header_avcall_h" = yes -a "$ac_cv_header_callback_h" = yes; then
28      AC_SEARCH_LIBS([ffcall_get_version])
29      if test "$ac_cv_search_ffcall_get_version" != no; then
30        found_libffcall=yes
31      fi
32    fi
33    if test -z "$found_libffcall"; then
34      CPPFLAGS="$cl_save_CPPFLAGS"
35      LIBS="$cl_save_LIBS"
36      dnl Second, search for libavcall and libcallback (installed by libffcall < 2.0).
37      AC_LIB_FROMPACKAGE([avcall], [libffcall])
38      AC_LIB_FROMPACKAGE([callback], [libffcall])
39      AC_LIB_LINKFLAGS([avcall])
40      AC_LIB_LINKFLAGS([callback])
41      AC_LIB_APPENDTOVAR([LIBS], [$LIBAVCALL])
42      AC_LIB_APPENDTOVAR([LIBS], [$LIBCALLBACK])
43      unset ac_cv_header_avcall_h
44      unset ac_cv_header_callback_h
45      AC_CHECK_HEADERS([avcall.h callback.h])
46      if test "$ac_cv_header_avcall_h" = yes -a "$ac_cv_header_callback_h" = yes; then
47        AC_SEARCH_LIBS([__builtin_avcall])
48        AC_SEARCH_LIBS([trampoline_r_data0])
49        if test "$ac_cv_search___builtin_avcall" != no -a "$ac_cv_search_trampoline_r_data0" != no; then
50          found_libffcall=yes
51        fi
52      fi
53      if test -z "$found_libffcall"; then
54        CPPFLAGS="$cl_save_CPPFLAGS"
55        LIBS="$cl_save_LIBS"
56      fi
57    fi
58    AC_CACHE_CHECK([whether libffcall is installed], [cl_cv_have_ffcall],
59      [if test -n "$found_libffcall"; then
60         cl_cv_have_ffcall=yes
61       else
62         cl_cv_have_ffcall='no, consider installing GNU libffcall'
63       fi
64      ])
65    if test $cl_use_ffcall = yes -a "$cl_cv_have_ffcall" != yes; then
66      if test "$ac_cv_build" = "$ac_cv_host"; then
67        host_arg=""
68      else
69        host_arg=" --host=$ac_cv_host"
70      fi
71      libffcall_url='CL_LIBFFCALL_DOWNLOAD_URL'
72      libffcall_targz=`echo "$libffcall_url" | sed -e 's|^.*/||'`
73      libffcall_dirname=`echo "$libffcall_targz" | sed -e 's|\.tar\.gz$||'`
74      AC_MSG_ERROR([Despite --with-ffcall, LIBFFCALL was not found
75 Either call configure without --with-ffcall or do
76  mkdir prerequisites; cd prerequisites; prefix=\$(pwd)/${ac_cv_host}
77  wget ${libffcall_url}
78  tar xfz ${libffcall_targz}
79  cd ${libffcall_dirname}
80  ./configure$host_arg --prefix=\${prefix} && make && make check && make install
81  cd ../..
82  ./configure --with-libffcall-prefix=\${prefix} ${ac_configure_args}])
83    fi
84  fi
85])
86