fix hazptr_array move
[folly.git] / folly / m4 / ax_boost_base.m4
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
38 AC_DEFUN([AX_BOOST_BASE],
39 [
40 AC_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
60 AC_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
74 if 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"
270 fi
271
272 ])