[glib: 1/4] meson: Add autodetection to the iconv combo option



commit 2f066aeb51c9968a0b9e68277e53c67d9a4d03e0
Author: Nirbheek Chauhan <nirbheek centricular com>
Date:   Fri Mar 29 18:01:47 2019 +0530

    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

 meson.build       | 45 ++++++++++++++++++++++-----------------------
 meson_options.txt |  6 +++---
 2 files changed, 25 insertions(+), 26 deletions(-)
---
diff --git a/meson.build b/meson.build
index b80264759..0ec80c177 100644
--- a/meson.build
+++ b/meson.build
@@ -1693,39 +1693,38 @@ glibconfig_conf.set10('G_HAVE_GROWING_STACK', growing_stack)
 # 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 = []
+  # 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)
+  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', 'native'].contains(iconv_opt) and 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 not found_iconv and ['auto', 'gnu'].contains(iconv_opt) and cc.has_header_symbol('iconv.h', 
'libiconv_open')
+    glib_conf.set('USE_LIBICONV_GNU', true)
+    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..0841f6bfe 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', 'native', 'gnu'],
+       value : 'auto',
+       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',
        type : 'string',


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]