Boost logo

Boost :

From: Thomas Porschberg (thomas.porschberg_at_[hidden])
Date: 2006-01-05 12:38:44


Stefan Seefeld <seefeld <at> sympatico.ca> writes:
>
> I typically compile and install boost with the --layout=system
> option, which produces the same directory layout I get with the boost
> rpms. I think AX_PATH_BOOST should recognize that, too.

Yes I see. I updated the macro and post it here again.
Now it looks first for boost in the "system location" (installed
with the --layout=system or via RPMs). If nothing was found, it looks
further in the native boost installation directories and evaluates BOOST_ROOT.
At the end of the macro I set the names for the filesystem and program_options
libraries. If the procedure is accepted I could extend it for the other
boost libraries.
As always improvements are very welcome.

AC_DEFUN([AX_PATH_BOOST],
[
        AC_ARG_WITH([boost],
                        AC_HELP_STRING([--with-boost=DIR],
                                                   [use boost (default is NO) , specify the
root directory for boost library (optional)]), [
                if test "$withval" = "no"; then
                        want_boost="no"
                elif test "$withval" = "yes"; then
                        want_boost="yes"
                        ac_boost_path=""
                else
                        want_boost="yes"
                        ac_boost_path="$withval"
                fi
        ],[want_boost="no"])

        if test "x$want_boost" = "xyes"; then
                boost_lib_version_req=ifelse([$1], ,1.20.0,$1)
                boost_lib_version_req_shorten=`expr $boost_lib_version_req : '\([[0-
9]]*\.[[0-9]]*\)'`
                boost_lib_version_req_major=`expr $boost_lib_version_req : '\([[0-9
]]*\)'`
                boost_lib_version_req_minor=`expr $boost_lib_version_req : '[[0-9]]
*\.\([[0-9]]*\)'`
                boost_lib_version_req_sub_minor=`expr $boost_lib_version_req : '[[0-
9]]*\.[[0-9]]*\.\([[0-9]]*\)'`
                if test "x$boost_lib_version_req_sub_minor" = "x" ; then
                        boost_lib_version_req_sub_minor="0"
            fi
                WANT_BOOST_VERSION=`expr $boost_lib_version_req_major \* 100000 \+
$boost_lib_version_req_minor \* 100 \+ $boost_lib_version_req_sub_minor`
                AC_MSG_CHECKING(for boostlib >= $boost_lib_version_req)
                succeeded=no

                dnl first we check the system location for boost libraries
                dnl this location ist chosen if boost libraries are installed with
the --layout=system option
                dnl or if you install boost with RPM
                if test "$ac_boost_path" != ""; then
                        BOOST_LDFLAGS="-L$ac_boost_path/lib"
                        BOOST_CPPFLAGS="-I$ac_boost_path/include"
                else
                        for ac_boost_path_tmp in /usr /usr/local /opt ; do
                                if test -d "$ac_boost_path_tmp/include/boost" && test -r
"$ac_boost_path_tmp/include/boost"; then
                                        BOOST_LDFLAGS="-L$ac_boost_path_tmp/lib"
                                        BOOST_CPPFLAGS="-I$ac_boost_path_tmp/include"
                                        break;
                                fi
                        done
        
                fi
                CPPFLAGS_SAVED="$CPPFLAGS"
                CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS"
                export CPPFLAGS
                
                LDFLAGS_SAVED="$LDFLAGS"
                LDFLAGS="$LDFLAGS $BOOST_LDFLAGS"
                export LDFLAGS

             AC_TRY_COMPILE(
               [
#include <boost/version.hpp>
],
       [
#if BOOST_VERSION >= $WANT_BOOST_VERSION
// Everything is okay
#else
# error Boost version is too old
#endif

                ],
            [
         AC_MSG_RESULT(yes ($_version))
                 succeeded=yes
                 found_system=yes
         ifelse([$2], , :, [$2])
       ],
       [
       ])

                dnl if we found no boost with system layout we search for boost
libraries
                dnl built and installed without the --layout=system option or for a
staged(not installed) version
                
                if test "x$succeeded" != "xyes"; then
                        _version=0
                        if test "$ac_boost_path" != ""; then
                                BOOST_LDFLAGS="-L$ac_boost_path/lib"
                                if test -d "$ac_boost_path" && test -r "$ac_boost_path";
then
                                        for i in `ls -d $ac_boost_path/include/boost-* 2>/
dev/null`; do
                                                _version_tmp=`echo $i | sed
"s#$ac_boost_path##" | sed 's/\/include\/boost-//' | sed 's/_/./'`
                                                V_CHECK=`expr $_version_tmp \> $_version`
                                                if test "$V_CHECK" = "1" ; then
                                                        _version=$_version_tmp
                                                fi
                                                VERSION_UNDERSCORE=`echo $_version | sed 's/
\./_/'`
                                                BOOST_CPPFLAGS="-I$ac_boost_path/include/
boost-$VERSION_UNDERSCORE"
                                        done
                                fi
                        else
                                for ac_boost_path in /usr /usr/local /opt ; do
                                        if test -d "$ac_boost_path" && test -r
"$ac_boost_path"; then
                                                for i in `ls -d $ac_boost_path/include/
boost-* 2>/dev/null`; do
                                                        _version_tmp=`echo $i | sed
"s#$ac_boost_path##" | sed 's/\/include\/boost-//' | sed 's/_/./'`
                                                        V_CHECK=`expr $_version_tmp \>
$_version`
                                                        if test "$V_CHECK" = "1" ; then
                                                                _version=$_version_tmp
                                                                best_path=$ac_boost_path
                                                        fi
                                                done
                                        fi
                                done

                                VERSION_UNDERSCORE=`echo $_version | sed 's/\./_/'`
                                BOOST_CPPFLAGS="-I$best_path/include/boost-
$VERSION_UNDERSCORE"
                                BOOST_LDFLAGS="-L$best_path/lib"

                            if test "x$BOOST_ROOT" != "x"; then
                                        if test -d "$BOOST_ROOT" && test -r "$BOOST_ROOT";
then
                                                version_dir=`expr //$BOOST_ROOT : '.*/\(.*\)
'`
                                                stage_version=`echo $version_dir | sed 's/
boost_//' | sed 's/_/./g'`
                                                stage_version_shorten=`expr $stage_version :
'\([[0-9]]*\.[[0-9]]*\)'`
                                                V_CHECK=`expr $stage_version_shorten \>\=
$_version`
                                                if test "$V_CHECK" = "1" ; then
                                                        AC_MSG_NOTICE(We will use a staged
boost library from $BOOST_ROOT)
                                                        BOOST_CPPFLAGS="-I$BOOST_ROOT"
                                                        BOOST_LDFLAGS="-L$BOOST_ROOT/stage/
lib"
                                                fi
                                        fi
                            fi
                        fi

                        CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS"
                        export CPPFLAGS
                        LDFLAGS="$LDFLAGS $BOOST_LDFLAGS"
                        export LDFLAGS

                     AC_TRY_COMPILE(
                       [
#include <boost/version.hpp>
],
       [
#if BOOST_VERSION >= $WANT_BOOST_VERSION
// Everything is okay
#else
# error Boost version is too old
#endif

                ],
            [
         AC_MSG_RESULT(yes ($_version))
                 succeeded=yes
         ifelse([$2], , :, [$2])
       ],
       [
         AC_MSG_RESULT(no ($_version))
         ifelse([$3], , :, [$3])
       ])
                fi

                if test "$succeeded" != "yes" ; then
                        if test "$_version" = "0" ; then
                                AC_MSG_ERROR('We could not detect the boost libraries.
                           If you have a staged boost library (still not installed)
                           please specify \$BOOST_ROOT in your environment and do
not
                           give a PATH to --with-boost option')
                        else
                                AC_MSG_ERROR('Your boost libraries seems to old (version
$_version).
                           We need at least $boost_lib_version_shorten')
                        fi
                else
                        AC_MSG_NOTICE(BOOST_CPPFLAGS: $BOOST_CPPFLAGS)
                        AC_MSG_NOTICE(BOOST_LDFLAGS: $BOOST_LDFLAGS)
                        AC_SUBST(BOOST_CPPFLAGS)
                        AC_SUBST(BOOST_LDFLAGS)
                        AC_DEFINE(HAVE_BOOST,,[define if the Boost library is
available])

                        AC_CACHE_CHECK(whether the Boost::Filesystem library is
available,
                                                   ax_cv_boost_filesystem,
                                                [AC_LANG_SAVE
                         AC_LANG_CPLUSPLUS
                         AC_COMPILE_IFELSE(AC_LANG_PROGRAM([[#include <boost/
filesystem/path.hpp>]],
                                   [[using namespace boost::filesystem;
                                   path my_path( "foo/bar/data.txt" );
                                   return 0;]]),
                                                   ax_cv_boost_filesystem=yes,
ax_cv_boost_filesystem=no)
                                                                 AC_LANG_RESTORE
                        ])
                        if test "$ax_cv_boost_filesystem" = "yes"; then
                                AC_DEFINE(HAVE_BOOST_FILE,,[define if the Boost::
FILESYSTEM library is available])
                                if test "x$found_system" = "xyes"; then
                                        ax_lib="boost_filesystem"
                                else
                                        ax_lib="boost_filesystem-$CC"
                                fi
                                AC_MSG_NOTICE(ax_lib=$ax_lib)

                            AC_CHECK_LIB($ax_lib, main, [BOOST_FILESYSTEM_LIB=$ax_lib
AC_SUBST(BOOST_FILESYSTEM_LIB) break],[link_filesystem="no"])
                                if test "x$link_filesystem" = "xno"; then
                                        AC_MSG_NOTICE(Could not link against $ax_lib !)
                                fi
                        fi

                        AC_CACHE_CHECK(whether the Boost::Program_Options library is
available,
                                                   ax_cv_boost_program_options,
                                                [AC_LANG_SAVE
                         AC_LANG_CPLUSPLUS
                         AC_COMPILE_IFELSE(AC_LANG_PROGRAM([[#include <boost/
program_options.hpp>]],
                                   [[boost::program_options::options_description
generic("Generic options");
                                   return 0;]]),
                   ax_cv_boost_program_options=yes,
ax_cv_boost_program_options=no)
                         AC_LANG_RESTORE
                        ])
                        if test "$ax_cv_boost_program_options" = yes; then
                                AC_DEFINE(HAVE_BOOST_PROGRAM_OPTIONS,,[define if the
Boost::PROGRAM_OPTIONS library is available])
                                if test "x$found_system" = "xyes"; then
                                        ax_lib="boost_program_options"
                                else
                                        ax_lib="boost_program_options-$CC"
                                fi
                                AC_MSG_NOTICE(ax_lib=$ax_lib)

                            AC_CHECK_LIB($ax_lib, main,
[BOOST_PROGRAM_OPTIONS_LIB=$ax_lib AC_SUBST(BOOST_PROGRAM_OPTIONS_LIB) break],
[link_program_options="no"])
                                if test "x$link_program_options" = "xno"; then
                                        AC_MSG_NOTICE(Could not link against $ax_lib !)
                                fi
                        fi

                fi
        fi
])


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk