From 93add41491a03a0cc44f4a94dffaca0fdeed84e9 Mon Sep 17 00:00:00 2001 From: Peter Kokot Date: Mon, 12 Aug 2024 13:03:41 +0200 Subject: [PATCH] Autotools: Refactor iconv implementation checks This uses AS_* macros and checks for an iconv implementation in a single cache check block for easier configure log output and possible future adjustments when iconv is built-in the C library (like on Alpine and some other systems where it isn't recognized as such yet exactly). --- build/php.m4 | 29 +++++----- ext/iconv/config.m4 | 137 ++++++++++++++++++++------------------------ 2 files changed, 75 insertions(+), 91 deletions(-) diff --git a/build/php.m4 b/build/php.m4 index fde0daafe00d4..1774f0cf57c3d 100644 --- a/build/php.m4 +++ b/build/php.m4 @@ -1844,24 +1844,20 @@ AC_DEFUN([PHP_SETUP_ICONV], [ [Define to 1 if you have the 'libiconv' function.]) dnl Check libc first if no path is provided in --with-iconv. - if test "$PHP_ICONV" = "yes"; then + AS_VAR_IF([PHP_ICONV], [yes], [ dnl Reset LIBS temporarily as it may have already been included -liconv in. - LIBS_save="$LIBS" + LIBS_save=$LIBS LIBS= - AC_CHECK_FUNC([iconv], [ - found_iconv=yes - ],[ - AC_CHECK_FUNC([libiconv], [ + AC_CHECK_FUNC([iconv], [found_iconv=yes], + [AC_CHECK_FUNC([libiconv], [ AC_DEFINE([HAVE_LIBICONV], [1]) found_iconv=yes - ]) - ]) - LIBS="$LIBS_save" - fi + ])]) + LIBS=$LIBS_save + ]) dnl Check external libs for iconv funcs. - if test "$found_iconv" = "no"; then - + AS_VAR_IF([found_iconv], [no], [ for i in $PHP_ICONV /usr/local /usr; do if test -r $i/include/gnu-libiconv/iconv.h; then ICONV_DIR=$i @@ -1876,9 +1872,10 @@ AC_DEFUN([PHP_SETUP_ICONV], [ fi done - if test -z "$ICONV_DIR"; then - AC_MSG_ERROR([Please specify the install prefix of iconv with --with-iconv=]) - fi + AS_VAR_IF([ICONV_DIR],, + [AC_MSG_ERROR(m4_text_wrap([ + Please specify the install prefix of iconv with --with-iconv= + ]))]) if test -f $ICONV_DIR/$PHP_LIBDIR/lib$iconv_lib_name.a || test -f $ICONV_DIR/$PHP_LIBDIR/lib$iconv_lib_name.$SHLIB_SUFFIX_NAME || @@ -1896,7 +1893,7 @@ AC_DEFUN([PHP_SETUP_ICONV], [ [-L$ICONV_DIR/$PHP_LIBDIR])], [-L$ICONV_DIR/$PHP_LIBDIR]) fi - fi + ]) if test "$found_iconv" = "yes"; then if test -n "$ICONV_DIR"; then diff --git a/ext/iconv/config.m4 b/ext/iconv/config.m4 index d3900323a14c7..f0c31c1114af1 100644 --- a/ext/iconv/config.m4 +++ b/ext/iconv/config.m4 @@ -8,69 +8,57 @@ if test "$PHP_ICONV" != "no"; then PHP_SETUP_ICONV([ICONV_SHARED_LIBADD],, [AC_MSG_FAILURE([The iconv not found.])]) - save_LDFLAGS=$LDFLAGS - save_CFLAGS=$CFLAGS - LDFLAGS="$ICONV_SHARED_LIBADD $LDFLAGS" - CFLAGS="$INCLUDES $CFLAGS" - - AC_MSG_CHECKING([if iconv is glibc's]) - AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include ]], [[gnu_get_libc_version();]])],[ - AC_MSG_RESULT([yes]) - iconv_impl_name="glibc" - ],[ - AC_MSG_RESULT([no]) - ]) - - if test -z "$iconv_impl_name"; then - AC_MSG_CHECKING([if using GNU libiconv]) - AC_LINK_IFELSE([AC_LANG_PROGRAM([#include ], [(void) _libiconv_version])],[ - AC_MSG_RESULT([yes]) - iconv_impl_name="gnu_libiconv" - ],[ - AC_MSG_RESULT([no]) - ]) - fi - - if test -z "$iconv_impl_name"; then - AC_MSG_CHECKING([if iconv is Konstantin Chuguev's]) - AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include ]], [[iconv_ccs_init(NULL, NULL);]])],[ - AC_MSG_RESULT([yes]) - iconv_impl_name="bsd" - ],[ - AC_MSG_RESULT([no]) - ]) - fi - - if test -z "$iconv_impl_name"; then - AC_MSG_CHECKING([if using IBM iconv]) - AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include ]], [[cstoccsid("");]])],[ - AC_MSG_RESULT([yes]) - iconv_impl_name="ibm" - ],[ - AC_MSG_RESULT([no]) - ]) - fi + save_LDFLAGS=$LDFLAGS + save_CFLAGS=$CFLAGS + LDFLAGS="$ICONV_SHARED_LIBADD $LDFLAGS" + CFLAGS="$INCLUDES $CFLAGS" + + AC_CACHE_CHECK([for iconv implementation], [php_cv_iconv_implementation], [ + AC_LINK_IFELSE([AC_LANG_PROGRAM([#include ], + [gnu_get_libc_version();])], + [php_cv_iconv_implementation=glibc], + [php_cv_iconv_implementation=unknown]) + + AS_VAR_IF([php_cv_iconv_implementation], [unknown], + [AC_LINK_IFELSE([AC_LANG_PROGRAM([#include ], + [(void) _libiconv_version])], + [php_cv_iconv_implementation="GNU libiconv"], + [php_cv_iconv_implementation=unknown])]) + + dnl BSD iconv by Konstantin Chuguev. + AS_VAR_IF([php_cv_iconv_implementation], [unknown], + [AC_LINK_IFELSE([AC_LANG_PROGRAM([#include ], + [iconv_ccs_init(NULL, NULL);])], + [php_cv_iconv_implementation=BSD], + [php_cv_iconv_implementation=unknown])]) + + AS_VAR_IF([php_cv_iconv_implementation], [unknown], + [AC_LINK_IFELSE([AC_LANG_PROGRAM([#include ], + [cstoccsid("");])], + [php_cv_iconv_implementation=IBM], + [php_cv_iconv_implementation=unknown])]) + ]) AH_TEMPLATE([PHP_ICONV_IMPL], [The iconv implementation.]) - AS_CASE([$iconv_impl_name], - [gnu_libiconv], [ - AC_DEFINE([PHP_ICONV_IMPL], ["libiconv"]) - AC_DEFINE([HAVE_LIBICONV], [1]) - ], - [bsd], [AC_DEFINE([PHP_ICONV_IMPL], ["BSD iconv"])], + AS_CASE([$php_cv_iconv_implementation], [glibc], [ AC_DEFINE([HAVE_GLIBC_ICONV], [1], [Define to 1 if iconv implementation is glibc.]) AC_DEFINE([PHP_ICONV_IMPL], ["glibc"]) ], - [ibm], [ + ["GNU libiconv"], [ + AC_DEFINE([PHP_ICONV_IMPL], ["libiconv"]) + AC_DEFINE([HAVE_LIBICONV], [1]) + ], + [BSD], [AC_DEFINE([PHP_ICONV_IMPL], ["BSD iconv"])], + [IBM], [ AC_DEFINE([HAVE_IBM_ICONV], [1], [Define to 1 if iconv implementation is IBM.]) AC_DEFINE([PHP_ICONV_IMPL], ["IBM iconv"]) ]) - AC_CACHE_CHECK([if iconv supports errno], [php_cv_iconv_errno], + AC_CACHE_CHECK([if iconv supports errno], [php_cv_iconv_errno], [AC_RUN_IFELSE([AC_LANG_SOURCE([ #include #include @@ -92,11 +80,11 @@ int main(void) { [php_cv_iconv_errno=yes], [php_cv_iconv_errno=no], [php_cv_iconv_errno=yes])]) - AS_VAR_IF([php_cv_iconv_errno], [yes],, - [AC_MSG_FAILURE([The iconv check failed, 'errno' is missing.])]) + AS_VAR_IF([php_cv_iconv_errno], [yes],, + [AC_MSG_FAILURE([The iconv check failed, 'errno' is missing.])]) - AC_CACHE_CHECK([if iconv supports //IGNORE], [php_cv_iconv_ignore], - [AC_RUN_IFELSE([AC_LANG_SOURCE([[ + AC_CACHE_CHECK([if iconv supports //IGNORE], [php_cv_iconv_ignore], + [AC_RUN_IFELSE([AC_LANG_SOURCE([[ #include #include @@ -115,25 +103,24 @@ int main(void) { } return 0; } - ]])], - [php_cv_iconv_ignore=yes], - [php_cv_iconv_ignore=no], - [php_cv_iconv_ignore=no])]) - - AS_VAR_IF([php_cv_iconv_ignore], [no], - [AC_DEFINE([ICONV_BROKEN_IGNORE], [1], - [Define to 1 if iconv has broken IGNORE.])]) - - LDFLAGS=$save_LDFLAGS - CFLAGS=$save_CFLAGS - - AC_DEFINE([HAVE_ICONV], [1], - [Define to 1 if the PHP extension 'iconv' is available.]) - - PHP_NEW_EXTENSION([iconv], - [iconv.c], - [$ext_shared],, - [-DZEND_ENABLE_STATIC_TSRMLS_CACHE=1]) - PHP_SUBST([ICONV_SHARED_LIBADD]) - PHP_INSTALL_HEADERS([ext/iconv], [php_iconv.h]) + ]])], + [php_cv_iconv_ignore=yes], + [php_cv_iconv_ignore=no], + [php_cv_iconv_ignore=no])]) + AS_VAR_IF([php_cv_iconv_ignore], [no], + [AC_DEFINE([ICONV_BROKEN_IGNORE], [1], + [Define to 1 if iconv has broken IGNORE.])]) + + LDFLAGS=$save_LDFLAGS + CFLAGS=$save_CFLAGS + + AC_DEFINE([HAVE_ICONV], [1], + [Define to 1 if the PHP extension 'iconv' is available.]) + + PHP_NEW_EXTENSION([iconv], + [iconv.c], + [$ext_shared],, + [-DZEND_ENABLE_STATIC_TSRMLS_CACHE=1]) + PHP_SUBST([ICONV_SHARED_LIBADD]) + PHP_INSTALL_HEADERS([ext/iconv], [php_iconv.h]) fi