revise iconv detection:

- check libiconv with a linkage test with iconv.h included
- check libc iconv with a linkage test with iconv.h included
  and LIBICONV_PLUG defined (in case libiconv header is in
  include path)
- add new configuration option to prefer iconv from libiconv,
  if available, over the libc version, defaults to disabled:
  SDL_LIBICONV for cmake, --enable-libiconv for autotools.
- change FreeBSD specific LIBICONV_PLUG define in SDL_iconv.c
  to configuration result.
This commit is contained in:
Ozkan Sezer 2023-11-22 23:29:00 +03:00
parent 4940b5dbc2
commit 17e62abb6d
6 changed files with 152 additions and 41 deletions

View File

@ -421,6 +421,7 @@ dep_option(SDL_DIRECTFB_SHARED "Dynamically load directfb support" ON "SDL_D
set_option(SDL_DUMMYVIDEO "Use dummy video driver" ON) set_option(SDL_DUMMYVIDEO "Use dummy video driver" ON)
dep_option(SDL_IBUS "Enable IBus support" ON ${UNIX_SYS} OFF) dep_option(SDL_IBUS "Enable IBus support" ON ${UNIX_SYS} OFF)
set_option(SDL_SYSTEM_ICONV "Use iconv() from system-installed libraries" ON) set_option(SDL_SYSTEM_ICONV "Use iconv() from system-installed libraries" ON)
set_option(SDL_LIBICONV "Prefer iconv() from libiconv, if available, over libc version" OFF)
set_option(SDL_OPENGL "Include OpenGL support" ON) set_option(SDL_OPENGL "Include OpenGL support" ON)
set_option(SDL_OPENGLES "Include OpenGL ES support" ON) set_option(SDL_OPENGLES "Include OpenGL ES support" ON)
set_option(SDL_PTHREADS "Use POSIX threads for multi-threading" ${SDL_PTHREADS_ENABLED_BY_DEFAULT}) set_option(SDL_PTHREADS "Use POSIX threads for multi-threading" ${SDL_PTHREADS_ENABLED_BY_DEFAULT})
@ -1123,16 +1124,31 @@ if(SDL_LIBC)
endif() endif()
if(SDL_SYSTEM_ICONV) if(SDL_SYSTEM_ICONV)
check_library_exists(iconv iconv_open "" HAVE_LIBICONV) check_c_source_compiles("
if(HAVE_LIBICONV) #define LIBICONV_PLUG 1 /* in case libiconv header is in include path */
list(APPEND EXTRA_LIBS iconv) #include <stddef.h>
#include <iconv.h>
int main(int argc, char **argv) {
return iconv_open(NULL,NULL);
}" ICONV_IN_LIBC)
cmake_push_check_state()
list(APPEND CMAKE_REQUIRED_LIBRARIES iconv)
check_c_source_compiles("
#include <stddef.h>
#include <iconv.h>
int main(int argc, char **argv) {
return iconv_open(NULL,NULL);
}" ICONV_IN_LIBICONV)
cmake_pop_check_state()
if(ICONV_IN_LIBC OR ICONV_IN_LIBICONV)
set(HAVE_ICONV 1) set(HAVE_ICONV 1)
set(HAVE_SYSTEM_ICONV TRUE) set(HAVE_SYSTEM_ICONV TRUE)
else() if(ICONV_IN_LIBICONV AND (SDL_LIBICONV OR (NOT ICONV_IN_LIBC)))
check_library_exists(c iconv_open "" HAVE_BUILTIN_ICONV) set(SDL_USE_LIBICONV 1)
if(HAVE_BUILTIN_ICONV) set(HAVE_LIBICONV TRUE)
set(HAVE_ICONV 1) list(APPEND EXTRA_LIBS iconv)
set(HAVE_SYSTEM_ICONV TRUE)
endif() endif()
endif() endif()
endif() endif()

105
configure vendored
View File

@ -845,6 +845,7 @@ enable_assertions
enable_dependency_tracking enable_dependency_tracking
enable_libc enable_libc
enable_system_iconv enable_system_iconv
enable_libiconv
enable_gcc_atomics enable_gcc_atomics
enable_atomic enable_atomic
enable_audio enable_audio
@ -1642,6 +1643,8 @@ Optional Features:
--enable-libc Use the system C library [default=yes] --enable-libc Use the system C library [default=yes]
--enable-system-iconv Use iconv() from system-installed libraries --enable-system-iconv Use iconv() from system-installed libraries
[default=yes] [default=yes]
--enable-libiconv Prefer iconv() from libiconv, if available, over
libc version [default=no]
--enable-gcc-atomics Use gcc builtin atomics [default=yes] --enable-gcc-atomics Use gcc builtin atomics [default=yes]
--enable-atomic Enable the atomic operations subsystem [default=yes] --enable-atomic Enable the atomic operations subsystem [default=yes]
--enable-audio Enable the audio subsystem [default=yes] --enable-audio Enable the audio subsystem [default=yes]
@ -18828,6 +18831,14 @@ else $as_nop
enable_system_iconv=yes enable_system_iconv=yes
fi fi
# Check whether --enable-libiconv was given.
if test ${enable_libiconv+y}
then :
enableval=$enable_libiconv;
else $as_nop
enable_libiconv=no
fi
if test x$enable_libc = xyes; then if test x$enable_libc = xyes; then
@ -20043,53 +20054,92 @@ fi
if test x$enable_system_iconv = xyes; then if test x$enable_system_iconv = xyes; then
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for iconv_open in -liconv" >&5 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for iconv in libc" >&5
printf %s "checking for iconv_open in -liconv... " >&6; } printf %s "checking for iconv in libc... " >&6; }
if test ${ac_cv_lib_iconv_iconv_open+y} cat confdefs.h - <<_ACEOF >conftest.$ac_ext
then :
printf %s "(cached) " >&6
else $as_nop
ac_check_lib_save_LIBS=$LIBS
LIBS="-liconv $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */ /* end confdefs.h. */
/* Override any GCC internal prototype to avoid an error. #define LIBICONV_PLUG 1 /* in case libiconv header is in include path */
Use char because int might match the return type of a GCC #include <stddef.h>
builtin and then its argument prototype would still apply. */ #include <iconv.h>
char iconv_open ();
int int
main (void) main (void)
{ {
return iconv_open ();
iconv_open(NULL,NULL);
; ;
return 0; return 0;
} }
_ACEOF _ACEOF
if ac_fn_c_try_link "$LINENO" if ac_fn_c_try_link "$LINENO"
then : then :
ac_cv_lib_iconv_iconv_open=yes have_libc_iconv=yes
else $as_nop else $as_nop
ac_cv_lib_iconv_iconv_open=no have_libc_iconv=no
fi fi
rm -f core conftest.err conftest.$ac_objext conftest.beam \ rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $have_libc_iconv" >&5
fi printf "%s\n" "$have_libc_iconv" >&6; }
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_iconv_iconv_open" >&5
printf "%s\n" "$ac_cv_lib_iconv_iconv_open" >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for iconv in libiconv" >&5
if test "x$ac_cv_lib_iconv_iconv_open" = xyes printf %s "checking for iconv in libiconv... " >&6; }
save_LIBS="$LIBS"
LIBS="$LIBS -liconv"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
#include <stddef.h>
#include <iconv.h>
int
main (void)
{
iconv_open(NULL,NULL);
;
return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"
then : then :
LIBS="$LIBS -liconv"; EXTRA_LDFLAGS="$EXTRA_LDFLAGS -liconv" have_libiconv=yes
else $as_nop
have_libiconv=no
fi fi
rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
LIBS="$save_LIBS"
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $have_libiconv" >&5
printf "%s\n" "$have_libiconv" >&6; }
ac_fn_c_check_func "$LINENO" "iconv" "ac_cv_func_iconv" if test x$have_libc_iconv = xyes || test x$have_libiconv = xyes; then
if test "x$ac_cv_func_iconv" = xyes
then :
printf "%s\n" "#define HAVE_ICONV 1" >>confdefs.h
fi printf "%s\n" "#define HAVE_ICONV 1" >>confdefs.h
if test x$have_libiconv = xyes; then
if test x$have_libc_iconv != xyes; then
use_libiconv=yes
elif test x$enable_libiconv = xyes; then
use_libiconv=yes
fi
fi
if test x$use_libiconv = xyes; then
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: -- Using iconv() from libiconv" >&5
printf "%s\n" "-- Using iconv() from libiconv" >&6; }
printf "%s\n" "#define SDL_USE_LIBICONV 1" >>confdefs.h
EXTRA_LDFLAGS="$EXTRA_LDFLAGS -liconv"
else
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: -- Using iconv() from libc" >&5
printf "%s\n" "-- Using iconv() from libc" >&6; }
fi
fi
fi fi
ac_fn_c_check_member "$LINENO" "struct sigaction" "sa_sigaction" "ac_cv_member_struct_sigaction_sa_sigaction" "#include <signal.h> ac_fn_c_check_member "$LINENO" "struct sigaction" "sa_sigaction" "ac_cv_member_struct_sigaction_sa_sigaction" "#include <signal.h>
@ -27629,6 +27679,7 @@ if test "x$ac_cv_header_xinput_h" = xyes
then : then :
have_xinput=yes have_xinput=yes
fi fi
if test x$have_xinput = xyes; then if test x$have_xinput = xyes; then
printf "%s\n" "#define HAVE_XINPUT_H 1" >>confdefs.h printf "%s\n" "#define HAVE_XINPUT_H 1" >>confdefs.h

View File

@ -319,10 +319,14 @@ AC_ARG_ENABLE(libc,
[AS_HELP_STRING([--enable-libc], [Use the system C library [default=yes]])], [AS_HELP_STRING([--enable-libc], [Use the system C library [default=yes]])],
, enable_libc=yes) , enable_libc=yes)
dnl See whether we are allowed to use libiconv dnl See whether we are allowed to use system iconv
AC_ARG_ENABLE(system-iconv, AC_ARG_ENABLE(system-iconv,
[AS_HELP_STRING([--enable-system-iconv], [Use iconv() from system-installed libraries [default=yes]])], [AS_HELP_STRING([--enable-system-iconv], [Use iconv() from system-installed libraries [default=yes]])],
, enable_system_iconv=yes) , enable_system_iconv=yes)
dnl See whether we prefer libiconv over libc
AC_ARG_ENABLE(libiconv,
[AS_HELP_STRING([--enable-libiconv], [Prefer iconv() from libiconv, if available, over libc version [default=no]])],
, enable_libiconv=no)
if test x$enable_libc = xyes; then if test x$enable_libc = xyes; then
AC_DEFINE(HAVE_LIBC, 1, [ ]) AC_DEFINE(HAVE_LIBC, 1, [ ])
@ -355,8 +359,46 @@ dnl Checks for library functions.
AC_CHECK_FUNCS(acos acosf asin asinf atan atanf atan2 atan2f ceil ceilf copysign copysignf cos cosf exp expf fabs fabsf floor floorf trunc truncf fmod fmodf log logf log10 log10f lround lroundf pow powf round roundf scalbn scalbnf sin sinf sqrt sqrtf tan tanf) AC_CHECK_FUNCS(acos acosf asin asinf atan atanf atan2 atan2f ceil ceilf copysign copysignf cos cosf exp expf fabs fabsf floor floorf trunc truncf fmod fmodf log logf log10 log10f lround lroundf pow powf round roundf scalbn scalbnf sin sinf sqrt sqrtf tan tanf)
if test x$enable_system_iconv = xyes; then if test x$enable_system_iconv = xyes; then
AC_CHECK_LIB(iconv, iconv_open, [LIBS="$LIBS -liconv"; EXTRA_LDFLAGS="$EXTRA_LDFLAGS -liconv"]) AC_MSG_CHECKING(for iconv in libc)
AC_CHECK_FUNCS(iconv) AC_LINK_IFELSE([AC_LANG_PROGRAM([[
#define LIBICONV_PLUG 1 /* in case libiconv header is in include path */
#include <stddef.h>
#include <iconv.h>
]],[[
iconv_open(NULL,NULL);
]])], [have_libc_iconv=yes],[have_libc_iconv=no])
AC_MSG_RESULT($have_libc_iconv)
AC_MSG_CHECKING(for iconv in libiconv)
save_LIBS="$LIBS"
LIBS="$LIBS -liconv"
AC_LINK_IFELSE([AC_LANG_PROGRAM([[
#include <stddef.h>
#include <iconv.h>
]],[[
iconv_open(NULL,NULL);
]])], [have_libiconv=yes],[have_libiconv=no])
LIBS="$save_LIBS"
AC_MSG_RESULT($have_libiconv)
if test x$have_libc_iconv = xyes || test x$have_libiconv = xyes; then
AC_DEFINE(HAVE_ICONV,1,[ ])
if test x$have_libiconv = xyes; then
if test x$have_libc_iconv != xyes; then
use_libiconv=yes
elif test x$enable_libiconv = xyes; then
use_libiconv=yes
fi
fi
if test x$use_libiconv = xyes; then
AC_MSG_RESULT([-- Using iconv() from libiconv])
AC_DEFINE(SDL_USE_LIBICONV,1,[ ])
EXTRA_LDFLAGS="$EXTRA_LDFLAGS -liconv"
else
AC_MSG_RESULT([-- Using iconv() from libc])
fi
fi
fi fi
AC_CHECK_MEMBER(struct sigaction.sa_sigaction,[AC_DEFINE([HAVE_SA_SIGACTION], 1, [ ])], ,[#include <signal.h>]) AC_CHECK_MEMBER(struct sigaction.sa_sigaction,[AC_DEFINE([HAVE_SA_SIGACTION], 1, [ ])], ,[#include <signal.h>])

View File

@ -200,6 +200,7 @@
#cmakedefine HAVE_GETPAGESIZE 1 #cmakedefine HAVE_GETPAGESIZE 1
#cmakedefine HAVE_MPROTECT 1 #cmakedefine HAVE_MPROTECT 1
#cmakedefine HAVE_ICONV 1 #cmakedefine HAVE_ICONV 1
#cmakedefine SDL_USE_LIBICONV 1
#cmakedefine HAVE_PTHREAD_SETNAME_NP 1 #cmakedefine HAVE_PTHREAD_SETNAME_NP 1
#cmakedefine HAVE_PTHREAD_SET_NAME_NP 1 #cmakedefine HAVE_PTHREAD_SET_NAME_NP 1
#cmakedefine HAVE_SEM_TIMEDWAIT 1 #cmakedefine HAVE_SEM_TIMEDWAIT 1
@ -240,7 +241,7 @@
#cmakedefine HAVE_LIBUDEV_H 1 #cmakedefine HAVE_LIBUDEV_H 1
#cmakedefine HAVE_LIBSAMPLERATE_H 1 #cmakedefine HAVE_LIBSAMPLERATE_H 1
#cmakedefine HAVE_LIBDECOR_H 1 #cmakedefine HAVE_LIBDECOR_H 1
#cmakedefine HAVE_D3D_H @HAVE_D3D_H@ #cmakedefine HAVE_D3D_H @HAVE_D3D_H@
#cmakedefine HAVE_D3D11_H @HAVE_D3D11_H@ #cmakedefine HAVE_D3D11_H @HAVE_D3D11_H@
@ -524,7 +525,7 @@
#cmakedefine SDL_ARM_NEON_BLITTERS @SDL_ARM_NEON_BLITTERS@ #cmakedefine SDL_ARM_NEON_BLITTERS @SDL_ARM_NEON_BLITTERS@
/* Whether SDL_DYNAMIC_API needs dlopen */ /* Whether SDL_DYNAMIC_API needs dlopen */
#cmakedefine DYNAPI_NEEDS_DLOPEN @DYNAPI_NEEDS_DLOPEN@ #cmakedefine DYNAPI_NEEDS_DLOPEN @DYNAPI_NEEDS_DLOPEN@
/* Enable dynamic libsamplerate support */ /* Enable dynamic libsamplerate support */
#cmakedefine SDL_LIBSAMPLERATE_DYNAMIC @SDL_LIBSAMPLERATE_DYNAMIC@ #cmakedefine SDL_LIBSAMPLERATE_DYNAMIC @SDL_LIBSAMPLERATE_DYNAMIC@

View File

@ -204,6 +204,7 @@
#undef HAVE_GETPAGESIZE #undef HAVE_GETPAGESIZE
#undef HAVE_MPROTECT #undef HAVE_MPROTECT
#undef HAVE_ICONV #undef HAVE_ICONV
#undef SDL_USE_LIBICONV
#undef HAVE_PTHREAD_SETNAME_NP #undef HAVE_PTHREAD_SETNAME_NP
#undef HAVE_PTHREAD_SET_NAME_NP #undef HAVE_PTHREAD_SET_NAME_NP
#undef HAVE_SEM_TIMEDWAIT #undef HAVE_SEM_TIMEDWAIT

View File

@ -31,7 +31,7 @@
#include "SDL_endian.h" #include "SDL_endian.h"
#if defined(HAVE_ICONV) && defined(HAVE_ICONV_H) #if defined(HAVE_ICONV) && defined(HAVE_ICONV_H)
#ifdef __FreeBSD__ #ifndef SDL_USE_LIBICONV
/* Define LIBICONV_PLUG to use iconv from the base instead of ports and avoid linker errors. */ /* Define LIBICONV_PLUG to use iconv from the base instead of ports and avoid linker errors. */
#define LIBICONV_PLUG 1 #define LIBICONV_PLUG 1
#endif #endif