1# ===========================================================================
2#       http://www.gnu.org/software/autoconf-archive/ax_boost_base.html
3# ===========================================================================
4#
5# SYNOPSIS
6#
7#   AX_BOOST_BASE([MINIMUM-VERSION], [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND])
8#
9# DESCRIPTION
10#
11#   Test for the Boost C++ libraries of a particular version (or newer)
12#
13#   If no path to the installed boost library is given the macro searchs
14#   under /usr, /usr/local, /opt and /opt/local and evaluates the
15#   $BOOST_ROOT environment variable. Further documentation is available at
16#   <http://randspringer.de/boost/index.html>.
17#
18#   This macro calls:
19#
20#     AC_SUBST(BOOST_CPPFLAGS) / AC_SUBST(BOOST_LDFLAGS)
21#
22#   And sets:
23#
24#     HAVE_BOOST
25#
26# LICENSE
27#
28#   Copyright (c) 2008 Thomas Porschberg <thomas@randspringer.de>
29#   Copyright (c) 2009 Peter Adolphs
30#
31#   Copying and distribution of this file, with or without modification, are
32#   permitted in any medium without royalty provided the copyright notice
33#   and this notice are preserved. This file is offered as-is, without any
34#   warranty.
35
36#serial 20
37
38AC_DEFUN([AX_BOOST_BASE],
39[
40AC_ARG_WITH([boost],
41  [AS_HELP_STRING([--with-boost@<:@=ARG@:>@],
42    [use Boost library from a standard location (ARG=yes),
43     from the specified location (ARG=<path>),
44     or disable it (ARG=no)
45     @<:@ARG=yes@:>@ ])],
46    [
47    if test "$withval" = "no"; then
48        want_boost="no"
49    elif test "$withval" = "yes"; then
50        want_boost="yes"
51        ac_boost_path=""
52    else
53        want_boost="yes"
54        ac_boost_path="$withval"
55    fi
56    ],
57    [want_boost="yes"])
58
59
60AC_ARG_WITH([boost-libdir],
61        AS_HELP_STRING([--with-boost-libdir=LIB_DIR],
62        [Force given directory for boost libraries. Note that this will override library path detection, so use this parameter only if default library detection fails and you know exactly where your boost libraries are located.]),
63        [
64        if test -d "$withval"
65        then
66                ac_boost_lib_path="$withval"
67        else
68                AC_MSG_ERROR(--with-boost-libdir expected directory name)
69        fi
70        ],
71        [ac_boost_lib_path=""]
72)
73
74if test "x$want_boost" = "xyes"; then
75    boost_lib_version_req=ifelse([$1], ,1.20.0,$1)
76    boost_lib_version_req_shorten=`expr $boost_lib_version_req : '\([[0-9]]*\.[[0-9]]*\)'`
77    boost_lib_version_req_major=`expr $boost_lib_version_req : '\([[0-9]]*\)'`
78    boost_lib_version_req_minor=`expr $boost_lib_version_req : '[[0-9]]*\.\([[0-9]]*\)'`
79    boost_lib_version_req_sub_minor=`expr $boost_lib_version_req : '[[0-9]]*\.[[0-9]]*\.\([[0-9]]*\)'`
80    if test "x$boost_lib_version_req_sub_minor" = "x" ; then
81        boost_lib_version_req_sub_minor="0"
82        fi
83    WANT_BOOST_VERSION=`expr $boost_lib_version_req_major \* 100000 \+  $boost_lib_version_req_minor \* 100 \+ $boost_lib_version_req_sub_minor`
84    AC_MSG_CHECKING(for boostlib >= $boost_lib_version_req)
85    succeeded=no
86
87    dnl On 64-bit systems check for system libraries in both lib64 and lib.
88    dnl The former is specified by FHS, but e.g. Debian does not adhere to
89    dnl this (as it rises problems for generic multi-arch support).
90    dnl The last entry in the list is chosen by default when no libraries
91    dnl are found, e.g. when only header-only libraries are installed!
92    libsubdirs="lib"
93    ax_arch=`uname -m`
94    if test $ax_arch = x86_64 -o $ax_arch = ppc64 -o $ax_arch = s390x -o $ax_arch = sparc64; then
95        libsubdirs="lib64 lib lib64"
96    fi
97
98    dnl first we check the system location for boost libraries
99    dnl this location ist chosen if boost libraries are installed with the --layout=system option
100    dnl or if you install boost with RPM
101    if test "$ac_boost_path" != ""; then
102        BOOST_CPPFLAGS="-I$ac_boost_path/include"
103        for ac_boost_path_tmp in $libsubdirs; do
104                if test -d "$ac_boost_path"/"$ac_boost_path_tmp" ; then
105                        BOOST_LDFLAGS="-L$ac_boost_path/$ac_boost_path_tmp"
106                        break
107                fi
108        done
109    elif test "$cross_compiling" != yes; then
110        for ac_boost_path_tmp in /usr /usr/local /opt /opt/local ; do
111            if test -d "$ac_boost_path_tmp/include/boost" && test -r "$ac_boost_path_tmp/include/boost"; then
112                for libsubdir in $libsubdirs ; do
113                    if ls "$ac_boost_path_tmp/$libsubdir/libboost_"* >/dev/null 2>&1 ; then break; fi
114                done
115                BOOST_LDFLAGS="-L$ac_boost_path_tmp/$libsubdir"
116                BOOST_CPPFLAGS="-I$ac_boost_path_tmp/include"
117                break;
118            fi
119        done
120    fi
121
122    dnl overwrite ld flags if we have required special directory with
123    dnl --with-boost-libdir parameter
124    if test "$ac_boost_lib_path" != ""; then
125       BOOST_LDFLAGS="-L$ac_boost_lib_path"
126    fi
127
128    CPPFLAGS_SAVED="$CPPFLAGS"
129    CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS"
130    export CPPFLAGS
131
132    LDFLAGS_SAVED="$LDFLAGS"
133    LDFLAGS="$LDFLAGS $BOOST_LDFLAGS"
134    export LDFLAGS
135
136    AC_REQUIRE([AC_PROG_CXX])
137    AC_LANG_PUSH(C++)
138        AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
139    @%:@include <boost/version.hpp>
140    ]], [[
141    #if BOOST_VERSION >= $WANT_BOOST_VERSION
142    // Everything is okay
143    #else
144    #  error Boost version is too old
145    #endif
146    ]])],[
147        AC_MSG_RESULT(yes)
148    succeeded=yes
149    found_system=yes
150        ],[
151        ])
152    AC_LANG_POP([C++])
153
154
155
156    dnl if we found no boost with system layout we search for boost libraries
157    dnl built and installed without the --layout=system option or for a staged(not installed) version
158    if test "x$succeeded" != "xyes"; then
159        _version=0
160        if test "$ac_boost_path" != ""; then
161            if test -d "$ac_boost_path" && test -r "$ac_boost_path"; then
162                for i in `ls -d $ac_boost_path/include/boost-* 2>/dev/null`; do
163                    _version_tmp=`echo $i | sed "s#$ac_boost_path##" | sed 's/\/include\/boost-//' | sed 's/_/./'`
164                    V_CHECK=`expr $_version_tmp \> $_version`
165                    if test "$V_CHECK" = "1" ; then
166                        _version=$_version_tmp
167                    fi
168                    VERSION_UNDERSCORE=`echo $_version | sed 's/\./_/'`
169                    BOOST_CPPFLAGS="-I$ac_boost_path/include/boost-$VERSION_UNDERSCORE"
170                done
171            fi
172        else
173            if test "$cross_compiling" != yes; then
174                for ac_boost_path in /usr /usr/local /opt /opt/local ; do
175                    if test -d "$ac_boost_path" && test -r "$ac_boost_path"; then
176                        for i in `ls -d $ac_boost_path/include/boost-* 2>/dev/null`; do
177                            _version_tmp=`echo $i | sed "s#$ac_boost_path##" | sed 's/\/include\/boost-//' | sed 's/_/./'`
178                            V_CHECK=`expr $_version_tmp \> $_version`
179                            if test "$V_CHECK" = "1" ; then
180                                _version=$_version_tmp
181                                best_path=$ac_boost_path
182                            fi
183                        done
184                    fi
185                done
186
187                VERSION_UNDERSCORE=`echo $_version | sed 's/\./_/'`
188                BOOST_CPPFLAGS="-I$best_path/include/boost-$VERSION_UNDERSCORE"
189                if test "$ac_boost_lib_path" = ""; then
190                    for libsubdir in $libsubdirs ; do
191                        if ls "$best_path/$libsubdir/libboost_"* >/dev/null 2>&1 ; then break; fi
192                    done
193                    BOOST_LDFLAGS="-L$best_path/$libsubdir"
194                fi
195            fi
196
197            if test "x$BOOST_ROOT" != "x"; then
198                for libsubdir in $libsubdirs ; do
199                    if ls "$BOOST_ROOT/stage/$libsubdir/libboost_"* >/dev/null 2>&1 ; then break; fi
200                done
201                if test -d "$BOOST_ROOT" && test -r "$BOOST_ROOT" && test -d "$BOOST_ROOT/stage/$libsubdir" && test -r "$BOOST_ROOT/stage/$libsubdir"; then
202                    version_dir=`expr //$BOOST_ROOT : '.*/\(.*\)'`
203                    stage_version=`echo $version_dir | sed 's/boost_//' | sed 's/_/./g'`
204                        stage_version_shorten=`expr $stage_version : '\([[0-9]]*\.[[0-9]]*\)'`
205                    V_CHECK=`expr $stage_version_shorten \>\= $_version`
206                    if test "$V_CHECK" = "1" -a "$ac_boost_lib_path" = "" ; then
207                        AC_MSG_NOTICE(We will use a staged boost library from $BOOST_ROOT)
208                        BOOST_CPPFLAGS="-I$BOOST_ROOT"
209                        BOOST_LDFLAGS="-L$BOOST_ROOT/stage/$libsubdir"
210                    fi
211                fi
212            fi
213        fi
214
215        CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS"
216        export CPPFLAGS
217        LDFLAGS="$LDFLAGS $BOOST_LDFLAGS"
218        export LDFLAGS
219
220        AC_LANG_PUSH(C++)
221            AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
222        @%:@include <boost/version.hpp>
223        ]], [[
224        #if BOOST_VERSION >= $WANT_BOOST_VERSION
225        // Everything is okay
226        #else
227        #  error Boost version is too old
228        #endif
229        ]])],[
230            AC_MSG_RESULT(yes)
231        succeeded=yes
232        found_system=yes
233            ],[
234            ])
235        AC_LANG_POP([C++])
236    fi
237
238    if test "$succeeded" != "yes" ; then
239        if test "$_version" = "0" ; then
240            AC_MSG_NOTICE([[We could not detect the boost libraries (version $boost_lib_version_req_shorten or higher). 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.  If you are sure you have boost installed, then check your version number looking in <boost/version.hpp>. See http://randspringer.de/boost for more documentation.]])
241        else
242            AC_MSG_NOTICE([Your boost libraries seems to old (version $_version).])
243        fi
244        # execute ACTION-IF-NOT-FOUND (if present):
245        ifelse([$3], , :, [$3])
246    else
247        AC_SUBST(BOOST_CPPFLAGS)
248        AC_SUBST(BOOST_LDFLAGS)
249        AC_DEFINE(HAVE_BOOST,,[define if the Boost library is available])
250        # execute ACTION-IF-FOUND (if present):
251        ifelse([$2], , :, [$2])
252    fi
253
254    CPPFLAGS="$CPPFLAGS_SAVED"
255    LDFLAGS="$LDFLAGS_SAVED"
256fi
257
258])
259