]> git.saurik.com Git - wxWidgets.git/blobdiff - acinclude.m4
fixed warnings about possibly uninitialized variables; commented non trivial piece...
[wxWidgets.git] / acinclude.m4
index c81c17bc7b4556108f1e87bf76bce4764ba082e3..ea80b748255740a86d7a7b824dc844671541d0d3 100644 (file)
@@ -8,6 +8,89 @@ dnl
 dnl Version: $Id$
 dnl ---------------------------------------------------------------------------
 
 dnl Version: $Id$
 dnl ---------------------------------------------------------------------------
 
+dnl ===========================================================================
+dnl macros to detect specialty compiler options
+dnl ===========================================================================
+
+dnl Figure out if we need to pass -ext o to compiler (MetroWerks)
+AC_DEFUN([AC_WX_METROWERKS_EXTO],
+[AC_CACHE_CHECK([if the _AC_LANG compiler requires -ext o], wx_cv_[]_AC_LANG_ABBREV[]_exto,
+dnl First create an empty conf test
+[AC_LANG_CONFTEST([AC_LANG_PROGRAM()])
+dnl Now remove .o and .c.o or .cc.o
+rm -f conftest.$ac_objext conftest.$ac_ext.o
+dnl Now compile the test
+AS_IF([AC_TRY_EVAL(ac_compile)],
+dnl If the test succeeded look for conftest.c.o or conftest.cc.o
+[for ac_file in `(ls conftest.* 2>/dev/null)`; do
+    case $ac_file in
+        conftest.$ac_ext.o)
+            wx_cv_[]_AC_LANG_ABBREV[]_exto="-ext o"
+            ;;
+        *)
+            ;;
+    esac
+done],
+[AC_MSG_FAILURE([cannot figure out if compiler needs -ext o: cannot compile])
+]) dnl AS_IF
+
+rm -f conftest.$ac_ext.o conftest.$ac_objext conftest.$ac_ext
+]) dnl AC_CACHE_CHECK
+
+if test "x$wx_cv_[]_AC_LANG_ABBREV[]_exto" '!=' "x"; then
+    if test "[]_AC_LANG_ABBREV[]" = "c"; then
+        CFLAGS="$wx_cv_[]_AC_LANG_ABBREV[]_exto $CFLAGS"
+    fi
+    if test "[]_AC_LANG_ABBREV[]" = "cxx"; then
+        CXXFLAGS="$wx_cv_[]_AC_LANG_ABBREV[]_exto $CXXFLAGS"
+    fi
+fi
+]) dnl AC_DEFUN
+
+
+dnl Based on autoconf _AC_LANG_COMPILER_GNU
+AC_DEFUN([_AC_WX_LANG_COMPILER_XLC],
+[AC_CACHE_CHECK([whether we are using the IBM xlC _AC_LANG compiler],
+    [wx_cv_[]_AC_LANG_ABBREV[]_compiler_xlc],
+    [AC_TRY_COMPILE([],[#ifndef __xlC__
+       choke me
+#endif
+],
+        [wx_compiler_xlc=yes],
+        [wx_compiler_xlc=no])
+    wx_cv_[]_AC_LANG_ABBREV[]_compiler_xlc=$wx_compiler_xlc
+    ])
+])
+
+dnl Loosely based on autoconf AC_PROG_CC
+AC_DEFUN([AC_WX_PROG_XLCC],
+[AC_LANG_PUSH(C)
+_AC_WX_LANG_COMPILER_XLC
+XLCC=`test $wx_cv_c_compiler_xlc = yes && echo yes`
+AC_LANG_POP(C)
+])
+
+dnl Loosely based on autoconf AC_PROG_CXX
+AC_DEFUN([AC_WX_PROG_XLCXX],
+[AC_LANG_PUSH(C++)
+_AC_WX_LANG_COMPILER_XLC
+XLCXX=`test $wx_cv_cxx_compiler_xlc = yes && echo yes`
+AC_LANG_POP(C++)
+])
+
+dnl ===========================================================================
+dnl Objective-C(++) related macros
+dnl ===========================================================================
+m4_define([AC_WX_LANG_OBJECTIVEC],
+[AC_LANG(C)
+ac_ext=m
+])
+
+m4_define([AC_WX_LANG_OBJECTIVECPLUSPLUS],
+[AC_LANG(C++)
+ac_ext=mm
+])
+
 dnl ===========================================================================
 dnl macros to find the a file in the list of include/lib paths
 dnl ===========================================================================
 dnl ===========================================================================
 dnl macros to find the a file in the list of include/lib paths
 dnl ===========================================================================
@@ -19,7 +102,7 @@ dnl ---------------------------------------------------------------------------
 AC_DEFUN([WX_PATH_FIND_INCLUDES],
 [
 ac_find_includes=
 AC_DEFUN([WX_PATH_FIND_INCLUDES],
 [
 ac_find_includes=
-for ac_dir in $1;
+for ac_dir in $1 /usr/include;
   do
     if test -f "$ac_dir/$2"; then
       ac_find_includes=$ac_dir
   do
     if test -f "$ac_dir/$2"; then
       ac_find_includes=$ac_dir
@@ -35,7 +118,7 @@ dnl ---------------------------------------------------------------------------
 AC_DEFUN([WX_PATH_FIND_LIBRARIES],
 [
 ac_find_libraries=
 AC_DEFUN([WX_PATH_FIND_LIBRARIES],
 [
 ac_find_libraries=
-for ac_dir in $1;
+for ac_dir in $1 /usr/lib;
   do
     for ac_extension in a so sl dylib; do
       if test -f "$ac_dir/lib$2.$ac_extension"; then
   do
     for ac_extension in a so sl dylib; do
       if test -f "$ac_dir/lib$2.$ac_extension"; then
@@ -51,13 +134,17 @@ dnl Path to include, already defined
 dnl ---------------------------------------------------------------------------
 AC_DEFUN([WX_INCLUDE_PATH_EXIST],
 [
 dnl ---------------------------------------------------------------------------
 AC_DEFUN([WX_INCLUDE_PATH_EXIST],
 [
-  ac_path_to_include=$1
-  echo "$2" | grep "\-I$1" > /dev/null
-  result=$?
-  if test $result = 0; then
+  dnl never add -I/usr/include to the CPPFLAGS
+  if test "x$1" = "x/usr/include"; then
     ac_path_to_include=""
   else
     ac_path_to_include=""
   else
-    ac_path_to_include=" -I$1"
+    echo "$2" | grep "\-I$1" > /dev/null
+    result=$?
+    if test $result = 0; then
+      ac_path_to_include=""
+    else
+      ac_path_to_include=" -I$1"
+    fi
   fi
 ])
 
   fi
 ])
 
@@ -84,14 +171,11 @@ dnl WX_CPP_NEW_HEADERS checks whether the compiler has "new" <iostream> header
 dnl or only the old <iostream.h> one - it may be generally assumed that if
 dnl <iostream> exists, the other "new" headers (without .h) exist too.
 dnl
 dnl or only the old <iostream.h> one - it may be generally assumed that if
 dnl <iostream> exists, the other "new" headers (without .h) exist too.
 dnl
-dnl call WX_CPP_NEW_HEADERS(actiof-if-true, action-if-false-or-cross-compiling)
+dnl call WX_CPP_NEW_HEADERS(actiof-if-true, action-if-false)
 dnl ---------------------------------------------------------------------------
 
 AC_DEFUN([WX_CPP_NEW_HEADERS],
 [
 dnl ---------------------------------------------------------------------------
 
 AC_DEFUN([WX_CPP_NEW_HEADERS],
 [
-  if test "$cross_compiling" = "yes"; then
-    ifelse([$2], , :, [$2])
-  else
     AC_LANG_SAVE
     AC_LANG_CPLUSPLUS
 
     AC_LANG_SAVE
     AC_LANG_CPLUSPLUS
 
@@ -104,7 +188,6 @@ AC_DEFUN([WX_CPP_NEW_HEADERS],
     fi
 
     AC_LANG_RESTORE
     fi
 
     AC_LANG_RESTORE
-  fi
 ])
 
 dnl ---------------------------------------------------------------------------
 ])
 
 dnl ---------------------------------------------------------------------------
@@ -144,6 +227,53 @@ AC_DEFUN([WX_CPP_BOOL],
   fi
 ])
 
   fi
 ])
 
+dnl ---------------------------------------------------------------------------
+dnl WX_CPP_EXPLICIT checks whether the C++ compiler support the explicit
+dnl keyword and defines HAVE_EXPLICIT if this is the case
+dnl ---------------------------------------------------------------------------
+
+AC_DEFUN([WX_CPP_EXPLICIT],
+[
+  AC_CACHE_CHECK([if C++ compiler supports the explicit keyword],
+                 wx_cv_explicit,
+  [
+    AC_LANG_SAVE
+    AC_LANG_CPLUSPLUS
+
+    dnl do the test in 2 steps: first check that the compiler knows about the
+    dnl explicit keyword at all and then verify that it really honours it
+    AC_TRY_COMPILE(
+      [
+        class Foo { public: explicit Foo(int) {} };
+      ],
+      [
+        return 0;
+      ],
+      [
+        AC_TRY_COMPILE(
+            [
+                class Foo { public: explicit Foo(int) {} };
+                static void TakeFoo(const Foo& foo) { }
+            ],
+            [
+                TakeFoo(17);
+                return 0;
+            ],
+            wx_cv_explicit=no,
+            wx_cv_explicit=yes
+        )
+      ],
+      wx_cv_explicit=no
+    )
+
+    AC_LANG_RESTORE
+  ])
+
+  if test "$wx_cv_explicit" = "yes"; then
+    AC_DEFINE(HAVE_EXPLICIT)
+  fi
+])
+
 dnl ---------------------------------------------------------------------------
 dnl a slightly better AC_C_BIGENDIAN macro which allows cross-compiling
 dnl ---------------------------------------------------------------------------
 dnl ---------------------------------------------------------------------------
 dnl a slightly better AC_C_BIGENDIAN macro which allows cross-compiling
 dnl ---------------------------------------------------------------------------
@@ -289,10 +419,15 @@ AC_DEFUN([WX_ARG_WITH],
         ])
 
 dnl like WX_ARG_WITH but uses AC_ARG_ENABLE instead of AC_ARG_WITH
         ])
 
 dnl like WX_ARG_WITH but uses AC_ARG_ENABLE instead of AC_ARG_WITH
-dnl usage: WX_ARG_ENABLE(option, helpmessage, variable-name)
+dnl usage: WX_ARG_ENABLE(option, helpmessage, variable-name, enablestring)
+dnl
+dnl enablestring is a hack and allows to show "checking for --disable-foo"
+dnl message when running configure instead of the default "checking for
+dnl --enable-foo" one whih is useful for the options enabled by default
 AC_DEFUN([WX_ARG_ENABLE],
         [
 AC_DEFUN([WX_ARG_ENABLE],
         [
-          AC_MSG_CHECKING([for --enable-$1])
+         enablestring=$4
+          AC_MSG_CHECKING([for --${enablestring:-enable}-$1])
           no_cache=0
           AC_ARG_ENABLE($1, [$2],
                         [
           no_cache=0
           AC_ARG_ENABLE($1, [$2],
                         [
@@ -326,6 +461,59 @@ AC_DEFUN([WX_ARG_ENABLE],
         ])
 
 
         ])
 
 
+dnl ===========================================================================
+dnl Linker features test
+dnl ===========================================================================
+
+dnl ---------------------------------------------------------------------------
+dnl WX_VERSIONED_SYMBOLS checks whether the linker can create versioned
+dnl symbols. If it can, sets LDFLAGS_VERSIONING to $CXX flags needed to use
+dnl version script file named versionfile
+dnl
+dnl call WX_VERSIONED_SYMBOLS(versionfile)
+dnl ---------------------------------------------------------------------------
+AC_DEFUN([WX_VERSIONED_SYMBOLS],
+[
+  found_versioning=no
+
+  dnl FIXME - doesn't work, Solaris linker doesn't accept wildcards
+  dnl         in the script.
+  dnl dnl Check for known non-gcc cases:
+  dnl case "${host}" in
+  dnl   *-*-solaris2* )
+  dnl     if test "x$GCC" != "xyes" ; then
+  dnl         LDFLAGS_VERSIONING="-M $1"
+  dnl         found_versioning=yes
+  dnl     fi
+  dnl   ;;
+  dnl esac
+  
+  dnl Generic check for GCC or GCC-like behaviour (Intel C++, GCC):
+  if test $found_versioning = no ; then
+      AC_CACHE_CHECK([if the linker accepts --version-script], wx_cv_version_script,
+      [
+        echo "VER_1 { *; };" >conftest.sym
+        echo "int main() { return 0; }" >conftest.cpp
+  
+        if AC_TRY_COMMAND([
+                $CXX -o conftest.output $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.cpp
+                -Wl,--version-script,conftest.sym >/dev/null 2>conftest.stderr]) ; then
+          if test -s conftest.stderr ; then
+              wx_cv_version_script=no
+          else
+              wx_cv_version_script=yes
+          fi
+        else
+          wx_cv_version_script=no
+        fi
+        rm -f conftest.output conftest.stderr conftest.sym conftest.cpp
+      ])
+      if test $wx_cv_version_script = yes ; then
+        LDFLAGS_VERSIONING="-Wl,--version-script,$1"
+      fi
+  fi
+])
+
 
 dnl ===========================================================================
 dnl "3rd party" macros included here because they are not widely available
 
 dnl ===========================================================================
 dnl "3rd party" macros included here because they are not widely available
@@ -471,3 +659,80 @@ if test "$enable_largefile" != no; then
     AC_MSG_RESULT($wx_largefile)
 fi
 ])
     AC_MSG_RESULT($wx_largefile)
 fi
 ])
+
+
+dnl Available from the GNU Autoconf Macro Archive at:
+dnl http://www.gnu.org/software/ac-archive/htmldoc/ac_cxx_const_cast.html
+dnl
+AC_DEFUN([AC_CXX_CONST_CAST],
+[AC_CACHE_CHECK(whether the compiler supports const_cast<>,
+ac_cv_cxx_const_cast,
+[AC_LANG_SAVE
+ AC_LANG_CPLUSPLUS
+ AC_TRY_COMPILE(,[int x = 0;const int& y = x;int& z = const_cast<int&>(y);return z;],
+ ac_cv_cxx_const_cast=yes, ac_cv_cxx_const_cast=no)
+ AC_LANG_RESTORE
+])
+if test "$ac_cv_cxx_const_cast" = yes; then
+  AC_DEFINE(HAVE_CONST_CAST,,[define if the compiler supports const_cast<>])
+fi
+])
+
+dnl http://www.gnu.org/software/ac-archive/htmldoc/ac_cxx_reinterpret_cast.html
+AC_DEFUN([AC_CXX_REINTERPRET_CAST],
+[AC_CACHE_CHECK(whether the compiler supports reinterpret_cast<>,
+ac_cv_cxx_reinterpret_cast,
+[AC_LANG_SAVE
+ AC_LANG_CPLUSPLUS
+ AC_TRY_COMPILE([#include <typeinfo>
+class Base { public : Base () {} virtual void f () = 0;};
+class Derived : public Base { public : Derived () {} virtual void f () {} };
+class Unrelated { public : Unrelated () {} };
+int g (Unrelated&) { return 0; }],[
+Derived d;Base& b=d;Unrelated& e=reinterpret_cast<Unrelated&>(b);return g(e);],
+ ac_cv_cxx_reinterpret_cast=yes, ac_cv_cxx_reinterpret_cast=no)
+ AC_LANG_RESTORE
+])
+if test "$ac_cv_cxx_reinterpret_cast" = yes; then
+  AC_DEFINE(HAVE_REINTERPRET_CAST,,
+            [define if the compiler supports reinterpret_cast<>])
+fi
+])
+
+dnl and http://www.gnu.org/software/ac-archive/htmldoc/ac_cxx_static_cast.html
+AC_DEFUN([AC_CXX_STATIC_CAST],
+[AC_CACHE_CHECK(whether the compiler supports static_cast<>,
+ac_cv_cxx_static_cast,
+[AC_LANG_SAVE
+ AC_LANG_CPLUSPLUS
+ AC_TRY_COMPILE([#include <typeinfo>
+class Base { public : Base () {} virtual void f () = 0; };
+class Derived : public Base { public : Derived () {} virtual void f () {} };
+int g (Derived&) { return 0; }],[
+Derived d; Base& b = d; Derived& s = static_cast<Derived&> (b); return g (s);],
+ ac_cv_cxx_static_cast=yes, ac_cv_cxx_static_cast=no)
+ AC_LANG_RESTORE
+])
+if test "$ac_cv_cxx_static_cast" = yes; then
+  AC_DEFINE(HAVE_STATIC_CAST,, [define if the compiler supports static_cast<>])
+fi
+])
+
+dnl http://autoconf-archive.cryp.to/ac_cxx_dynamic_cast.html
+AC_DEFUN([AC_CXX_DYNAMIC_CAST],
+[AC_CACHE_CHECK(whether the compiler supports dynamic_cast<>,
+ac_cv_cxx_dynamic_cast,
+[AC_LANG_SAVE
+ AC_LANG_CPLUSPLUS
+ AC_TRY_COMPILE([#include <typeinfo>
+class Base { public : Base () {} virtual void f () = 0;};
+class Derived : public Base { public : Derived () {} virtual void f () {} };],[
+Derived d; Base& b=d; return dynamic_cast<Derived*>(&b) ? 0 : 1;],
+ ac_cv_cxx_dynamic_cast=yes, ac_cv_cxx_dynamic_cast=no)
+ AC_LANG_RESTORE
+])
+if test "$ac_cv_cxx_dynamic_cast" = yes; then
+  AC_DEFINE(HAVE_DYNAMIC_CAST,,[define if the compiler supports dynamic_cast<>])
+fi
+])
+