Autotools by example

There are lots of tutorials and manuals on autoconf/automake/ libtool outhere that explain the basic usage. However, few articles provide examples and discuss more advanced topics. This document provides some collected examples that show the different features of the “autotools” build system.

Adding options in autoconf

The following lines add the –enable-goodbye option to configure

This gives the user the choice to enter one of the following options:

  • –enable-goodbye
  • –enable-goodbye=yes
  • –enable-goodbye=no

The following should go in configure.ac

AC_MSG_CHECKING([whether we are enabling goodbye])
  AC_ARG_ENABLE(goodbye,
     AC_HELP_STRING([--enable-goodbye], [Say goodbye as well]),
     [if test "${enable_goodbye}" = "yes" ; then
             AC_DEFINE(_WITH_GOODBYE, 1, Say goodbye as well)
             AC_MSG_RESULT([yes])
     else
             AC_DEFINE(_WITH_GOODBYE, 0, Say goodbye as well)
             AC_MSG_RESULT([no])
     fi],
     # Default value for configure
     AC_MSG_RESULT([no])
     )

Assuming your project is using autotools correctly, the above addition in your configure.ac will allow you to test if the user has chosen to enable the “goodbye” option. For that you can test the value of the variable _WITH_GOODBYE as follows :

#ifdef HAVE_CONFIG_H
#include <config.h>
#endif

#include <stdio.h>
#include <unistd.h>

int main()
{
      fprintf (stdout, "Hello World!\n");

#ifdef _WITH_GOODBYE
      sleep (1);
      fprintf (stdout, "Goodbye Cruel World!\n");
#endif

      return (0);
}

Check for IPv6 support

This code in your configure.ac will define the variable IPV6 if your system has everything for compiling and running IPv6 enabled applications.

AC_MSG_CHECKING(for IPv6 support)
AC_CACHE_VAL(ac_cv_ipv6,
      AC_TRY_RUN([
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
      /* Make sure the definitions for AF_INET6 and struct sockaddr_in6
       * are defined, and that we can actually create an IPv6 TCP socket.
       */
      main()
      {
              int fd;
              struct sockaddr_in6 foo;
              fd = socket(AF_INET6, SOCK_STREAM, 0);
              exit(fd >= 0 ? 0 : 1);
      }],
      ac_cv_ipv6=yes,
      ac_cv_ipv6=no,
      ac_cv_ipv6=no))
AC_MSG_RESULT($ac_cv_ipv6)
if test $ac_cv_ipv6 = yes ; then
      AC_DEFINE(IPV6,,"check if system supports IPV6")
fi

Checking libraries

The following will cause the configure script to fail if the function connect is not defined in the library libc

 AC_CHECK_LIB(c,
              connect,[],[
              echo "Socket library is required"
              exit -1 ])

The following will cause the configure script to fail if the function connect is not defined in the library libc nor in the library socket

AC_CHECK_LIB(c,
           connect, [],[
           AC_CHECK_LIB(socket,
                        connect,[],[
                        echo "Socket library is required"
                        exit -1 ]]))

Check for headers

The following in the configure.ac will cause the configure script to fail if any of the required headers is not present in the system.

AC_CHECK_HEADERS([arpa/inet.h fcntl.h limits.h \
                  netdb.h netinet/in.h stddef.h \
                  stdlib.h string.h sys/file.h \
                  sys/ioctl.h sys/param.h sys/socket.h \
                  sys/time.h termios.h unistd.h], 
                  [],[ echo "missing header"
                  exit -1])

External links


More resources




Labels: , , Wireless Internet Security Performance RADIUS server

Discussion

Enter your comment (wiki syntax is allowed):
BTBVL

Wireless Internet Security Performance RADIUS server Wireless Internet Security Performance RADIUS server