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); -- Cheers, Eric _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev