meson: Add autodetection to the iconv combo option

Instead of requiring the user to specify which option to use, which
they will not really know, nor should they need to know.

Search for each type of iconv (in the C library, as a separate
native library, as the GNU implementation) by default.

Fixes https://gitlab.gnome.org/GNOME/glib/issues/1557
This commit is contained in:
Nirbheek Chauhan 2019-03-29 18:01:47 +05:30
parent eefe435828
commit 2f066aeb51
2 changed files with 25 additions and 26 deletions

View File

@ -1693,39 +1693,38 @@ glibconfig_conf.set10('G_HAVE_GROWING_STACK', growing_stack)
# USE_LIBICONV_GNU: Using GNU libiconv # USE_LIBICONV_GNU: Using GNU libiconv
# USE_LIBICONV_NATIVE: Using a native impl of iconv in a separate library # USE_LIBICONV_NATIVE: Using a native impl of iconv in a separate library
# #
# We should never use the MinGW C library's iconv. On Windows we use the # We should never use the MinGW C library's iconv because it may not be
# GNU implementation that ships with MinGW. # available in the actual runtime environment. On Windows, we always use
# the built-in implementation
# On Windows, just always use the built-in implementation iconv_opt = get_option('iconv')
if host_system == 'windows' if host_system == 'windows'
libiconv = [] libiconv = []
# We have a #include "win_iconv.c" in gconvert.c on Windows, so we don't need
# any external library for it
glib_conf.set('USE_LIBICONV_NATIVE', true) glib_conf.set('USE_LIBICONV_NATIVE', true)
if iconv_opt != 'auto'
warning('-Diconv was set to @0@, which was ignored')
endif
else else
found_iconv = false found_iconv = false
iconv_opt = get_option('iconv') if ['auto', 'libc'].contains(iconv_opt) and cc.has_function('iconv_open')
if iconv_opt == 'libc' libiconv = []
if cc.has_function('iconv_open') found_iconv = true
libiconv = [] endif
found_iconv = true if not found_iconv and ['auto', 'native'].contains(iconv_opt) and cc.has_header_symbol('iconv.h', 'iconv_open')
endif glib_conf.set('USE_LIBICONV_NATIVE', true)
elif iconv_opt == 'gnu' libiconv = [cc.find_library('iconv')]
if cc.has_header_symbol('iconv.h', 'libiconv_open') found_iconv = true
glib_conf.set('USE_LIBICONV_GNU', true) endif
libiconv = [cc.find_library('iconv')] if not found_iconv and ['auto', 'gnu'].contains(iconv_opt) and cc.has_header_symbol('iconv.h', 'libiconv_open')
found_iconv = true glib_conf.set('USE_LIBICONV_GNU', true)
endif libiconv = [cc.find_library('iconv')]
elif iconv_opt == 'native' found_iconv = true
if cc.has_header_symbol('iconv.h', 'iconv_open')
glib_conf.set('USE_LIBICONV_NATIVE', true)
libiconv = [cc.find_library('iconv')]
found_iconv = true
endif
endif endif
if not found_iconv if not found_iconv
error('iconv implementation "@0@" not found'.format(iconv_opt)) error('iconv implementation "@0@" not found'.format(iconv_opt))
endif endif
endif endif
if get_option('internal_pcre') if get_option('internal_pcre')

View File

@ -5,9 +5,9 @@ option('runtime_libdir',
option('iconv', option('iconv',
type : 'combo', type : 'combo',
choices : ['libc', 'gnu', 'native'], choices : ['auto', 'libc', 'native', 'gnu'],
value : 'libc', value : 'auto',
description : 'iconv implementation to use (\'libc\' = \'Part of the C stdlib\'; \'gnu\' = \'GNU\'s iconv\'; \'native\' = \'A separate iconv\')') description : 'iconv implementation to use (\'libc\' = \'Part of the C stdlib\'; \'gnu\' = \'GNU\'s iconv\'; \'native\' = \'A separate iconv\'; \'auto\' = \'Auto-detect which iconv is available\')')
option('charsetalias_dir', option('charsetalias_dir',
type : 'string', type : 'string',