2022-06-29 16:02:05 +08:00
|
|
|
# glib enables -Werror=format-nonliteral by default, but the embedded gnulib
|
|
|
|
# needs to handle user provided format strings.
|
|
|
|
extra_gnulib_args = cc.get_supported_arguments([
|
|
|
|
'-Wno-format-nonliteral', '-Wno-duplicated-branches'])
|
|
|
|
|
|
|
|
math_h_config = configuration_data ()
|
|
|
|
|
|
|
|
unneeded_funcs = [
|
|
|
|
'ACOSF',
|
|
|
|
'ACOSL',
|
|
|
|
'ASINF',
|
|
|
|
'ASINL',
|
|
|
|
'ATAN2F',
|
|
|
|
'ATANF',
|
|
|
|
'ATANL',
|
|
|
|
'CBRT',
|
|
|
|
'CBRTF',
|
|
|
|
'CBRTL',
|
|
|
|
'CEIL',
|
|
|
|
'CEILF',
|
|
|
|
'CEILL',
|
|
|
|
'COPYSIGN',
|
|
|
|
'COPYSIGNF',
|
|
|
|
'COPYSIGNL',
|
|
|
|
'COSF',
|
|
|
|
'COSHF',
|
|
|
|
'COSL',
|
|
|
|
'EXP2',
|
|
|
|
'EXP2F',
|
|
|
|
'EXP2L',
|
|
|
|
'EXPF',
|
|
|
|
'EXPL',
|
|
|
|
'EXPM1',
|
|
|
|
'EXPM1F',
|
|
|
|
'EXPM1L',
|
|
|
|
'FABSF',
|
|
|
|
'FABSL',
|
|
|
|
'FLOOR',
|
|
|
|
'FLOORF',
|
|
|
|
'FLOORL',
|
|
|
|
'FMA',
|
|
|
|
'FMAF',
|
|
|
|
'FMAL',
|
|
|
|
'FMOD',
|
|
|
|
'FMODF',
|
|
|
|
'FMODL',
|
|
|
|
'FREXPF',
|
|
|
|
'HYPOT',
|
|
|
|
'HYPOTF',
|
|
|
|
'HYPOTL',
|
|
|
|
'ILOGB',
|
|
|
|
'ILOGBF',
|
|
|
|
'ILOGBL',
|
|
|
|
'LDEXPF',
|
|
|
|
'LOG',
|
|
|
|
'LOG10',
|
|
|
|
'LOG10F',
|
|
|
|
'LOG10L',
|
|
|
|
'LOG1P',
|
|
|
|
'LOG1PF',
|
|
|
|
'LOG1PL',
|
|
|
|
'LOG2',
|
|
|
|
'LOG2F',
|
|
|
|
'LOG2L',
|
|
|
|
'LOGB',
|
|
|
|
'LOGBF',
|
|
|
|
'LOGBL',
|
|
|
|
'LOGF',
|
|
|
|
'LOGL',
|
|
|
|
'MODF',
|
|
|
|
'MODFF',
|
|
|
|
'MODFL',
|
|
|
|
'POWF',
|
|
|
|
'REMAINDER',
|
|
|
|
'REMAINDERF',
|
|
|
|
'REMAINDERL',
|
|
|
|
'RINT',
|
|
|
|
'RINTF',
|
|
|
|
'RINTL',
|
|
|
|
'ROUND',
|
|
|
|
'ROUNDF',
|
|
|
|
'ROUNDL',
|
|
|
|
'SINF',
|
|
|
|
'SINHF',
|
|
|
|
'SINL',
|
|
|
|
'SQRTF',
|
|
|
|
'SQRTL',
|
|
|
|
'TANF',
|
|
|
|
'TANHF',
|
|
|
|
'TANL',
|
|
|
|
'TRUNC',
|
|
|
|
'TRUNCF',
|
|
|
|
'TRUNCL',
|
|
|
|
]
|
|
|
|
|
|
|
|
foreach f : unneeded_funcs
|
|
|
|
math_h_config.set ('GNULIB_' + f, 0)
|
|
|
|
# These are not used in practice, guarded by
|
|
|
|
# the appropriate GNULIB_*, but meson config
|
|
|
|
# processor doesn't know that
|
|
|
|
math_h_config.set ('HAVE_' + f, 'variable not used')
|
|
|
|
math_h_config.set ('REPLACE_' + f, 'variable not used')
|
|
|
|
endforeach
|
|
|
|
|
|
|
|
needed_funcs = [
|
|
|
|
'FREXP',
|
|
|
|
'FREXPL',
|
|
|
|
'ISFINITE',
|
|
|
|
'ISINF',
|
|
|
|
'ISNAN',
|
|
|
|
'ISNAND',
|
|
|
|
'ISNANF',
|
|
|
|
'ISNANL',
|
|
|
|
'LDEXPL',
|
|
|
|
'SIGNBIT',
|
|
|
|
]
|
|
|
|
|
|
|
|
foreach f : needed_funcs
|
|
|
|
math_h_config.set ('GNULIB_' + f, 1)
|
|
|
|
endforeach
|
|
|
|
|
|
|
|
math_h_config.set ('GUARD_PREFIX', 'GL')
|
|
|
|
|
|
|
|
decls_for_unused_funcs = [
|
|
|
|
'ACOSL',
|
|
|
|
'ASINL',
|
|
|
|
'ATANL',
|
|
|
|
'CBRTF',
|
|
|
|
'CBRTL',
|
|
|
|
'CEILF',
|
|
|
|
'CEILL',
|
|
|
|
'COPYSIGNF',
|
|
|
|
'COSL',
|
|
|
|
'EXP2',
|
|
|
|
'EXP2F',
|
|
|
|
'EXP2L',
|
|
|
|
'EXPL',
|
|
|
|
'EXPM1L',
|
|
|
|
'FLOORF',
|
|
|
|
'FLOORL',
|
|
|
|
'LOG10L',
|
|
|
|
'LOG2',
|
|
|
|
'LOG2F',
|
|
|
|
'LOG2L',
|
|
|
|
'LOGB',
|
|
|
|
'LOGL',
|
|
|
|
'REMAINDER',
|
|
|
|
'REMAINDERL',
|
|
|
|
'RINTF',
|
|
|
|
'ROUND',
|
|
|
|
'ROUNDF',
|
|
|
|
'ROUNDL',
|
|
|
|
'SINL',
|
|
|
|
'SQRTL',
|
|
|
|
'TANL',
|
|
|
|
'TRUNC',
|
|
|
|
'TRUNCF',
|
|
|
|
'TRUNCL',
|
|
|
|
]
|
|
|
|
|
|
|
|
foreach f : decls_for_unused_funcs
|
|
|
|
math_h_config.set ('HAVE_DECL_' + f, 0)
|
|
|
|
endforeach
|
|
|
|
|
|
|
|
decls_for_used_funcs = [
|
|
|
|
'frexpl',
|
|
|
|
'ldexpl',
|
|
|
|
]
|
|
|
|
|
|
|
|
foreach f : decls_for_used_funcs
|
|
|
|
compiles = cc.compiles('''#include <math.h>
|
|
|
|
int main ()
|
|
|
|
{
|
|
|
|
(void) @0@;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
'''.format (f))
|
|
|
|
math_h_config.set ('HAVE_DECL_' + f.to_upper (), compiles ? 1 : 0)
|
|
|
|
set_variable ('have_decl_' + f, compiles ? true : false)
|
|
|
|
endforeach
|
|
|
|
|
|
|
|
nan_tmpl = '''#include <math.h>
|
|
|
|
#if __GNUC__ >= 4
|
|
|
|
# undef @0@
|
2023-02-15 16:51:32 +08:00
|
|
|
# define @0@(x) @2@ ((@1@)(x))
|
2022-06-29 16:02:05 +08:00
|
|
|
#else
|
|
|
|
# undef @0@
|
|
|
|
# define @0@(x) isnan ((@1@)(x))
|
|
|
|
#endif
|
|
|
|
double x;
|
|
|
|
int main () {return @0@ (x);}
|
|
|
|
'''
|
|
|
|
|
2023-02-15 16:51:32 +08:00
|
|
|
links = cc.links (nan_tmpl.format ('isnand', 'double', '__builtin_isnan'),
|
2022-06-29 16:02:05 +08:00
|
|
|
dependencies : [libm])
|
2023-02-15 16:51:32 +08:00
|
|
|
|
|
|
|
math_h_config.set ('HAVE_ISNAN', links ? 1 : 0)
|
|
|
|
set_variable ('have_isnan', links)
|
2022-06-29 16:02:05 +08:00
|
|
|
math_h_config.set ('HAVE_ISNAND', links ? 1 : 0)
|
|
|
|
set_variable ('have_isnand', links)
|
|
|
|
|
2023-02-15 16:51:32 +08:00
|
|
|
if links
|
|
|
|
extra_gnulib_args += '-DHAVE_ISNAN_IN_LIBC'
|
|
|
|
extra_gnulib_args += '-DHAVE_ISNAND_IN_LIBC'
|
|
|
|
endif
|
|
|
|
|
|
|
|
links = cc.links (nan_tmpl.format ('isnanf', 'float', '__builtin_isnanf'),
|
2022-06-29 16:02:05 +08:00
|
|
|
dependencies : [libm])
|
2023-02-15 16:51:32 +08:00
|
|
|
|
|
|
|
math_h_config.set ('HAVE_ISNANF', links ? 1 : 0)
|
|
|
|
set_variable ('have_isnanf', links)
|
|
|
|
|
|
|
|
if links
|
|
|
|
extra_gnulib_args += '-DHAVE_ISNANF_IN_LIBC'
|
|
|
|
endif
|
|
|
|
|
|
|
|
links = cc.links (nan_tmpl.format ('isnanl', 'long double', '__builtin_isnanl'),
|
|
|
|
dependencies : [libm])
|
|
|
|
|
2022-06-29 16:02:05 +08:00
|
|
|
math_h_config.set ('HAVE_ISNANL', links ? 1 : 0)
|
|
|
|
set_variable ('have_isnanl', links)
|
|
|
|
|
2023-02-15 16:51:32 +08:00
|
|
|
if links
|
|
|
|
extra_gnulib_args += '-DHAVE_ISNANL_IN_LIBC'
|
|
|
|
endif
|
|
|
|
|
|
|
|
math_h_config.set ('REPLACE_ISNAN', (have_isnand and have_isnanf and have_isnanl) ? 0 : 1)
|
|
|
|
|
|
|
|
other_needed_math_sources = []
|
|
|
|
|
|
|
|
if not (have_isnand and have_isnanf and have_isnanl)
|
|
|
|
other_needed_math_sources += [ 'isnand.c', 'isnanf.c', 'isnanl.c' ]
|
|
|
|
endif
|
|
|
|
|
2022-06-29 16:02:05 +08:00
|
|
|
links = cc.links ('''#include <math.h>
|
|
|
|
double x;
|
|
|
|
int y;
|
|
|
|
int main () {return ldexp (x, y) < 1;}
|
|
|
|
''',
|
|
|
|
dependencies : [libm])
|
|
|
|
math_h_config.set ('HAVE_LDEXP', links ? 1 : 0)
|
|
|
|
math_h_config.set ('HAVE_LDEXP_IN_LIBC', links ? 1 : 0)
|
|
|
|
set_variable ('have_ldexp', links)
|
|
|
|
|
|
|
|
links = cc.links ('''#include <math.h>
|
|
|
|
long double x;
|
|
|
|
int main () {return ldexpl (x, -1) > 0;}
|
|
|
|
''',
|
|
|
|
dependencies : [libm])
|
|
|
|
math_h_config.set ('HAVE_LDEXPL', links ? 1 : 0)
|
|
|
|
math_h_config.set ('HAVE_LDEXPL_IN_LIBC', links ? 1 : 0)
|
|
|
|
set_variable ('have_ldexpl', links)
|
|
|
|
|
|
|
|
links = cc.links ('''#include <math.h>
|
|
|
|
double x;
|
|
|
|
int main () {int e; return frexp (x, &e) > 0;}
|
|
|
|
''',
|
|
|
|
dependencies : [libm])
|
|
|
|
math_h_config.set ('HAVE_FREXP', links ? 1 : 0)
|
|
|
|
math_h_config.set ('HAVE_FREXP_IN_LIBC', links ? 1 : 0)
|
|
|
|
set_variable ('have_frexp', links)
|
|
|
|
|
|
|
|
links = cc.links ('''#include <math.h>
|
|
|
|
long double x;
|
|
|
|
int main () {int e; return frexpl (x, &e) > 0;}
|
|
|
|
''',
|
|
|
|
dependencies : [libm])
|
|
|
|
math_h_config.set ('HAVE_FREXPL', links ? 1 : 0)
|
|
|
|
math_h_config.set ('HAVE_FREXPL_IN_LIBC', links ? 1 : 0)
|
|
|
|
set_variable ('have_frexpl', links)
|
|
|
|
|
|
|
|
math_h_config.set ('INCLUDE_NEXT_AS_FIRST_DIRECTIVE', 'include')
|
|
|
|
math_h_config.set ('NEXT_AS_FIRST_DIRECTIVE_MATH_H', '<math.h>')
|
|
|
|
math_h_config.set ('PRAGMA_COLUMNS', '')
|
|
|
|
math_h_config.set ('PRAGMA_SYSTEM_HEADER', '')
|
|
|
|
|
|
|
|
compiles = cc.compiles ('''
|
|
|
|
#include <math.h>
|
|
|
|
/* Solaris 10 has a broken definition of NAN. Other platforms
|
|
|
|
fail to provide NAN, or provide it only in C99 mode; this
|
|
|
|
test only needs to fail when NAN is provided but wrong. */
|
|
|
|
int main () {
|
|
|
|
float f = 1.0f;
|
|
|
|
#ifdef NAN
|
|
|
|
f = NAN;
|
|
|
|
#endif
|
|
|
|
return f == 0;
|
|
|
|
}
|
|
|
|
''')
|
|
|
|
math_h_config.set ('REPLACE_NAN', compiles ? 0 : 1)
|
|
|
|
|
|
|
|
if have_frexp
|
|
|
|
subdir ('gl_cv_func_frexp_works')
|
|
|
|
else
|
|
|
|
gl_cv_func_frexp_works = false
|
|
|
|
gl_cv_func_frexp_broken_beyond_repair = true
|
|
|
|
endif
|
|
|
|
if have_frexpl
|
|
|
|
subdir ('gl_cv_func_frexpl_works')
|
|
|
|
else
|
|
|
|
gl_cv_func_frexpl_works = false
|
|
|
|
gl_cv_func_frexpl_broken_beyond_repair = true
|
|
|
|
endif
|
|
|
|
|
|
|
|
if not gl_cv_func_frexp_works and gl_cv_func_frexp_broken_beyond_repair
|
|
|
|
error ('frexp() is missing or broken beyond repair, and we have nothing to replace it with')
|
|
|
|
endif
|
|
|
|
if not gl_cv_func_frexpl_works and gl_cv_func_frexpl_broken_beyond_repair
|
|
|
|
error ('frexpl() is missing or broken beyond repair, and we have nothing to replace it with')
|
|
|
|
endif
|
|
|
|
|
|
|
|
math_h_config.set ('REPLACE_FREXP', gl_cv_func_frexp_works ? 0 : 1)
|
|
|
|
math_h_config.set ('REPLACE_FREXPL', gl_cv_func_frexpl_works ? 0 : 1)
|
|
|
|
math_h_config.set ('HAVE_DECL_FREXPL', gl_cv_func_frexpl_decl ? 0 : 1)
|
|
|
|
|
|
|
|
math_h_config.set ('REPLACE_ITOLD', 0)
|
|
|
|
math_h_config.set ('REPLACE_HUGE_VAL', 0)
|
|
|
|
math_h_config.set ('REPLACE_SIGNBIT_USING_GCC', 0)
|
|
|
|
|
|
|
|
if have_ldexpl
|
|
|
|
subdir ('gl_cv_func_ldexpl_works')
|
|
|
|
else
|
|
|
|
gl_cv_func_ldexpl_works = false
|
|
|
|
endif
|
|
|
|
math_h_config.set ('REPLACE_LDEXPL', gl_cv_func_ldexpl_works ? 0 : 1)
|
|
|
|
math_h_config.set ('HAVE_DECL_LDEXPL', gl_cv_func_ldexpl_decl ? 0 : 1)
|
|
|
|
|
|
|
|
inf_tmpl = '''#include <math.h>
|
|
|
|
double x;
|
|
|
|
int main () {return @0@ (x);}
|
|
|
|
'''
|
|
|
|
|
|
|
|
# Some compilers may not have isfinite, isinf available
|
2023-02-15 16:51:32 +08:00
|
|
|
foreach f: ['isfinite', 'isinf', 'signbit']
|
2022-06-29 16:02:05 +08:00
|
|
|
links = cc.links (inf_tmpl.format('@0@'.format(f)),
|
|
|
|
dependencies : [libm])
|
|
|
|
math_h_config.set ('HAVE_@0@'.format(f.to_upper()), links ? 1 : 0)
|
|
|
|
math_h_config.set ('HAVE_@0@_IN_LIBC'.format(f.to_upper()), links ? 1 : 0)
|
|
|
|
math_h_config.set ('REPLACE_@0@'.format(f.to_upper()), links ? 0 : 1)
|
|
|
|
set_variable ('have_@0@'.format(f), links)
|
|
|
|
if not links
|
|
|
|
if f == 'signbit'
|
|
|
|
other_needed_math_sources += [ 'signbitd.c', 'signbitf.c', 'signbitl.c' ]
|
|
|
|
elif f != 'isfinite' and f != 'isnan'
|
|
|
|
other_needed_math_sources += [ '@0@.c'.format(f) ]
|
|
|
|
endif
|
|
|
|
endif
|
|
|
|
endforeach
|
|
|
|
|
|
|
|
math_h = configure_file (input: 'gnulib_math.h.in',
|
|
|
|
output: 'gnulib_math.h',
|
|
|
|
configuration: math_h_config)
|
|
|
|
|
2023-02-15 16:51:32 +08:00
|
|
|
gnulib_sources = ['asnprintf.c', 'printf.c', 'printf-args.c', 'printf-parse.c', 'printf-frexp.c', 'printf-frexpl.c', 'vasnprintf.c', 'xsize.c']
|
2022-06-29 16:02:05 +08:00
|
|
|
|
|
|
|
if not gl_cv_func_frexp_works
|
|
|
|
gnulib_sources += ['frexp.c']
|
|
|
|
endif
|
|
|
|
if not gl_cv_func_frexpl_works
|
|
|
|
gnulib_sources += ['frexpl.c']
|
|
|
|
endif
|
|
|
|
|
|
|
|
gnulib_sources += other_needed_math_sources
|
|
|
|
|
|
|
|
gnulib_lib = static_library('gnulib', gnulib_sources,
|
|
|
|
dependencies : [libm],
|
|
|
|
include_directories : [configinc, glibinc, include_directories ('.')],
|
|
|
|
pic : true,
|
|
|
|
c_args : ['-DGCC_LINT=1', '-DLIBDIR="@0@"'.format(glib_libdir), '-DGLIB_COMPILATION', '-DG_LOG_DOMAIN="GLib"' ] + glib_hidden_visibility_args + extra_gnulib_args)
|
|
|
|
|
|
|
|
gnulib_libm_dependency = [libm]
|