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 25
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)
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        _version=0
177        if test "$ac_boost_path" != ""; then
178            if test -d "$ac_boost_path" && test -r "$ac_boost_path"; then
179                for i in `ls -d $ac_boost_path/include/boost-* 2>/dev/null`; do
180                    _version_tmp=`echo $i | sed "s#$ac_boost_path##" | sed 's/\/include\/boost-//' | sed 's/_/./'`
181                    V_CHECK=`expr $_version_tmp \> $_version`
182                    if test "$V_CHECK" = "1" ; then
183                        _version=$_version_tmp
184                    fi
185                    VERSION_UNDERSCORE=`echo $_version | sed 's/\./_/'`
186                    BOOST_CPPFLAGS="-I$ac_boost_path/include/boost-$VERSION_UNDERSCORE"
187                done
188            fi
189        else
190            if test "$cross_compiling" != yes; then
191                for ac_boost_path in /usr /usr/local /opt /opt/local ; do
192                    if test -d "$ac_boost_path" && test -r "$ac_boost_path"; then
193                        for i in `ls -d $ac_boost_path/include/boost-* 2>/dev/null`; do
194                            _version_tmp=`echo $i | sed "s#$ac_boost_path##" | sed 's/\/include\/boost-//' | sed 's/_/./'`
195                            V_CHECK=`expr $_version_tmp \> $_version`
196                            if test "$V_CHECK" = "1" ; then
197                                _version=$_version_tmp
198                                best_path=$ac_boost_path
199                            fi
200                        done
201                    fi
202                done
203
204                VERSION_UNDERSCORE=`echo $_version | sed 's/\./_/'`
205                BOOST_CPPFLAGS="-I$best_path/include/boost-$VERSION_UNDERSCORE"
206                if test "$ac_boost_lib_path" = ""; then
207                    for libsubdir in $libsubdirs ; do
208                        if ls "$best_path/$libsubdir/libboost_"* >/dev/null 2>&1 ; then break; fi
209                    done
210                    BOOST_LDFLAGS="-L$best_path/$libsubdir"
211                fi
212            fi
213
214            if test "x$BOOST_ROOT" != "x"; then
215                for libsubdir in $libsubdirs ; do
216                    if ls "$BOOST_ROOT/stage/$libsubdir/libboost_"* >/dev/null 2>&1 ; then break; fi
217                done
218                if test -d "$BOOST_ROOT" && test -r "$BOOST_ROOT" && test -d "$BOOST_ROOT/stage/$libsubdir" && test -r "$BOOST_ROOT/stage/$libsubdir"; then
219                    version_dir=`expr //$BOOST_ROOT : '.*/\(.*\)'`
220                    stage_version=`echo $version_dir | sed 's/boost_//' | sed 's/_/./g'`
221                        stage_version_shorten=`expr $stage_version : '\([[0-9]]*\.[[0-9]]*\)'`
222                    V_CHECK=`expr $stage_version_shorten \>\= $_version`
223                    if test "$V_CHECK" = "1" -a "$ac_boost_lib_path" = "" ; then
224                        AC_MSG_NOTICE(We will use a staged boost library from $BOOST_ROOT)
225                        BOOST_CPPFLAGS="-I$BOOST_ROOT"
226                        BOOST_LDFLAGS="-L$BOOST_ROOT/stage/$libsubdir"
227                    fi
228                fi
229            fi
230        fi
231
232        CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS"
233        export CPPFLAGS
234        LDFLAGS="$LDFLAGS $BOOST_LDFLAGS"
235        export LDFLAGS
236
237        AC_LANG_PUSH(C++)
238            AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
239        @%:@include <boost/version.hpp>
240        ]], [[
241        #if BOOST_VERSION >= $WANT_BOOST_VERSION
242        // Everything is okay
243        #else
244        #  error Boost version is too old
245        #endif
246        ]])],[
247            AC_MSG_RESULT(yes)
248        succeeded=yes
249        found_system=yes
250            ],[
251            ])
252        AC_LANG_POP([C++])
253    fi
254
255    if test "$succeeded" != "yes" ; then
256        if test "$_version" = "0" ; then
257            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.]])
258        else
259            AC_MSG_NOTICE([Your boost libraries seems to old (version $_version).])
260        fi
261        # execute ACTION-IF-NOT-FOUND (if present):
262        ifelse([$3], , :, [$3])
263    else
264        AC_SUBST(BOOST_CPPFLAGS)
265        AC_SUBST(BOOST_LDFLAGS)
266        AC_DEFINE(HAVE_BOOST,,[define if the Boost library is available])
267        # execute ACTION-IF-FOUND (if present):
268        ifelse([$2], , :, [$2])
269    fi
270
271    CPPFLAGS="$CPPFLAGS_SAVED"
272    LDFLAGS="$LDFLAGS_SAVED"
273fi
274
275])
276