| # 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@ |
| # define @0@(x) @2@ ((@1@)(x)) |
| #else |
| # undef @0@ |
| # define @0@(x) isnan ((@1@)(x)) |
| #endif |
| double x; |
| int main () {return @0@ (x);} |
| ''' |
| |
| links = cc.links (nan_tmpl.format ('isnand', 'double', '__builtin_isnan'), |
| dependencies : [libm]) |
| |
| math_h_config.set ('HAVE_ISNAN', links ? 1 : 0) |
| set_variable ('have_isnan', links) |
| math_h_config.set ('HAVE_ISNAND', links ? 1 : 0) |
| set_variable ('have_isnand', links) |
| |
| 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'), |
| dependencies : [libm]) |
| |
| 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]) |
| |
| math_h_config.set ('HAVE_ISNANL', links ? 1 : 0) |
| set_variable ('have_isnanl', links) |
| |
| 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 |
| |
| 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 |
| foreach f: ['isfinite', 'isinf', 'signbit'] |
| 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) |
| |
| gnulib_sources = ['asnprintf.c', 'printf.c', 'printf-args.c', 'printf-parse.c', 'printf-frexp.c', 'printf-frexpl.c', 'vasnprintf.c', 'xsize.c'] |
| |
| 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] |