]> git.saurik.com Git - wxWidgets.git/blobdiff - acinclude.m4
Add wxHtmlTag::GetParamAsString() convenience method.
[wxWidgets.git] / acinclude.m4
index c81c17bc7b4556108f1e87bf76bce4764ba082e3..bd17ead502a60b9b4f42ab647344a598e498c259 100644 (file)
@@ -4,12 +4,24 @@ dnl Macros for configure.in for wxWindows by Robert Roebling, Phil Blecker,
 dnl Vadim Zeitlin and Ron Lee
 dnl
 dnl This script is under the wxWindows licence.
 dnl Vadim Zeitlin and Ron Lee
 dnl
 dnl This script is under the wxWindows licence.
-dnl
-dnl Version: $Id$
 dnl ---------------------------------------------------------------------------
 
 dnl ---------------------------------------------------------------------------
 
+
+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 ===========================================================================
-dnl macros to find the a file in the list of include/lib paths
+dnl macros to find a file in the list of include/lib paths
 dnl ===========================================================================
 
 dnl ---------------------------------------------------------------------------
 dnl ===========================================================================
 
 dnl ---------------------------------------------------------------------------
@@ -19,7 +31,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
@@ -29,16 +41,17 @@ for ac_dir in $1;
 ])
 
 dnl ---------------------------------------------------------------------------
 ])
 
 dnl ---------------------------------------------------------------------------
-dnl call WX_PATH_FIND_LIBRARIES(search path, header name), sets ac_find_libraries
-dnl to the full name of the file that was found or leaves it empty if not found
+dnl call WX_PATH_FIND_LIBRARIES(lib name, [optional extra search paths])
+dnl sets ac_find_libraries to the full name of the file that was found
+dnl or leaves it empty if not found
 dnl ---------------------------------------------------------------------------
 AC_DEFUN([WX_PATH_FIND_LIBRARIES],
 [
 dnl ---------------------------------------------------------------------------
 AC_DEFUN([WX_PATH_FIND_LIBRARIES],
 [
-ac_find_libraries=
-for ac_dir in $1;
+  ac_find_libraries=
+  for ac_dir in $2 $SEARCH_LIB
   do
   do
-    for ac_extension in a so sl dylib; do
-      if test -f "$ac_dir/lib$2.$ac_extension"; then
+    for ac_extension in a so sl dylib dll.a; do
+      if test -f "$ac_dir/lib$1.$ac_extension"; then
         ac_find_libraries=$ac_dir
         break 2
       fi
         ac_find_libraries=$ac_dir
         break 2
       fi
@@ -46,35 +59,127 @@ for ac_dir in $1;
   done
 ])
 
   done
 ])
 
+dnl ---------------------------------------------------------------------------
+dnl return list of standard library paths
+dnl ---------------------------------------------------------------------------
+dnl return all default locations:
+dnl   - /usr/lib: standard
+dnl   - /usr/lib32: n32 ABI on IRIX
+dnl   - /usr/lib64: n64 ABI on IRIX
+dnl   - /usr/lib/64: 64 bit ABI on Solaris and Linux x86-64
+dnl
+dnl NB: if any of directories in the list is not a subdir of /usr, code setting
+dnl     wx_cv_std_libpath needs to be updated
+AC_DEFUN([WX_STD_LIBPATH], [/usr/lib /usr/lib32 /usr/lib/64 /usr/lib64])
+
 dnl ---------------------------------------------------------------------------
 dnl Path to include, already defined
 dnl ---------------------------------------------------------------------------
 AC_DEFUN([WX_INCLUDE_PATH_EXIST],
 [
 dnl ---------------------------------------------------------------------------
 dnl Path to include, already defined
 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
 ])
 
 dnl ---------------------------------------------------------------------------
   fi
 ])
 
 dnl ---------------------------------------------------------------------------
-dnl Path to link, already defined
+dnl Usage: WX_LINK_PATH_EXIST(path, libpath)
+dnl
+dnl Set ac_path_to_link to nothing if path is already in libpath, or to -Lpath
+dnl if it is not, so that libpath can be set to "$libpath$ac_path_to_link"
+dnl after calling this function
 dnl ---------------------------------------------------------------------------
 AC_DEFUN([WX_LINK_PATH_EXIST],
 [
 dnl ---------------------------------------------------------------------------
 AC_DEFUN([WX_LINK_PATH_EXIST],
 [
-  echo "$2" | grep "\-L$1" > /dev/null
-  result=$?
-  if test $result = 0; then
+  dnl never add -L/usr/libXXX explicitly to libpath
+  if test "$1" = "default location"; then
     ac_path_to_link=""
   else
     ac_path_to_link=""
   else
-    ac_path_to_link=" -L$1"
+    echo "$2" | grep "\-L$1" > /dev/null
+    result=$?
+    if test $result = 0; then
+      ac_path_to_link=""
+    else
+      ac_path_to_link=" -L$1"
+    fi
   fi
 ])
 
   fi
 ])
 
+dnl ---------------------------------------------------------------------------
+dnl Usage: WX_FIND_LIB(lib-name, [lib-function to test], [extra search paths])
+dnl
+dnl Tests in a variety of ways for the presence of lib-name
+dnl
+dnl On success, returns any novel path found in ac_find_libraries; else "std"
+dnl             and any cflags in ac_find_cflags
+dnl On failure, ac_find_libraries will be empty
+dnl ---------------------------------------------------------------------------
+AC_DEFUN([WX_FIND_LIB],
+[
+  ac_find_libraries=
+
+  dnl Try with pkg-config first. It requires its lib-name parameter lowercase
+  fl_pkgname=`echo "$1" | tr [[:upper:]] [[:lower:]]`
+  dnl suppress PKG_PROG_PKG_CONFIG output; we don't want to keep seeing it
+  PKG_PROG_PKG_CONFIG() AS_MESSAGE_FD> /dev/null
+  PKG_CHECK_MODULES([$1], [$fl_pkgname],
+    [
+      dnl Start by assuming there are no novel lib paths
+      ac_find_libraries="std"
+
+      dnl A simple copy of the internal vars $1_CFLAGS $1_LIBS doesn't work
+      dnl inside the macro
+      dnl
+      dnl TODO: When we stop being autoconf 2.61 compatible, the next 2 lines
+      dnl should become:
+      dnl AS_VAR_COPY([ac_find_cflags], [$1_CFLAGS])
+      dnl AS_VAR_COPY([fl_libs], [$1_LIBS])
+      eval ac_find_cflags=\$$1_CFLAGS
+      eval fl_libs=\$$1_LIBS
+
+      dnl fl_libs may now contain -Lfoopath -lfoo (only non-standard paths are
+      dnl added) We only want the path bit, not the lib names
+      for fl_path in $fl_libs
+      do
+        if test `echo "$fl_path" | cut -c 1-2` = "-L"; then
+          dnl there shouldn't be >1 novel path
+          dnl return it without the -L, ready for WX_LINK_PATH_EXIST
+          ac_find_libraries=`echo "$fl_path" | cut -c 3-`
+        fi
+      done
+    ],
+    [
+      if test "x$ac_find_libraries" = "x"; then
+        dnl Next with AC_CHECK_LIB, if a test function was provided
+        if test "x$2" != "x"; then
+          AC_CHECK_LIB([$1], [$2], [ac_find_libraries="std"])
+        fi
+      fi
+
+      if test "x$ac_find_libraries" = "x"; then
+        dnl Finally try the search path
+        dnl Output a message again, as AC_CHECK_LIB will just have said "no"
+        AC_MSG_CHECKING([elsewhere])
+        dnl $3 will occasionally hold extra path(s) to search
+        WX_PATH_FIND_LIBRARIES([$1], [$3])
+        if test "x$ac_find_libraries" != "x"; then
+          AC_MSG_RESULT([yes])
+        else
+          AC_MSG_RESULT([no])
+        fi
+      fi
+    ])
+])
+
 dnl ===========================================================================
 dnl C++ features test
 dnl ===========================================================================
 dnl ===========================================================================
 dnl C++ features test
 dnl ===========================================================================
@@ -84,18 +189,15 @@ 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(action-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
 
-    AC_CHECK_HEADERS(iostream)
+    AC_CHECK_HEADERS([iostream],,, [ ])
 
     if test "$ac_cv_header_iostream" = "yes" ; then
       ifelse([$1], , :, [$1])
 
     if test "$ac_cv_header_iostream" = "yes" ; then
       ifelse([$1], , :, [$1])
@@ -104,46 +206,121 @@ AC_DEFUN([WX_CPP_NEW_HEADERS],
     fi
 
     AC_LANG_RESTORE
     fi
 
     AC_LANG_RESTORE
-  fi
 ])
 
 dnl ---------------------------------------------------------------------------
 ])
 
 dnl ---------------------------------------------------------------------------
-dnl WX_CPP_BOOL checks whether the C++ compiler has a built in bool type
-dnl
-dnl call WX_CPP_BOOL - will define HAVE_BOOL if the compiler supports bool
+dnl WX_CPP_EXPLICIT checks whether the C++ compiler support the explicit
+dnl keyword and defines HAVE_EXPLICIT if this is the case
 dnl ---------------------------------------------------------------------------
 
 dnl ---------------------------------------------------------------------------
 
-AC_DEFUN([WX_CPP_BOOL],
+AC_DEFUN([WX_CPP_EXPLICIT],
 [
 [
-  AC_CACHE_CHECK([if C++ compiler supports bool], wx_cv_cpp_bool,
+  AC_CACHE_CHECK([if C++ compiler supports the explicit keyword],
+                 wx_cv_explicit,
   [
     AC_LANG_SAVE
     AC_LANG_CPLUSPLUS
 
   [
     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(
       [
     AC_TRY_COMPILE(
       [
+        class Foo { public: explicit Foo(int) {} };
       ],
       [
       ],
       [
-        bool b = true;
-
         return 0;
       ],
       [
         return 0;
       ],
       [
-        wx_cv_cpp_bool=yes
+        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_cpp_bool=no
-      ]
+      wx_cv_explicit=no
     )
 
     AC_LANG_RESTORE
   ])
 
     )
 
     AC_LANG_RESTORE
   ])
 
-  if test "$wx_cv_cpp_bool" = "yes"; then
-    AC_DEFINE(HAVE_BOOL)
+  if test "$wx_cv_explicit" = "yes"; then
+    AC_DEFINE(HAVE_EXPLICIT)
   fi
 ])
 
   fi
 ])
 
+dnl ---------------------------------------------------------------------------
+dnl WX_CHECK_FUNCS(FUNCTIONS...,
+dnl                [ACTION-IF-FOUND],
+dnl                [ACTION-IF-NOT-FOUND],
+dnl                [EXTRA-DEFINES-AND-INCLUDES],
+dnl                [EXTRA-TEST-CODE])
+dnl
+dnl Checks that the functions listed in FUNCTIONS exist in the headers and the
+dnl libs. For each function, if it is found then defines 'HAVE_FUNCTION' and
+dnl executes ACTION-IF-FOUND, otherwise executes ACTION-IF-NOT-FOUND.
+dnl
+dnl The code from EXTRA-DEFINES-AND-INCLUDES is inserted into the test before
+dnl the default headers are included, and EXTRA-TEST-CODE is inserted into
+dnl the main() function after the default test for existence.
+dnl
+dnl Examples:
+dnl   # the simple case
+dnl   WX_CHECK_FUNCS(stat)
+dnl   # use break to finish the loop early
+dnl   WX_CHECK_FUNCS(mkstemp mktemp, break)
+dnl   # extra defines
+dnl   WX_CHECK_FUNCS(strtok_r, [], [], [#define _RREENTRANT])
+dnl   # extra includes
+dnl   WX_CHECK_FUNCS(swprintf, [], [], [#include <wchar.h>])
+dnl   # checking the signature with extra test code
+dnl   WX_CHECK_FUNCS(gettimeofday, [], [], [#include <sys/time.h>]
+dnl     [struct timeval tv; struct timezone tz; gettimeofday(&tv, &tz)])
+dnl ---------------------------------------------------------------------------
+
+AC_DEFUN([WX_CHECK_FUNCS],
+[
+  for wx_func in $1
+  do
+    AC_CACHE_CHECK(
+      [for $wx_func],
+      [wx_cv_func_$wx_func],
+      [
+        AC_LINK_IFELSE(
+          [
+            AC_LANG_PROGRAM(
+              [
+                $4
+                AC_INCLUDES_DEFAULT
+              ],
+              [
+                #ifndef $wx_func
+                  &$wx_func;
+                #endif
+                $5
+              ])
+          ],
+          [eval wx_cv_func_$wx_func=yes],
+          [eval wx_cv_func_$wx_func=no])
+      ])
+
+    if eval test \$wx_cv_func_$wx_func = yes
+    then
+      AC_DEFINE_UNQUOTED(AS_TR_CPP([HAVE_$wx_func]))
+      $2
+    else
+      :
+      $3
+    fi
+  done
+])
+
 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 ---------------------------------------------------------------------------
@@ -175,7 +352,7 @@ AC_TRY_RUN([main () {
 }], [ac_cv_c_bigendian=no], [ac_cv_c_bigendian=yes], [ac_cv_c_bigendian=unknown])
 fi])
 if test $ac_cv_c_bigendian = unknown; then
 }], [ac_cv_c_bigendian=no], [ac_cv_c_bigendian=yes], [ac_cv_c_bigendian=unknown])
 fi])
 if test $ac_cv_c_bigendian = unknown; then
-  AC_MSG_WARN([Assuming little-endian target machine - this may be overriden by adding the line "ac_cv_c_bigendian=${ac_cv_c_bigendian='yes'}" to config.cache file])
+  AC_MSG_WARN([Assuming little-endian target machine - this may be overridden by adding the line "ac_cv_c_bigendian=${ac_cv_c_bigendian='yes'}" to config.cache file])
 fi
 if test $ac_cv_c_bigendian = yes; then
   AC_DEFINE(WORDS_BIGENDIAN)
 fi
 if test $ac_cv_c_bigendian = yes; then
   AC_DEFINE(WORDS_BIGENDIAN)
@@ -183,60 +360,38 @@ fi
 ])
 
 dnl ---------------------------------------------------------------------------
 ])
 
 dnl ---------------------------------------------------------------------------
-dnl override AC_ARG_ENABLE/WITH to cache the results in .cache file
+dnl override AC_ARG_ENABLE/WITH to handle options defaults
 dnl ---------------------------------------------------------------------------
 
 dnl ---------------------------------------------------------------------------
 
-AC_DEFUN([WX_ARG_CACHE_INIT],
-        [
-          wx_arg_cache_file="configarg.cache"
-          echo "loading argument cache $wx_arg_cache_file"
-          rm -f ${wx_arg_cache_file}.tmp
-          touch ${wx_arg_cache_file}.tmp
-          touch ${wx_arg_cache_file}
-        ])
-
-AC_DEFUN([WX_ARG_CACHE_FLUSH],
-        [
-          echo "saving argument cache $wx_arg_cache_file"
-          mv ${wx_arg_cache_file}.tmp ${wx_arg_cache_file}
-        ])
-
 dnl this macro checks for a three-valued command line --with argument:
 dnl   possible arguments are 'yes', 'no', 'sys', or 'builtin'
 dnl usage: WX_ARG_SYS_WITH(option, helpmessage, variable-name)
 dnl this macro checks for a three-valued command line --with argument:
 dnl   possible arguments are 'yes', 'no', 'sys', or 'builtin'
 dnl usage: WX_ARG_SYS_WITH(option, helpmessage, variable-name)
+dnl
+dnl the default value (used if the option is not specified at all) is the value
+dnl of wxUSE_ALL_FEATURES (which is "yes" by default but can be changed by
+dnl giving configure --disable-all-features option)
 AC_DEFUN([WX_ARG_SYS_WITH],
         [
           AC_MSG_CHECKING([for --with-$1])
 AC_DEFUN([WX_ARG_SYS_WITH],
         [
           AC_MSG_CHECKING([for --with-$1])
-          no_cache=0
           AC_ARG_WITH($1, [$2],
                       [
                         if test "$withval" = yes; then
           AC_ARG_WITH($1, [$2],
                       [
                         if test "$withval" = yes; then
-                          ac_cv_use_$1='$3=yes'
+                          AS_TR_SH(wx_cv_use_$1)='$3=yes'
                         elif test "$withval" = no; then
                         elif test "$withval" = no; then
-                          ac_cv_use_$1='$3=no'
+                          AS_TR_SH(wx_cv_use_$1)='$3=no'
                         elif test "$withval" = sys; then
                         elif test "$withval" = sys; then
-                          ac_cv_use_$1='$3=sys'
+                          AS_TR_SH(wx_cv_use_$1)='$3=sys'
                         elif test "$withval" = builtin; then
                         elif test "$withval" = builtin; then
-                          ac_cv_use_$1='$3=builtin'
+                          AS_TR_SH(wx_cv_use_$1)='$3=builtin'
                         else
                           AC_MSG_ERROR([Invalid value for --with-$1: should be yes, no, sys, or builtin])
                         fi
                       ],
                       [
                         else
                           AC_MSG_ERROR([Invalid value for --with-$1: should be yes, no, sys, or builtin])
                         fi
                       ],
                       [
-                        LINE=`grep "$3" ${wx_arg_cache_file}`
-                        if test "x$LINE" != x ; then
-                          eval "DEFAULT_$LINE"
-                        else
-                          no_cache=1
-                        fi
-
-                        ac_cv_use_$1='$3='$DEFAULT_$3
+                        AS_TR_SH(wx_cv_use_$1)='$3=${'DEFAULT_$3":-$wxUSE_ALL_FEATURES}"
                       ])
 
                       ])
 
-          eval "$ac_cv_use_$1"
-          if test "$no_cache" != 1; then
-            echo $ac_cv_use_$1 >> ${wx_arg_cache_file}.tmp
-          fi
+          eval "$AS_TR_SH(wx_cv_use_$1)"
 
           if test "$$3" = yes; then
             AC_MSG_RESULT(yes)
 
           if test "$$3" = yes; then
             AC_MSG_RESULT(yes)
@@ -251,80 +406,225 @@ AC_DEFUN([WX_ARG_SYS_WITH],
           fi
         ])
 
           fi
         ])
 
-dnl this macro checks for a command line argument and caches the result
-dnl usage: WX_ARG_WITH(option, helpmessage, variable-name)
+dnl this macro simply checks for a command line argument
+dnl usage: WX_ARG_WITH(option, helpmessage, variable-name, [withstring])
 AC_DEFUN([WX_ARG_WITH],
         [
 AC_DEFUN([WX_ARG_WITH],
         [
-          AC_MSG_CHECKING([for --with-$1])
-          no_cache=0
+          withstring=$4
+          defaultval=$wxUSE_ALL_FEATURES
+          if test -z "$defaultval"; then
+              if test x"$withstring" = xwithout; then
+                  defaultval=yes
+              else
+                  defaultval=no
+              fi
+          fi
+          AC_MSG_CHECKING([for --${withstring:-with}-$1])
           AC_ARG_WITH($1, [$2],
                       [
                         if test "$withval" = yes; then
           AC_ARG_WITH($1, [$2],
                       [
                         if test "$withval" = yes; then
-                          ac_cv_use_$1='$3=yes'
+                          AS_TR_SH(wx_cv_use_$1)='$3=yes'
                         else
                         else
-                          ac_cv_use_$1='$3=no'
+                          AS_TR_SH(wx_cv_use_$1)='$3=no'
                         fi
                       ],
                       [
                         fi
                       ],
                       [
-                        LINE=`grep "$3" ${wx_arg_cache_file}`
-                        if test "x$LINE" != x ; then
-                          eval "DEFAULT_$LINE"
-                        else
-                          no_cache=1
-                        fi
-
-                        ac_cv_use_$1='$3='$DEFAULT_$3
+                        AS_TR_SH(wx_cv_use_$1)='$3=${'DEFAULT_$3":-$defaultval}"
                       ])
 
                       ])
 
-          eval "$ac_cv_use_$1"
-          if test "$no_cache" != 1; then
-            echo $ac_cv_use_$1 >> ${wx_arg_cache_file}.tmp
-          fi
+          eval "$AS_TR_SH(wx_cv_use_$1)"
 
 
-          if test "$$3" = yes; then
-            AC_MSG_RESULT(yes)
+          if test x"$withstring" = xwithout; then
+            if test $$3 = yes; then
+              result=no
+            else
+              result=yes
+            fi
           else
           else
-            AC_MSG_RESULT(no)
+            result=$$3
           fi
           fi
+
+          AC_MSG_RESULT($result)
         ])
 
         ])
 
+dnl same as WX_ARG_WITH but makes it clear that the option is enabled by default
+AC_DEFUN([WX_ARG_WITHOUT], [WX_ARG_WITH($1, [$2], $3, without)])
+
 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, var, [enablestring], [default])
+dnl
+dnl enablestring can be omitted or a literal string "disable" and allows to
+dnl show "checking for --disable-foo" message when running configure instead of
+dnl the default "checking for --enable-foo" one whih is useful for the options
+dnl enabled by default
+dnl
+dnl the "default" argument can be omitted or contain the default value to use
+dnl for the option if it's unspecified
 AC_DEFUN([WX_ARG_ENABLE],
         [
 AC_DEFUN([WX_ARG_ENABLE],
         [
-          AC_MSG_CHECKING([for --enable-$1])
-          no_cache=0
+          enablestring=$4
+          defaultval=$5
+          if test -z "$defaultval"; then
+              if test x"$enablestring" = xdisable; then
+                  defaultval=yes
+              else
+                  defaultval=no
+              fi
+          fi
+
+          AC_MSG_CHECKING([for --${enablestring:-enable}-$1])
           AC_ARG_ENABLE($1, [$2],
                         [
                           if test "$enableval" = yes; then
           AC_ARG_ENABLE($1, [$2],
                         [
                           if test "$enableval" = yes; then
-                            ac_cv_use_$1='$3=yes'
+                            AS_TR_SH(wx_cv_use_$1)='$3=yes'
                           else
                           else
-                            ac_cv_use_$1='$3=no'
+                            AS_TR_SH(wx_cv_use_$1)='$3=no'
                           fi
                         ],
                         [
                           fi
                         ],
                         [
-                          LINE=`grep "$3" ${wx_arg_cache_file}`
-                          if test "x$LINE" != x ; then
-                            eval "DEFAULT_$LINE"
-                          else
-                            no_cache=1
-                          fi
-
-                          ac_cv_use_$1='$3='$DEFAULT_$3
+                          AS_TR_SH(wx_cv_use_$1)='$3=${'DEFAULT_$3":-$defaultval}"
                         ])
 
                         ])
 
-          eval "$ac_cv_use_$1"
-          if test "$no_cache" != 1; then
-            echo $ac_cv_use_$1 >> ${wx_arg_cache_file}.tmp
-          fi
+          eval "$AS_TR_SH(wx_cv_use_$1)"
 
 
-          if test "$$3" = yes; then
-            AC_MSG_RESULT(yes)
+          if test x"$enablestring" = xdisable; then
+            if test $$3 = no; then
+              result=yes
+            else
+              result=no
+            fi
           else
           else
-            AC_MSG_RESULT(no)
+            result=$$3
           fi
           fi
+
+          AC_MSG_RESULT($result)
+        ])
+
+dnl the same as WX_ARG_ENABLE but makes it more clear that the option is
+dnl enabled by default
+AC_DEFUN([WX_ARG_DISABLE], [WX_ARG_ENABLE($1, [$2], $3, disable)])
+
+dnl same as WX_ARG_ENABLE but defaults to wxUSE_ALL_FEATURES instead of "yes"
+AC_DEFUN([WX_ARG_FEATURE], [WX_ARG_ENABLE($1, [$2], $3,, $wxUSE_ALL_FEATURES)])
+
+dnl Like WX_ARG_ENABLE but accepts a parameter.
+dnl
+dnl Usage:
+dnl   WX_ARG_ENABLE_PARAM(option, helpmessage, variable-name, enablestring)
+dnl
+dnl Example:
+dnl   WX_ARG_ENABLE_PARAM(foo, [[  --enable-foo[=bar] use foo]], wxUSE_FOO)
+dnl
+dnl  --enable-foo       wxUSE_FOO=yes
+dnl  --disable-foo      wxUSE_FOO=no
+dnl  --enable-foo=bar   wxUSE_FOO=bar
+dnl  <not given>        wxUSE_FOO=$DEFAULT_wxUSE_FOO
+dnl
+AC_DEFUN([WX_ARG_ENABLE_PARAM],
+        [
+          enablestring=$4
+          AC_MSG_CHECKING([for --${enablestring:-enable}-$1])
+          AC_ARG_ENABLE($1, [$2],
+                        [
+                          wx_cv_use_$1="$3='$enableval'"
+                        ],
+                        [
+                          wx_cv_use_$1='$3='$DEFAULT_$3
+                        ])
+
+          eval "$wx_cv_use_$1"
+
+          AC_MSG_RESULT([$$3])
         ])
 
         ])
 
+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],
+[
+    case "${host}" in
+        *-*-cygwin* | *-*-mingw* )
+            dnl although ld does support version script option on these
+            dnl platforms, it doesn't make much sense to use it under Win32
+            dnl and, moreover, this breaks linking because of a bug in handling
+            dnl paths in -Wl,--version-script,path option (if we ever do need
+            dnl to use it for cygwin/mingw32, keep in mind that replacing last
+            dnl comma with the equal sign works) so
+            dnl simply disable it
+            wx_cv_version_script=no
+            ;;
+
+        *)
+            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
+
+                dnl There's a problem in some old linkers with --version-script that
+                dnl can cause linking to fail when you have objects with vtables in
+                dnl libs 3 deep.  This is known to happen in netbsd and openbsd with
+                dnl ld 2.11.2.
+                dnl
+                dnl To test for this we need to make some shared libs and
+                dnl unfortunately we can't be sure of the right way to do that. If the
+                dnl first two compiles don't succeed then it looks like the test isn't
+                dnl working and the result is ignored, but if OTOH the first two
+                dnl succeed but the third does not then the bug has been detected and
+                dnl the --version-script flag is dropped.
+                if test $wx_cv_version_script = yes
+                then
+                  echo "struct B { virtual ~B() { } }; \
+                        struct D : public B { }; \
+                        void F() { D d; }" > conftest.cpp
+
+                  if AC_TRY_COMMAND([
+                        $CXX -shared -fPIC -o conftest1.output $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.cpp
+                        -Wl,--version-script,conftest.sym >/dev/null 2>/dev/null]) &&
+                     AC_TRY_COMMAND([
+                        $CXX -shared -fPIC -o conftest2.output $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.cpp
+                        -Wl,--version-script,conftest.sym conftest1.output >/dev/null 2>/dev/null])
+                  then
+                    if AC_TRY_COMMAND([
+                          $CXX -shared -fPIC -o conftest3.output $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.cpp
+                          -Wl,--version-script,conftest.sym conftest2.output conftest1.output >/dev/null 2>/dev/null])
+                    then
+                      wx_cv_version_script=yes
+                    else
+                      wx_cv_version_script=no
+                    fi
+                  fi
+                fi
+
+                rm -f conftest.output conftest.stderr conftest.sym conftest.cpp
+                rm -f conftest1.output conftest2.output conftest3.output
+            ])
+
+            if test $wx_cv_version_script = yes ; then
+                LDFLAGS_VERSIONING="-Wl,--version-script,$1"
+            fi
+            ;;
+    esac
+])
 
 
 dnl ===========================================================================
 
 
 dnl ===========================================================================
@@ -471,3 +771,4 @@ if test "$enable_largefile" != no; then
     AC_MSG_RESULT($wx_largefile)
 fi
 ])
     AC_MSG_RESULT($wx_largefile)
 fi
 ])
+