X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/9e691f46b2ec1b5dbbff2e51131e3c532e688a89..575cf8b134a78055068bdbe9e90b2bda60cfff18:/acinclude.m4 diff --git a/acinclude.m4 b/acinclude.m4 index 4f7ee95a2b..ffc9df8c09 100644 --- a/acinclude.m4 +++ b/acinclude.m4 @@ -8,6 +8,20 @@ dnl dnl Version: $Id$ 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 macros to find the a file in the list of include/lib paths dnl =========================================================================== @@ -19,7 +33,7 @@ dnl --------------------------------------------------------------------------- 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 @@ -29,15 +43,15 @@ for ac_dir in $1; ]) dnl --------------------------------------------------------------------------- -dnl call WX_PATH_FIND_LIBRARIES(search path, header name), sets ac_find_libraries +dnl call WX_PATH_FIND_LIBRARIES(search path, lib name), sets ac_find_libraries dnl to the full name of the file that was found or leaves it empty if not found dnl --------------------------------------------------------------------------- AC_DEFUN([WX_PATH_FIND_LIBRARIES], [ -ac_find_libraries= -for ac_dir in $1; + ac_find_libraries= + for ac_dir in $1; do - for ac_extension in a so sl dylib; do + for ac_extension in a so sl dylib dll.a; do if test -f "$ac_dir/lib$2.$ac_extension"; then ac_find_libraries=$ac_dir break 2 @@ -46,32 +60,58 @@ for ac_dir in $1; 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], [ - 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=" -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 --------------------------------------------------------------------------- -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 of 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], [ - echo "$2" | grep "\-L$1" > /dev/null - result=$? - if test $result = 0; then + dnl never add -L/usr/libXXX explicitely to libpath + if test "$1" = "default location"; then 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 ]) @@ -84,18 +124,15 @@ dnl WX_CPP_NEW_HEADERS checks whether the compiler has "new" header dnl or only the old one - it may be generally assumed that if dnl 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], [ - if test "$cross_compiling" = "yes"; then - ifelse([$2], , :, [$2]) - else 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]) @@ -104,46 +141,121 @@ AC_DEFUN([WX_CPP_NEW_HEADERS], fi AC_LANG_RESTORE - fi ]) 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 --------------------------------------------------------------------------- -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 + 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) {} }; ], [ - bool b = true; - 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 ]) - if test "$wx_cv_cpp_bool" = "yes"; then - AC_DEFINE(HAVE_BOOL) + if test "$wx_cv_explicit" = "yes"; then + AC_DEFINE(HAVE_EXPLICIT) 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 ]) +dnl # checking the signature with extra test code +dnl WX_CHECK_FUNCS(gettimeofday, [], [], [#include ] +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 --------------------------------------------------------------------------- @@ -183,60 +295,38 @@ fi ]) 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 --------------------------------------------------------------------------- -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 +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]) - no_cache=0 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 - ac_cv_use_$1='$3=no' + AS_TR_SH(wx_cv_use_$1)='$3=no' 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 - 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 ], [ - 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) @@ -251,80 +341,225 @@ AC_DEFUN([WX_ARG_SYS_WITH], 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_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_cv_use_$1='$3=yes' + AS_TR_SH(wx_cv_use_$1)='$3=yes' else - ac_cv_use_$1='$3=no' + AS_TR_SH(wx_cv_use_$1)='$3=no' 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 - AC_MSG_RESULT(no) + result=$$3 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 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_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_cv_use_$1='$3=yes' + AS_TR_SH(wx_cv_use_$1)='$3=yes' else - ac_cv_use_$1='$3=no' + AS_TR_SH(wx_cv_use_$1)='$3=no' 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 = yes; then + result=no + else + result=yes + fi else - AC_MSG_RESULT(no) + result=$$3 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 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 =========================================================================== @@ -409,3 +644,66 @@ size_t iconv(); AC_SUBST(LIBICONV) ]) +dnl --------------------------------------------------------------------------- +dnl AC_SYS_LARGEFILE (partly based on the code from autoconf 2.5x) +dnl --------------------------------------------------------------------------- + +dnl WX_SYS_LARGEFILE_TEST +dnl +dnl NB: original autoconf test was checking if compiler supported 6 bit off_t +dnl arithmetic properly but this failed miserably with gcc under Linux +dnl whereas the system still supports 64 bit files, so now simply check +dnl that off_t is big enough +define(WX_SYS_LARGEFILE_TEST, +[typedef struct { + unsigned int field: sizeof(off_t) == 8; +} wxlf; +]) + + +dnl WX_SYS_LARGEFILE_MACRO_VALUE(C-MACRO, VALUE, CACHE-VAR) +define(WX_SYS_LARGEFILE_MACRO_VALUE, +[ + AC_CACHE_CHECK([for $1 value needed for large files], [$3], + [ + AC_TRY_COMPILE([#define $1 $2 + #include ], + WX_SYS_LARGEFILE_TEST, + [$3=$2], + [$3=no]) + ] + ) + + if test "$$3" != no; then + wx_largefile=yes + AC_DEFINE_UNQUOTED([$1], [$$3]) + fi +]) + + +dnl AC_SYS_LARGEFILE +dnl ---------------- +dnl By default, many hosts won't let programs access large files; +dnl one must use special compiler options to get large-file access to work. +dnl For more details about this brain damage please see: +dnl http://www.sas.com/standards/large.file/x_open.20Mar96.html +AC_DEFUN([AC_SYS_LARGEFILE], +[AC_ARG_ENABLE(largefile, + [ --disable-largefile omit support for large files]) +if test "$enable_largefile" != no; then + dnl _FILE_OFFSET_BITS==64 is needed for Linux, Solaris, ... + dnl _LARGE_FILES -- for AIX + wx_largefile=no + WX_SYS_LARGEFILE_MACRO_VALUE(_FILE_OFFSET_BITS, 64, ac_cv_sys_file_offset_bits) + if test "x$wx_largefile" != "xyes"; then + WX_SYS_LARGEFILE_MACRO_VALUE(_LARGE_FILES, 1, ac_cv_sys_large_files) + fi + + AC_MSG_CHECKING(if large file support is available) + if test "x$wx_largefile" = "xyes"; then + AC_DEFINE(HAVE_LARGEFILE_SUPPORT) + fi + AC_MSG_RESULT($wx_largefile) +fi +]) +