6843c390a7c6d36eb3182a6e79d52d2a48fa390f
[folly.git] / folly / m4 / ax_boost_context.m4
1 # ===========================================================================
2 #     http://www.gnu.org/software/autoconf-archive/ax_boost_context.html
3 # ===========================================================================
4 #
5 # SYNOPSIS
6 #
7 #   AX_BOOST_CONTEXT
8 #
9 # DESCRIPTION
10 #
11 #   Test for Context library from the Boost C++ libraries. The macro
12 #   requires a preceding call to AX_BOOST_BASE. Further documentation is
13 #   available at <http://randspringer.de/boost/index.html>.
14 #
15 #   This macro calls:
16 #
17 #     AC_SUBST(BOOST_CONTEXT_LIB)
18 #
19 #   And sets:
20 #
21 #     HAVE_BOOST_CONTEXT
22 #
23 # LICENSE
24 #
25 #   Copyright (c) 2008 Thomas Porschberg <thomas@randspringer.de>
26 #   Copyright (c) 2008 Michael Tindal
27 #   Copyright (c) 2013 Daniel Casimiro <dan.casimiro@gmail.com>
28 #
29 #   Copying and distribution of this file, with or without modification, are
30 #   permitted in any medium without royalty provided the copyright notice
31 #   and this notice are preserved. This file is offered as-is, without any
32 #   warranty.
33
34 #serial 1
35
36 AC_DEFUN([AX_BOOST_CONTEXT],
37 [
38         AC_ARG_WITH([boost-context],
39                 AS_HELP_STRING([--with-boost-context@<:@=special-lib@:>@],
40                 [use the Context library from boost - it is possible to specify a certain library for the linker
41                         e.g. --with-boost-context=boost_context-gcc-mt ]), [
42                 if test "$withval" = "no"; then
43                         want_boost="no"
44                 elif test "$withval" = "yes"; then
45                         want_boost="yes"
46                         ax_boost_user_context_lib=""
47                 else
48                         want_boost="yes"
49                         ax_boost_user_context_lib="$withval"
50                 fi
51                 ], [want_boost="yes"]
52         )
53
54         if test "x$want_boost" = "xyes"; then
55                 AC_REQUIRE([AC_PROG_CC])
56                 AC_REQUIRE([AC_CANONICAL_BUILD])
57
58                 CPPFLAGS_SAVED="$CPPFLAGS"
59                 CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS"
60                 export CPPFLAGS
61
62                 LDFLAGS_SAVED="$LDFLAGS"
63                 LDFLAGS="$LDFLAGS $BOOST_LDFLAGS"
64                 export LDFLAGS
65
66                 AC_CACHE_CHECK(whether the Boost::Context library is available,
67                         ax_cv_boost_context,
68                         [AC_LANG_PUSH([C++])
69                         CXXFLAGS_SAVE=$CXXFLAGS
70
71                         AC_COMPILE_IFELSE([AC_LANG_PROGRAM(
72                                 [[@%:@include <boost/context/all.hpp>
73 #include <boost/version.hpp>
74 ]],
75                                 [[#if BOOST_VERSION >= 105600
76   boost::context::fcontext_t fc = boost::context::make_fcontext(0, 0, 0);
77 #else
78   boost::context::fcontext_t* fc = boost::context::make_fcontext(0, 0, 0);
79 #endif
80 ]]
81                                 )],
82                                 ax_cv_boost_context=yes, ax_cv_boost_context=no)
83                                 CXXFLAGS=$CXXFLAGS_SAVE
84                         AC_LANG_POP([C++])
85                 ])
86
87                 if test "x$ax_cv_boost_context" = "xyes"; then
88                         AC_SUBST(BOOST_CPPFLAGS)
89
90                         AC_DEFINE(HAVE_BOOST_CONTEXT,,[define if the Boost::Context library is available])
91                         BOOSTLIBDIR=`echo $BOOST_LDFLAGS | sed -e 's/@<:@^\/@:>@*//'`
92
93                         if test "x$ax_boost_user_context_lib" = "x"; then
94                                 for libextension in `ls $BOOSTLIBDIR/libboost_context*.so* $BOOSTLIBDIR/libboost_context*.dylib* $BOOSTLIBDIR/libboost_context*.a* 2>/dev/null | sed 's,.*/,,' | sed -e 's;^lib\(boost_context.*\)\.so.*$;\1;' -e 's;^lib\(boost_context.*\)\.dylib.*$;\1;' -e 's;^lib\(boost_context.*\)\.a.*$;\1;'` ; do
95                                         ax_lib=${libextension}
96                                         AC_CHECK_LIB($ax_lib, exit,
97                                                 [BOOST_CONTEXT_LIB="-l$ax_lib"; AC_SUBST(BOOST_CONTEXT_LIB) link_context="yes"; break],
98                                         [link_context="no"])
99                                 done
100
101                                 if test "x$link_context" != "xyes"; then
102                                         for libextension in `ls $BOOSTLIBDIR/boost_context*.dll* $BOOSTLIBDIR/boost_context*.a* 2>/dev/null | sed 's,.*/,,' | sed -e 's;^\(boost_context.*\)\.dll.*$;\1;' -e 's;^\(boost_context.*\)\.a.*$;\1;'` ; do
103                                                 ax_lib=${libextension}
104                                                 AC_CHECK_LIB($ax_lib, exit,
105                                                         [BOOST_CONTEXT_LIB="-l$ax_lib"; AC_SUBST(BOOST_CONTEXT_LIB) link_context="yes"; break],
106                                                         [link_context="no"])
107                                         done
108                                 fi
109
110                         else
111                                 for ax_lib in $ax_boost_user_context_lib boost_context-$ax_boost_user_context_lib; do
112                                         AC_CHECK_LIB($ax_lib, exit,
113                                                 [BOOST_CONTEXT_LIB="-l$ax_lib"; AC_SUBST(BOOST_CONTEXT_LIB) link_context="yes"; break],
114                                                 [link_context="no"])
115                                 done
116                         fi
117
118                         if test "x$ax_lib" = "x"; then
119                                 AC_MSG_ERROR(Could not find a version of the library!)
120                         fi
121
122                         if test "x$link_context" = "xno"; then
123                                 AC_MSG_ERROR(Could not link against $ax_lib !)
124                         fi
125                 fi
126
127                 CPPFLAGS="$CPPFLAGS_SAVED"
128                 LDFLAGS="$LDFLAGS_SAVED"
129         fi
130 ])
131