project('glib', 'c') cc = meson.get_compiler('c') major_version = 3 minor_version = 36 micro_version = 3 interface_version = 3 glib_version = '3.36.3' inc_dirs = include_directories('.', 'glib', 'gmodule') glib_conf = configuration_data() glibconfig_conf = configuration_data() glib_conf.set('GLIB_MAJOR_VERSION', major_version) glib_conf.set('GLIB_MINOR_VERSION', minor_version) glib_conf.set('GLIB_MICRO_VERSION', micro_version) glib_conf.set('GLIB_INTERFACE_AGE', micro_version) glib_conf.set('GLIB_BINARY_AGE', 363) glib_conf.set('GETTEXT_PACKAGE', '"glib20"') glib_conf.set('ENABLE_NLS', 1) glib_conf.set('HAVE_VASPRINTF', 1) glib_conf.set('HAVE_VPRINTF', 1) glib_conf.set('HAVE_GOOD_PRINTF', 1) if run_command('xgettext', '--help').returncode() != 0 error('GNU Gettext required currently.') endif glib_conf.set('HAVE_GETTEXT', 1) glib_conf.set('GLIB_LOCALE_DIR', '"share/locale"') if cc.has_header('locale.h') glib_conf.set('HAVE_LOCALE_H', 1) lc_msg_test = '''#include void foo() { LC_MESSAGES; } ''' if cc.compiles(lc_msg_test) glib_conf.set('HAVE_LC_MESSAGES', 1) endif endif if cc.has_header('xlocale.h') glib_conf.set('HAVE_XLOCALE_H', 1) endif if host.name() == 'windows' glib_os = '''#define G_OS_WIN32 #define G_PLATFORM_WIN32''' else glib_os = '#define G_OS_UNIX' endif glibconfig_conf.set('glib_os', glib_os) glib_conf.set('HAVE_STDIO_H', 1) glib_conf.set('HAVE_STDDEF_H', 1) if cc.has_header('dirent.h') glib_conf.set('HAVE_DIRENT_H', 1) endif if cc.has_header('float.h') glib_conf.set('HAVE_FLOAT_H', 1) endif if cc.has_header('limits.h') glib_conf.set('HAVE_LIMITS_H', 1) endif if cc.has_header('pwd.h') glib_conf.set('HAVE_PWD_H', 1) endif if cc.has_header('grp.h') glib_conf.set('HAVE_GRP_H', 1) endif if cc.has_header('sys/param.h') glib_conf.set('HAVE_SYS_PARAM_H', 1) sysparam_include = '#include' else sysparam_include = '' endif if cc.has_header('poll.h') glib_conf.set('HAVE_POLL_H', 1) endif if cc.has_header('sys/resource.h') glib_conf.set('HAVE_SYS_RESOURCE_H', 1) endif if cc.has_header('sys/time.h') glib_conf.set('HAVE_SYS_TIME_H', 1) endif if cc.has_header('sys/times.h') glib_conf.set('HAVE_SYS_TIMES_H', 1) endif if cc.has_header('sys/wait.h') glib_conf.set('HAVE_SYS_WAIT_H', 1) endif if cc.has_header('unistd.h') glib_conf.set('HAVE_UNISTD_H', 1) endif if cc.has_header('values.h') glib_conf.set('HAVE_VALUES_H', 1) endif if cc.has_header('sys/select.h') glib_conf.set('HAVE_SYS_SELECT_H', 1) endif if cc.has_header('sys/types.h') glib_conf.set('HAVE_SYS_TYPES_H', 1) endif if cc.has_header('stdint.h') glib_conf.set('HAVE_STDINT_H', 1) endif if cc.has_header('inttypes.h') glib_conf.set('HAVE_INTTYPES_H', 1) endif if cc.has_header('sched.h') glib_conf.set('HAVE_SCHED_H', 1) endif if cc.has_header('malloc.h') glib_conf.set('HAVE_MALLOC_H', 1) endif if cc.has_header('sys/vfs.h') glib_conf.set('HAVE_SYS_VFS_H', 1) endif if cc.has_header('sys/vmount.h') glib_conf.set('HAVE_SYS_VMOUNT_H', 1) endif if cc.has_header('sys/statvfs.h') glib_conf.set('HAVE_SYS_STATVFS_H', 1) endif if cc.has_header('sys/filio.h') glib_conf.set('HAVE_SYS_FILIO_H', 1) endif if cc.has_header('mntent.h') glib_conf.set('HAVE_MNTENT_H', 1) endif if cc.has_header('sys/mnttab.h') glib_conf.set('HAVE_SYS_MNTTAB_H', 1) endif if cc.has_header('sys/vfstab.h') glib_conf.set('HAVE_SYS_VFSTAB_H', 1) endif if cc.has_header('sys/mntctl.h') glib_conf.set('HAVE_SYS_mntctl_H', 1) endif if cc.has_header('fstab.h') glib_conf.set('HAVE_FSTAB_H', 1) endif if cc.has_header('sys/uio.h') glib_conf.set('HAVE_SYS_UIO_H', 1) endif if cc.has_header('sys/mkdev.h') glib_conf.set('HAVE_SYS_MKDEV_H', 1) endif if cc.has_header('linux/magic.h') glib_conf.set('HAVE_LINUX_MAGIC_H', 1) endif if cc.has_header('sys/prctl.h') glib_conf.set('HAVE_SYS_PRCTL_H', 1) endif if cc.has_header('sys/mount.h', prefix : sysparam_include) glib_conf.set('HAVE_SYS_MOUNT_H', 1) endif if cc.has_header('sys/sysctl.h', prefix : sysparam_include) glib_conf.set('HAVE_SYS_SYSCTL_H', 1) endif if cc.has_header('xlocale.h') glib_conf.set('HAVE_XLOCALE_H', 1) endif if cc.has_member('struct stat', 'st_mtimensec', prefix : '#include') glib_conf.set('HAVE_STRUCT_STAT_ST_MTIMENSEC', 1) endif if cc.has_member('struct stat', 'st_mtim.tv_nsec', prefix : '#include') glib_conf.set('HAVE_STRUCT_STAT_ST_MTIM_TV_NSEC', 1) endif if cc.has_member('struct stat', 'st_atimensec', prefix : '#include') glib_conf.set('HAVE_STRUCT_STAT_ST_ATIMENSEC', 1) endif if cc.has_member('struct stat', 'st_atim.tv_nsec', prefix : '#include') glib_conf.set('HAVE_STRUCT_STAT_ST_ATIM_TV_NSEC', 1) endif if cc.has_member('struct stat', 'st_ctimensec', prefix : '#include') glib_conf.set('HAVE_STRUCT_STAT_ST_CTIMENSEC', 1) endif if cc.has_member('struct stat', 'st_ctim.tv_nsec', prefix : '#include') glib_conf.set('HAVE_STRUCT_STAT_ST_CTIM_TV_NSEC', 1) endif if cc.has_member('struct stat', 'st_ctim.tv_nsec', prefix : '#include') glib_conf.set('HAVE_STRUCT_STAT_ST_CTIM_TV_NSEC', 1) endif # Fixme, build properly. blkprefix = '''#include #include #include #include #include #include ''' if cc.has_member('struct stat', 'blksize', prefix : blkprefix) glib_conf.set('HAVE_STRUCT_STAT_BLKSIZE', 1) endif if cc.has_member('struct stat', 'st_blocks', prefix : blkprefix) glib_conf.set('HAVE_STRUCT_STAT_BLOCKS', 1) endif if cc.has_member('struct stat', 'f_fstypename', prefix : blkprefix) glib_conf.set('HAVE_STRUCT_STAT_F_FSTYPENAME', 1) endif if cc.has_member('struct stat', 'f_bavail', prefix : blkprefix) glib_conf.set('HAVE_STRUCT_STAT_F_BAVAIL', 1) endif if cc.has_header('string.h') glib_conf.set('HAVE_STRING_H', 1) endif # Let's configuring love char_size = cc.sizeof('char') short_size = cc.sizeof('short') int_size = cc.sizeof('int') voidp_size = cc.sizeof('void*') long_size = cc.sizeof('long') long_long_size = cc.sizeof('long long') sizet_size = cc.sizeof('size_t') char_align = cc.alignment('char') short_align = cc.alignment('short') int_align = cc.alignment('int') voidp_align = cc.alignment('void*') long_align = cc.alignment('long') long_long_align = cc.alignment('long long') sizet_align = cc.alignment('size_t') glib_conf.set('ALIGNOF_UNSIGNED_LONG', long_align) glib_conf.set('SIZEOF_CHAR', char_size) glib_conf.set('SIZEOF_INT', int_size) glib_conf.set('SIZEOF_SHORT', short_size) glib_conf.set('SIZEOF_LONG', long_size) glib_conf.set('SIZEOF_LONG_LONG', long_long_size) glib_conf.set('SIZEOF_SIZE_T', sizet_size) glib_conf.set('SIZEOF_VOID_P', voidp_size) if long_size == 2 # configure.ac does not work if this is the case. So we don't either. gint16 = 'long' endif if int_size == 2 gint16 = 'int' gint16_modifier='""' gint16_format='"i"' guint16_format='"u"' endif if short_size == 2 gint16 = 'short' gint16_modifier='"h"' gint16_format='"hi"' guint16_format='"hu"' endif glibconfig_conf.set('gint16', gint16) glibconfig_conf.set('gint16_modifier', gint16_modifier) glibconfig_conf.set('gint16_format', gint16_format) glibconfig_conf.set('guint16_format', guint16_format) if long_size == 4 gint32 = 'long' gint32_modifier='"l"' gint32_format='"li"' guint32_format='"lu"' guint32_align = long_align endif if int_size == 4 gint32 = 'int' gint32_modifier='""' gint32_format='"i"' guint32_format='"u"' guint32_align = int_align endif if short_size == 4 gint32 = 'short' gint32_modifier='"h"' gint32_format='"hi"' guint32_format='"hu"' guint32_align = short_align endif glibconfig_conf.set('gint32', gint32) glibconfig_conf.set('gint32_modifier', gint32_modifier) glibconfig_conf.set('gint32_format', gint32_format) glibconfig_conf.set('guint32_format', guint32_format) glib_conf.set('ALIGNOF_GUINT32', guint32_align) if long_long_size == 8 # Currently broken. gint64 = 'long long' endif if long_size == 8 gint64 = 'long' gint64_modifier='"l"' gint64_format='"li"' guint64_format='"lu"' glib_extension='' gint64_constant='(val##L)' guint64_constant='(val##UL)' guint64_align = long_align endif if int_size == 8 gint64 = 'int' gint64_modifier='""' gint64_format='"i"' guint64_format='"u"' glib_extension='' gint64_constant='(val)' guint64_constant='(val)' guint64_align = int_align endif if short_size == 8 # Another one broken in configure.ac gint64 = 'short' endif glibconfig_conf.set('gint64', gint64) glibconfig_conf.set('gint64_modifier', gint64_modifier) glibconfig_conf.set('gint64_format', gint64_format) glibconfig_conf.set('guint64_format', guint64_format) glibconfig_conf.set('gint64_constant', gint64_constant) glibconfig_conf.set('guint64_constant', guint64_constant) glib_conf.set('ALIGNOF_GUINT64', guint64_align) # Horrible hack. glibconfig_conf.set('gintbits', 32) if host.name() == 'windows' glibconfig_conf.set('g_pid_type', 'void*') else glibconfig_conf.set('g_pid_type', 'int') endif if sizet_size == short_size glibconfig_conf.set('glib_size_type_define', 'short') glibconfig_conf.set('gsize_modifier', '"h"') glibconfig_conf.set('gsize_format', '"hu"') glibconfig_conf.set('gssize_format', '"hi"') glibconfig_conf.set('glib_msize_type', 'SHRT') elif sizet_size == int_size glibconfig_conf.set('glib_size_type_define', 'int') glibconfig_conf.set('gsize_modifier', '""') glibconfig_conf.set('gsize_format', '"u"') glibconfig_conf.set('gssize_format', '"i"') glibconfig_conf.set('glib_msize_type', 'INT') elif sizet_size == long_size glibconfig_conf.set('glib_size_type_define', 'long') glibconfig_conf.set('gsize_modifier', '"l"') glibconfig_conf.set('gsize_format', '"lu"') glibconfig_conf.set('gssize_format', '"li"') glibconfig_conf.set('glib_msize_type', 'LONG') elif sizet_size == long_long_size glibconfig_conf.set('glib_size_type_define', 'long long') glibconfig_conf.set('gsize_modifier', '"I64"') glibconfig_conf.set('gsize_format', '"I64u"') glibconfig_conf.set('gssize_format', '"I64i"') glibconfig_conf.set('glib_msize_type', 'INT64') else error('Could not determine size of size_t.') endif glibconfig_conf.set('glib_void_p', voidp_size) glibconfig_conf.set('glib_long', long_size) glibconfig_conf.set('glib_size_t', sizet_size) if host.is_big_endian() glibconfig_conf.set('g_byte_order', 'G_BIG_ENDIAN') glibconfig_conf.set('g_bs_native', 'BE') glibconfig_conf.set('g_bs_alien', 'LE') else glibconfig_conf.set('g_byte_order', 'G_LITTLE_ENDIAN') glibconfig_conf.set('g_bs_native', 'LE') glibconfig_conf.set('g_bs_alien', 'BE') endif if cc.has_header('limits.h') glibconfig_conf.set('INC_LIMITS_H', '#include') glibconfig_conf.set('glib_ms', 'SHRT_MIN') glibconfig_conf.set('glib_Ms', 'SHRT_MAX') glibconfig_conf.set('glib_Mus', 'USHRT_MAX') glibconfig_conf.set('glib_mi', 'INT_MIN') glibconfig_conf.set('glib_Mi', 'INT_MAX') glibconfig_conf.set('glib_Mui', 'UINT_MAX') glibconfig_conf.set('glib_ml', 'LONG_MIN') glibconfig_conf.set('glib_Ml', 'LONG_MAX') glibconfig_conf.set('glib_Mul', 'ULONG_MAX') endif if cc.has_header('float.h') glibconfig_conf.set('INC_FLOAT_H', '#include') glibconfig_conf.set('glib_mf', 'FLT_MIN') glibconfig_conf.set('glib_Mf', 'FLT_MAX') glibconfig_conf.set('glib_md', 'DBL_MIN') glibconfig_conf.set('glib_Md', 'DBL_MAX') endif if cc.has_header('values.h') glibconfig_conf.set('INC_VALUES_H', '#include') glibconfig_conf.set('glib_mf', 'MINFLOAT') glibconfig_conf.set('glib_Mf', 'MAXFLOAT') glibconfig_conf.set('glib_md', 'MINDOUBLE') glibconfig_conf.set('glib_Md', 'MAXDOUBLE') glibconfig_conf.set('glib_ms', 'MINSHORT') glibconfig_conf.set('glib_Ms', 'MAXSHORT') glibconfig_conf.set('glib_Mus', '(((gushort)G_MAXSHORT)*2+1)') glibconfig_conf.set('glib_mi', 'MININT') glibconfig_conf.set('glib_Mi', 'MAXINT') glibconfig_conf.set('glib_Mui', '(((guint)G_MAXINT)*2+1)') glibconfig_conf.set('glib_ml', 'MINLONG') glibconfig_conf.set('glib_Ml', 'MAXLONG') glibconfig_conf.set('glib_Mul', '(((gulong)G_MAXLONG)*2+1)') endif if cc.compiles('''#undef inline inline int foo () { return 0; } int main () { return foo (); }''') glibconfig_conf.set('G_HAS_INLINE', 1) else glibconfig_conf.set('G_HAS_INLINE', 0) endif # I can't quite decipher what the multiple consecutive checks # are trying to do. Use this, fix if it breaks. glibconfig_conf.set('G_CAN_INLINE', '1') vacopy_src = '''#include #include void f (int i, ...) { va_list args1, args2; va_start (args1, i); va_copy (args2, args1); if (va_arg (args2, int) != 42 || va_arg (args1, int) != 42) exit (1); va_end (args1); va_end (args2); } int main() { f (0, 42); return 0; } ''' have_vacopy = cc.compiles(vacopy_src) __vaacopy_src = '''#include #include void f (int i, ...) { va_list args1, args2; va_start (args1, i); __va_copy (args2, args1); if (va_arg (args2, int) != 42 || va_arg (args1, int) != 42) exit (1); va_end (args1); va_end (args2); } int main() { f (0, 42); return 0; } ''' have___vaacopy = cc.compiles(__vaacopy_src) if have_vacopy glib_conf.set('G_VA_COPY', 'va_copy') elif have___vacopy glib_conf.set('G_VA_COPY', '__va_copy') endif if cc.has_header('alloca.h') glibconfig_conf.set('GLIB_HAVE_ALLOCA_H', true) endif has_syspoll = cc.has_header('sys/poll.h') has_systypes = cc.has_header('sys/types.h') if has_syspoll glibconfig_conf.set('GLIB_HAVE_SYS_POLL_H', true) endif if has_syspoll and has_systypes templ = '''#include #include #include int main(int argc, char **argv) { printf("%d\n", (int)@0@); return 0; }''' value_POLLIN = cc.run(templ.format('POLLIN')).stdout().strip() value_POLLOUT = cc.run(templ.format('POLLOUT')).stdout().strip() value_POLLPRI = cc.run(templ.format('POLLPRI')).stdout().strip() value_POLLERR = cc.run(templ.format('POLLERR')).stdout().strip() value_POLLHUP = cc.run(templ.format('POLLHUP')).stdout().strip() value_POLLNVAL = cc.run(templ.format('POLLNVAL')).stdout().strip() else value_POLLIN = 1 value_POLLOUT = 4 value_POLLPRI = 2 value_POLLERR = 8 value_POLLHUP = 16 value_POLLNVAL = 32 endif glibconfig_conf.set('g_pollin', value_POLLIN) glibconfig_conf.set('g_pollout', value_POLLOUT) glibconfig_conf.set('g_pollpri', value_POLLPRI) glibconfig_conf.set('g_pollerr', value_POLLERR) glibconfig_conf.set('g_pollhup', value_POLLHUP) glibconfig_conf.set('g_pollnval', value_POLLNVAL) glibconfig_conf.set('GLIB_USING_SYSTEM_PRINTF', true) # Need to check $host for this one. glibconfig_conf.set('glib_memory_barrier_needed', true) atomictest = '''void func() { volatile int atomic = 2; __sync_bool_compare_and_swap (&atomic, 2, 3); } ''' if cc.compiles(atomictest) glibconfig_conf.set('G_ATOMIC_LOCK_FREE', true) else glibconfig_conf.set('G_ATOMIC_LOCK_FREE', false) endif pcre = dependency('libpcre') # Should check for Unicode support, too. thread_lib = find_library('pthread') configure_file(input : 'config.h.meson', output : 'config.h', configuration : glib_conf) subdir('glib') #subdir('tests')