ceph 12.1.2 fails to build with gcc-7 on 32 bit architectures (i386 or armhf):
In file included from /usr/include/boost/variant.hpp:17:0,
from /root/ceph/src/common/cmdparse.h:9,
from /root/ceph/src/common/ceph_context.h:22,
from /root/ceph/src/common/Mutex.h:20,
from /root/ceph/src/common/config.h:21,
from /root/ceph/src/common/dout.h:22,
from /root/ceph/src/include/Context.h:19,
from /root/ceph/src/common/Cond.h:19,
from /root/ceph/src/common/Timer.h:18,
from /root/ceph/src/tools/rbd_mirror/InstanceReplayer.cc:5:
/usr/include/boost/variant/variant.hpp: In instantiation of ‘void boost::variant<T0, TN>::convert_construct(T&, int, mpl_::false_) [with T = unsigned int; T0_ = bool; TN = {long long unsigned int, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >}; mpl_::false_ = mpl_::bool_<false>]’:
/usr/include/boost/variant/variant.hpp:1777:26: required from ‘boost::variant<T0, TN>::variant(T&, typename boost::enable_if<boost::mpl::and_<boost::mpl::not_<boost::is_const<T> >, boost::mpl::not_<boost::is_same<T, boost::variant<T0, TN> > >, boost::detail::variant::is_variant_constructible_from<T&, typename boost::mpl::transform<typename boost::mpl::eval_if<boost::variant<T0, TN>::is_recursive_, boost::mpl::transform<typename boost::mpl::eval_if<boost::variant<T0, TN>::is_sequence_based_, typename boost::mpl::eval_if<boost::variant<T0, TN>::is_recursive_, T0_, boost::mpl::identity<T> >::type, boost::detail::variant::make_variant_list<typename boost::mpl::eval_if<boost::variant<T0, TN>::is_recursive_, T0_, boost::mpl::identity<T> >::type, TN ...> >::type, boost::mpl::protect<boost::detail::variant::quoted_enable_recursive<boost::variant<T0, TN> > > >, boost::mpl::identity<typename boost::mpl::eval_if<boost::variant<T0, TN>::is_sequence_based_, typename boost::mpl::eval_if<boost::variant<T0, TN>::is_recursive_, T0_, boost::mpl::identity<T> >::type, boost::detail::variant::make_variant_list<typename boost::mpl::eval_if<boost::variant<T0, TN>::is_recursive_, T0_, boost::mpl::identity<T> >::type, TN ...> >::type> >::type, boost::mpl::protect<boost::detail::make_reference_content<mpl_::void_> > >::type> > >::type*) [with T = unsigned int; T0_ = bool; TN = {long long unsigned int, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >}; typename boost::enable_if<boost::mpl::and_<boost::mpl::not_<boost::is_const<T> >, boost::mpl::not_<boost::is_same<T, boost::variant<T0, TN> > >, boost::detail::variant::is_variant_constructible_from<T&, typename boost::mpl::transform<typename boost::mpl::eval_if<boost::variant<T0, TN>::is_recursive_, boost::mpl::transform<typename boost::mpl::eval_if<boost::variant<T0, TN>::is_sequence_based_, typename boost::mpl::eval_if<boost::variant<T0, TN>::is_recursive_, T0_, boost::mpl::identity<T> >::type, boost::detail::variant::make_variant_list<typename boost::mpl::eval_if<boost::variant<T0, TN>::is_recursive_, T0_, boost::mpl::identity<T> >::type, TN ...> >::type, boost::mpl::protect<boost::detail::variant::quoted_enable_recursive<boost::variant<T0, TN> > > >, boost::mpl::identity<typename boost::mpl::eval_if<boost::variant<T0, TN>::is_sequence_based_, typename boost::mpl::eval_if<boost::variant<T0, TN>::is_recursive_, T0_, boost::mpl::identity<T> >::type, boost::detail::variant::make_variant_list<typename boost::mpl::eval_if<boost::variant<T0, TN>::is_recursive_, T0_, boost::mpl::identity<T> >::type, TN ...> >::type> >::type, boost::mpl::protect<boost::detail::make_reference_content<mpl_::void_> > >::type> > >::type = void]’
/root/ceph/src/tools/rbd_mirror/InstanceReplayer.cc:355:3: required from ‘void rbd::mirror::InstanceReplayer<ImageCtxT>::start_image_replayers(int) [with ImageCtxT = librbd::ImageCtx]’
/root/ceph/src/tools/rbd_mirror/InstanceReplayer.cc:496:29: required from here
/usr/include/boost/variant/variant.hpp:1604:38: error: call of overloaded ‘initialize(void*, unsigned int&)’ is ambiguous
initializer::initialize(
~~~~~~~~~~~~~~~~~~~~~~~^
storage_.address()
~~~~~~~~~~~~~~~~~~
, operand
~~~~~~~~~
)
~
In file included from /usr/include/boost/variant/variant.hpp:30:0,
from /usr/include/boost/variant.hpp:17,
from /root/ceph/src/common/cmdparse.h:9,
from /root/ceph/src/common/ceph_context.h:22,
from /root/ceph/src/common/Mutex.h:20,
from /root/ceph/src/common/config.h:21,
from /root/ceph/src/common/dout.h:22,
from /root/ceph/src/include/Context.h:19,
from /root/ceph/src/common/Cond.h:19,
from /root/ceph/src/common/Timer.h:18,
from /root/ceph/src/tools/rbd_mirror/InstanceReplayer.cc:5:
/usr/include/boost/variant/detail/initializer.hpp:104:24: note: candidate: static int boost::detail::variant::make_initializer_node::apply<BaseIndexPair, Iterator>::initializer_node::initialize(void*, boost::detail::variant::make_initializer_node::apply<BaseIndexPair, Iterator>::initializer_node::param_T) [with BaseIndexPair = boost::mpl::pair<boost::detail::variant::initializer_root, mpl_::int_<0> >; Iterator = boost::mpl::l_iter<boost::mpl::list3<bool, long long unsigned int, std::__cxx11::basic_string<char> > >; boost::detail::variant::make_initializer_node::apply<BaseIndexPair, Iterator>::initializer_node::param_T = const bool&]
static int initialize(void* dest, param_T operand)
^~~~~~~~~~
/usr/include/boost/variant/detail/initializer.hpp:115:24: note: candidate: static int boost::detail::variant::make_initializer_node::apply<BaseIndexPair, Iterator>::initializer_node::initialize(void*, boost::detail::variant::make_initializer_node::apply<BaseIndexPair, Iterator>::initializer_node::param2_T) [with BaseIndexPair = boost::mpl::pair<boost::detail::variant::initializer_root, mpl_::int_<0> >; Iterator = boost::mpl::l_iter<boost::mpl::list3<bool, long long unsigned int, std::__cxx11::basic_string<char> > >; boost::detail::variant::make_initializer_node::apply<BaseIndexPair, Iterator>::initializer_node::param2_T = bool&&]
static int initialize(void* dest, param2_T operand)
^~~~~~~~~~
/usr/include/boost/variant/detail/initializer.hpp:115:24: note: candidate: static int boost::detail::variant::make_initializer_node::apply<BaseIndexPair, Iterator>::initializer_node::initialize(void*, boost::detail::variant::make_initializer_node::apply<BaseIndexPair, Iterator>::initializer_node::param2_T) [with BaseIndexPair = boost::mpl::pair<boost::detail::variant::make_initializer_node::apply<boost::mpl::pair<boost::detail::variant::initializer_root, mpl_::int_<0> >, boost::mpl::l_iter<boost::mpl::list3<bool, long long unsigned int, std::__cxx11::basic_string<char> > > >::initializer_node, mpl_::int_<1> >; Iterator = boost::mpl::l_iter<boost::mpl::list2<long long unsigned int, std::__cxx11::basic_string<char> > >; boost::detail::variant::make_initializer_node::apply<BaseIndexPair, Iterator>::initializer_node::param2_T = long long unsigned int&&]
/usr/include/boost/variant/detail/initializer.hpp:104:24: note: candidate: static int boost::detail::variant::make_initializer_node::apply<BaseIndexPair, Iterator>::initializer_node::initialize(void*, boost::detail::variant::make_initializer_node::apply<BaseIndexPair, Iterator>::initializer_node::param_T) [with BaseIndexPair = boost::mpl::pair<boost::detail::variant::make_initializer_node::apply<boost::mpl::pair<boost::detail::variant::initializer_root, mpl_::int_<0> >, boost::mpl::l_iter<boost::mpl::list3<bool, long long unsigned int, std::__cxx11::basic_string<char> > > >::initializer_node, mpl_::int_<1> >; Iterator = boost::mpl::l_iter<boost::mpl::list2<long long unsigned int, std::__cxx11::basic_string<char> > >; boost::detail::variant::make_initializer_node::apply<BaseIndexPair, Iterator>::initializer_node::param_T = const long long unsigned int&]
static int initialize(void* dest, param_T operand)
^~~~~~~~~~
src/tools/rbd_mirror/CMakeFiles/rbd_mirror_internal.dir/build.make:182: recipe for target 'src/tools/rbd_mirror/CMakeFiles/rbd_mirror_internal.dir/InstanceReplayer.cc.o' failed
make[2]: *** [src/tools/rbd_mirror/CMakeFiles/rbd_mirror_internal.dir/InstanceReplayer.cc.o] Error 1
Full log:
https://launchpadlibrarian.net/332283208/buildlog_ubuntu-artful-armhf.ceph_12.1.2-0ubuntu1_BUILDING.txt.gz
code that's causing this ambiguity:
static int initialize(void* dest, param_T operand)
typedef typename boost:: detail: :make_reference _content<
recursive_ enabled_ T
> ::type internal_T;
{
}
#ifndef BOOST_NO_ CXX11_RVALUE_ REFERENCES
BOOST_ ASSERT( !is_reference_ content_ t::value) ;
static int initialize(void* dest, param2_T operand)
{
// This assert must newer trigger, because all the reference contents are
// handled by the initilize(void* dest, param_T operand) function above
}
#endif
gcc definition for this flag:
// C++0x features in 4.3.n and later BOOST_GCC_ CXX11) TAL_CXX0X_ _. RVALUE_ REFS STATIC_ ASSERT VARIADIC_ TMPL CXX11_DECLTYPE CXX11_FUNCTION_ TEMPLATE_ DEFAULT_ ARGS CXX11_RVALUE_ REFERENCES CXX11_STATIC_ ASSERT
//
#if (BOOST_GCC_VERSION >= 40300) && defined(
// C++0x features are only enabled when -std=c++0x or -std=gnu++0x are
// passed on the command line, which in turn defines
// __GXX_EXPERIMEN
# define BOOST_HAS_DECLTYPE
# define BOOST_HAS_
# define BOOST_HAS_
# define BOOST_HAS_
#else
# define BOOST_NO_
# define BOOST_NO_
# define BOOST_NO_
# define BOOST_NO_
#endif
and
#if defined( __GXX_EXPERIMEN TAL_CXX0X_ _) || (__cplusplus >= 201103L)
# define BOOST_GCC_CXX11
#endif