#
# SYNOPSIS
#
# AX_LIB_STDCXX
#
# DESCRIPTION
#
# Check for flags needed for new libc++ support.
#
# This is somewhat dependent on the internals of the generated configure file.
# $ac_link is manipulated to decouple the compiling from the linking. This
# allows AC_TRY_COMPILE to be used to generate the object file thereby checking
# for the requirement of particular flags when compiling, i.e. CXXFLAGS, while
# AC_LINK_IFELSE is used (via a munged $ac_link) to test the requirement of
# a flag at link time, i.e. LDFLAGS (e.g. when linking a number of object files
# without C++ source code).
#
# Aside: probably CPPFLAGS is the right place to put compile time flags because
# probably selection of the C++ library entails different sets of header
# files, but for some compilers, CXXFLAGS may be the right place
#
# LICENSE
#
# Copyright (C) 2014 Associated Universities, Inc. Washington DC, USA.
#
# Copying and distribution of this file, with or without modification, are
# permitted in any medium without royalty provided the copyright notice
# and this notice are preserved. This file is offered as-is, without any
# warranty.
#
AC_DEFUN([AX_LIB_STDCXX], [
AC_LANG_PUSH([C++])
AC_CACHE_CHECK( [for flags to support C++11 libc++], ax_cv_lib_stdcxx_cppflag, [
AC_CACHE_VAL( ax_cv_lib_stdcxx_ldflag, [
orig_CPPFLAGS="${CPPFLAGS}"
orig_LDFLAGS="${LD_FLAGS}"
ax_cv_lib_stdcxx_cppflag="no"
ax_cv_lib_stdcxx_ldflag="no"
for cppflag in "" "-stdlib=libc++"; do
CPPFLAGS="${orig_CPPFLAGS} ${cppflag}"
AC_TRY_COMPILE( [#include <memory>],
[auto val = std::make_shared<int>(90);],
[
ax_cv_lib_stdcxx_cppflag="${cppflag}"
CPPFLAGS="${orig_CPPFLAGS}"
mv conftest.$ac_objext xconftest.$ac_objext
orig_ac_link="$ac_link"
ac_link=`echo $ac_link | sed 's|conftest.$ac_ext|xconftest.$ac_objext|'`
for ldflag in "" "-stdlib=libc++"; do
LDFLAGS="${orig_LDFLAGS} ${ldflag}"
AC_LINK_IFELSE(, [ax_cv_lib_stdcxx_ldflag="${ldflag}"],
[ax_cv_lib_stdcxx_ldflag=no])
done
ac_link="${orig_ac_link}"
rm -f xconftest.$ac_objext
],
[ax_cv_lib_stdcxx_cppflag=no] )
if test "${ax_cv_lib_stdcxx_cppflag}" != "no" -a \
"${ax_cv_lib_stdcxx_ldflag}" != "no" ; then
break
else
ax_cv_lib_stdcxx_cppflag=no
ax_cv_lib_stdcxx_ldflag=no
fi
done
if test "${ax_cv_lib_stdcxx_cppflag}" != "no"; then
CPPFLAGS="${orig_CPPFLAGS} ${ax_cv_lib_stdcxx_cppflag}"
LDFLAGS="${orig_LDFLAGS} ${ax_cv_lib_stdcxx_ldflag}"
else
CPPFLAGS="${orig_CPPFLAGS}"
LDFLAGS="${orig_LDFLAGS}"
fi
])
])
AC_LANG_POP([C++])
])