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 26
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=no@:>@ ])],
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="no"])
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    case $ax_arch in
95      x86_64)
96        libsubdirs="lib64 libx32 lib lib64"
97        ;;
98      ppc64|s390x|sparc64|aarch64|ppc64le)
99        libsubdirs="lib64 lib lib64 ppc64le"
100        ;;
101    esac
102
103    dnl allow for real multi-arch paths e.g. /usr/lib/x86_64-linux-gnu. Give
104    dnl them priority over the other paths since, if libs are found there, they
105    dnl are almost assuredly the ones desired.
106    AC_REQUIRE([AC_CANONICAL_HOST])
107    libsubdirs="lib/${host_cpu}-${host_os} $libsubdirs"
108
109    case ${host_cpu} in
110      i?86)
111        libsubdirs="lib/i386-${host_os} $libsubdirs"
112        ;;
113    esac
114
115    dnl first we check the system location for boost libraries
116    dnl this location ist chosen if boost libraries are installed with the --layout=system option
117    dnl or if you install boost with RPM
118    if test "$ac_boost_path" != ""; then
119        BOOST_CPPFLAGS="-I$ac_boost_path/include"
120        for ac_boost_path_tmp in $libsubdirs; do
121                if test -d "$ac_boost_path"/"$ac_boost_path_tmp" ; then
122                        BOOST_LDFLAGS="-L$ac_boost_path/$ac_boost_path_tmp"
123                        break
124                fi
125        done
126    elif test "$cross_compiling" != yes; then
127        for ac_boost_path_tmp in /usr /usr/local /opt /opt/local ; do
128            if test -d "$ac_boost_path_tmp/include/boost" && test -r "$ac_boost_path_tmp/include/boost"; then
129                for libsubdir in $libsubdirs ; do
130                    if ls "$ac_boost_path_tmp/$libsubdir/libboost_"* >/dev/null 2>&1 ; then break; fi
131                done
132                BOOST_LDFLAGS="-L$ac_boost_path_tmp/$libsubdir"
133                BOOST_CPPFLAGS="-I$ac_boost_path_tmp/include"
134                break;
135            fi
136        done
137    fi
138
139    dnl overwrite ld flags if we have required special directory with
140    dnl --with-boost-libdir parameter
141    if test "$ac_boost_lib_path" != ""; then
142       BOOST_LDFLAGS="-L$ac_boost_lib_path"
143    fi
144
145    CPPFLAGS_SAVED="$CPPFLAGS"
146    CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS"
147    export CPPFLAGS
148
149    LDFLAGS_SAVED="$LDFLAGS"
150    LDFLAGS="$LDFLAGS $BOOST_LDFLAGS"
151    export LDFLAGS
152
153    AC_REQUIRE([AC_PROG_CXX])
154    AC_LANG_PUSH(C++)
155        AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
156    @%:@include <boost/version.hpp>
157    ]], [[
158    #if BOOST_VERSION >= $WANT_BOOST_VERSION
159    // Everything is okay
160    #else
161    #  error Boost version is too old
162    #endif
163    ]])],[
164        AC_MSG_RESULT(yes)
165    succeeded=yes
166    found_system=yes
167        ],[
168        ])
169    AC_LANG_POP([C++])
170
171
172
173    dnl if we found no boost with system layout we search for boost libraries
174    dnl built and installed without the --layout=system option or for a staged(not installed) version
175    if test "x$succeeded" != "xyes"; then
176        CPPFLAGS="$CPPFLAGS_SAVED"
177        LDFLAGS="$LDFLAGS_SAVED"
178        BOOST_CPPFLAGS=
179        BOOST_LDFLAGS=
180        _version=0
181        if test "$ac_boost_path" != ""; then
182            if test -d "$ac_boost_path" && test -r "$ac_boost_path"; then
183                for i in `ls -d $ac_boost_path/include/boost-* 2>/dev/null`; do
184                    _version_tmp=`echo $i | sed "s#$ac_boost_path##" | sed 's/\/include\/boost-//' | sed 's/_/./'`
185                    V_CHECK=`expr $_version_tmp \> $_version`
186                    if test "$V_CHECK" = "1" ; then
187                        _version=$_version_tmp
188                    fi
189                    VERSION_UNDERSCORE=`echo $_version | sed 's/\./_/'`
190                    BOOST_CPPFLAGS="-I$ac_boost_path/include/boost-$VERSION_UNDERSCORE"
191                done
192                dnl if nothing found search for layout used in Windows distributions
193                if test -z "$BOOST_CPPFLAGS"; then
194                    if test -d "$ac_boost_path/boost" && test -r "$ac_boost_path/boost"; then
195                        BOOST_CPPFLAGS="-I$ac_boost_path"
196                    fi
197                fi
198            fi
199        else
200            if test "$cross_compiling" != yes; then
201                for ac_boost_path in /usr /usr/local /opt /opt/local ; do
202                    if test -d "$ac_boost_path" && test -r "$ac_boost_path"; then
203                        for i in `ls -d $ac_boost_path/include/boost-* 2>/dev/null`; do
204                            _version_tmp=`echo $i | sed "s#$ac_boost_path##" | sed 's/\/include\/boost-//' | sed 's/_/./'`
205                            V_CHECK=`expr $_version_tmp \> $_version`
206                            if test "$V_CHECK" = "1" ; then
207                                _version=$_version_tmp
208                                best_path=$ac_boost_path
209                            fi
210                        done
211                    fi
212                done
213
214                VERSION_UNDERSCORE=`echo $_version | sed 's/\./_/'`
215                BOOST_CPPFLAGS="-I$best_path/include/boost-$VERSION_UNDERSCORE"
216                if test "$ac_boost_lib_path" = ""; then
217                    for libsubdir in $libsubdirs ; do
218                        if ls "$best_path/$libsubdir/libboost_"* >/dev/null 2>&1 ; then break; fi
219                    done
220                    BOOST_LDFLAGS="-L$best_path/$libsubdir"
221                fi
222            fi
223
224            if test "x$BOOST_ROOT" != "x"; then
225                for libsubdir in $libsubdirs ; do
226                    if ls "$BOOST_ROOT/stage/$libsubdir/libboost_"* >/dev/null 2>&1 ; then break; fi
227                done
228                if test -d "$BOOST_ROOT" && test -r "$BOOST_ROOT" && test -d "$BOOST_ROOT/stage/$libsubdir" && test -r "$BOOST_ROOT/stage/$libsubdir"; then
229                    version_dir=`expr //$BOOST_ROOT : '.*/\(.*\)'`
230                    stage_version=`echo $version_dir | sed 's/boost_//' | sed 's/_/./g'`
231                        stage_version_shorten=`expr $stage_version : '\([[0-9]]*\.[[0-9]]*\)'`
232                    V_CHECK=`expr $stage_version_shorten \>\= $_version`
233                    if test "$V_CHECK" = "1" -a "$ac_boost_lib_path" = "" ; then
234                        AC_MSG_NOTICE(We will use a staged boost library from $BOOST_ROOT)
235                        BOOST_CPPFLAGS="-I$BOOST_ROOT"
236                        BOOST_LDFLAGS="-L$BOOST_ROOT/stage/$libsubdir"
237                    fi
238                fi
239            fi
240        fi
241
242        CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS"
243        export CPPFLAGS
244        LDFLAGS="$LDFLAGS $BOOST_LDFLAGS"
245        export LDFLAGS
246
247        AC_LANG_PUSH(C++)
248            AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
249        @%:@include <boost/version.hpp>
250        ]], [[
251        #if BOOST_VERSION >= $WANT_BOOST_VERSION
252        // Everything is okay
253        #else
254        #  error Boost version is too old
255        #endif
256        ]])],[
257            AC_MSG_RESULT(yes)
258        succeeded=yes
259        found_system=yes
260            ],[
261            ])
262        AC_LANG_POP([C++])
263    fi
264
265    if test "$succeeded" != "yes" ; then
266        if test "$_version" = "0" ; then
267            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.]])
268        else
269            AC_MSG_NOTICE([Your boost libraries seems to old (version $_version).])
270        fi
271        # execute ACTION-IF-NOT-FOUND (if present):
272        ifelse([$3], , :, [$3])
273    else
274        AC_SUBST(BOOST_CPPFLAGS)
275        AC_SUBST(BOOST_LDFLAGS)
276        AC_DEFINE(HAVE_BOOST,,[define if the Boost library is available])
277        # execute ACTION-IF-FOUND (if present):
278        ifelse([$2], , :, [$2])
279    fi
280
281    CPPFLAGS="$CPPFLAGS_SAVED"
282    LDFLAGS="$LDFLAGS_SAVED"
283fi
284
285])
286