@cindex autoconf, using with GSL

For applications using @code{autoconf} the standard macro
@code{AC_CHECK_LIB} can be used to link with GSL automatically
from a @code{configure} script.  The library itself depends on the
presence of a @sc{cblas} and math library as well, so these must also be
located before linking with the main @code{libgsl} file.  The following
commands should be placed in the @file{configure.ac} file to perform
these tests,

@example
AC_CHECK_LIB(m,main)
AC_CHECK_LIB(gslcblas,main)
AC_CHECK_LIB(gsl,main)
@end example

@noindent
It is important to check for @code{libm} and @code{libgslcblas} before
@code{libgsl}, otherwise the tests will fail.  Assuming the libraries
are found the output during the configure stage looks like this,

@example
checking for main in -lm... yes
checking for main in -lgslcblas... yes
checking for main in -lgsl... yes
@end example

@noindent
If the library is found then the tests will define the macros
@code{HAVE_LIBGSL}, @code{HAVE_LIBGSLCBLAS}, @code{HAVE_LIBM} and add
the options @code{-lgsl -lgslcblas -lm} to the variable @code{LIBS}.

The tests above will find any version of the library.  They are suitable
for general use, where the versions of the functions are not important.
An alternative macro is available in the file @file{gsl.m4} to test for
a specific version of the library.  To use this macro simply add the
following line to your @file{configure.in} file instead of the tests
above:

@example
AM_PATH_GSL(GSL_VERSION,
           [action-if-found],
           [action-if-not-found])
@end example

@noindent
The argument @code{GSL_VERSION} should be the two or three digit
@sc{major.minor} or @sc{major.minor.micro} version number of the release
you require. A suitable choice for @code{action-if-not-found} is,

@example
AC_MSG_ERROR(could not find required version of GSL)
@end example

@noindent
Then you can add the variables @code{GSL_LIBS} and @code{GSL_CFLAGS} to
your Makefile.am files to obtain the correct compiler flags.
@code{GSL_LIBS} is equal to the output of the @code{gsl-config --libs}
command and @code{GSL_CFLAGS} is equal to @code{gsl-config --cflags}
command. For example,

@example
libfoo_la_LDFLAGS = -lfoo $(GSL_LIBS) -lgslcblas
@end example

@noindent
Note that the macro @code{AM_PATH_GSL} needs to use the C compiler so it
should appear in the @file{configure.in} file before the macro
@code{AC_LANG_CPLUSPLUS} for programs that use C++.

To test for @code{inline} the following test should be placed in your
@file{configure.in} file,

@example
AC_C_INLINE

if test "$ac_cv_c_inline" != no ; then
  AC_DEFINE(HAVE_INLINE,1)
  AC_SUBST(HAVE_INLINE)
fi
@end example

@noindent
and the macro will then be defined in the compilation flags or by
including the file @file{config.h} before any library headers.  

The following autoconf test will check for @code{extern inline},

@smallexample
dnl Check for "extern inline", using a modified version
dnl of the test for AC_C_INLINE from acspecific.mt
dnl
AC_CACHE_CHECK([for extern inline], ac_cv_c_extern_inline,
[ac_cv_c_extern_inline=no
AC_TRY_COMPILE([extern $ac_cv_c_inline double foo(double x);
extern $ac_cv_c_inline double foo(double x) @{ return x+1.0; @};
double foo (double x) @{ return x + 1.0; @};], 
[  foo(1.0)  ],
[ac_cv_c_extern_inline="yes"])
])

if test "$ac_cv_c_extern_inline" != no ; then
  AC_DEFINE(HAVE_INLINE,1)
  AC_SUBST(HAVE_INLINE)
fi
@end smallexample

The substitution of portability functions can be made automatically if
you use @code{autoconf}. For example, to test whether the BSD function
@code{hypot} is available you can include the following line in the
configure file @file{configure.in} for your application,

@example
AC_CHECK_FUNCS(hypot)
@end example

@noindent
and place the following macro definitions in the file
@file{config.h.in},

@example
/* Substitute gsl_hypot for missing system hypot */

#ifndef HAVE_HYPOT
#define hypot gsl_hypot
#endif
@end example

@noindent
The application source files can then use the include command
@code{#include <config.h>} to substitute @code{gsl_hypot} for each
occurrence of @code{hypot} when @code{hypot} is not available.
