1 # ===========================================================================
2 # https://www.gnu.org/software/autoconf-archive/ax_boost_base.html
3 # ===========================================================================
7 # AX_BOOST_BASE([MINIMUM-VERSION], [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND])
11 # Test for the Boost C++ libraries of a particular version (or newer)
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>.
20 # AC_SUBST(BOOST_CPPFLAGS) / AC_SUBST(BOOST_LDFLAGS)
28 # Copyright (c) 2008 Thomas Porschberg <thomas@randspringer.de>
29 # Copyright (c) 2009 Peter Adolphs
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
38 # example boost program (need to pass version)
39 m4_define([_AX_BOOST_BASE_PROGRAM],
41 #include <boost/version.hpp>
43 (void) ((void)sizeof(char[1 - 2*!!((BOOST_VERSION) < ($1))]));
46 AC_DEFUN([AX_BOOST_BASE],
49 [AS_HELP_STRING([--with-boost@<:@=ARG@:>@],
50 [use Boost library from a standard location (ARG=yes),
51 from the specified location (ARG=<path>),
52 or disable it (ARG=no)
56 [no],[want_boost="no";_AX_BOOST_BASE_boost_path=""],
57 [yes],[want_boost="yes";_AX_BOOST_BASE_boost_path=""],
58 [want_boost="yes";_AX_BOOST_BASE_boost_path="$withval"])
63 AC_ARG_WITH([boost-libdir],
64 [AS_HELP_STRING([--with-boost-libdir=LIB_DIR],
65 [Force given directory for boost libraries.
66 Note that this will override library path detection,
67 so use this parameter only if default library detection fails
68 and you know exactly where your boost libraries are located.])],
70 AS_IF([test -d "$withval"],
71 [_AX_BOOST_BASE_boost_lib_path="$withval"],
72 [AC_MSG_ERROR([--with-boost-libdir expected directory name])])
74 [_AX_BOOST_BASE_boost_lib_path=""])
78 AS_IF([test "x$want_boost" = "xyes"],
79 [_AX_BOOST_BASE_RUNDETECT([$1],[$2],[$3])])
80 AC_SUBST(BOOST_CPPFLAGS)
81 AC_SUBST(BOOST_LDFLAGS)
85 # convert a version string in $2 to numeric and affect to polymorphic var $1
86 AC_DEFUN([_AX_BOOST_BASE_TONUMERICVERSION],[
87 AS_IF([test "x$2" = "x"],[_AX_BOOST_BASE_TONUMERICVERSION_req="1.20.0"],[_AX_BOOST_BASE_TONUMERICVERSION_req="$2"])
88 _AX_BOOST_BASE_TONUMERICVERSION_req_shorten=`expr $_AX_BOOST_BASE_TONUMERICVERSION_req : '\([[0-9]]*\.[[0-9]]*\)'`
89 _AX_BOOST_BASE_TONUMERICVERSION_req_major=`expr $_AX_BOOST_BASE_TONUMERICVERSION_req : '\([[0-9]]*\)'`
90 AS_IF([test "x$_AX_BOOST_BASE_TONUMERICVERSION_req_major" = "x"],
91 [AC_MSG_ERROR([You should at least specify libboost major version])])
92 _AX_BOOST_BASE_TONUMERICVERSION_req_minor=`expr $_AX_BOOST_BASE_TONUMERICVERSION_req : '[[0-9]]*\.\([[0-9]]*\)'`
93 AS_IF([test "x$_AX_BOOST_BASE_TONUMERICVERSION_req_minor" = "x"],
94 [_AX_BOOST_BASE_TONUMERICVERSION_req_minor="0"])
95 _AX_BOOST_BASE_TONUMERICVERSION_req_sub_minor=`expr $_AX_BOOST_BASE_TONUMERICVERSION_req : '[[0-9]]*\.[[0-9]]*\.\([[0-9]]*\)'`
96 AS_IF([test "X$_AX_BOOST_BASE_TONUMERICVERSION_req_sub_minor" = "X"],
97 [_AX_BOOST_BASE_TONUMERICVERSION_req_sub_minor="0"])
98 _AX_BOOST_BASE_TONUMERICVERSION_RET=`expr $_AX_BOOST_BASE_TONUMERICVERSION_req_major \* 100000 \+ $_AX_BOOST_BASE_TONUMERICVERSION_req_minor \* 100 \+ $_AX_BOOST_BASE_TONUMERICVERSION_req_sub_minor`
99 AS_VAR_SET($1,$_AX_BOOST_BASE_TONUMERICVERSION_RET)
102 dnl Run the detection of boost should be run only if $want_boost
103 AC_DEFUN([_AX_BOOST_BASE_RUNDETECT],[
104 _AX_BOOST_BASE_TONUMERICVERSION(WANT_BOOST_VERSION,[$1])
108 AC_REQUIRE([AC_CANONICAL_HOST])
109 dnl On 64-bit systems check for system libraries in both lib64 and lib.
110 dnl The former is specified by FHS, but e.g. Debian does not adhere to
111 dnl this (as it rises problems for generic multi-arch support).
112 dnl The last entry in the list is chosen by default when no libraries
113 dnl are found, e.g. when only header-only libraries are installed!
114 AS_CASE([${host_cpu}],
115 [x86_64],[libsubdirs="lib64 libx32 lib lib64"],
116 [mips*64*],[libsubdirs="lib64 lib32 lib lib64"],
117 [ppc64|powerpc64|s390x|sparc64|aarch64|ppc64le|powerpc64le|riscv64|e2k],[libsubdirs="lib64 lib lib64"],
121 dnl allow for real multi-arch paths e.g. /usr/lib/x86_64-linux-gnu. Give
122 dnl them priority over the other paths since, if libs are found there, they
123 dnl are almost assuredly the ones desired.
124 AS_CASE([${host_cpu}],
125 [i?86],[multiarch_libsubdir="lib/i386-${host_os}"],
126 [armv7l],[multiarch_libsubdir="lib/arm-${host_os}"],
127 [multiarch_libsubdir="lib/${host_cpu}-${host_os}"]
130 dnl first we check the system location for boost libraries
131 dnl this location ist chosen if boost libraries are installed with the --layout=system option
132 dnl or if you install boost with RPM
133 AS_IF([test "x$_AX_BOOST_BASE_boost_path" != "x"],[
134 AC_MSG_CHECKING([for boostlib >= $1 ($WANT_BOOST_VERSION) includes in "$_AX_BOOST_BASE_boost_path/include"])
135 AS_IF([test -d "$_AX_BOOST_BASE_boost_path/include" && test -r "$_AX_BOOST_BASE_boost_path/include"],[
137 BOOST_CPPFLAGS="-I$_AX_BOOST_BASE_boost_path/include"
138 for _AX_BOOST_BASE_boost_path_tmp in $multiarch_libsubdir $libsubdirs; do
139 AC_MSG_CHECKING([for boostlib >= $1 ($WANT_BOOST_VERSION) lib path in "$_AX_BOOST_BASE_boost_path/$_AX_BOOST_BASE_boost_path_tmp"])
140 AS_IF([test -d "$_AX_BOOST_BASE_boost_path/$_AX_BOOST_BASE_boost_path_tmp" && test -r "$_AX_BOOST_BASE_boost_path/$_AX_BOOST_BASE_boost_path_tmp" ],[
142 BOOST_LDFLAGS="-L$_AX_BOOST_BASE_boost_path/$_AX_BOOST_BASE_boost_path_tmp";
145 [AC_MSG_RESULT([no])])
147 AC_MSG_RESULT([no])])
149 if test X"$cross_compiling" = Xyes; then
150 search_libsubdirs=$multiarch_libsubdir
152 search_libsubdirs="$multiarch_libsubdir $libsubdirs"
154 for _AX_BOOST_BASE_boost_path_tmp in /usr /usr/local /opt /opt/local ; do
155 if test -d "$_AX_BOOST_BASE_boost_path_tmp/include/boost" && test -r "$_AX_BOOST_BASE_boost_path_tmp/include/boost" ; then
156 for libsubdir in $search_libsubdirs ; do
157 if ls "$_AX_BOOST_BASE_boost_path_tmp/$libsubdir/libboost_"* >/dev/null 2>&1 ; then break; fi
159 BOOST_LDFLAGS="-L$_AX_BOOST_BASE_boost_path_tmp/$libsubdir"
160 BOOST_CPPFLAGS="-I$_AX_BOOST_BASE_boost_path_tmp/include"
166 dnl overwrite ld flags if we have required special directory with
167 dnl --with-boost-libdir parameter
168 AS_IF([test "x$_AX_BOOST_BASE_boost_lib_path" != "x"],
169 [BOOST_LDFLAGS="-L$_AX_BOOST_BASE_boost_lib_path"])
171 AC_MSG_CHECKING([for boostlib >= $1 ($WANT_BOOST_VERSION)])
172 CPPFLAGS_SAVED="$CPPFLAGS"
173 CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS"
176 LDFLAGS_SAVED="$LDFLAGS"
177 LDFLAGS="$LDFLAGS $BOOST_LDFLAGS"
180 AC_REQUIRE([AC_PROG_CXX])
182 AC_COMPILE_IFELSE([_AX_BOOST_BASE_PROGRAM($WANT_BOOST_VERSION)],[
192 dnl if we found no boost with system layout we search for boost libraries
193 dnl built and installed without the --layout=system option or for a staged(not installed) version
194 if test "x$succeeded" != "xyes" ; then
195 CPPFLAGS="$CPPFLAGS_SAVED"
196 LDFLAGS="$LDFLAGS_SAVED"
198 if test -z "$_AX_BOOST_BASE_boost_lib_path" ; then
202 if test -n "$_AX_BOOST_BASE_boost_path" ; then
203 if test -d "$_AX_BOOST_BASE_boost_path" && test -r "$_AX_BOOST_BASE_boost_path"; then
204 for i in `ls -d $_AX_BOOST_BASE_boost_path/include/boost-* 2>/dev/null`; do
205 _version_tmp=`echo $i | sed "s#$_AX_BOOST_BASE_boost_path##" | sed 's/\/include\/boost-//' | sed 's/_/./'`
206 V_CHECK=`expr $_version_tmp \> $_version`
207 if test "x$V_CHECK" = "x1" ; then
208 _version=$_version_tmp
210 VERSION_UNDERSCORE=`echo $_version | sed 's/\./_/'`
211 BOOST_CPPFLAGS="-I$_AX_BOOST_BASE_boost_path/include/boost-$VERSION_UNDERSCORE"
213 dnl if nothing found search for layout used in Windows distributions
214 if test -z "$BOOST_CPPFLAGS"; then
215 if test -d "$_AX_BOOST_BASE_boost_path/boost" && test -r "$_AX_BOOST_BASE_boost_path/boost"; then
216 BOOST_CPPFLAGS="-I$_AX_BOOST_BASE_boost_path"
219 dnl if we found something and BOOST_LDFLAGS was unset before
220 dnl (because "$_AX_BOOST_BASE_boost_lib_path" = ""), set it here.
221 if test -n "$BOOST_CPPFLAGS" && test -z "$BOOST_LDFLAGS"; then
222 for libsubdir in $libsubdirs ; do
223 if ls "$_AX_BOOST_BASE_boost_path/$libsubdir/libboost_"* >/dev/null 2>&1 ; then break; fi
225 BOOST_LDFLAGS="-L$_AX_BOOST_BASE_boost_path/$libsubdir"
229 if test "x$cross_compiling" != "xyes" ; then
230 for _AX_BOOST_BASE_boost_path in /usr /usr/local /opt /opt/local ; do
231 if test -d "$_AX_BOOST_BASE_boost_path" && test -r "$_AX_BOOST_BASE_boost_path" ; then
232 for i in `ls -d $_AX_BOOST_BASE_boost_path/include/boost-* 2>/dev/null`; do
233 _version_tmp=`echo $i | sed "s#$_AX_BOOST_BASE_boost_path##" | sed 's/\/include\/boost-//' | sed 's/_/./'`
234 V_CHECK=`expr $_version_tmp \> $_version`
235 if test "x$V_CHECK" = "x1" ; then
236 _version=$_version_tmp
237 best_path=$_AX_BOOST_BASE_boost_path
243 VERSION_UNDERSCORE=`echo $_version | sed 's/\./_/'`
244 BOOST_CPPFLAGS="-I$best_path/include/boost-$VERSION_UNDERSCORE"
245 if test -z "$_AX_BOOST_BASE_boost_lib_path" ; then
246 for libsubdir in $libsubdirs ; do
247 if ls "$best_path/$libsubdir/libboost_"* >/dev/null 2>&1 ; then break; fi
249 BOOST_LDFLAGS="-L$best_path/$libsubdir"
253 if test -n "$BOOST_ROOT" ; then
254 for libsubdir in $libsubdirs ; do
255 if ls "$BOOST_ROOT/stage/$libsubdir/libboost_"* >/dev/null 2>&1 ; then break; fi
257 if test -d "$BOOST_ROOT" && test -r "$BOOST_ROOT" && test -d "$BOOST_ROOT/stage/$libsubdir" && test -r "$BOOST_ROOT/stage/$libsubdir"; then
258 version_dir=`expr //$BOOST_ROOT : '.*/\(.*\)'`
259 stage_version=`echo $version_dir | sed 's/boost_//' | sed 's/_/./g'`
260 stage_version_shorten=`expr $stage_version : '\([[0-9]]*\.[[0-9]]*\)'`
261 V_CHECK=`expr $stage_version_shorten \>\= $_version`
262 if test "x$V_CHECK" = "x1" && test -z "$_AX_BOOST_BASE_boost_lib_path" ; then
263 AC_MSG_NOTICE(We will use a staged boost library from $BOOST_ROOT)
264 BOOST_CPPFLAGS="-I$BOOST_ROOT"
265 BOOST_LDFLAGS="-L$BOOST_ROOT/stage/$libsubdir"
271 CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS"
273 LDFLAGS="$LDFLAGS $BOOST_LDFLAGS"
277 AC_COMPILE_IFELSE([_AX_BOOST_BASE_PROGRAM($WANT_BOOST_VERSION)],[
286 if test "x$succeeded" != "xyes" ; then
287 if test "x$_version" = "x0" ; then
288 AC_MSG_NOTICE([[We could not detect the boost libraries (version $1 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.]])
290 AC_MSG_NOTICE([Your boost libraries seems to old (version $_version).])
292 # execute ACTION-IF-NOT-FOUND (if present):
293 ifelse([$3], , :, [$3])
295 AC_DEFINE(HAVE_BOOST,,[define if the Boost library is available])
296 # execute ACTION-IF-FOUND (if present):
297 ifelse([$2], , :, [$2])
300 CPPFLAGS="$CPPFLAGS_SAVED"
301 LDFLAGS="$LDFLAGS_SAVED"