[Mesa-dev] [PATCH mesa] util: improve compiler guard

Laurent Carlier lordheavym at gmail.com
Fri Sep 1 18:45:03 UTC 2017


Le jeudi 31 août 2017, 18:54:48 CEST Eric Engestrom a écrit :

Reviewed-by: Laurent Carlier <lordheavym at gmail.com>

> Glibc 2.26 has dropped xlocale.h, but the functions needed (strtod_l()
> and strdof_l()) can be found in stdlib.h.
> Improve the detection method to allow newer builds to still make use of
> the locale-setting.
> 
> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=102454
> Cc: Laurent Carlier <lordheavym at gmail.com>
> Cc: Emil Velikov <emil.l.velikov at gmail.com>
> Cc: Rob Herring <robh at kernel.org>
> Signed-off-by: Eric Engestrom <eric.engestrom at imgtec.com>
> ---
> 
> Rob, any idea if android needs locale-setting? Emil suggested it might
> always use "C" anyway.
> 
> For SCons, I added a trivial "does this function exist" check, but
> I don't even know what headers it includes when checking that. There's
> a chance this might break the scons build (appveyor is happy though,
> fwiw).
> 
> If anyone knows how to do the same check in scons that I'm doing in
> autoconf, speak up :)
> 
> ---
>  configure.ac      | 21 +++++++++++++++++++++
>  scons/gallium.py  | 16 ++++++++++++++++
>  src/util/strtod.c | 12 ++++++------
>  3 files changed, 43 insertions(+), 6 deletions(-)
> 
> diff --git a/configure.ac b/configure.ac
> index 53d52f6d52..f4d83e1c10 100644
> --- a/configure.ac
> +++ b/configure.ac
> @@ -826,6 +826,27 @@ AC_CHECK_HEADER([sys/sysctl.h], [DEFINES="$DEFINES
> -DHAVE_SYS_SYSCTL_H"]) AC_CHECK_FUNC([strtof], [DEFINES="$DEFINES
> -DHAVE_STRTOF"])
>  AC_CHECK_FUNC([mkostemp], [DEFINES="$DEFINES -DHAVE_MKOSTEMP"])
> 
> +AC_MSG_CHECKING([whether strtod has locale support])
> +AC_LINK_IFELSE([AC_LANG_SOURCE([[
> +    #define _GNU_SOURCE
> +    #include <stdlib.h>
> +    #include <locale.h>
> +    #ifdef HAVE_XLOCALE_H
> +    #include <xlocale.h>
> +    #endif
> +    int main() {
> +       locale_t loc = newlocale(LC_CTYPE_MASK, "C", NULL);
> +       const char *s = "1.0";
> +       char *end;
> +       double d = strtod_l(s, end, loc);
> +       float f = strtof_l(s, end, loc);
> +       freelocale(loc);
> +       return 0;
> +    }]])],
> +  [DEFINES="$DEFINES -DHAVE_STRTOD_L"];
> +   AC_MSG_RESULT([yes]),
> +   AC_MSG_RESULT([no]))
> +
>  dnl Check to see if dlopen is in default libraries (like Solaris, which
>  dnl has it in libc), or if libdl is needed to get it.
>  AC_CHECK_FUNC([dlopen], [DEFINES="$DEFINES -DHAVE_DLOPEN"],
> diff --git a/scons/gallium.py b/scons/gallium.py
> index c8e47a39db..1e35ef434a 100755
> --- a/scons/gallium.py
> +++ b/scons/gallium.py
> @@ -157,6 +157,19 @@ def check_header(env, header):
>      env = conf.Finish()
>      return have_header
> 
> +def check_functions(env, functions):
> +    '''Check if all of the functions exist'''
> +
> +    conf = SCons.Script.Configure(env)
> +    have_functions = True
> +
> +    for function in functions:
> +        if not conf.CheckFunc(function):
> +            have_functions = False
> +
> +    env = conf.Finish()
> +    return have_functions
> +
>  def check_prog(env, prog):
>      """Check whether this program exists."""
> 
> @@ -339,6 +352,9 @@ def generate(env):
>          if check_header(env, 'xlocale.h'):
>              cppdefines += ['HAVE_XLOCALE_H']
> 
> +        if check_functions(env, ['strtod_l', 'strtof_l']):
> +            cppdefines += ['HAVE_STRTOD_L']
> +
>      if platform == 'windows':
>          cppdefines += [
>              'WIN32',
> diff --git a/src/util/strtod.c b/src/util/strtod.c
> index ea7d395e2d..de695d64b4 100644
> --- a/src/util/strtod.c
> +++ b/src/util/strtod.c
> @@ -26,13 +26,13 @@
> 
>  #include <stdlib.h>
> 
> -#ifdef _GNU_SOURCE
> +#if defined(_GNU_SOURCE) && defined(HAVE_STRTOD_L)
>  #include <locale.h>
>  #ifdef HAVE_XLOCALE_H
>  #include <xlocale.h>
> +#endif
>  static locale_t loc;
>  #endif
> -#endif
> 
>  #include "strtod.h"
> 
> @@ -40,7 +40,7 @@ static locale_t loc;
>  void
>  _mesa_locale_init(void)
>  {
> -#if defined(_GNU_SOURCE) && defined(HAVE_XLOCALE_H)
> +#if defined(_GNU_SOURCE) && defined(HAVE_STRTOD_L)
>     loc = newlocale(LC_CTYPE_MASK, "C", NULL);
>  #endif
>  }
> @@ -48,7 +48,7 @@ _mesa_locale_init(void)
>  void
>  _mesa_locale_fini(void)
>  {
> -#if defined(_GNU_SOURCE) && defined(HAVE_XLOCALE_H)
> +#if defined(_GNU_SOURCE) && defined(HAVE_STRTOD_L)
>     freelocale(loc);
>  #endif
>  }
> @@ -60,7 +60,7 @@ _mesa_locale_fini(void)
>  double
>  _mesa_strtod(const char *s, char **end)
>  {
> -#if defined(_GNU_SOURCE) && defined(HAVE_XLOCALE_H)
> +#if defined(_GNU_SOURCE) && defined(HAVE_STRTOD_L)
>     return strtod_l(s, end, loc);
>  #else
>     return strtod(s, end);
> @@ -75,7 +75,7 @@ _mesa_strtod(const char *s, char **end)
>  float
>  _mesa_strtof(const char *s, char **end)
>  {
> -#if defined(_GNU_SOURCE) && defined(HAVE_XLOCALE_H)
> +#if defined(_GNU_SOURCE) && defined(HAVE_STRTOD_L)
>     return strtof_l(s, end, loc);
>  #elif defined(HAVE_STRTOF)
>     return strtof(s, end);


-- 
Laurent Carlier
http://www.archlinux.org
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 488 bytes
Desc: This is a digitally signed message part.
URL: <https://lists.freedesktop.org/archives/mesa-dev/attachments/20170901/4b77e763/attachment.sig>


More information about the mesa-dev mailing list