|
|
- From 750687bf2824fcaf8976fb8b558d583f29acdfeb Mon Sep 17 00:00:00 2001
- From: Eli Schwartz <eschwartz@archlinux.org>
- Date: Tue, 7 Jun 2022 16:14:04 -0400
- Subject: [PATCH 1/2] meson: simplify iconv lookups using Meson's builtin
- dependency lookup
-
- iconv is complicated to look up. That complexity now resides in
- Meson, since 0.60.0, via a `dependency('iconv')` lookup, so use that
- instead.
-
- No effort is made to support the old option for which type of iconv to
- use. It was a false choice, because if only one was available, then
- that's the only one you can use, and if both are available, the external
- iconv shadows the builtin one and renders the builtin one unusable,
- so there is still only one you can use.
-
- This meant that when configuring glib with -Diconv=libc on systems that
- had an external iconv, the configure check would detect a valid libc
- iconv, try to use it, and then fail during the build because iconv.h
- belongs to the external iconv and generates machine code using the
- external iconv ABI, but fails to link to the iconv `find_library()`.
- Meson handles this transparently.
- ---
- meson.build | 20 +-------------------
- meson_options.txt | 8 +-------
- 2 files changed, 2 insertions(+), 26 deletions(-)
-
- --- a/meson.build
- +++ b/meson.build
- @@ -1958,28 +1958,10 @@ glibconfig_conf.set10('G_HAVE_GROWING_ST
- # 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
- - if iconv_opt != 'auto'
- - warning('-Diconv was set to @0@, which was ignored')
- - endif
- else
- - found_iconv = false
- - 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
- + libiconv = dependency('iconv')
- endif
-
- pcre = dependency('libpcre', version: '>= 8.31', required : false) # Should check for Unicode support, too. FIXME
- @@ -2046,42 +2028,37 @@ endif
- # FIXME: glib-gettext.m4 has much more checks to detect broken/uncompatible
- # implementations. This could be extended if issues are found in some platforms.
- libintl_deps = []
- -if cc.has_function('ngettext', args : osx_ldflags)
- - have_bind_textdomain_codeset = cc.has_function('bind_textdomain_codeset')
- -else
- - # First just find the bare library.
- - libintl = cc.find_library('intl', required : false)
- - # The bare library probably won't link without help if it's static.
- - if libintl.found() and not cc.has_function('ngettext', args : osx_ldflags, dependencies : libintl)
- - libintl_iconv = cc.find_library('iconv', required : false)
- - # libintl supports different threading APIs, which may not
- - # require additional flags, but it defaults to using pthreads if
- - # found. Meson's "threads" dependency does not allow you to
- - # prefer pthreads. We may not be using pthreads for glib itself
- - # either so just link the library to satisfy libintl rather than
- - # also defining the macros with the -pthread flag.
- - libintl_pthread = cc.find_library('pthread', required : false)
- - # Try linking with just libiconv.
- - if libintl_iconv.found() and cc.has_function('ngettext', args : osx_ldflags, dependencies : [libintl, libintl_iconv])
- - libintl_deps += [libintl_iconv]
- - # Then also try linking with pthreads.
- - elif libintl_iconv.found() and libintl_pthread.found() and cc.has_function('ngettext', args : osx_ldflags, dependencies : [libintl, libintl_iconv, libintl_pthread])
- - libintl_deps += [libintl_iconv, libintl_pthread]
- - else
- - libintl = disabler()
- - endif
- - endif
- - if not libintl.found()
- - libintl = subproject('proxy-libintl').get_variable('intl_dep')
- - libintl_deps = [libintl] + libintl_deps
- - have_bind_textdomain_codeset = true # proxy-libintl supports it
- +libintl = dependency('intl', required: false)
- +if libintl.found()
- + # libintl supports different threading APIs, which may not
- + # require additional flags, but it defaults to using pthreads if
- + # found. Meson's "threads" dependency does not allow you to
- + # prefer pthreads. We may not be using pthreads for glib itself
- + # either so just link the library to satisfy libintl rather than
- + # also defining the macros with the -pthread flag.
- + #
- + # Meson's builtin dependency lookup as of 0.60.0 doesn't check for
- + # pthread, so we do this manually here.
- + if cc.has_function('ngettext', dependencies : libintl)
- + libintl_deps += [libintl]
- else
- - libintl_deps = [libintl] + libintl_deps
- - have_bind_textdomain_codeset = cc.has_function('bind_textdomain_codeset', args : osx_ldflags,
- - dependencies : libintl_deps)
- + libintl_pthread = cc.find_library('pthread', required : false)
- + if libintl_pthread.found() and cc.has_function('ngettext', dependencies : [libintl, libintl_pthread])
- + libintl_deps += [libintl, libintl_pthread]
- + else
- + libintl = disabler()
- + endif
- endif
- endif
-
- +if libintl.found()
- + have_bind_textdomain_codeset = cc.has_function('bind_textdomain_codeset', dependencies: libintl_deps)
- +else
- + libintl = subproject('proxy-libintl').get_variable('intl_dep')
- + libintl_deps = [libintl]
- + have_bind_textdomain_codeset = true # proxy-libintl supports it
- +endif
- +
- glib_conf.set('HAVE_BIND_TEXTDOMAIN_CODESET', have_bind_textdomain_codeset)
-
- # We require gettext to always be present
- --- a/meson_options.txt
- +++ b/meson_options.txt
- @@ -3,12 +3,6 @@ option('runtime_libdir',
- value : '',
- description : 'install runtime libraries relative to libdir')
-
- -option('iconv',
- - type : 'combo',
- - 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',
- value : '',
|