diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 8897da3e1..c9cd70f32 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -95,7 +95,9 @@ cross-android_api21_arm64: <<: *cross-template script: # FIXME: add --werror - - meson ${MESON_COMMON_OPTIONS} --cross-file=/opt/cross_file_android_arm64_21.txt -Diconv=gnu -Dinternal_pcre=true _build + # We use -Diconv=auto to test that we successfully detect that iconv is not + # provided by android api 21, and detect the external iconv instead. + - meson ${MESON_COMMON_OPTIONS} --cross-file=/opt/cross_file_android_arm64_21.txt -Diconv=auto -Dinternal_pcre=true _build - ninja -C _build cross-android_api28_arm64: @@ -173,10 +175,10 @@ freebsd-11-x86_64: LANG: en_US.UTF-8 script: # We cannot use -Wl,--no-undefined because GLib uses 'environ' variable. - # FreeBSD iconv doesn't handle transliteration, so we use GNU libiconv here. + # FreeBSD iconv doesn't handle transliteration, so we use (external) GNU libiconv here. # FreeBSD supports xattr, but its API is different from Linux xattr. # FIXME: extattr(2) support: https://gitlab.gnome.org/GNOME/glib/issues/1404 - - meson ${MESON_COMMON_OPTIONS} -Db_lundef=false -Diconv=gnu -Dxattr=false _build + - meson ${MESON_COMMON_OPTIONS} -Db_lundef=false -Diconv=external -Dxattr=false _build - ninja -C _build - bash -x ./.gitlab-ci/run-tests.sh except: diff --git a/glib/gconvert.c b/glib/gconvert.c index 707867951..c5857df1c 100644 --- a/glib/gconvert.c +++ b/glib/gconvert.c @@ -52,14 +52,6 @@ #include "glibintl.h" -#if defined(USE_LIBICONV_GNU) && !defined (_LIBICONV_H) -#error GNU libiconv in use but included iconv.h not from libiconv -#endif -#if !defined(USE_LIBICONV_GNU) && defined (_LIBICONV_H) \ - && !defined (__APPLE_CC__) && !defined (__LP_64__) -#error GNU libiconv not in use but included iconv.h is from libiconv -#endif - /** * SECTION:conversions diff --git a/meson.build b/meson.build index b80264759..85433fb3b 100644 --- a/meson.build +++ b/meson.build @@ -1690,42 +1690,31 @@ glibconfig_conf.set10('G_HAVE_GROWING_STACK', growing_stack) # Tests for iconv # -# USE_LIBICONV_GNU: Using GNU libiconv -# 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 -# GNU implementation that ships with MinGW. - -# On Windows, just always use the built-in implementation +# We should never use the MinGW C library's iconv because it may not be +# available in the actual runtime environment. On Windows, we always use +# the built-in implementation +iconv_opt = get_option('iconv') if host_system == 'windows' libiconv = [] - glib_conf.set('USE_LIBICONV_NATIVE', true) + # We have a #include "win_iconv.c" in gconvert.c on Windows, so we don't need + # any external library for it + if iconv_opt != 'auto' + warning('-Diconv was set to @0@, which was ignored') + endif else found_iconv = false - iconv_opt = get_option('iconv') - if iconv_opt == 'libc' - if cc.has_function('iconv_open') - libiconv = [] - found_iconv = true - endif - elif iconv_opt == 'gnu' - if cc.has_header_symbol('iconv.h', 'libiconv_open') - glib_conf.set('USE_LIBICONV_GNU', true) - libiconv = [cc.find_library('iconv')] - found_iconv = true - endif - elif iconv_opt == 'native' - 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 + if ['auto', 'libc'].contains(iconv_opt) and cc.has_function('iconv_open') + libiconv = [] + found_iconv = true + endif + if not found_iconv and ['auto', 'external'].contains(iconv_opt) and cc.has_header_symbol('iconv.h', 'iconv_open') + libiconv = [cc.find_library('iconv')] + found_iconv = true endif if not found_iconv error('iconv implementation "@0@" not found'.format(iconv_opt)) endif - endif if get_option('internal_pcre') diff --git a/meson_options.txt b/meson_options.txt index 897d06607..2c831e37e 100644 --- a/meson_options.txt +++ b/meson_options.txt @@ -5,9 +5,9 @@ option('runtime_libdir', option('iconv', type : 'combo', - choices : ['libc', 'gnu', 'native'], - value : 'libc', - description : 'iconv implementation to use (\'libc\' = \'Part of the C stdlib\'; \'gnu\' = \'GNU\'s iconv\'; \'native\' = \'A separate iconv\')') + choices : ['auto', 'libc', 'external'], + value : 'auto', + description : 'iconv implementation to use (\'libc\' = \'Part of the C library\'; \'external\' = \'External libiconv\'; \'auto\' = \'Auto-detect which iconv is available\')') option('charsetalias_dir', type : 'string',