1# ===========================================================================
2#      https://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 45
37
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]])])
45
46AC_DEFUN([AX_BOOST_BASE],
47[
48AC_ARG_WITH([boost],
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)
53     @<:@ARG=yes@:>@ ])],
54    [
55     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"])
59    ],
60    [want_boost="yes"])
61
62
63AC_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.])],
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=""])
75
76BOOST_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])
105    succeeded=no
106
107
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      [ppc64|powerpc64|s390x|sparc64|aarch64|ppc64le|powerpc64le|riscv64],[libsubdirs="lib64 lib lib64"],
117      [libsubdirs="lib"]
118    )
119
120    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.
123    AS_CASE([${host_cpu}],
124      [i?86],[multiarch_libsubdir="lib/i386-${host_os}"],
125      [multiarch_libsubdir="lib/${host_cpu}-${host_os}"]
126    )
127
128    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
131    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
156                done
157                BOOST_LDFLAGS="-L$_AX_BOOST_BASE_boost_path_tmp/$libsubdir"
158                BOOST_CPPFLAGS="-I$_AX_BOOST_BASE_boost_path_tmp/include"
159                break;
160            fi
161        done
162    ])
163
164    dnl overwrite ld flags if we have required special directory with
165    dnl --with-boost-libdir parameter
166    AS_IF([test "x$_AX_BOOST_BASE_boost_lib_path" != "x"],
167          [BOOST_LDFLAGS="-L$_AX_BOOST_BASE_boost_lib_path"])
168
169    AC_MSG_CHECKING([for boostlib >= $1 ($WANT_BOOST_VERSION)])
170    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++)
180        AC_COMPILE_IFELSE([_AX_BOOST_BASE_PROGRAM($WANT_BOOST_VERSION)],[
181        AC_MSG_RESULT(yes)
182    succeeded=yes
183    found_system=yes
184        ],[
185        ])
186    AC_LANG_POP([C++])
187
188
189
190    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
192    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
199        _version=0
200        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/_/./'`
204                    V_CHECK=`expr $_version_tmp \> $_version`
205                    if test "x$V_CHECK" = "x1" ; then
206                        _version=$_version_tmp
207                    fi
208                    VERSION_UNDERSCORE=`echo $_version | sed 's/\./_/'`
209                    BOOST_CPPFLAGS="-I$_AX_BOOST_BASE_boost_path/include/boost-$VERSION_UNDERSCORE"
210                done
211                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
225            fi
226        else
227            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/_/./'`
232                            V_CHECK=`expr $_version_tmp \> $_version`
233                            if test "x$V_CHECK" = "x1" ; then
234                                _version=$_version_tmp
235                                best_path=$_AX_BOOST_BASE_boost_path
236                            fi
237                        done
238                    fi
239                done
240
241                VERSION_UNDERSCORE=`echo $_version | sed 's/\./_/'`
242                BOOST_CPPFLAGS="-I$best_path/include/boost-$VERSION_UNDERSCORE"
243                if test -z "$_AX_BOOST_BASE_boost_lib_path" ; then
244                    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
250
251            if test -n "$BOOST_ROOT" ; then
252                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`
260                    if test "x$V_CHECK" = "x1" && test -z "$_AX_BOOST_BASE_boost_lib_path" ; then
261                        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
268
269        CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS"
270        export CPPFLAGS
271        LDFLAGS="$LDFLAGS $BOOST_LDFLAGS"
272        export LDFLAGS
273
274        AC_LANG_PUSH(C++)
275            AC_COMPILE_IFELSE([_AX_BOOST_BASE_PROGRAM($WANT_BOOST_VERSION)],[
276            AC_MSG_RESULT(yes)
277        succeeded=yes
278        found_system=yes
279            ],[
280            ])
281        AC_LANG_POP([C++])
282    fi
283
284    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.]])
287        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
293        AC_DEFINE(HAVE_BOOST,,[define if the Boost library is available])
294        # execute ACTION-IF-FOUND (if present):
295        ifelse([$2], , :, [$2])
296    fi
297
298    CPPFLAGS="$CPPFLAGS_SAVED"
299    LDFLAGS="$LDFLAGS_SAVED"
300
301])
302