Le jeudi 31 août 2017, 18:54:48 CEST Eric Engestrom a écrit : Reviewed-by: Laurent Carlier <lordhea...@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 <lordhea...@gmail.com> > Cc: Emil Velikov <emil.l.veli...@gmail.com> > Cc: Rob Herring <r...@kernel.org> > Signed-off-by: Eric Engestrom <eric.engest...@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
signature.asc
Description: This is a digitally signed message part.
_______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev