Node:Autoconf Macros, Next:, Previous:Contributors to GSL, Up:Top



Autoconf Macros

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

     AC_CHECK_LIB(m,main)
     AC_CHECK_LIB(gslcblas,main)
     AC_CHECK_LIB(gsl,main)
     

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

     checking for main in -lm... yes
     checking for main in -lgslcblas... yes
     checking for main in -lgsl... yes
     

If the library is found then the tests will define the macros HAVE_LIBGSL, HAVE_LIBGSLCBLAS, HAVE_LIBM and add the options -lgsl -lgslcblas -lm to the variable 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 gsl.m4 to test for a specific version of the library. To use this macro simply add the following line to your configure.in file instead of the tests above:

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

The argument GSL_VERSION should be the two or three digit MAJOR.MINOR or MAJOR.MINOR.MICRO version number of the release you require. A suitable choice for action-if-not-found is,

     AC_MSG_ERROR(could not find required version of GSL)
     

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

     libfoo_la_LDFLAGS = -lfoo $(GSL_LIBS) -lgslcblas
     

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

To test for inline the following test should be placed in your configure.in file,

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

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

The following autoconf test will check for extern inline,

     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
     

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

     AC_CHECK_FUNCS(hypot)
     

and place the following macro definitions in the file config.h.in,

     /* Substitute gsl_hypot for missing system hypot */
     
     #ifndef HAVE_HYPOT
     #define hypot gsl_hypot
     #endif
     

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