# 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 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 #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 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 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 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 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_config.set ('PRAGMA_COLUMNS', '') math_h_config.set ('PRAGMA_SYSTEM_HEADER', '') compiles = cc.compiles (''' #include /* 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 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]