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