[glib] Meson: Check for HAVE_GOOD_PRINTF



commit 72528938b726f807e073a31ca2b111b1388e09d3
Author: Chun-wei Fan <fanchunwei src gnome org>
Date:   Mon Jul 17 15:51:54 2017 +0800

    Meson: Check for HAVE_GOOD_PRINTF
    
    The HAVE_GOOD_PRINTF config variable determines whether we are able to
    use the CRT-supplied *printf() functions directly, by determining whether
    the CRT-supplied vsnprintf() and snprintf() functions support C99 well
    enough.
    
    This means, we need to build the gnulib subdir as a static lib in GLib, and use
    the gnulib *printf() functions when:
    
    -We are on Windows
    -The CRT's vsnprintf() and snprintf() is not sufficiently C99-compliant.
    
    This will fix the problem when the *printf() functions cause a CRT
    abort() call on pre-2015 Visual Studio builds at least, and ensures that
    the Visual Studio 2015+ builds will pass the printf tests in GLib, since
    the *printf() in Visual Studio 2015/2017's CRT does not support the %n
    format specifier, nor the positional parameters (which requires
    different _*printf_p*() functions), as indicated by
    glib/tests/test-printf.c.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=783270

 glib/gnulib/meson.build |    4 ++++
 glib/meson.build        |    7 ++++++-
 meson.build             |   24 ++++++++++++++++++------
 3 files changed, 28 insertions(+), 7 deletions(-)
---
diff --git a/glib/gnulib/meson.build b/glib/gnulib/meson.build
new file mode 100644
index 0000000..6746631
--- /dev/null
+++ b/glib/gnulib/meson.build
@@ -0,0 +1,4 @@
+gnulib_lib = static_library('gnulib', 'asnprintf.c', 'printf.c', 'printf-args.c', 'printf-parse.c', 
'vasnprintf.c',
+  include_directories : configinc,
+  pic : true,
+  c_args : [ '-DLIBDIR="@0@"'.format(get_option('libdir')), '-DGLIB_COMPILATION', '-DG_LOG_DOMAIN="GLib"' ] 
+ glib_hidden_visibility_args)
diff --git a/glib/meson.build b/glib/meson.build
index acdb27c..008d21f 100644
--- a/glib/meson.build
+++ b/glib/meson.build
@@ -7,6 +7,11 @@ subdir('libcharset')
 if not use_system_pcre
   subdir('pcre')
 endif
+if have_good_vsnprintf and have_good_snprintf
+  gnulib_lib = []
+else
+  subdir('gnulib')
+endif
 
 glib_headers = [
   'glib.h',
@@ -217,7 +222,7 @@ libglib = shared_library('glib-2.0',
   # intl.lib is not compatible with SAFESEH
   link_args : noseh_link_args,
   include_directories : configinc,
-  link_with : charset_lib,
+  link_with : [charset_lib, gnulib_lib],
   dependencies : [pcre, thread_dep, libintl, librt] + libiconv + platform_deps,
   c_args : ['-DG_LOG_DOMAIN="GLib"', '-DGLIB_COMPILATION', '-DPCRE_STATIC'] + glib_hidden_visibility_args
 )
diff --git a/meson.build b/meson.build
index 60787b7..4019f62 100644
--- a/meson.build
+++ b/meson.build
@@ -84,7 +84,6 @@ glib_conf.set_quoted('PACKAGE_TARNAME', 'glib')
 glib_conf.set_quoted('PACKAGE_URL', '')
 glib_conf.set_quoted('PACKAGE_VERSION', meson.project_version())
 glib_conf.set('ENABLE_NLS', 1)
-glib_conf.set('HAVE_GOOD_PRINTF', 1) # FIXME
 
 # Variables used in glib-gettextize and pkg-config files
 # These should not contain " quotes around the values
@@ -557,11 +556,15 @@ endif
 # AC_FUNC_VSNPRINTF_C99
 # Check whether there is a snprintf() function with C99 semantics installed.
 # AC_FUNC_SNPRINTF_C99
-if host_system == 'windows' and cc.get_id() == 'gcc'
-  # Unfortunately the mingw implementations of C99-style snprintf and vsnprintf
-  # don't seem to be quite good enough, at least not in mingw-runtime-3.14.
-  # (Sorry, I don't know exactly what is the problem, but it is related to
-  # floating point formatting and decimal point vs. comma.)
+
+have_good_vsnprintf = false
+have_good_snprintf = false
+
+if host_system == 'windows'
+  # Unfortunately the mingw and Visual Studio 2015+ implementations of C99-style
+  # snprintf and vsnprintf don't seem to be quite good enough, at least not in
+  # mingw-runtime-3.14.  (Sorry, I don't know exactly what is the problem,
+  # but it is related to floating point formatting and decimal point vs. comma.)
   # The simple tests in AC_FUNC_VSNPRINTF_C99 and AC_FUNC_SNPRINTF_C99 aren't
   # rigorous enough to notice, though.
   glib_conf.set('HAVE_C99_SNPRINTF', false)
@@ -608,6 +611,7 @@ main(void)
   rres = cc.run(vsnprintf_c99_test_code, name : 'C99 vsnprintf')
   if rres.compiled() and rres.returncode() == 0
     glib_conf.set('HAVE_C99_VSNPRINTF', 1)
+    have_good_vsnprintf = true
   endif
 
   snprintf_c99_test_code = '''
@@ -649,6 +653,7 @@ main(void)
   rres = cc.run(snprintf_c99_test_code, name : 'C99 snprintf')
   if rres.compiled() and rres.returncode() == 0
     glib_conf.set('HAVE_C99_SNPRINTF', 1)
+    have_good_snprintf = true
   endif
 endif
 
@@ -658,6 +663,13 @@ else
   glib_conf.set('EXEEXT', '')
 endif
 
+if have_good_vsnprintf and have_good_snprintf
+  # Our printf is 'good' only if vsnpintf()/snprintf() supports C99 well enough
+  glib_conf.set('HAVE_GOOD_PRINTF', 1) # FIXME: Check for HAVE_UNIX98_PRINTF?
+else
+  glib_conf.set('HAVE_VASPRINTF', 1)
+endif
+
 # Check whether the printf() family supports Unix98 %n$ positional parameters
 # AC_FUNC_PRINTF_UNIX98
 # Nothing uses HAVE_UNIX98_PRINTF


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