1PHP_ARG_WITH([iconv], 2 [for iconv support], 3 [AS_HELP_STRING([[--without-iconv[=DIR]]], 4 [Exclude iconv support])], 5 [yes]) 6 7if test "$PHP_ICONV" != "no"; then 8 9 PHP_SETUP_ICONV(ICONV_SHARED_LIBADD, [ 10 iconv_avail="yes"; 11 ],[ 12 iconv_avail="no"; 13 ]) 14 15 if test "$iconv_avail" != "no"; then 16 save_LDFLAGS="$LDFLAGS" 17 save_CFLAGS="$CFLAGS" 18 LDFLAGS="$ICONV_SHARED_LIBADD $LDFLAGS" 19 CFLAGS="$INCLUDES $CFLAGS" 20 21 AC_MSG_CHECKING([if iconv is glibc's]) 22 AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include <gnu/libc-version.h>]], [[gnu_get_libc_version();]])],[ 23 AC_MSG_RESULT(yes) 24 iconv_impl_name="glibc" 25 ],[ 26 AC_MSG_RESULT(no) 27 ]) 28 29 if test -z "$iconv_impl_name"; then 30 AC_MSG_CHECKING([if using GNU libiconv]) 31 AC_LINK_IFELSE([AC_LANG_PROGRAM([#include <iconv.h>], [(void) _libiconv_version])],[ 32 AC_MSG_RESULT(yes) 33 iconv_impl_name="gnu_libiconv" 34 ],[ 35 AC_MSG_RESULT(no) 36 ]) 37 fi 38 39 if test -z "$iconv_impl_name"; then 40 AC_MSG_CHECKING([if iconv is Konstantin Chuguev's]) 41 AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include <iconv.h>]], [[iconv_ccs_init(NULL, NULL);]])],[ 42 AC_MSG_RESULT(yes) 43 iconv_impl_name="bsd" 44 ],[ 45 AC_MSG_RESULT(no) 46 ]) 47 fi 48 49 if test -z "$iconv_impl_name"; then 50 AC_MSG_CHECKING([if using IBM iconv]) 51 AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include <iconv.h>]], [[cstoccsid("");]])],[ 52 AC_MSG_RESULT(yes) 53 iconv_impl_name="ibm" 54 ],[ 55 AC_MSG_RESULT(no) 56 ]) 57 fi 58 59 case "$iconv_impl_name" in 60 gnu_libiconv [)] 61 AC_DEFINE([PHP_ICONV_IMPL],["libiconv"],[Which iconv implementation to use]) 62 AC_DEFINE([HAVE_LIBICONV],1,[Whether libiconv is used]) 63 ;; 64 65 bsd [)] 66 AC_DEFINE([PHP_ICONV_IMPL],["BSD iconv"],[Which iconv implementation to use]) 67 ;; 68 69 glibc [)] 70 AC_DEFINE([HAVE_GLIBC_ICONV],1,[glibc's iconv implementation]) 71 AC_DEFINE([PHP_ICONV_IMPL],["glibc"],[Which iconv implementation to use]) 72 ;; 73 ibm [)] 74 AC_DEFINE([HAVE_IBM_ICONV],1,[IBM iconv implementation]) 75 AC_DEFINE([PHP_ICONV_IMPL],["IBM iconv"],[Which iconv implementation to use]) 76 ;; 77 esac 78 79 AC_MSG_CHECKING([if iconv supports errno]) 80 AC_RUN_IFELSE([AC_LANG_SOURCE([[ 81#include <iconv.h> 82#include <errno.h> 83 84int main(void) { 85 iconv_t cd; 86 cd = iconv_open( "*blahblah*", "*blahblahblah*" ); 87 if (cd == (iconv_t)(-1)) { 88 if (errno == EINVAL) { 89 return 0; 90 } else { 91 return 1; 92 } 93 } 94 iconv_close( cd ); 95 return 2; 96} 97 ]])],[ 98 AC_MSG_RESULT(yes) 99 ],[ 100 AC_MSG_RESULT(no) 101 AC_MSG_ERROR(iconv does not support errno) 102 ],[ 103 AC_MSG_RESULT(yes, cross-compiling) 104 ]) 105 106 AC_CACHE_CHECK([if iconv supports //IGNORE], [php_cv_iconv_ignore], 107 [AC_RUN_IFELSE([AC_LANG_SOURCE([[ 108#include <iconv.h> 109#include <stdlib.h> 110 111int main(void) { 112 iconv_t cd = iconv_open( "UTF-8//IGNORE", "UTF-8" ); 113 if(cd == (iconv_t)-1) { 114 return 1; 115 } 116 char *in_p = "\xC3\xC3\xC3\xB8"; 117 size_t in_left = 4, out_left = 4096; 118 char *out = malloc(out_left); 119 char *out_p = out; 120 size_t result = iconv(cd, (char **) &in_p, &in_left, (char **) &out_p, &out_left); 121 if(result == (size_t)-1) { 122 return 1; 123 } 124 return 0; 125} 126 ]])], 127 [php_cv_iconv_ignore=yes], 128 [php_cv_iconv_ignore=no], 129 [php_cv_iconv_ignore=no])]) 130 131 AS_VAR_IF([php_cv_iconv_ignore], [no], 132 [AC_DEFINE([ICONV_BROKEN_IGNORE], [1], [Whether iconv has broken IGNORE.])]) 133 134 LDFLAGS="$save_LDFLAGS" 135 CFLAGS="$save_CFLAGS" 136 137 PHP_NEW_EXTENSION(iconv, iconv.c, $ext_shared,, [-DZEND_ENABLE_STATIC_TSRMLS_CACHE=1]) 138 PHP_SUBST(ICONV_SHARED_LIBADD) 139 PHP_INSTALL_HEADERS([ext/iconv], [php_iconv.h]) 140 else 141 AC_MSG_ERROR(Please reinstall the iconv library.) 142 fi 143fi 144