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],[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 [multiarch_libsubdir="lib/${host_cpu}-${host_os}"]
129 dnl first we check the system location for boost libraries
130 dnl this location ist chosen if boost libraries are installed with the --layout=system option
131 dnl or if you install boost with RPM
132 AS_IF([test "x$_AX_BOOST_BASE_boost_path" != "x"],[
133 AC_MSG_CHECKING([for boostlib >= $1 ($WANT_BOOST_VERSION) includes in "$_AX_BOOST_BASE_boost_path/include"])
134 AS_IF([test -d "$_AX_BOOST_BASE_boost_path/include" && test -r "$_AX_BOOST_BASE_boost_path/include"],[
136 BOOST_CPPFLAGS="-I$_AX_BOOST_BASE_boost_path/include"
137 for _AX_BOOST_BASE_boost_path_tmp in $multiarch_libsubdir $libsubdirs; do
138 AC_MSG_CHECKING([for boostlib >= $1 ($WANT_BOOST_VERSION) lib path in "$_AX_BOOST_BASE_boost_path/$_AX_BOOST_BASE_boost_path_tmp"])
139 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" ],[
141 BOOST_LDFLAGS="-L$_AX_BOOST_BASE_boost_path/$_AX_BOOST_BASE_boost_path_tmp";
144 [AC_MSG_RESULT([no])])
146 AC_MSG_RESULT([no])])
148 if test X"$cross_compiling" = Xyes; then
149 search_libsubdirs=$multiarch_libsubdir
151 search_libsubdirs="$multiarch_libsubdir $libsubdirs"
153 for _AX_BOOST_BASE_boost_path_tmp in /usr /usr/local /opt /opt/local ; do
154 if test -d "$_AX_BOOST_BASE_boost_path_tmp/include/boost" && test -r "$_AX_BOOST_BASE_boost_path_tmp/include/boost" ; then
155 for libsubdir in $search_libsubdirs ; do
156 if ls "$_AX_BOOST_BASE_boost_path_tmp/$libsubdir/libboost_"* >/dev/null 2>&1 ; then break; fi
158 BOOST_LDFLAGS="-L$_AX_BOOST_BASE_boost_path_tmp/$libsubdir"
159 BOOST_CPPFLAGS="-I$_AX_BOOST_BASE_boost_path_tmp/include"
165 dnl overwrite ld flags if we have required special directory with
166 dnl --with-boost-libdir parameter
167 AS_IF([test "x$_AX_BOOST_BASE_boost_lib_path" != "x"],
168 [BOOST_LDFLAGS="-L$_AX_BOOST_BASE_boost_lib_path"])
170 AC_MSG_CHECKING([for boostlib >= $1 ($WANT_BOOST_VERSION)])
171 CPPFLAGS_SAVED="$CPPFLAGS"
172 CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS"
175 LDFLAGS_SAVED="$LDFLAGS"
176 LDFLAGS="$LDFLAGS $BOOST_LDFLAGS"
179 AC_REQUIRE([AC_PROG_CXX])
181 AC_COMPILE_IFELSE([_AX_BOOST_BASE_PROGRAM($WANT_BOOST_VERSION)],[
191 dnl if we found no boost with system layout we search for boost libraries
192 dnl built and installed without the --layout=system option or for a staged(not installed) version
193 if test "x$succeeded" != "xyes" ; then
194 CPPFLAGS="$CPPFLAGS_SAVED"
195 LDFLAGS="$LDFLAGS_SAVED"
197 if test -z "$_AX_BOOST_BASE_boost_lib_path" ; then
201 if test -n "$_AX_BOOST_BASE_boost_path" ; then
202 if test -d "$_AX_BOOST_BASE_boost_path" && test -r "$_AX_BOOST_BASE_boost_path"; then
203 for i in `ls -d $_AX_BOOST_BASE_boost_path/include/boost-* 2>/dev/null`; do
204 _version_tmp=`echo $i | sed "s#$_AX_BOOST_BASE_boost_path##" | sed 's/\/include\/boost-//' | sed 's/_/./'`
205 V_CHECK=`expr $_version_tmp \> $_version`
206 if test "x$V_CHECK" = "x1" ; then
207 _version=$_version_tmp
209 VERSION_UNDERSCORE=`echo $_version | sed 's/\./_/'`
210 BOOST_CPPFLAGS="-I$_AX_BOOST_BASE_boost_path/include/boost-$VERSION_UNDERSCORE"
212 dnl if nothing found search for layout used in Windows distributions
213 if test -z "$BOOST_CPPFLAGS"; then
214 if test -d "$_AX_BOOST_BASE_boost_path/boost" && test -r "$_AX_BOOST_BASE_boost_path/boost"; then
215 BOOST_CPPFLAGS="-I$_AX_BOOST_BASE_boost_path"
218 dnl if we found something and BOOST_LDFLAGS was unset before
219 dnl (because "$_AX_BOOST_BASE_boost_lib_path" = ""), set it here.
220 if test -n "$BOOST_CPPFLAGS" && test -z "$BOOST_LDFLAGS"; then
221 for libsubdir in $libsubdirs ; do
222 if ls "$_AX_BOOST_BASE_boost_path/$libsubdir/libboost_"* >/dev/null 2>&1 ; then break; fi
224 BOOST_LDFLAGS="-L$_AX_BOOST_BASE_boost_path/$libsubdir"
228 if test "x$cross_compiling" != "xyes" ; then
229 for _AX_BOOST_BASE_boost_path in /usr /usr/local /opt /opt/local ; do
230 if test -d "$_AX_BOOST_BASE_boost_path" && test -r "$_AX_BOOST_BASE_boost_path" ; then
231 for i in `ls -d $_AX_BOOST_BASE_boost_path/include/boost-* 2>/dev/null`; do
232 _version_tmp=`echo $i | sed "s#$_AX_BOOST_BASE_boost_path##" | sed 's/\/include\/boost-//' | sed 's/_/./'`
233 V_CHECK=`expr $_version_tmp \> $_version`
234 if test "x$V_CHECK" = "x1" ; then
235 _version=$_version_tmp
236 best_path=$_AX_BOOST_BASE_boost_path
242 VERSION_UNDERSCORE=`echo $_version | sed 's/\./_/'`
243 BOOST_CPPFLAGS="-I$best_path/include/boost-$VERSION_UNDERSCORE"
244 if test -z "$_AX_BOOST_BASE_boost_lib_path" ; then
245 for libsubdir in $libsubdirs ; do
246 if ls "$best_path/$libsubdir/libboost_"* >/dev/null 2>&1 ; then break; fi
248 BOOST_LDFLAGS="-L$best_path/$libsubdir"
252 if test -n "$BOOST_ROOT" ; then
253 for libsubdir in $libsubdirs ; do
254 if ls "$BOOST_ROOT/stage/$libsubdir/libboost_"* >/dev/null 2>&1 ; then break; fi
256 if test -d "$BOOST_ROOT" && test -r "$BOOST_ROOT" && test -d "$BOOST_ROOT/stage/$libsubdir" && test -r "$BOOST_ROOT/stage/$libsubdir"; then
257 version_dir=`expr //$BOOST_ROOT : '.*/\(.*\)'`
258 stage_version=`echo $version_dir | sed 's/boost_//' | sed 's/_/./g'`
259 stage_version_shorten=`expr $stage_version : '\([[0-9]]*\.[[0-9]]*\)'`
260 V_CHECK=`expr $stage_version_shorten \>\= $_version`
261 if test "x$V_CHECK" = "x1" && test -z "$_AX_BOOST_BASE_boost_lib_path" ; then
262 AC_MSG_NOTICE(We will use a staged boost library from $BOOST_ROOT)
263 BOOST_CPPFLAGS="-I$BOOST_ROOT"
264 BOOST_LDFLAGS="-L$BOOST_ROOT/stage/$libsubdir"
270 CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS"
272 LDFLAGS="$LDFLAGS $BOOST_LDFLAGS"
276 AC_COMPILE_IFELSE([_AX_BOOST_BASE_PROGRAM($WANT_BOOST_VERSION)],[
285 if test "x$succeeded" != "xyes" ; then
286 if test "x$_version" = "x0" ; then
287 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.]])
289 AC_MSG_NOTICE([Your boost libraries seems to old (version $_version).])
291 # execute ACTION-IF-NOT-FOUND (if present):
292 ifelse([$3], , :, [$3])
294 AC_DEFINE(HAVE_BOOST,,[define if the Boost library is available])
295 # execute ACTION-IF-FOUND (if present):
296 ifelse([$2], , :, [$2])
299 CPPFLAGS="$CPPFLAGS_SAVED"
300 LDFLAGS="$LDFLAGS_SAVED"