blob: 83e9ad3d6dba189daa4afb5d15f7cf841a2a1cb7 [file] [log] [blame]
dnl Copyright (C) 1999-2005 Open Source Telecom Corporation.
dnl Copyright (C) 2006-2010 David Sugar, Tycho Softworks.
dnl
dnl This program is free software; you can redistribute it and/or modify
dnl it under the terms of the GNU General Public License as published by
dnl the Free Software Foundation; either version 2 of the License, or
dnl (at your option) any later version.
dnl
dnl This program is distributed in the hope that it will be useful,
dnl but WITHOUT ANY WARRANTY; without even the implied warranty of
dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
dnl GNU General Public License for more details.
dnl
dnl You should have received a copy of the GNU General Public License
dnl along with this program; if not, write to the Free Software
dnl Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
dnl
dnl As a special exception to the GNU General Public License, if you
dnl distribute this file as part of a program that contains a configuration
dnl script generated by Autoconf, you may include it under the same
dnl distribution terms that you use for the rest of that program.
AC_DEFUN([OST_CXX_PROGRAMMING],[
AC_REQUIRE([OST_PROG_CC_POSIX])
AC_PROG_CPP
AC_PROG_CXX
AC_PROG_CXXCPP
dnl
dnl Check for common C++ portability problems
dnl
AC_LANG_SAVE
ac_save_CXXFLAGS="$CXXFLAGS"
CXXFLAGS=""
AC_LANG_CPLUSPLUS
dnl Check whether we have bool
AC_CACHE_CHECK(whether ${CXX} has built-in bool type,
ac_cv_cxx_bool_type,
AC_TRY_COMPILE(,
[bool b1=true; bool b2=false;],
ac_cv_cxx_bool_type=yes,
ac_cv_cxx_bool_type=no
)
)
if test $ac_cv_cxx_bool_type = yes ; then
AC_DEFINE(HAVE_BOOL_TYPE, [1], [have bool type])
fi
AC_LANG_RESTORE
CXXFLAGS="$ac_save_CXXFLAGS"
AH_BOTTOM([
#ifndef HAVE_BOOL_TYPE
typedef enum { true=1, false=0 } bool;
#endif
])
])
AC_DEFUN([OST_CXX_NEW_INIT],[
AC_REQUIRE([OST_PROG_CC_POSIX])
# AC_PROG_CPP
# AC_PROG_CXX
# AC_PROG_CXXCPP
dnl
dnl Check for common C++ portability problems
dnl
AC_LANG_SAVE
ac_save_CXXFLAGS="$CXXFLAGS"
CXXFLAGS=""
AC_LANG_CPLUSPLUS
dnl Check whether we have bool
AC_CACHE_CHECK([whether ${CXX} has new(size_t,void*)],
ac_cv_cxx_new_init,
AC_TRY_COMPILE([#include <new>
#include <iostream>
using namespace std;],
[int* p1 = new int();
int* p2 = new (p1) int();
return 0;],
ac_cv_cxx_new_init=yes,
ac_cv_cxx_new_init=no
)
)
if test $ac_cv_cxx_new_init = yes ; then
AC_DEFINE(CCXX_HAVE_NEW_INIT, [1], [have new with init])
fi
AC_LANG_RESTORE
CXXFLAGS="$ac_save_CXXFLAGS"
AH_BOTTOM([
#ifdef CCXX_NAMESPACES
#define USING(x) using namespace x;
#else
#define USING(x)
#endif
#ifdef __KCC
#define KAI_NONSTD_IOSTREAM 1
#endif
])
])
AC_DEFUN([OST_CXX_ARRAYS],[
AC_REQUIRE([OST_CXX_PROGRAMMING])
dnl
dnl Determine C++ support for dynamic sized arrays in stack frame.
dnl
AC_LANG_SAVE
AC_LANG_CPLUSPLUS
ac_save_CXXFLAGS="$CXXFLAGS"
CXXFLAGS=""
AC_CACHE_CHECK(wheather dynamic arrays in stack frame,
ost_cv_cxx_array,
AC_TRY_COMPILE(,[
int x;
int y\[x\];
return 0;
], ost_cv_cxx_array=no, ost_cv_array=yes)
)
if test "$ost_cv_cxx_array" = yes ; then
AC_DEFINE(HAVE_DYN_ARRAY, [1], [c++ dynamic arrays in stack frame])
fi
AC_LANG_RESTORE
CXXFLAGS="$ac_save_CXXFLAGS"
])
AC_DEFUN([OST_CXX_IOSTREAM],[
AC_REQUIRE([OST_CXX_PROGRAMMING])
dnl
dnl Determine kind of C++ iostream support.
dnl
AC_LANG_SAVE
ac_save_CXXFLAGS="$CXXFLAGS"
CXXFLAGS=""
AC_LANG_CPLUSPLUS
AC_CACHE_CHECK(wheather old style iostreams,
ost_cv_cxx_iostream,
AC_TRY_COMPILE([
#include <iostream>
using namespace std;
class mystr : public streambuf, public iostream
{
mystr();
};
mystr::mystr() : streambuf(), iostream((streambuf *)this)
{
}
],[return 0;],
ost_cv_cxx_iostream=no,
ost_cv_cxx_iostream=yes
)
)
if test $ost_cv_cxx_iostream = yes ; then
AC_DEFINE(HAVE_OLD_IOSTREAM, [1], [old style iostreams])
fi
AC_CHECK_HEADERS(sstream)
AC_LANG_RESTORE
CXXFLAGS="$ac_save_CXXFLAGS"
])
AC_DEFUN([OST_CXX_NAMESPACE],[
AC_REQUIRE([OST_CXX_PROGRAMMING])
dnl
dnl Determine if C++ supports namespaces.
dnl
AC_LANG_SAVE
ac_save_CXXFLAGS="$CXXFLAGS"
CXXFLAGS=""
AC_LANG_CPLUSPLUS
AC_CACHE_CHECK(whether ${CXX} supports namespace,
ost_cv_cxx_namespace,
AC_TRY_COMPILE([
#include <iostream>
namespace Test { using namespace std; }],[return 0;],
ost_cv_cxx_namespace=yes,
ost_cv_cxx_namespace=no
)
)
if test "$ost_cv_cxx_namespace" = yes ; then
AC_DEFINE(CCXX_NAMESPACES, [1], [has c++ namespaces])
fi
AC_LANG_RESTORE
CXXFLAGS="$ac_save_CXXFLAGS"
])
AC_DEFUN([OST_CXX_MUTABLE],[
AC_REQUIRE([OST_CXX_PROGRAMMING])
dnl
dnl Determine if C++ supports mutable members.
dnl
AC_LANG_SAVE
ac_save_CXXFLAGS="$CXXFLAGS"
CXXFLAGS=""
AC_LANG_CPLUSPLUS
AC_CACHE_CHECK(whether ${CXX} supports mutable,
ost_cv_cxx_mutable,
AC_TRY_COMPILE([
class t {mutable int i;};], [return 0;],
ost_cv_cxx_mutable=yes,
ost_cv_cxx_mutable=no
)
)
if test $ost_cv_cxx_mutable = no ; then
COMMON_FLAGS="$COMMON_FLAGS -Dmutable"
fi
AC_LANG_RESTORE
CXXFLAGS="$ac_save_CXXFLAGS"
])
AC_DEFUN([OST_CXX_NOEXCEPTIONS],[
AC_REQUIRE([OST_CXX_PROGRAMMING])
dnl
dnl Disable C++ exception handling whenever possible.
dnl
AC_LANG_SAVE
ac_save_CXXFLAGS="$CXXFLAGS"
CXXFLAGS=""
AC_LANG_CPLUSPLUS
dnl strip -fexceptions flag if used
optflags=$CXXFLAGS
if test ! -z "$optflags" ; then
CXXFLAGS=""
for opt in $optflags ; do
case $opt in
*rtti*)
;;
*exceptions*)
;;
*)
CXXFLAGS="$CXXFLAGS $opt"
;;
esac
done
fi
AC_CACHE_CHECK(whether ${CXX} supports -fno-exceptions,
ac_cv_cxx_noexception_flag,[
echo 'void f(){}' >conftest.cpp
if test -z "`${CXX} -fno-exceptions -c conftest.cpp 2>&1`"; then
COMMON_FLAGS="$COMMON_FLAGS -fno-exceptions"
ac_cv_cxx_noexception_flag=yes
else
ac_cv_cxx_noexception_flag=no
fi
rm -f conftest*
])
AC_CACHE_CHECK(whether ${CXX} supports -fno-rtti,
ac_cv_cxx_no_rtti_flag,[
echo '#include <sstream>' >conftest.cpp
echo 'void f(){}' >>conftest.cpp
if test -z "`${CXX} -fno-rtti -c conftest.cpp 2>&1`"; then
COMMON_FLAGS="$COMMON_FLAGS -fno-rtti"
ac_cv_cxx_no_rtti_flag=yes
else
ac_cv_cxx_no_rtti_flag=no
fi
rm -f conftest*
])
AC_CACHE_CHECK(whether ${CXX} supports -fno-check-new,
ac_cv_cxx_no_check_new_flag,[
echo 'void f(){}' >conftest.cpp
if test -z "`${CXX} -fno-check-new -c conftest.cpp 2>&1`"; then
COMMON_FLAGS="$COMMON_FLAGS -fno-check-new"
ac_cv_cxx_no_check_new_flag=yes
else
ac_cv_cxx_no_check_new_flag=no
fi
rm -f conftest*
])
AC_CACHE_CHECK(whether ${CXX} supports -finline,
ac_cv_cxx_inline_flag,[
echo 'void f(){}' >conftest.cpp
if test -z "`${CXX} -finline -c conftest.cpp 2>&1`"; then
COMMON_FLAGS="$COMMON_FLAGS -finline"
ac_cv_cxx_inline_flag=yes
else
ac_cv_cxx_inline_flag=no
fi
rm -f conftest*
])
AC_LANG_RESTORE
CXXFLAGS="$ac_save_CXXFLAGS"
])
AC_DEFUN([OST_CXX_EXCEPTIONS],[
AC_REQUIRE([OST_CXX_PROGRAMMING])
dnl
dnl Enable C++ exception handling whenever possible.
dnl
AC_LANG_SAVE
ac_save_CXXFLAGS="$CXXFLAGS"
CXXFLAGS=""
AC_LANG_CPLUSPLUS
dnl strip -fno-exceptions flag if used
optflags=$CXXFLAGS
if test ! -z "$optflags" ; then
CXXFLAGS=""
for opt in $optflags ; do
case $opt in
*no-rtti*)
;;
*omit-frame-pointer*)
;;
*no-exceptions*)
;;
*)
CXXFLAGS="$CXXFLAGS $opt"
;;
esac
done
fi
dnl Check for exception handling
AC_CACHE_CHECK(whether ${CXX} supports -fhandle-exceptions,
ac_cv_cxx_exception_flag,[
echo 'void f(){}' >conftest.cpp
if test -z "`${CXX} -fhandle-exceptions -c conftest.cpp 2>&1`"; then
ac_cv_cxx_exception_flag=yes
COMMON_FLAGS="$COMMON_FLAGS -fhandle-exceptions"
else
ac_cv_cxx_exception_flag=no
fi
rm -f conftest*
])
if test $ac_cv_cxx_exception_flag = "yes" ; then
ac_cv_cxx_exception_handling=yes
else
AC_CACHE_CHECK(whether ${CXX} supports exception handling,
ac_cv_cxx_exception_handling,
AC_TRY_COMPILE(
[void f(void)
{
throw "abc";
}
void g(void)
{
try {
f();
}
catch(char*){}
}
],,
ac_cv_cxx_exception_handling=yes,
ac_cv_cxx_exception_handling=no
)
)
fi
if test $ac_cv_cxx_exception_handling = yes ; then
AC_DEFINE(CCXX_EXCEPTIONS, [1], [has c++ exception handling])
AC_CHECK_HEADERS(exception)
fi
AC_LANG_RESTORE
CXXFLAGS="$ac_save_CXXFLAGS"
AH_BOTTOM([
#ifndef CCXX_EXCEPTIONS
/* disable HAVE_EXCEPTION */
#ifdef HAVE_EXCEPTION
#undef HAVE_EXCEPTION
#endif
/* throw - replacement to throw an exception */
#define THROW(x) abort()
/* throw - replacement to declare an exception */
#define THROWS(x)
/* throw - for empty list */
#define NEW_THROWS
#define THROWS_EMPTY
/*
* work around dangeling if/else combinations:
*/
#else
#define THROW(x) throw x
#define THROWS(x) throw(x)
#define NEW_THROWS throw()
#define THROWS_EMPTY throw()
#endif
])
])