util: improve compiler guard

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@gmail.com>
Cc: Emil Velikov <emil.l.velikov@gmail.com>
Cc: Rob Herring <robh@kernel.org>
Signed-off-by: Eric Engestrom <eric.engestrom@imgtec.com>
Reviewed-by: Laurent Carlier <lordheavym@gmail.com>
Reviewed-by: Jose Fonseca <jfonseca@vmware.com>
This commit is contained in:
Eric Engestrom
2017-08-31 16:55:56 +00:00
committed by Eric Engestrom
parent 8514c5d078
commit 49b428470e
3 changed files with 43 additions and 6 deletions

View File

@@ -795,6 +795,27 @@ AC_CHECK_HEADER([sys/sysctl.h], [DEFINES="$DEFINES -DHAVE_SYS_SYSCTL_H"])
AC_CHECK_FUNC([strtof], [DEFINES="$DEFINES -DHAVE_STRTOF"]) AC_CHECK_FUNC([strtof], [DEFINES="$DEFINES -DHAVE_STRTOF"])
AC_CHECK_FUNC([mkostemp], [DEFINES="$DEFINES -DHAVE_MKOSTEMP"]) 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 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. dnl has it in libc), or if libdl is needed to get it.
AC_CHECK_FUNC([dlopen], [DEFINES="$DEFINES -DHAVE_DLOPEN"], AC_CHECK_FUNC([dlopen], [DEFINES="$DEFINES -DHAVE_DLOPEN"],

View File

@@ -157,6 +157,19 @@ def check_header(env, header):
env = conf.Finish() env = conf.Finish()
return have_header 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): def check_prog(env, prog):
"""Check whether this program exists.""" """Check whether this program exists."""
@@ -339,6 +352,9 @@ def generate(env):
if check_header(env, 'xlocale.h'): if check_header(env, 'xlocale.h'):
cppdefines += ['HAVE_XLOCALE_H'] cppdefines += ['HAVE_XLOCALE_H']
if check_functions(env, ['strtod_l', 'strtof_l']):
cppdefines += ['HAVE_STRTOD_L']
if platform == 'windows': if platform == 'windows':
cppdefines += [ cppdefines += [
'WIN32', 'WIN32',

View File

@@ -26,12 +26,12 @@
#include <stdlib.h> #include <stdlib.h>
#ifdef _GNU_SOURCE #if defined(_GNU_SOURCE) && defined(HAVE_STRTOD_L)
#include <locale.h> #include <locale.h>
#ifdef HAVE_XLOCALE_H #ifdef HAVE_XLOCALE_H
#include <xlocale.h> #include <xlocale.h>
static locale_t loc;
#endif #endif
static locale_t loc;
#endif #endif
#include "strtod.h" #include "strtod.h"
@@ -40,7 +40,7 @@ static locale_t loc;
void void
_mesa_locale_init(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); loc = newlocale(LC_CTYPE_MASK, "C", NULL);
#endif #endif
} }
@@ -48,7 +48,7 @@ _mesa_locale_init(void)
void void
_mesa_locale_fini(void) _mesa_locale_fini(void)
{ {
#if defined(_GNU_SOURCE) && defined(HAVE_XLOCALE_H) #if defined(_GNU_SOURCE) && defined(HAVE_STRTOD_L)
freelocale(loc); freelocale(loc);
#endif #endif
} }
@@ -60,7 +60,7 @@ _mesa_locale_fini(void)
double double
_mesa_strtod(const char *s, char **end) _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); return strtod_l(s, end, loc);
#else #else
return strtod(s, end); return strtod(s, end);
@@ -75,7 +75,7 @@ _mesa_strtod(const char *s, char **end)
float float
_mesa_strtof(const char *s, char **end) _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); return strtof_l(s, end, loc);
#elif defined(HAVE_STRTOF) #elif defined(HAVE_STRTOF)
return strtof(s, end); return strtof(s, end);