Skip to content

Commit 6cb6cc6

Browse files
authored
Autotools: Refactor iconv implementation checks (#15357)
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).
1 parent d334382 commit 6cb6cc6

File tree

2 files changed

+75
-91
lines changed

2 files changed

+75
-91
lines changed

build/php.m4

+13-16
Original file line numberDiff line numberDiff line change
@@ -1844,24 +1844,20 @@ AC_DEFUN([PHP_SETUP_ICONV], [
18441844
[Define to 1 if you have the 'libiconv' function.])
18451845
18461846
dnl Check libc first if no path is provided in --with-iconv.
1847-
if test "$PHP_ICONV" = "yes"; then
1847+
AS_VAR_IF([PHP_ICONV], [yes], [
18481848
dnl Reset LIBS temporarily as it may have already been included -liconv in.
1849-
LIBS_save="$LIBS"
1849+
LIBS_save=$LIBS
18501850
LIBS=
1851-
AC_CHECK_FUNC([iconv], [
1852-
found_iconv=yes
1853-
],[
1854-
AC_CHECK_FUNC([libiconv], [
1851+
AC_CHECK_FUNC([iconv], [found_iconv=yes],
1852+
[AC_CHECK_FUNC([libiconv], [
18551853
AC_DEFINE([HAVE_LIBICONV], [1])
18561854
found_iconv=yes
1857-
])
1858-
])
1859-
LIBS="$LIBS_save"
1860-
fi
1855+
])])
1856+
LIBS=$LIBS_save
1857+
])
18611858
18621859
dnl Check external libs for iconv funcs.
1863-
if test "$found_iconv" = "no"; then
1864-
1860+
AS_VAR_IF([found_iconv], [no], [
18651861
for i in $PHP_ICONV /usr/local /usr; do
18661862
if test -r $i/include/gnu-libiconv/iconv.h; then
18671863
ICONV_DIR=$i
@@ -1876,9 +1872,10 @@ AC_DEFUN([PHP_SETUP_ICONV], [
18761872
fi
18771873
done
18781874
1879-
if test -z "$ICONV_DIR"; then
1880-
AC_MSG_ERROR([Please specify the install prefix of iconv with --with-iconv=<DIR>])
1881-
fi
1875+
AS_VAR_IF([ICONV_DIR],,
1876+
[AC_MSG_ERROR(m4_text_wrap([
1877+
Please specify the install prefix of iconv with --with-iconv=<DIR>
1878+
]))])
18821879
18831880
if test -f $ICONV_DIR/$PHP_LIBDIR/lib$iconv_lib_name.a ||
18841881
test -f $ICONV_DIR/$PHP_LIBDIR/lib$iconv_lib_name.$SHLIB_SUFFIX_NAME ||
@@ -1896,7 +1893,7 @@ AC_DEFUN([PHP_SETUP_ICONV], [
18961893
[-L$ICONV_DIR/$PHP_LIBDIR])],
18971894
[-L$ICONV_DIR/$PHP_LIBDIR])
18981895
fi
1899-
fi
1896+
])
19001897
19011898
if test "$found_iconv" = "yes"; then
19021899
if test -n "$ICONV_DIR"; then

ext/iconv/config.m4

+62-75
Original file line numberDiff line numberDiff line change
@@ -8,69 +8,57 @@ if test "$PHP_ICONV" != "no"; then
88
PHP_SETUP_ICONV([ICONV_SHARED_LIBADD],,
99
[AC_MSG_FAILURE([The iconv not found.])])
1010

11-
save_LDFLAGS=$LDFLAGS
12-
save_CFLAGS=$CFLAGS
13-
LDFLAGS="$ICONV_SHARED_LIBADD $LDFLAGS"
14-
CFLAGS="$INCLUDES $CFLAGS"
15-
16-
AC_MSG_CHECKING([if iconv is glibc's])
17-
AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include <gnu/libc-version.h>]], [[gnu_get_libc_version();]])],[
18-
AC_MSG_RESULT([yes])
19-
iconv_impl_name="glibc"
20-
],[
21-
AC_MSG_RESULT([no])
22-
])
23-
24-
if test -z "$iconv_impl_name"; then
25-
AC_MSG_CHECKING([if using GNU libiconv])
26-
AC_LINK_IFELSE([AC_LANG_PROGRAM([#include <iconv.h>], [(void) _libiconv_version])],[
27-
AC_MSG_RESULT([yes])
28-
iconv_impl_name="gnu_libiconv"
29-
],[
30-
AC_MSG_RESULT([no])
31-
])
32-
fi
33-
34-
if test -z "$iconv_impl_name"; then
35-
AC_MSG_CHECKING([if iconv is Konstantin Chuguev's])
36-
AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include <iconv.h>]], [[iconv_ccs_init(NULL, NULL);]])],[
37-
AC_MSG_RESULT([yes])
38-
iconv_impl_name="bsd"
39-
],[
40-
AC_MSG_RESULT([no])
41-
])
42-
fi
43-
44-
if test -z "$iconv_impl_name"; then
45-
AC_MSG_CHECKING([if using IBM iconv])
46-
AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include <iconv.h>]], [[cstoccsid("");]])],[
47-
AC_MSG_RESULT([yes])
48-
iconv_impl_name="ibm"
49-
],[
50-
AC_MSG_RESULT([no])
51-
])
52-
fi
11+
save_LDFLAGS=$LDFLAGS
12+
save_CFLAGS=$CFLAGS
13+
LDFLAGS="$ICONV_SHARED_LIBADD $LDFLAGS"
14+
CFLAGS="$INCLUDES $CFLAGS"
15+
16+
AC_CACHE_CHECK([for iconv implementation], [php_cv_iconv_implementation], [
17+
AC_LINK_IFELSE([AC_LANG_PROGRAM([#include <gnu/libc-version.h>],
18+
[gnu_get_libc_version();])],
19+
[php_cv_iconv_implementation=glibc],
20+
[php_cv_iconv_implementation=unknown])
21+
22+
AS_VAR_IF([php_cv_iconv_implementation], [unknown],
23+
[AC_LINK_IFELSE([AC_LANG_PROGRAM([#include <iconv.h>],
24+
[(void) _libiconv_version])],
25+
[php_cv_iconv_implementation="GNU libiconv"],
26+
[php_cv_iconv_implementation=unknown])])
27+
28+
dnl BSD iconv by Konstantin Chuguev.
29+
AS_VAR_IF([php_cv_iconv_implementation], [unknown],
30+
[AC_LINK_IFELSE([AC_LANG_PROGRAM([#include <iconv.h>],
31+
[iconv_ccs_init(NULL, NULL);])],
32+
[php_cv_iconv_implementation=BSD],
33+
[php_cv_iconv_implementation=unknown])])
34+
35+
AS_VAR_IF([php_cv_iconv_implementation], [unknown],
36+
[AC_LINK_IFELSE([AC_LANG_PROGRAM([#include <iconv.h>],
37+
[cstoccsid("");])],
38+
[php_cv_iconv_implementation=IBM],
39+
[php_cv_iconv_implementation=unknown])])
40+
])
5341

5442
AH_TEMPLATE([PHP_ICONV_IMPL], [The iconv implementation.])
5543

56-
AS_CASE([$iconv_impl_name],
57-
[gnu_libiconv], [
58-
AC_DEFINE([PHP_ICONV_IMPL], ["libiconv"])
59-
AC_DEFINE([HAVE_LIBICONV], [1])
60-
],
61-
[bsd], [AC_DEFINE([PHP_ICONV_IMPL], ["BSD iconv"])],
44+
AS_CASE([$php_cv_iconv_implementation],
6245
[glibc], [
6346
AC_DEFINE([HAVE_GLIBC_ICONV], [1],
6447
[Define to 1 if iconv implementation is glibc.])
6548
AC_DEFINE([PHP_ICONV_IMPL], ["glibc"])
6649
],
67-
[ibm], [
50+
["GNU libiconv"], [
51+
AC_DEFINE([PHP_ICONV_IMPL], ["libiconv"])
52+
AC_DEFINE([HAVE_LIBICONV], [1])
53+
],
54+
[BSD], [AC_DEFINE([PHP_ICONV_IMPL], ["BSD iconv"])],
55+
[IBM], [
6856
AC_DEFINE([HAVE_IBM_ICONV], [1],
6957
[Define to 1 if iconv implementation is IBM.])
7058
AC_DEFINE([PHP_ICONV_IMPL], ["IBM iconv"])
7159
])
7260

73-
AC_CACHE_CHECK([if iconv supports errno], [php_cv_iconv_errno],
61+
AC_CACHE_CHECK([if iconv supports errno], [php_cv_iconv_errno],
7462
[AC_RUN_IFELSE([AC_LANG_SOURCE([
7563
#include <iconv.h>
7664
#include <errno.h>
@@ -92,11 +80,11 @@ int main(void) {
9280
[php_cv_iconv_errno=yes],
9381
[php_cv_iconv_errno=no],
9482
[php_cv_iconv_errno=yes])])
95-
AS_VAR_IF([php_cv_iconv_errno], [yes],,
96-
[AC_MSG_FAILURE([The iconv check failed, 'errno' is missing.])])
83+
AS_VAR_IF([php_cv_iconv_errno], [yes],,
84+
[AC_MSG_FAILURE([The iconv check failed, 'errno' is missing.])])
9785

98-
AC_CACHE_CHECK([if iconv supports //IGNORE], [php_cv_iconv_ignore],
99-
[AC_RUN_IFELSE([AC_LANG_SOURCE([[
86+
AC_CACHE_CHECK([if iconv supports //IGNORE], [php_cv_iconv_ignore],
87+
[AC_RUN_IFELSE([AC_LANG_SOURCE([[
10088
#include <iconv.h>
10189
#include <stdlib.h>
10290
@@ -115,25 +103,24 @@ int main(void) {
115103
}
116104
return 0;
117105
}
118-
]])],
119-
[php_cv_iconv_ignore=yes],
120-
[php_cv_iconv_ignore=no],
121-
[php_cv_iconv_ignore=no])])
122-
123-
AS_VAR_IF([php_cv_iconv_ignore], [no],
124-
[AC_DEFINE([ICONV_BROKEN_IGNORE], [1],
125-
[Define to 1 if iconv has broken IGNORE.])])
126-
127-
LDFLAGS=$save_LDFLAGS
128-
CFLAGS=$save_CFLAGS
129-
130-
AC_DEFINE([HAVE_ICONV], [1],
131-
[Define to 1 if the PHP extension 'iconv' is available.])
132-
133-
PHP_NEW_EXTENSION([iconv],
134-
[iconv.c],
135-
[$ext_shared],,
136-
[-DZEND_ENABLE_STATIC_TSRMLS_CACHE=1])
137-
PHP_SUBST([ICONV_SHARED_LIBADD])
138-
PHP_INSTALL_HEADERS([ext/iconv], [php_iconv.h])
106+
]])],
107+
[php_cv_iconv_ignore=yes],
108+
[php_cv_iconv_ignore=no],
109+
[php_cv_iconv_ignore=no])])
110+
AS_VAR_IF([php_cv_iconv_ignore], [no],
111+
[AC_DEFINE([ICONV_BROKEN_IGNORE], [1],
112+
[Define to 1 if iconv has broken IGNORE.])])
113+
114+
LDFLAGS=$save_LDFLAGS
115+
CFLAGS=$save_CFLAGS
116+
117+
AC_DEFINE([HAVE_ICONV], [1],
118+
[Define to 1 if the PHP extension 'iconv' is available.])
119+
120+
PHP_NEW_EXTENSION([iconv],
121+
[iconv.c],
122+
[$ext_shared],,
123+
[-DZEND_ENABLE_STATIC_TSRMLS_CACHE=1])
124+
PHP_SUBST([ICONV_SHARED_LIBADD])
125+
PHP_INSTALL_HEADERS([ext/iconv], [php_iconv.h])
139126
fi

0 commit comments

Comments
 (0)