blob: 4065af0d760ff6b62cbf9054300375f116c1a2e2 [file] [log] [blame]
Roger Meier73b58a22014-05-11 17:39:34 +02001# ===========================================================================
James E. King, IIId7142b72017-09-01 13:00:36 -07002# https://www.gnu.org/software/autoconf-archive/ax_boost_base.html
Roger Meier73b58a22014-05-11 17:39:34 +02003# ===========================================================================
David Reiss2d2aa142008-03-26 07:22:26 +00004#
5# SYNOPSIS
6#
Roger Meier73b58a22014-05-11 17:39:34 +02007# AX_BOOST_BASE([MINIMUM-VERSION], [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND])
David Reiss2d2aa142008-03-26 07:22:26 +00008#
9# DESCRIPTION
10#
11# Test for the Boost C++ libraries of a particular version (or newer)
12#
Roger Meier73b58a22014-05-11 17:39:34 +020013# 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>.
David Reiss2d2aa142008-03-26 07:22:26 +000017#
18# This macro calls:
19#
20# AC_SUBST(BOOST_CPPFLAGS) / AC_SUBST(BOOST_LDFLAGS)
21#
22# And sets:
23#
24# HAVE_BOOST
25#
Roger Meier73b58a22014-05-11 17:39:34 +020026# LICENSE
David Reiss2d2aa142008-03-26 07:22:26 +000027#
Roger Meier73b58a22014-05-11 17:39:34 +020028# Copyright (c) 2008 Thomas Porschberg <thomas@randspringer.de>
29# Copyright (c) 2009 Peter Adolphs
David Reiss2d2aa142008-03-26 07:22:26 +000030#
Roger Meier73b58a22014-05-11 17:39:34 +020031# 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
James E. King III56ac72e2018-12-17 09:32:24 -050036#serial 45
James E. King, IIId7142b72017-09-01 13:00:36 -070037
38# example boost program (need to pass version)
39m4_define([_AX_BOOST_BASE_PROGRAM],
40 [AC_LANG_PROGRAM([[
41#include <boost/version.hpp>
42]],[[
43(void) ((void)sizeof(char[1 - 2*!!((BOOST_VERSION) < ($1))]));
44]])])
Marc Slemko6f038a72006-08-03 18:58:09 +000045
46AC_DEFUN([AX_BOOST_BASE],
47[
48AC_ARG_WITH([boost],
Roger Meier73b58a22014-05-11 17:39:34 +020049 [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)
53 @<:@ARG=yes@:>@ ])],
54 [
James E. King, IIId7142b72017-09-01 13:00:36 -070055 AS_CASE([$withval],
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"])
Marc Slemko6f038a72006-08-03 18:58:09 +000059 ],
Marc Slemko75c2f702007-01-17 07:59:38 +000060 [want_boost="yes"])
Marc Slemko6f038a72006-08-03 18:58:09 +000061
Roger Meier73b58a22014-05-11 17:39:34 +020062
63AC_ARG_WITH([boost-libdir],
James E. King, IIId7142b72017-09-01 13:00:36 -070064 [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.])],
69 [
70 AS_IF([test -d "$withval"],
71 [_AX_BOOST_BASE_boost_lib_path="$withval"],
72 [AC_MSG_ERROR([--with-boost-libdir expected directory name])])
73 ],
74 [_AX_BOOST_BASE_boost_lib_path=""])
Roger Meier73b58a22014-05-11 17:39:34 +020075
James E. King, IIId7142b72017-09-01 13:00:36 -070076BOOST_LDFLAGS=""
77BOOST_CPPFLAGS=""
78AS_IF([test "x$want_boost" = "xyes"],
79 [_AX_BOOST_BASE_RUNDETECT([$1],[$2],[$3])])
80AC_SUBST(BOOST_CPPFLAGS)
81AC_SUBST(BOOST_LDFLAGS)
82])
83
84
85# convert a version string in $2 to numeric and affect to polymorphic var $1
86AC_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)
100])
101
102dnl Run the detection of boost should be run only if $want_boost
103AC_DEFUN([_AX_BOOST_BASE_RUNDETECT],[
104 _AX_BOOST_BASE_TONUMERICVERSION(WANT_BOOST_VERSION,[$1])
Roger Meier73b58a22014-05-11 17:39:34 +0200105 succeeded=no
Marc Slemko6f038a72006-08-03 18:58:09 +0000106
James E. King, IIId7142b72017-09-01 13:00:36 -0700107
108 AC_REQUIRE([AC_CANONICAL_HOST])
Roger Meier73b58a22014-05-11 17:39:34 +0200109 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!
James E. King, IIId7142b72017-09-01 13:00:36 -0700114 AS_CASE([${host_cpu}],
115 [x86_64],[libsubdirs="lib64 libx32 lib lib64"],
Huang Yang607cd542024-09-04 11:11:18 +0800116 [ppc64|powerpc64|s390x|sparc64|aarch64|ppc64le|powerpc64le|riscv64|loongarch64],[libsubdirs="lib64 lib lib64"],
James E. King III56ac72e2018-12-17 09:32:24 -0500117 [libsubdirs="lib"]
James E. King, IIId7142b72017-09-01 13:00:36 -0700118 )
Marc Slemko6f038a72006-08-03 18:58:09 +0000119
Roger Meier73b58a22014-05-11 17:39:34 +0200120 dnl allow for real multi-arch paths e.g. /usr/lib/x86_64-linux-gnu. Give
121 dnl them priority over the other paths since, if libs are found there, they
122 dnl are almost assuredly the ones desired.
James E. King, IIId7142b72017-09-01 13:00:36 -0700123 AS_CASE([${host_cpu}],
124 [i?86],[multiarch_libsubdir="lib/i386-${host_os}"],
125 [multiarch_libsubdir="lib/${host_cpu}-${host_os}"]
126 )
Marc Slemko6f038a72006-08-03 18:58:09 +0000127
Roger Meier73b58a22014-05-11 17:39:34 +0200128 dnl first we check the system location for boost libraries
129 dnl this location ist chosen if boost libraries are installed with the --layout=system option
130 dnl or if you install boost with RPM
James E. King, IIId7142b72017-09-01 13:00:36 -0700131 AS_IF([test "x$_AX_BOOST_BASE_boost_path" != "x"],[
132 AC_MSG_CHECKING([for boostlib >= $1 ($WANT_BOOST_VERSION) includes in "$_AX_BOOST_BASE_boost_path/include"])
133 AS_IF([test -d "$_AX_BOOST_BASE_boost_path/include" && test -r "$_AX_BOOST_BASE_boost_path/include"],[
134 AC_MSG_RESULT([yes])
135 BOOST_CPPFLAGS="-I$_AX_BOOST_BASE_boost_path/include"
136 for _AX_BOOST_BASE_boost_path_tmp in $multiarch_libsubdir $libsubdirs; do
137 AC_MSG_CHECKING([for boostlib >= $1 ($WANT_BOOST_VERSION) lib path in "$_AX_BOOST_BASE_boost_path/$_AX_BOOST_BASE_boost_path_tmp"])
138 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" ],[
139 AC_MSG_RESULT([yes])
140 BOOST_LDFLAGS="-L$_AX_BOOST_BASE_boost_path/$_AX_BOOST_BASE_boost_path_tmp";
141 break;
142 ],
143 [AC_MSG_RESULT([no])])
144 done],[
145 AC_MSG_RESULT([no])])
146 ],[
147 if test X"$cross_compiling" = Xyes; then
148 search_libsubdirs=$multiarch_libsubdir
149 else
150 search_libsubdirs="$multiarch_libsubdir $libsubdirs"
151 fi
152 for _AX_BOOST_BASE_boost_path_tmp in /usr /usr/local /opt /opt/local ; do
153 if test -d "$_AX_BOOST_BASE_boost_path_tmp/include/boost" && test -r "$_AX_BOOST_BASE_boost_path_tmp/include/boost" ; then
154 for libsubdir in $search_libsubdirs ; do
155 if ls "$_AX_BOOST_BASE_boost_path_tmp/$libsubdir/libboost_"* >/dev/null 2>&1 ; then break; fi
Roger Meier73b58a22014-05-11 17:39:34 +0200156 done
James E. King, IIId7142b72017-09-01 13:00:36 -0700157 BOOST_LDFLAGS="-L$_AX_BOOST_BASE_boost_path_tmp/$libsubdir"
158 BOOST_CPPFLAGS="-I$_AX_BOOST_BASE_boost_path_tmp/include"
Roger Meier73b58a22014-05-11 17:39:34 +0200159 break;
160 fi
161 done
James E. King, IIId7142b72017-09-01 13:00:36 -0700162 ])
Christian Lavoie4f42ef72010-11-04 18:51:42 +0000163
Roger Meier73b58a22014-05-11 17:39:34 +0200164 dnl overwrite ld flags if we have required special directory with
165 dnl --with-boost-libdir parameter
James E. King, IIId7142b72017-09-01 13:00:36 -0700166 AS_IF([test "x$_AX_BOOST_BASE_boost_lib_path" != "x"],
167 [BOOST_LDFLAGS="-L$_AX_BOOST_BASE_boost_lib_path"])
Roger Meier73b58a22014-05-11 17:39:34 +0200168
James E. King, IIId7142b72017-09-01 13:00:36 -0700169 AC_MSG_CHECKING([for boostlib >= $1 ($WANT_BOOST_VERSION)])
Roger Meier73b58a22014-05-11 17:39:34 +0200170 CPPFLAGS_SAVED="$CPPFLAGS"
171 CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS"
172 export CPPFLAGS
173
174 LDFLAGS_SAVED="$LDFLAGS"
175 LDFLAGS="$LDFLAGS $BOOST_LDFLAGS"
176 export LDFLAGS
177
178 AC_REQUIRE([AC_PROG_CXX])
179 AC_LANG_PUSH(C++)
James E. King, IIId7142b72017-09-01 13:00:36 -0700180 AC_COMPILE_IFELSE([_AX_BOOST_BASE_PROGRAM($WANT_BOOST_VERSION)],[
Marc Slemko6f038a72006-08-03 18:58:09 +0000181 AC_MSG_RESULT(yes)
Roger Meier73b58a22014-05-11 17:39:34 +0200182 succeeded=yes
183 found_system=yes
184 ],[
185 ])
186 AC_LANG_POP([C++])
Marc Slemko6f038a72006-08-03 18:58:09 +0000187
188
189
Roger Meier73b58a22014-05-11 17:39:34 +0200190 dnl if we found no boost with system layout we search for boost libraries
191 dnl built and installed without the --layout=system option or for a staged(not installed) version
James E. King, IIId7142b72017-09-01 13:00:36 -0700192 if test "x$succeeded" != "xyes" ; then
193 CPPFLAGS="$CPPFLAGS_SAVED"
194 LDFLAGS="$LDFLAGS_SAVED"
195 BOOST_CPPFLAGS=
196 if test -z "$_AX_BOOST_BASE_boost_lib_path" ; then
197 BOOST_LDFLAGS=
198 fi
Roger Meier73b58a22014-05-11 17:39:34 +0200199 _version=0
James E. King, IIId7142b72017-09-01 13:00:36 -0700200 if test -n "$_AX_BOOST_BASE_boost_path" ; then
201 if test -d "$_AX_BOOST_BASE_boost_path" && test -r "$_AX_BOOST_BASE_boost_path"; then
202 for i in `ls -d $_AX_BOOST_BASE_boost_path/include/boost-* 2>/dev/null`; do
203 _version_tmp=`echo $i | sed "s#$_AX_BOOST_BASE_boost_path##" | sed 's/\/include\/boost-//' | sed 's/_/./'`
Roger Meier73b58a22014-05-11 17:39:34 +0200204 V_CHECK=`expr $_version_tmp \> $_version`
James E. King, IIId7142b72017-09-01 13:00:36 -0700205 if test "x$V_CHECK" = "x1" ; then
Roger Meier73b58a22014-05-11 17:39:34 +0200206 _version=$_version_tmp
207 fi
208 VERSION_UNDERSCORE=`echo $_version | sed 's/\./_/'`
James E. King, IIId7142b72017-09-01 13:00:36 -0700209 BOOST_CPPFLAGS="-I$_AX_BOOST_BASE_boost_path/include/boost-$VERSION_UNDERSCORE"
Roger Meier73b58a22014-05-11 17:39:34 +0200210 done
James E. King, IIId7142b72017-09-01 13:00:36 -0700211 dnl if nothing found search for layout used in Windows distributions
212 if test -z "$BOOST_CPPFLAGS"; then
213 if test -d "$_AX_BOOST_BASE_boost_path/boost" && test -r "$_AX_BOOST_BASE_boost_path/boost"; then
214 BOOST_CPPFLAGS="-I$_AX_BOOST_BASE_boost_path"
215 fi
216 fi
217 dnl if we found something and BOOST_LDFLAGS was unset before
218 dnl (because "$_AX_BOOST_BASE_boost_lib_path" = ""), set it here.
219 if test -n "$BOOST_CPPFLAGS" && test -z "$BOOST_LDFLAGS"; then
220 for libsubdir in $libsubdirs ; do
221 if ls "$_AX_BOOST_BASE_boost_path/$libsubdir/libboost_"* >/dev/null 2>&1 ; then break; fi
222 done
223 BOOST_LDFLAGS="-L$_AX_BOOST_BASE_boost_path/$libsubdir"
224 fi
Roger Meier73b58a22014-05-11 17:39:34 +0200225 fi
226 else
James E. King, IIId7142b72017-09-01 13:00:36 -0700227 if test "x$cross_compiling" != "xyes" ; then
228 for _AX_BOOST_BASE_boost_path in /usr /usr/local /opt /opt/local ; do
229 if test -d "$_AX_BOOST_BASE_boost_path" && test -r "$_AX_BOOST_BASE_boost_path" ; then
230 for i in `ls -d $_AX_BOOST_BASE_boost_path/include/boost-* 2>/dev/null`; do
231 _version_tmp=`echo $i | sed "s#$_AX_BOOST_BASE_boost_path##" | sed 's/\/include\/boost-//' | sed 's/_/./'`
Roger Meier73b58a22014-05-11 17:39:34 +0200232 V_CHECK=`expr $_version_tmp \> $_version`
James E. King, IIId7142b72017-09-01 13:00:36 -0700233 if test "x$V_CHECK" = "x1" ; then
Roger Meier73b58a22014-05-11 17:39:34 +0200234 _version=$_version_tmp
James E. King, IIId7142b72017-09-01 13:00:36 -0700235 best_path=$_AX_BOOST_BASE_boost_path
Roger Meier73b58a22014-05-11 17:39:34 +0200236 fi
237 done
238 fi
239 done
Marc Slemko6f038a72006-08-03 18:58:09 +0000240
Roger Meier73b58a22014-05-11 17:39:34 +0200241 VERSION_UNDERSCORE=`echo $_version | sed 's/\./_/'`
242 BOOST_CPPFLAGS="-I$best_path/include/boost-$VERSION_UNDERSCORE"
James E. King, IIId7142b72017-09-01 13:00:36 -0700243 if test -z "$_AX_BOOST_BASE_boost_lib_path" ; then
Roger Meier73b58a22014-05-11 17:39:34 +0200244 for libsubdir in $libsubdirs ; do
245 if ls "$best_path/$libsubdir/libboost_"* >/dev/null 2>&1 ; then break; fi
246 done
247 BOOST_LDFLAGS="-L$best_path/$libsubdir"
248 fi
249 fi
Marc Slemko6f038a72006-08-03 18:58:09 +0000250
James E. King, IIId7142b72017-09-01 13:00:36 -0700251 if test -n "$BOOST_ROOT" ; then
Roger Meier73b58a22014-05-11 17:39:34 +0200252 for libsubdir in $libsubdirs ; do
253 if ls "$BOOST_ROOT/stage/$libsubdir/libboost_"* >/dev/null 2>&1 ; then break; fi
254 done
255 if test -d "$BOOST_ROOT" && test -r "$BOOST_ROOT" && test -d "$BOOST_ROOT/stage/$libsubdir" && test -r "$BOOST_ROOT/stage/$libsubdir"; then
256 version_dir=`expr //$BOOST_ROOT : '.*/\(.*\)'`
257 stage_version=`echo $version_dir | sed 's/boost_//' | sed 's/_/./g'`
258 stage_version_shorten=`expr $stage_version : '\([[0-9]]*\.[[0-9]]*\)'`
259 V_CHECK=`expr $stage_version_shorten \>\= $_version`
James E. King, IIId7142b72017-09-01 13:00:36 -0700260 if test "x$V_CHECK" = "x1" && test -z "$_AX_BOOST_BASE_boost_lib_path" ; then
Roger Meier73b58a22014-05-11 17:39:34 +0200261 AC_MSG_NOTICE(We will use a staged boost library from $BOOST_ROOT)
262 BOOST_CPPFLAGS="-I$BOOST_ROOT"
263 BOOST_LDFLAGS="-L$BOOST_ROOT/stage/$libsubdir"
264 fi
265 fi
266 fi
267 fi
Marc Slemko6f038a72006-08-03 18:58:09 +0000268
Roger Meier73b58a22014-05-11 17:39:34 +0200269 CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS"
270 export CPPFLAGS
271 LDFLAGS="$LDFLAGS $BOOST_LDFLAGS"
272 export LDFLAGS
Marc Slemko6f038a72006-08-03 18:58:09 +0000273
Roger Meier73b58a22014-05-11 17:39:34 +0200274 AC_LANG_PUSH(C++)
James E. King, IIId7142b72017-09-01 13:00:36 -0700275 AC_COMPILE_IFELSE([_AX_BOOST_BASE_PROGRAM($WANT_BOOST_VERSION)],[
Roger Meier73b58a22014-05-11 17:39:34 +0200276 AC_MSG_RESULT(yes)
277 succeeded=yes
278 found_system=yes
279 ],[
280 ])
281 AC_LANG_POP([C++])
282 fi
Marc Slemko6f038a72006-08-03 18:58:09 +0000283
James E. King, IIId7142b72017-09-01 13:00:36 -0700284 if test "x$succeeded" != "xyes" ; then
285 if test "x$_version" = "x0" ; then
286 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.]])
Roger Meier73b58a22014-05-11 17:39:34 +0200287 else
288 AC_MSG_NOTICE([Your boost libraries seems to old (version $_version).])
289 fi
290 # execute ACTION-IF-NOT-FOUND (if present):
291 ifelse([$3], , :, [$3])
292 else
Roger Meier73b58a22014-05-11 17:39:34 +0200293 AC_DEFINE(HAVE_BOOST,,[define if the Boost library is available])
294 # execute ACTION-IF-FOUND (if present):
295 ifelse([$2], , :, [$2])
296 fi
Marc Slemko6f038a72006-08-03 18:58:09 +0000297
Roger Meier73b58a22014-05-11 17:39:34 +0200298 CPPFLAGS="$CPPFLAGS_SAVED"
299 LDFLAGS="$LDFLAGS_SAVED"
Marc Slemko6f038a72006-08-03 18:58:09 +0000300
301])