Blame meson.build

Packit ae235b
project('glib', 'c', 'cpp',
Packit ae235b
  version : '2.56.0',
Packit ae235b
  meson_version : '>= 0.44.0',
Packit ae235b
  default_options : [
Packit ae235b
    'warning_level=1',
Packit ae235b
    'c_std=gnu89'
Packit ae235b
  ]
Packit ae235b
)
Packit ae235b
Packit ae235b
cc = meson.get_compiler('c')
Packit ae235b
cxx = meson.get_compiler('cpp')
Packit ae235b
Packit ae235b
if cc.get_id() == 'msvc'
Packit ae235b
  # Ignore several spurious warnings for things glib does very commonly
Packit ae235b
  # If a warning is completely useless and spammy, use '/wdXXXX' to suppress it
Packit ae235b
  # If a warning is harmless but hard to fix, use '/woXXXX' so it's shown once
Packit ae235b
  # NOTE: Only add warnings here if you are sure they're spurious
Packit ae235b
  add_project_arguments('/wd4035', '/wd4715', '/wd4116',
Packit ae235b
    '/wd4046', '/wd4068', '/wo4090', '/FImsvc_recommended_pragmas.h',language : 'c')
Packit ae235b
  # Disable SAFESEH with MSVC for plugins and libs that use external deps that
Packit ae235b
  # are built with MinGW
Packit ae235b
  noseh_link_args = ['/SAFESEH:NO']
Packit ae235b
else
Packit ae235b
  noseh_link_args = []
Packit ae235b
  # -mms-bitfields vs -fnative-struct ?
Packit ae235b
endif
Packit ae235b
Packit ae235b
host_system = host_machine.system()
Packit ae235b
Packit ae235b
glib_version = meson.project_version()
Packit ae235b
glib_api_version = '2.0'
Packit ae235b
version_arr = glib_version.split('.')
Packit ae235b
major_version = version_arr[0].to_int()
Packit ae235b
minor_version = version_arr[1].to_int()
Packit ae235b
micro_version = version_arr[2].to_int()
Packit ae235b
Packit ae235b
interface_age = minor_version.is_odd() ? 0 : micro_version
Packit ae235b
binary_age = 100 * minor_version + micro_version
Packit ae235b
Packit ae235b
soversion = 0
Packit ae235b
# Maintain compatibility with previous libtool versioning
Packit ae235b
# current = minor * 100 + micro
Packit ae235b
library_version = '@0@.@1@.@2@'.format(soversion, binary_age - interface_age, interface_age)
Packit ae235b
Packit ae235b
configinc = include_directories('.')
Packit ae235b
glibinc = include_directories('glib')
Packit ae235b
gobjectinc = include_directories('gobject')
Packit ae235b
gmoduleinc = include_directories('gmodule')
Packit ae235b
gioinc = include_directories('gio')
Packit ae235b
Packit ae235b
glib_prefix = get_option('prefix')
Packit ae235b
glib_bindir = join_paths(glib_prefix, get_option('bindir'))
Packit ae235b
glib_libdir = join_paths(glib_prefix, get_option('libdir'))
Packit ae235b
glib_datadir = join_paths(glib_prefix, get_option('datadir'))
Packit ae235b
glib_pkgdatadir = join_paths(glib_datadir, 'glib-2.0')
Packit ae235b
glib_includedir = join_paths(glib_prefix, get_option('includedir'))
Packit ae235b
glib_giomodulesdir = get_option('gio_module_dir')
Packit ae235b
if glib_giomodulesdir == ''
Packit ae235b
  glib_giomodulesdir = join_paths(glib_libdir, 'gio', 'modules')
Packit ae235b
endif
Packit ae235b
Packit ae235b
glib_pkgconfigreldir = join_paths(glib_libdir, 'pkgconfig')
Packit ae235b
Packit ae235b
add_project_arguments('-D_GNU_SOURCE', language: 'c')
Packit ae235b
Packit ae235b
# Disable strict aliasing;
Packit ae235b
# see https://bugzilla.gnome.org/show_bug.cgi?id=791622
Packit ae235b
if cc.has_argument('-fno-strict-aliasing')
Packit ae235b
  add_project_arguments('-fno-strict-aliasing', language: 'c')
Packit ae235b
endif
Packit ae235b
Packit ae235b
########################
Packit ae235b
# Configuration begins #
Packit ae235b
########################
Packit ae235b
glib_conf = configuration_data()
Packit ae235b
glibconfig_conf = configuration_data()
Packit ae235b
Packit ae235b
# accumulated list of defines as we check for them, so we can easily
Packit ae235b
# use them later in test programs (autoconf does this automatically)
Packit ae235b
glib_conf_prefix = ''
Packit ae235b
Packit ae235b
glib_conf.set('GLIB_VERSION', glib_version)
Packit ae235b
glib_conf.set('GLIB_MAJOR_VERSION', major_version)
Packit ae235b
glib_conf.set('GLIB_MINOR_VERSION', minor_version)
Packit ae235b
glib_conf.set('GLIB_MICRO_VERSION', micro_version)
Packit ae235b
glib_conf.set('GLIB_INTERFACE_AGE', interface_age)
Packit ae235b
glib_conf.set('GLIB_BINARY_AGE', binary_age)
Packit ae235b
glib_conf.set_quoted('GETTEXT_PACKAGE', 'glib20')
Packit ae235b
glib_conf.set_quoted('PACKAGE_BUGREPORT', 'http://bugzilla.gnome.org/enter_bug.cgi?product=glib')
Packit ae235b
glib_conf.set_quoted('PACKAGE_NAME', 'glib')
Packit ae235b
glib_conf.set_quoted('PACKAGE_STRING', 'glib @0@'.format(meson.project_version()))
Packit ae235b
glib_conf.set_quoted('PACKAGE_TARNAME', 'glib')
Packit ae235b
glib_conf.set_quoted('PACKAGE_URL', '')
Packit ae235b
glib_conf.set_quoted('PACKAGE_VERSION', meson.project_version())
Packit ae235b
glib_conf.set('ENABLE_NLS', 1)
Packit ae235b
Packit ae235b
# Variables used in glib-gettextize and pkg-config files
Packit ae235b
# These should not contain " quotes around the values
Packit ae235b
glib_conf.set('PACKAGE', 'glib')
Packit ae235b
glib_conf.set('VERSION', meson.project_version())
Packit ae235b
glib_conf.set('prefix', glib_prefix)
Packit ae235b
glib_conf.set('exec_prefix', glib_prefix)
Packit ae235b
glib_conf.set('libdir', glib_libdir)
Packit ae235b
glib_conf.set('includedir', glib_includedir)
Packit ae235b
glib_conf.set('datadir', glib_datadir)
Packit ae235b
glib_conf.set('datarootdir', glib_datadir)
Packit ae235b
Packit ae235b
glib_conf.set('_GNU_SOURCE', 1)
Packit ae235b
Packit ae235b
if host_system == 'windows'
Packit ae235b
  # Poll doesn't work on devices on Windows
Packit ae235b
  glib_conf.set('BROKEN_POLL', true)
Packit ae235b
endif
Packit ae235b
Packit ae235b
# Detect and set symbol visibility
Packit ae235b
glib_hidden_visibility_args = []
Packit ae235b
if get_option('default_library') != 'static'
Packit ae235b
  if host_system == 'windows'
Packit ae235b
    glib_conf.set('DLL_EXPORT', true)
Packit ae235b
    if cc.get_id() == 'msvc'
Packit ae235b
      glib_conf.set('_GLIB_EXTERN', '__declspec(dllexport) extern')
Packit ae235b
    elif cc.has_argument('-fvisibility=hidden')
Packit ae235b
      glib_conf.set('_GLIB_EXTERN', '__attribute__((visibility("default"))) __declspec(dllexport) extern')
Packit ae235b
      glib_hidden_visibility_args = ['-fvisibility=hidden']
Packit ae235b
    endif
Packit ae235b
  elif cc.has_argument('-fvisibility=hidden')
Packit ae235b
    glib_conf.set('_GLIB_EXTERN', '__attribute__((visibility("default"))) extern')
Packit ae235b
    glib_hidden_visibility_args = ['-fvisibility=hidden']
Packit ae235b
  endif
Packit ae235b
endif
Packit ae235b
Packit ae235b
if host_system == 'windows' and get_option('default_library') == 'static'
Packit ae235b
    glibconfig_conf.set('GLIB_STATIC_COMPILATION', '1')
Packit ae235b
    glibconfig_conf.set('GOBJECT_STATIC_COMPILATION', '1')
Packit ae235b
endif
Packit ae235b
Packit ae235b
# FIXME: what about Cygwin (G_WITH_CYGWIN)
Packit ae235b
if host_system == 'windows'
Packit ae235b
  glib_os = '''#define G_OS_WIN32
Packit ae235b
#define G_PLATFORM_WIN32'''
Packit ae235b
else
Packit ae235b
  glib_os = '#define G_OS_UNIX'
Packit ae235b
endif
Packit ae235b
glibconfig_conf.set('glib_os', glib_os)
Packit ae235b
Packit ae235b
# We need to know the build type to determine what .lib files we need on Visual Studio
Packit ae235b
# for dependencies that don't normally come with pkg-config files for Visual Studio builds
Packit ae235b
buildtype = get_option('buildtype')
Packit ae235b
Packit ae235b
# check for header files
Packit ae235b
Packit ae235b
headers = [
Packit ae235b
  'stdlib.h',
Packit ae235b
  'string.h',
Packit ae235b
  'strings.h',
Packit ae235b
  'memory.h',
Packit ae235b
  'alloca.h',
Packit ae235b
  'locale.h',
Packit ae235b
  'xlocale.h',
Packit ae235b
  'float.h',
Packit ae235b
  'limits.h',
Packit ae235b
  'pwd.h',
Packit ae235b
  'grp.h',
Packit ae235b
  'poll.h',
Packit ae235b
  'termios.h',
Packit ae235b
  'sys/param.h',
Packit ae235b
  'sys/resource.h',
Packit ae235b
  'mach/mach_time.h',
Packit ae235b
  'sys/select.h',
Packit ae235b
  'stdint.h',
Packit ae235b
  'inttypes.h',
Packit ae235b
  'sched.h',
Packit ae235b
  'malloc.h',
Packit ae235b
  'sys/vfs.h',
Packit ae235b
  'sys/vmount.h',
Packit ae235b
  'sys/statfs.h',
Packit ae235b
  'sys/statvfs.h',
Packit ae235b
  'sys/filio.h',
Packit ae235b
  'mntent.h',
Packit ae235b
  'sys/mnttab.h',
Packit ae235b
  'sys/vfstab.h',
Packit ae235b
  'sys/mntctl.h',
Packit ae235b
  'fstab.h',
Packit ae235b
  'linux/magic.h',
Packit ae235b
  'termios.h',
Packit ae235b
  'dirent.h', # MSC does not come with this by default
Packit ae235b
  'sys/time.h', # MSC does not come with this by default
Packit ae235b
  'sys/times.h',
Packit ae235b
  'sys/wait.h',
Packit ae235b
  'unistd.h',
Packit ae235b
  'values.h',
Packit ae235b
  'sys/types.h',
Packit ae235b
  'sys/uio.h',
Packit ae235b
  'sys/mkdev.h',
Packit ae235b
  'sys/mount.h',
Packit ae235b
  'sys/sysctl.h',
Packit ae235b
  'crt_externs.h',
Packit ae235b
  'sys/inotify.h',
Packit ae235b
  'sys/event.h',
Packit ae235b
  'sys/stat.h',
Packit ae235b
]
Packit ae235b
Packit ae235b
foreach h : headers
Packit ae235b
  if cc.has_header(h)
Packit ae235b
    define = 'HAVE_' + h.underscorify().to_upper()
Packit ae235b
    glib_conf.set(define, 1)
Packit ae235b
    glib_conf_prefix = glib_conf_prefix + '#define @0@ 1\n'.format(define)
Packit ae235b
  endif
Packit ae235b
endforeach
Packit ae235b
Packit ae235b
if cc.has_header('linux/netlink.h')
Packit ae235b
  glib_conf.set('HAVE_NETLINK', 1)
Packit ae235b
endif
Packit ae235b
Packit ae235b
if glib_conf.has('HAVE_LOCALE_H')
Packit ae235b
  if cc.has_header_symbol('locale.h', 'LC_MESSAGES')
Packit ae235b
    glib_conf.set('HAVE_LC_MESSAGES', 1)
Packit ae235b
  endif
Packit ae235b
endif
Packit ae235b
Packit ae235b
struct_stat_blkprefix = '''
Packit ae235b
#include <sys/types.h>
Packit ae235b
#include <sys/stat.h>
Packit ae235b
#ifdef HAVE_UNISTD_H
Packit ae235b
#include <unistd.h>
Packit ae235b
#endif
Packit ae235b
#ifdef HAVE_SYS_STATFS_H
Packit ae235b
#include <sys/statfs.h>
Packit ae235b
#endif
Packit ae235b
#ifdef HAVE_SYS_PARAM_H
Packit ae235b
#include <sys/param.h>
Packit ae235b
#endif
Packit ae235b
#ifdef HAVE_SYS_MOUNT_H
Packit ae235b
#include <sys/mount.h>
Packit ae235b
#endif
Packit ae235b
'''
Packit ae235b
Packit ae235b
struct_members = [
Packit ae235b
  [ 'stat', 'st_mtimensec' ],
Packit ae235b
  [ 'stat', 'st_mtim.tv_nsec' ],
Packit ae235b
  [ 'stat', 'st_atimensec' ],
Packit ae235b
  [ 'stat', 'st_atim.tv_nsec' ],
Packit ae235b
  [ 'stat', 'st_ctimensec' ],
Packit ae235b
  [ 'stat', 'st_ctim.tv_nsec' ],
Packit ae235b
  [ 'stat', 'st_birthtime' ],
Packit ae235b
  [ 'stat', 'st_birthtimensec' ],
Packit ae235b
  [ 'stat', 'st_birthtim' ],
Packit ae235b
  [ 'stat', 'st_birthtim.tv_nsec' ],
Packit ae235b
  [ 'stat', 'st_blksize', struct_stat_blkprefix ],
Packit ae235b
  [ 'stat', 'st_blocks', struct_stat_blkprefix ],
Packit ae235b
  [ 'statfs', 'f_fstypename', struct_stat_blkprefix ],
Packit ae235b
  [ 'statfs', 'f_bavail', struct_stat_blkprefix ],
Packit ae235b
  [ 'dirent', 'd_type', '''#include <sys/types.h>
Packit ae235b
                           #include <dirent.h>''' ],
Packit ae235b
]
Packit ae235b
Packit ae235b
foreach m : struct_members
Packit ae235b
  header_check_prefix = glib_conf_prefix
Packit ae235b
  if m.length() == 3
Packit ae235b
    header_check_prefix = header_check_prefix + m[2]
Packit ae235b
  else
Packit ae235b
    header_check_prefix = header_check_prefix + '#include <sys/stat.h>'
Packit ae235b
  endif
Packit ae235b
  if cc.has_member('struct ' + m[0], m[1], prefix : header_check_prefix)
Packit ae235b
    define = 'HAVE_STRUCT_@0@_@1@'.format(m[0].to_upper(), m[1].underscorify().to_upper())
Packit ae235b
    glib_conf.set(define, 1)
Packit ae235b
    glib_conf_prefix = glib_conf_prefix + '#define @0@ 1\n'.format(define)
Packit ae235b
  else
Packit ae235b
  endif
Packit ae235b
endforeach
Packit ae235b
Packit ae235b
# Compiler flags
Packit ae235b
if cc.get_id() == 'gcc' or cc.get_id() == 'clang'
Packit ae235b
  test_c_args = [
Packit ae235b
    '-Wall',
Packit ae235b
    '-Wduplicated-branches',
Packit ae235b
    '-Wstrict-prototypes',
Packit ae235b
    '-Werror=declaration-after-statement',
Packit ae235b
    '-Werror=format=2',
Packit ae235b
    '-Werror=format-security',
Packit ae235b
    '-Werror=implicit-function-declaration',
Packit ae235b
    '-Werror=init-self',
Packit ae235b
    '-Werror=missing-include-dirs',
Packit ae235b
    '-Werror=missing-prototypes',
Packit ae235b
    '-Werror=pointer-arith',
Packit ae235b
  ]
Packit ae235b
else
Packit ae235b
  test_c_args = []
Packit ae235b
endif
Packit ae235b
Packit ae235b
add_project_arguments(cc.get_supported_arguments(test_c_args), language: 'c')
Packit ae235b
Packit ae235b
# Windows Support (Vista+)
Packit ae235b
if host_system == 'windows'
Packit ae235b
  glib_conf.set('_WIN32_WINNT', '0x0601')
Packit ae235b
endif
Packit ae235b
Packit ae235b
functions = [
Packit ae235b
  'alloca',
Packit ae235b
  'mmap',
Packit ae235b
  'posix_memalign',
Packit ae235b
  'memalign',
Packit ae235b
  'valloc',
Packit ae235b
  'fsync',
Packit ae235b
  'pipe2',
Packit ae235b
  'issetugid',
Packit ae235b
  'timegm',
Packit ae235b
  'gmtime_r',
Packit ae235b
  'strerror_r',
Packit ae235b
  'lstat',
Packit ae235b
  'strsignal',
Packit ae235b
  'vsnprintf',
Packit ae235b
  'stpcpy',
Packit ae235b
  'poll',
Packit ae235b
  'vasprintf',
Packit ae235b
  'setenv',
Packit ae235b
  'unsetenv',
Packit ae235b
  'getc_unlocked',
Packit ae235b
  'readlink',
Packit ae235b
  'symlink',
Packit ae235b
  'fdwalk',
Packit ae235b
  'lchmod',
Packit ae235b
  'lchown',
Packit ae235b
  'fchmod',
Packit ae235b
  'fchown',
Packit ae235b
  'utimes',
Packit ae235b
  'getresuid',
Packit ae235b
  'getmntent_r',
Packit ae235b
  'setmntent',
Packit ae235b
  'endmntent',
Packit ae235b
  'hasmntopt',
Packit ae235b
  'getfsstat',
Packit ae235b
  'getvfsstat',
Packit ae235b
  'fallocate',
Packit ae235b
  'localtime_r',
Packit ae235b
  'gmtime_r',
Packit ae235b
  'getpwuid_r',
Packit ae235b
  'getgrgid_r',
Packit ae235b
  'prlimit',
Packit ae235b
  'strnlen',
Packit ae235b
  'wcslen',
Packit ae235b
  'wcsnlen',
Packit ae235b
  'mbrtowc',
Packit ae235b
  'wcrtomb',
Packit ae235b
  'newlocale',
Packit ae235b
  'uselocale',
Packit ae235b
  'strtod_l',
Packit ae235b
  'strtoll_l',
Packit ae235b
  'strtoull_l',
Packit ae235b
  'inotify_init1',
Packit ae235b
  'kqueue',
Packit ae235b
  'kevent',
Packit ae235b
  'endservent',
Packit ae235b
  'sendmmsg',
Packit ae235b
  'recvmmsg',
Packit ae235b
]
Packit ae235b
Packit ae235b
if glib_conf.has('HAVE_SYS_STATVFS_H')
Packit ae235b
  functions += ['statvfs']
Packit ae235b
else
Packit ae235b
  have_func_statvfs = false
Packit ae235b
endif
Packit ae235b
if glib_conf.has('HAVE_SYS_STATFS_H') or glib_conf.has('HAVE_SYS_MOUNT_H')
Packit ae235b
  functions += ['statfs']
Packit ae235b
else
Packit ae235b
  have_func_statfs = false
Packit ae235b
endif
Packit ae235b
Packit ae235b
if host_system == 'windows'
Packit ae235b
  iphlpapi_dep = cc.find_library('iphlpapi')
Packit ae235b
  iphlpapi_funcs = ['if_nametoindex', 'if_indextoname']
Packit ae235b
  foreach ifunc : iphlpapi_funcs
Packit ae235b
    if cc.has_function(ifunc,
Packit ae235b
                       prefix : '#define _WIN32_WINNT 0x0601\n#include <winsock2.h>\n#include <iphlpapi.h>',
Packit ae235b
                       dependencies : iphlpapi_dep)
Packit ae235b
      idefine = 'HAVE_' + ifunc.underscorify().to_upper()
Packit ae235b
      glib_conf.set(idefine, 1)
Packit ae235b
      glib_conf_prefix = glib_conf_prefix + '#define @0@ 1\n'.format(idefine)
Packit ae235b
      set_variable('have_func_' + ifunc, true)
Packit ae235b
    else
Packit ae235b
      set_variable('have_func_' + ifunc, false)
Packit ae235b
    endif
Packit ae235b
  endforeach
Packit ae235b
else
Packit ae235b
  functions += ['if_indextoname', 'if_nametoindex']
Packit ae235b
endif
Packit ae235b
Packit ae235b
# AIX splice is something else
Packit ae235b
if host_system != 'aix'
Packit ae235b
  functions += ['splice']
Packit ae235b
endif
Packit ae235b
Packit ae235b
foreach f : functions
Packit ae235b
  if cc.has_function(f)
Packit ae235b
    define = 'HAVE_' + f.underscorify().to_upper()
Packit ae235b
    glib_conf.set(define, 1)
Packit ae235b
    glib_conf_prefix = glib_conf_prefix + '#define @0@ 1\n'.format(define)
Packit ae235b
    set_variable('have_func_' + f, true)
Packit ae235b
  else
Packit ae235b
    set_variable('have_func_' + f, false)
Packit ae235b
  endif
Packit ae235b
endforeach
Packit ae235b
Packit ae235b
# Check whether strerror_r returns char *
Packit ae235b
if have_func_strerror_r
Packit ae235b
  if cc.compiles('''#define _GNU_SOURCE
Packit ae235b
                    #include <string.h>
Packit ae235b
                    int func (void) {
Packit ae235b
                      char error_string[256];
Packit ae235b
                      char *ptr = strerror_r (-2, error_string, 256);
Packit ae235b
                      char c = *strerror_r (-2, error_string, 256);
Packit ae235b
                      return c != 0 && ptr != (void*) 0L;
Packit ae235b
                    }
Packit ae235b
                 ''',
Packit ae235b
                 name : 'strerror_r() returns char *')
Packit ae235b
    glib_conf.set('STRERROR_R_CHAR_P', 1,
Packit ae235b
                  description: 'Defined if strerror_r returns char *')
Packit ae235b
  endif
Packit ae235b
endif
Packit ae235b
Packit ae235b
# Special-case these functions that have alternative names on Windows/MSVC
Packit ae235b
if cc.has_function('snprintf') or cc.has_header_symbol('stdio.h', 'snprintf')
Packit ae235b
  glib_conf.set('HAVE_SNPRINTF', 1)
Packit ae235b
  glib_conf_prefix = glib_conf_prefix + '#define HAVE_SNPRINTF 1\n'
Packit ae235b
elif cc.has_function('_snprintf') or cc.has_header_symbol('stdio.h', '_snprintf')
Packit ae235b
  hack_define = '1\n#define snprintf _snprintf'
Packit ae235b
  glib_conf.set('HAVE_SNPRINTF', hack_define)
Packit ae235b
  glib_conf_prefix = glib_conf_prefix + '#define HAVE_SNPRINTF ' + hack_define
Packit ae235b
endif
Packit ae235b
Packit ae235b
if cc.has_function('strcasecmp')
Packit ae235b
  glib_conf.set('HAVE_STRCASECMP', 1)
Packit ae235b
  glib_conf_prefix = glib_conf_prefix + '#define HAVE_STRCASECMP 1\n'
Packit ae235b
elif cc.has_function('_stricmp')
Packit ae235b
  hack_define = '1\n#define strcasecmp _stricmp'
Packit ae235b
  glib_conf.set('HAVE_STRCASECMP', hack_define)
Packit ae235b
  glib_conf_prefix = glib_conf_prefix + '#define HAVE_STRCASECMP ' + hack_define
Packit ae235b
endif
Packit ae235b
Packit ae235b
if cc.has_function('strncasecmp')
Packit ae235b
  glib_conf.set('HAVE_STRNCASECMP', 1)
Packit ae235b
  glib_conf_prefix = glib_conf_prefix + '#define HAVE_STRNCASECMP 1\n'
Packit ae235b
elif cc.has_function('_strnicmp')
Packit ae235b
  hack_define = '1\n#define strncasecmp _strnicmp'
Packit ae235b
  glib_conf.set('HAVE_STRNCASECMP', hack_define)
Packit ae235b
  glib_conf_prefix = glib_conf_prefix + '#define HAVE_STRNCASECMP ' + hack_define
Packit ae235b
endif
Packit ae235b
Packit ae235b
if cc.has_header_symbol('sys/sysmacros.h', 'major')
Packit ae235b
  glib_conf.set('MAJOR_IN_SYSMACROS', 1)
Packit ae235b
elif cc.has_header_symbol('sys/mkdev.h', 'major')
Packit ae235b
  glib_conf.set('MAJOR_IN_MKDEV', 1)
Packit ae235b
endif
Packit ae235b
Packit ae235b
if cc.has_header_symbol('dlfcn.h', 'RTLD_LAZY')
Packit ae235b
  glib_conf.set('HAVE_RTLD_LAZY', 1)
Packit ae235b
endif
Packit ae235b
Packit ae235b
if cc.has_header_symbol('dlfcn.h', 'RTLD_NOW')
Packit ae235b
  glib_conf.set('HAVE_RTLD_NOW', 1)
Packit ae235b
endif
Packit ae235b
Packit ae235b
if cc.has_header_symbol('dlfcn.h', 'RTLD_GLOBAL')
Packit ae235b
  glib_conf.set('HAVE_RTLD_GLOBAL', 1)
Packit ae235b
endif
Packit ae235b
Packit ae235b
# Check whether to use statfs or statvfs
Packit ae235b
# Some systems have both statfs and statvfs, pick the most "native" for these
Packit ae235b
if have_func_statfs and have_func_statvfs
Packit ae235b
  # on solaris and irix, statfs doesn't even have the f_bavail field
Packit ae235b
  if not glib_conf.has('HAVE_STRUCT_STATFS_F_BAVAIL')
Packit ae235b
    have_func_statfs = false
Packit ae235b
  else
Packit ae235b
    # at least on linux, statfs is the actual syscall
Packit ae235b
    have_func_statvfs = false
Packit ae235b
  endif
Packit ae235b
endif
Packit ae235b
if have_func_statfs
Packit ae235b
  glib_conf.set('USE_STATFS', 1)
Packit ae235b
  stat_func_to_use = 'statfs'
Packit ae235b
elif have_func_statvfs
Packit ae235b
  glib_conf.set('USE_STATVFS', 1)
Packit ae235b
  stat_func_to_use = 'statvfs'
Packit ae235b
else
Packit ae235b
  stat_func_to_use = 'neither'
Packit ae235b
endif
Packit ae235b
message('Checking whether to use statfs or statvfs .. ' + stat_func_to_use)
Packit ae235b
Packit ae235b
if host_system == 'linux'
Packit ae235b
  if cc.has_function('mkostemp',
Packit ae235b
                     prefix: '''#define _GNU_SOURCE
Packit ae235b
                                #include <stdlib.h>''')
Packit ae235b
    glib_conf.set('HAVE_MKOSTEMP', 1)
Packit ae235b
  endif
Packit ae235b
endif
Packit ae235b
Packit ae235b
platform_ldflags=[]
Packit ae235b
Packit ae235b
# Mac OS X Carbon support
Packit ae235b
glib_have_carbon = cc.compiles('''#include <Carbon/Carbon.h>
Packit ae235b
                                  #include <CoreServices/CoreServices.h>''',
Packit ae235b
                               name : 'Mac OS X Carbon support')
Packit ae235b
Packit ae235b
glib_have_os_x_9_or_later = false
Packit ae235b
Packit ae235b
if glib_have_carbon
Packit ae235b
  glib_conf.set('HAVE_CARBON', true)
Packit ae235b
  CARBON_LIBS='-Wl,-framework,Carbon' # FIXME: propagate to .pc files as well
Packit ae235b
  platform_ldflags += [CARBON_LIBS]
Packit ae235b
  glib_have_os_x_9_or_later = cc.compiles('''#include <AvailabilityMacros.h>
Packit ae235b
                                             #if MAC_OS_X_VERSION_MIN_REQUIRED < 1090
Packit ae235b
                                             #error Compiling for minimum OS X version before 10.9
Packit ae235b
                                             #endif''', name : 'OS X 9 or later')
Packit ae235b
else
Packit ae235b
  CARBON_LIBS=''
Packit ae235b
endif
Packit ae235b
Packit ae235b
# Mac OS X Cocoa support
Packit ae235b
glib_have_cocoa = cc.compiles('''#include <Cocoa/Cocoa.h>
Packit ae235b
                                 #ifdef GNUSTEP_BASE_VERSION
Packit ae235b
                                 #error "Detected GNUstep, not Cocoa"
Packit ae235b
                                 #endif''',
Packit ae235b
                              name : 'Mac OS X Cocoa support')
Packit ae235b
Packit ae235b
if glib_have_cocoa
Packit ae235b
  glib_conf.set('HAVE_COCOA', true)
Packit ae235b
  COCOA_LIBS='-Wl,-framework,Foundation -Wl,-framework,AppKit' # FIXME: propagate to .pc files as well
Packit ae235b
  platform_ldflags += [COCOA_LIBS]
Packit ae235b
else
Packit ae235b
  COCOA_LIBS=''
Packit ae235b
endif
Packit ae235b
Packit ae235b
# Check for futex(2)
Packit ae235b
if cc.links('''#include <linux/futex.h>
Packit ae235b
               #include <sys/syscall.h>
Packit ae235b
               #include <unistd.h>
Packit ae235b
               int main (int argc, char ** argv) {
Packit ae235b
                 syscall (__NR_futex, NULL, FUTEX_WAKE, FUTEX_WAIT);
Packit ae235b
                 return 0;
Packit ae235b
               }''', name : 'futex(2) system call')
Packit ae235b
  glib_conf.set('HAVE_FUTEX', 1)
Packit ae235b
endif
Packit ae235b
Packit ae235b
# Check for eventfd(2)
Packit ae235b
if cc.links('''#include <sys/eventfd.h>
Packit ae235b
               #include <unistd.h>
Packit ae235b
               int main (int argc, char ** argv) {
Packit ae235b
                 eventfd (0, EFD_CLOEXEC);
Packit ae235b
                 return 0;
Packit ae235b
               }''', name : 'eventfd(2) system call')
Packit ae235b
  glib_conf.set('HAVE_EVENTFD', 1)
Packit ae235b
endif
Packit ae235b
Packit ae235b
clock_gettime_test_code = '''
Packit ae235b
  #include <time.h>
Packit ae235b
  struct timespec t;
Packit ae235b
  int main (int argc, char ** argv) {
Packit ae235b
    return clock_gettime(CLOCK_REALTIME, &t);
Packit ae235b
  }'''
Packit ae235b
librt = []
Packit ae235b
if cc.links(clock_gettime_test_code, name : 'clock_gettime')
Packit ae235b
  glib_conf.set('HAVE_CLOCK_GETTIME', 1)
Packit ae235b
elif cc.links(clock_gettime_test_code, args : '-lrt', name : 'clock_gettime in librt')
Packit ae235b
  glib_conf.set('HAVE_CLOCK_GETTIME', 1)
Packit ae235b
  librt = cc.find_library('rt')
Packit ae235b
endif
Packit ae235b
Packit ae235b
# if statfs() takes 2 arguments (Posix) or 4 (Solaris)
Packit ae235b
if have_func_statfs
Packit ae235b
  if cc.compiles(glib_conf_prefix + '''
Packit ae235b
                 #include <unistd.h>
Packit ae235b
                        #ifdef HAVE_SYS_PARAM_H
Packit ae235b
                        #include <sys/param.h>
Packit ae235b
                        #endif
Packit ae235b
                        #ifdef HAVE_SYS_VFS_H
Packit ae235b
                        #include <sys/vfs.h>
Packit ae235b
                        #endif
Packit ae235b
                        #ifdef HAVE_SYS_MOUNT_H
Packit ae235b
                        #include <sys/mount.h>
Packit ae235b
                        #endif
Packit ae235b
                        #ifdef HAVE_SYS_STATFS_H
Packit ae235b
                        #include <sys/statfs.h>
Packit ae235b
                        #endif
Packit ae235b
                        void some_func (void) {
Packit ae235b
                          struct statfs st;
Packit ae235b
                          statfs("/", &st);
Packit ae235b
                        }''', name : 'number of arguments to statfs() (n=2)')
Packit ae235b
    glib_conf.set('STATFS_ARGS', 2)
Packit ae235b
  elif cc.compiles(glib_conf_prefix + '''
Packit ae235b
                   #include <unistd.h>
Packit ae235b
                          #ifdef HAVE_SYS_PARAM_H
Packit ae235b
                          #include <sys/param.h>
Packit ae235b
                          #endif
Packit ae235b
                          #ifdef HAVE_SYS_VFS_H
Packit ae235b
                          #include <sys/vfs.h>
Packit ae235b
                          #endif
Packit ae235b
                          #ifdef HAVE_SYS_MOUNT_H
Packit ae235b
                          #include <sys/mount.h>
Packit ae235b
                          #endif
Packit ae235b
                          #ifdef HAVE_SYS_STATFS_H
Packit ae235b
                          #include <sys/statfs.h>
Packit ae235b
                          #endif
Packit ae235b
                          void some_func (void) {
Packit ae235b
                            struct statfs st;
Packit ae235b
                            statfs("/", &st, sizeof (st), 0);
Packit ae235b
                          }''', name : 'number of arguments to statfs() (n=4)')
Packit ae235b
    glib_conf.set('STATFS_ARGS', 4)
Packit ae235b
  else
Packit ae235b
    error('Unable to determine number of arguments to statfs()')
Packit ae235b
  endif
Packit ae235b
endif
Packit ae235b
Packit ae235b
# open takes O_DIRECTORY as an option
Packit ae235b
#AC_MSG_CHECKING([])
Packit ae235b
if cc.compiles('''#include <fcntl.h>
Packit ae235b
                  #include <sys/types.h>
Packit ae235b
                  #include <sys/stat.h>],
Packit ae235b
                  void some_func (void) {
Packit ae235b
                    open(0, O_DIRECTORY, 0);
Packit ae235b
                  }''', name : 'open() option O_DIRECTORY')
Packit ae235b
  glib_conf.set('HAVE_OPEN_O_DIRECTORY', 1)
Packit ae235b
endif
Packit ae235b
Packit ae235b
# Check whether there is a vsnprintf() function with C99 semantics installed.
Packit ae235b
# AC_FUNC_VSNPRINTF_C99
Packit ae235b
# Check whether there is a snprintf() function with C99 semantics installed.
Packit ae235b
# AC_FUNC_SNPRINTF_C99
Packit ae235b
Packit ae235b
have_good_vsnprintf = false
Packit ae235b
have_good_snprintf = false
Packit ae235b
Packit ae235b
if host_system == 'windows'
Packit ae235b
  # Unfortunately the mingw and Visual Studio 2015+ implementations of C99-style
Packit ae235b
  # snprintf and vsnprintf don't seem to be quite good enough, at least not in
Packit ae235b
  # mingw-runtime-3.14.  (Sorry, I don't know exactly what is the problem,
Packit ae235b
  # but it is related to floating point formatting and decimal point vs. comma.)
Packit ae235b
  # The simple tests in AC_FUNC_VSNPRINTF_C99 and AC_FUNC_SNPRINTF_C99 aren't
Packit ae235b
  # rigorous enough to notice, though.
Packit ae235b
  glib_conf.set('HAVE_C99_SNPRINTF', false)
Packit ae235b
  glib_conf.set('HAVE_C99_VSNPRINTF', false)
Packit ae235b
else
Packit ae235b
  vsnprintf_c99_test_code = '''
Packit ae235b
#include <stdio.h>
Packit ae235b
#include <stdarg.h>
Packit ae235b
Packit ae235b
int
Packit ae235b
doit(char * s, ...)
Packit ae235b
{
Packit ae235b
  char buffer[32];
Packit ae235b
  va_list args;
Packit ae235b
  int r;
Packit ae235b
Packit ae235b
  va_start(args, s);
Packit ae235b
  r = vsnprintf(buffer, 5, s, args);
Packit ae235b
  va_end(args);
Packit ae235b
Packit ae235b
  if (r != 7)
Packit ae235b
    exit(1);
Packit ae235b
Packit ae235b
  /* AIX 5.1 and Solaris seems to have a half-baked vsnprintf()
Packit ae235b
     implementation. The above will return 7 but if you replace
Packit ae235b
     the size of the buffer with 0, it borks! */
Packit ae235b
  va_start(args, s);
Packit ae235b
  r = vsnprintf(buffer, 0, s, args);
Packit ae235b
  va_end(args);
Packit ae235b
Packit ae235b
  if (r != 7)
Packit ae235b
    exit(1);
Packit ae235b
Packit ae235b
  exit(0);
Packit ae235b
}
Packit ae235b
Packit ae235b
int
Packit ae235b
main(void)
Packit ae235b
{
Packit ae235b
  doit("1234567");
Packit ae235b
  exit(1);
Packit ae235b
}'''
Packit ae235b
Packit ae235b
  rres = cc.run(vsnprintf_c99_test_code, name : 'C99 vsnprintf')
Packit ae235b
  if rres.compiled() and rres.returncode() == 0
Packit ae235b
    glib_conf.set('HAVE_C99_VSNPRINTF', 1)
Packit ae235b
    have_good_vsnprintf = true
Packit ae235b
  endif
Packit ae235b
Packit ae235b
  snprintf_c99_test_code = '''
Packit ae235b
#include <stdio.h>
Packit ae235b
#include <stdarg.h>
Packit ae235b
Packit ae235b
int
Packit ae235b
doit()
Packit ae235b
{
Packit ae235b
  char buffer[32];
Packit ae235b
  va_list args;
Packit ae235b
  int r;
Packit ae235b
Packit ae235b
  r = snprintf(buffer, 5, "1234567");
Packit ae235b
Packit ae235b
  if (r != 7)
Packit ae235b
    exit(1);
Packit ae235b
Packit ae235b
  r = snprintf(buffer, 0, "1234567");
Packit ae235b
Packit ae235b
  if (r != 7)
Packit ae235b
    exit(1);
Packit ae235b
Packit ae235b
  r = snprintf(NULL, 0, "1234567");
Packit ae235b
Packit ae235b
  if (r != 7)
Packit ae235b
    exit(1);
Packit ae235b
Packit ae235b
  exit(0);
Packit ae235b
}
Packit ae235b
Packit ae235b
int
Packit ae235b
main(void)
Packit ae235b
{
Packit ae235b
  doit();
Packit ae235b
  exit(1);
Packit ae235b
}'''
Packit ae235b
Packit ae235b
  rres = cc.run(snprintf_c99_test_code, name : 'C99 snprintf')
Packit ae235b
  if rres.compiled() and rres.returncode() == 0
Packit ae235b
    glib_conf.set('HAVE_C99_SNPRINTF', 1)
Packit ae235b
    have_good_snprintf = true
Packit ae235b
  endif
Packit ae235b
endif
Packit ae235b
Packit ae235b
if host_system == 'windows'
Packit ae235b
  glib_conf.set_quoted('EXEEXT', '.exe')
Packit ae235b
else
Packit ae235b
  glib_conf.set('EXEEXT', '')
Packit ae235b
endif
Packit ae235b
Packit ae235b
if have_good_vsnprintf and have_good_snprintf
Packit ae235b
  # Our printf is 'good' only if vsnpintf()/snprintf() supports C99 well enough
Packit ae235b
  glib_conf.set('HAVE_GOOD_PRINTF', 1) # FIXME: Check for HAVE_UNIX98_PRINTF?
Packit ae235b
else
Packit ae235b
  glib_conf.set('HAVE_VASPRINTF', 1)
Packit ae235b
endif
Packit ae235b
Packit ae235b
# Check whether the printf() family supports Unix98 %n$ positional parameters
Packit ae235b
# AC_FUNC_PRINTF_UNIX98
Packit ae235b
# Nothing uses HAVE_UNIX98_PRINTF
Packit ae235b
Packit ae235b
Packit ae235b
# Check for nl_langinfo and CODESET
Packit ae235b
# FIXME: Check for HAVE_BIND_TEXTDOMAIN_CODESET
Packit ae235b
if cc.links('''#include <langinfo.h>
Packit ae235b
               int main (int argc, char ** argv) {
Packit ae235b
                 char *codeset = nl_langinfo (CODESET);
Packit ae235b
                 return 0;
Packit ae235b
               }''', name : 'nl_langinfo and CODESET')
Packit ae235b
  glib_conf.set('HAVE_LANGINFO_CODESET', 1)
Packit ae235b
  glib_conf.set('HAVE_CODESET', 1)
Packit ae235b
endif
Packit ae235b
Packit ae235b
# Check for nl_langinfo and LC_TIME parts that are needed in gdatetime.c
Packit ae235b
if cc.links('''#include <langinfo.h>
Packit ae235b
               int main (int argc, char ** argv) {
Packit ae235b
                 char *str;
Packit ae235b
                 str = nl_langinfo (PM_STR);
Packit ae235b
                 str = nl_langinfo (D_T_FMT);
Packit ae235b
                 str = nl_langinfo (D_FMT);
Packit ae235b
                 str = nl_langinfo (T_FMT);
Packit ae235b
                 str = nl_langinfo (T_FMT_AMPM);
Packit ae235b
                 str = nl_langinfo (MON_1);
Packit ae235b
                 str = nl_langinfo (ABMON_12);
Packit ae235b
                 str = nl_langinfo (DAY_1);
Packit ae235b
                 str = nl_langinfo (ABDAY_7);
Packit ae235b
                 return 0;
Packit ae235b
               }''', name : 'nl_langinfo (PM_STR)')
Packit ae235b
  glib_conf.set('HAVE_LANGINFO_TIME', 1)
Packit ae235b
endif
Packit ae235b
if cc.links('''#include <langinfo.h>
Packit ae235b
               int main (int argc, char ** argv) {
Packit ae235b
                 char *str;
Packit ae235b
                 str = nl_langinfo (_NL_CTYPE_OUTDIGIT0_MB);
Packit ae235b
                 str = nl_langinfo (_NL_CTYPE_OUTDIGIT1_MB);
Packit ae235b
                 str = nl_langinfo (_NL_CTYPE_OUTDIGIT2_MB);
Packit ae235b
                 str = nl_langinfo (_NL_CTYPE_OUTDIGIT3_MB);
Packit ae235b
                 str = nl_langinfo (_NL_CTYPE_OUTDIGIT4_MB);
Packit ae235b
                 str = nl_langinfo (_NL_CTYPE_OUTDIGIT5_MB);
Packit ae235b
                 str = nl_langinfo (_NL_CTYPE_OUTDIGIT6_MB);
Packit ae235b
                 str = nl_langinfo (_NL_CTYPE_OUTDIGIT7_MB);
Packit ae235b
                 str = nl_langinfo (_NL_CTYPE_OUTDIGIT8_MB);
Packit ae235b
                 str = nl_langinfo (_NL_CTYPE_OUTDIGIT9_MB);
Packit ae235b
                 return 0;
Packit ae235b
               }''', name : 'nl_langinfo (_NL_CTYPE_OUTDIGITn_MB)')
Packit ae235b
  glib_conf.set('HAVE_LANGINFO_OUTDIGIT', 1)
Packit ae235b
endif
Packit ae235b
Packit ae235b
# Check for nl_langinfo and alternative month names
Packit ae235b
if cc.links('''#ifndef _GNU_SOURCE
Packit ae235b
              # define _GNU_SOURCE
Packit ae235b
              #endif
Packit ae235b
              #include <langinfo.h>
Packit ae235b
               int main (int argc, char ** argv) {
Packit ae235b
                 char *str;
Packit ae235b
                 str = nl_langinfo (ALTMON_1);
Packit ae235b
                 str = nl_langinfo (ALTMON_2);
Packit ae235b
                 str = nl_langinfo (ALTMON_3);
Packit ae235b
                 str = nl_langinfo (ALTMON_4);
Packit ae235b
                 str = nl_langinfo (ALTMON_5);
Packit ae235b
                 str = nl_langinfo (ALTMON_6);
Packit ae235b
                 str = nl_langinfo (ALTMON_7);
Packit ae235b
                 str = nl_langinfo (ALTMON_8);
Packit ae235b
                 str = nl_langinfo (ALTMON_9);
Packit ae235b
                 str = nl_langinfo (ALTMON_10);
Packit ae235b
                 str = nl_langinfo (ALTMON_11);
Packit ae235b
                 str = nl_langinfo (ALTMON_12);
Packit ae235b
                 return 0;
Packit ae235b
               }''', name : 'nl_langinfo (ALTMON_n)')
Packit ae235b
  glib_conf.set('HAVE_LANGINFO_ALTMON', 1)
Packit ae235b
endif
Packit ae235b
Packit ae235b
# Check for nl_langinfo and abbreviated alternative month names
Packit ae235b
if cc.links('''#ifndef _GNU_SOURCE
Packit ae235b
              # define _GNU_SOURCE
Packit ae235b
              #endif
Packit ae235b
              #include <langinfo.h>
Packit ae235b
               int main (int argc, char ** argv) {
Packit ae235b
                 char *str;
Packit ae235b
                 str = nl_langinfo (_NL_ALTMON_1);
Packit ae235b
                 str = nl_langinfo (_NL_ALTMON_2);
Packit ae235b
                 str = nl_langinfo (_NL_ALTMON_3);
Packit ae235b
                 str = nl_langinfo (_NL_ALTMON_4);
Packit ae235b
                 str = nl_langinfo (_NL_ALTMON_5);
Packit ae235b
                 str = nl_langinfo (_NL_ALTMON_6);
Packit ae235b
                 str = nl_langinfo (_NL_ALTMON_7);
Packit ae235b
                 str = nl_langinfo (_NL_ALTMON_8);
Packit ae235b
                 str = nl_langinfo (_NL_ALTMON_9);
Packit ae235b
                 str = nl_langinfo (_NL_ALTMON_10);
Packit ae235b
                 str = nl_langinfo (_NL_ALTMON_11);
Packit ae235b
                 str = nl_langinfo (_NL_ALTMON_12);
Packit ae235b
                 return 0;
Packit ae235b
               }''', name : 'nl_langinfo (_NL_ALTMON_n)')
Packit ae235b
  glib_conf.set('HAVE_LANGINFO_ABALTMON', 1)
Packit ae235b
endif
Packit ae235b
Packit ae235b
# Check if C compiler supports the 'signed' keyword
Packit ae235b
if not cc.compiles('''signed char x;''', name : 'signed')
Packit ae235b
  glib_conf.set('signed', '/* NOOP */')
Packit ae235b
endif
Packit ae235b
Packit ae235b
# Check if the ptrdiff_t type exists
Packit ae235b
if cc.has_header_symbol('stddef.h', 'ptrdiff_t')
Packit ae235b
  glib_conf.set('HAVE_PTRDIFF_T', 1)
Packit ae235b
endif
Packit ae235b
Packit ae235b
# Check for sig_atomic_t type
Packit ae235b
if cc.links('''#include <signal.h>
Packit ae235b
               #include <sys/types.h>
Packit ae235b
               sig_atomic_t val = 42;
Packit ae235b
               int main (int argc, char ** argv) {
Packit ae235b
                 return val == 42 ? 0 : 1;
Packit ae235b
               }''', name : 'sig_atomic_t')
Packit ae235b
  glib_conf.set('HAVE_SIG_ATOMIC_T', 1)
Packit ae235b
endif
Packit ae235b
Packit ae235b
# Check if 'long long' works and what format can be used to print it
Packit ae235b
# jm_AC_TYPE_LONG_LONG
Packit ae235b
# Nothing uses HAVE_LONG_LONG_FORMAT and HAVE_INT64_AND_I64
Packit ae235b
if cc.compiles('''long long ll = 1LL;
Packit ae235b
                  int i = 63;
Packit ae235b
                  int some_func (void) {
Packit ae235b
                    long long llmax = (long long) -1;
Packit ae235b
                    return ll << i | ll >> i | llmax / ll | llmax % ll;
Packit ae235b
                  }''', name : 'long long')
Packit ae235b
  glib_conf.set('HAVE_LONG_LONG', 1)
Packit ae235b
  have_long_long = true
Packit ae235b
else
Packit ae235b
  have_long_long = false
Packit ae235b
endif
Packit ae235b
Packit ae235b
# Test whether the compiler supports the 'long double' type.
Packit ae235b
if cc.compiles('''/* The Stardent Vistra knows sizeof(long double), but does not support it.  */
Packit ae235b
                  long double foo = 0.0;
Packit ae235b
                  /* On Ultrix 4.3 cc, long double is 4 and double is 8.  */
Packit ae235b
                  int array [2*(sizeof(long double) >= sizeof(double)) - 1];''',
Packit ae235b
               name : 'long double')
Packit ae235b
  glib_conf.set('HAVE_LONG_DOUBLE', 1)
Packit ae235b
endif
Packit ae235b
Packit ae235b
#dnl Test whether <stddef.h> has the 'wchar_t' type.
Packit ae235b
if cc.has_header_symbol('stddef.h', 'wchar_t')
Packit ae235b
  glib_conf.set('HAVE_WCHAR_T', 1)
Packit ae235b
endif
Packit ae235b
Packit ae235b
# Test whether <wchar.h> has the 'wint_t' type.
Packit ae235b
if cc.has_header_symbol('wchar.h', 'wint_t')
Packit ae235b
  glib_conf.set('HAVE_WINT_T', 1)
Packit ae235b
endif
Packit ae235b
Packit ae235b
found_uintmax_t = false
Packit ae235b
Packit ae235b
# Define HAVE_INTTYPES_H_WITH_UINTMAX if <inttypes.h> exists,
Packit ae235b
# doesn't clash with <sys/types.h>, and declares uintmax_t.
Packit ae235b
# jm_AC_HEADER_INTTYPES_H
Packit ae235b
if cc.compiles('''#include <sys/types.h>
Packit ae235b
                  #include <inttypes.h>
Packit ae235b
                  void some_func (void) {
Packit ae235b
                    uintmax_t i = (uintmax_t) -1;
Packit ae235b
                  }''', name : 'uintmax_t in inttypes.h')
Packit ae235b
  glib_conf.set('HAVE_INTTYPES_H_WITH_UINTMAX', 1)
Packit ae235b
  found_uintmax_t = true
Packit ae235b
endif
Packit ae235b
Packit ae235b
# Define HAVE_STDINT_H_WITH_UINTMAX if <stdint.h> exists,
Packit ae235b
# doesn't clash with <sys/types.h>, and declares uintmax_t.
Packit ae235b
# jm_AC_HEADER_STDINT_H
Packit ae235b
if cc.compiles('''#include <sys/types.h>
Packit ae235b
                  #include <stdint.h>
Packit ae235b
                  void some_func (void) {
Packit ae235b
                    uintmax_t i = (uintmax_t) -1;
Packit ae235b
                  }''', name : 'uintmax_t in stdint.h')
Packit ae235b
  glib_conf.set('HAVE_STDINT_H_WITH_UINTMAX', 1)
Packit ae235b
  found_uintmax_t = true
Packit ae235b
endif
Packit ae235b
Packit ae235b
# Define intmax_t to 'long' or 'long long'
Packit ae235b
# if it is not already defined in <stdint.h> or <inttypes.h>.
Packit ae235b
# For simplicity, we assume that a header file defines 'intmax_t' if and
Packit ae235b
# only if it defines 'uintmax_t'.
Packit ae235b
if found_uintmax_t
Packit ae235b
  glib_conf.set('HAVE_INTMAX_T', 1)
Packit ae235b
elif have_long_long
Packit ae235b
  glib_conf.set('intmax_t', 'long long')
Packit ae235b
else
Packit ae235b
  glib_conf.set('intmax_t', 'long')
Packit ae235b
endif
Packit ae235b
Packit ae235b
char_size = cc.sizeof('char')
Packit ae235b
short_size = cc.sizeof('short')
Packit ae235b
int_size = cc.sizeof('int')
Packit ae235b
voidp_size = cc.sizeof('void*')
Packit ae235b
long_size = cc.sizeof('long')
Packit ae235b
if have_long_long
Packit ae235b
  long_long_size = cc.sizeof('long long')
Packit ae235b
else
Packit ae235b
  long_long_size = 0
Packit ae235b
endif
Packit ae235b
sizet_size = cc.sizeof('size_t')
Packit ae235b
if cc.get_id() == 'msvc'
Packit ae235b
  ssizet_size = cc.sizeof('SSIZE_T', prefix : '#include <BaseTsd.h>')
Packit ae235b
else
Packit ae235b
  ssizet_size = cc.sizeof('ssize_t')
Packit ae235b
endif
Packit ae235b
Packit ae235b
# On Windows, MSVC supports both ll and I64 as format specifiers for 64-bit
Packit ae235b
# integers, but some versions (at least 4.7.x) of MinGW only support I64.
Packit ae235b
if host_system == 'windows'
Packit ae235b
  int64_m = 'I64'
Packit ae235b
else
Packit ae235b
  int64_m = 'll'
Packit ae235b
endif
Packit ae235b
Packit ae235b
char_align = cc.alignment('char')
Packit ae235b
short_align = cc.alignment('short')
Packit ae235b
int_align = cc.alignment('int')
Packit ae235b
voidp_align = cc.alignment('void*')
Packit ae235b
long_align = cc.alignment('long')
Packit ae235b
long_long_align = cc.alignment('long long')
Packit ae235b
# NOTE: We don't check for size of __int64 because long long is guaranteed to
Packit ae235b
# be 64-bit in C99, and it is available on all supported compilers
Packit ae235b
sizet_align = cc.alignment('size_t')
Packit ae235b
Packit ae235b
glib_conf.set('ALIGNOF_UNSIGNED_LONG', long_align)
Packit ae235b
Packit ae235b
glib_conf.set('SIZEOF_CHAR', char_size)
Packit ae235b
glib_conf.set('SIZEOF_INT', int_size)
Packit ae235b
glib_conf.set('SIZEOF_SHORT', short_size)
Packit ae235b
glib_conf.set('SIZEOF_LONG', long_size)
Packit ae235b
glib_conf.set('SIZEOF_LONG_LONG', long_long_size)
Packit ae235b
glib_conf.set('SIZEOF_SIZE_T', sizet_size)
Packit ae235b
glib_conf.set('SIZEOF_SSIZE_T', ssizet_size)
Packit ae235b
glib_conf.set('SIZEOF_VOID_P', voidp_size)
Packit ae235b
Packit ae235b
if short_size == 2
Packit ae235b
  gint16 = 'short'
Packit ae235b
  gint16_modifier='h'
Packit ae235b
  gint16_format='hi'
Packit ae235b
  guint16_format='hu'
Packit ae235b
elif int_size == 2
Packit ae235b
  gint16 = 'int'
Packit ae235b
  gint16_modifier=''
Packit ae235b
  gint16_format='i'
Packit ae235b
  guint16_format='u'
Packit ae235b
else
Packit ae235b
  error('Compiler provides no native 16-bit integer type')
Packit ae235b
endif
Packit ae235b
glibconfig_conf.set('gint16', gint16)
Packit ae235b
glibconfig_conf.set_quoted('gint16_modifier', gint16_modifier)
Packit ae235b
glibconfig_conf.set_quoted('gint16_format', gint16_format)
Packit ae235b
glibconfig_conf.set_quoted('guint16_format', guint16_format)
Packit ae235b
Packit ae235b
if short_size == 4
Packit ae235b
  gint32 = 'short'
Packit ae235b
  gint32_modifier='h'
Packit ae235b
  gint32_format='hi'
Packit ae235b
  guint32_format='hu'
Packit ae235b
  guint32_align = short_align
Packit ae235b
elif int_size == 4
Packit ae235b
  gint32 = 'int'
Packit ae235b
  gint32_modifier=''
Packit ae235b
  gint32_format='i'
Packit ae235b
  guint32_format='u'
Packit ae235b
  guint32_align = int_align
Packit ae235b
elif long_size == 4
Packit ae235b
  gint32 = 'long'
Packit ae235b
  gint32_modifier='l'
Packit ae235b
  gint32_format='li'
Packit ae235b
  guint32_format='lu'
Packit ae235b
  guint32_align = long_align
Packit ae235b
else
Packit ae235b
  error('Compiler provides no native 32-bit integer type')
Packit ae235b
endif
Packit ae235b
glibconfig_conf.set('gint32', gint32)
Packit ae235b
glibconfig_conf.set_quoted('gint32_modifier', gint32_modifier)
Packit ae235b
glibconfig_conf.set_quoted('gint32_format', gint32_format)
Packit ae235b
glibconfig_conf.set_quoted('guint32_format', guint32_format)
Packit ae235b
glib_conf.set('ALIGNOF_GUINT32', guint32_align)
Packit ae235b
Packit ae235b
if int_size == 8
Packit ae235b
  gint64 = 'int'
Packit ae235b
  gint64_modifier=''
Packit ae235b
  gint64_format='i'
Packit ae235b
  guint64_format='u'
Packit ae235b
  glib_extension=''
Packit ae235b
  gint64_constant='(val)'
Packit ae235b
  guint64_constant='(val)'
Packit ae235b
  guint64_align = int_align
Packit ae235b
elif long_size == 8
Packit ae235b
  gint64 = 'long'
Packit ae235b
  glib_extension=''
Packit ae235b
  gint64_modifier='l'
Packit ae235b
  gint64_format='li'
Packit ae235b
  guint64_format='lu'
Packit ae235b
  gint64_constant='(val##L)'
Packit ae235b
  guint64_constant='(val##UL)'
Packit ae235b
  guint64_align = long_align
Packit ae235b
elif long_long_size == 8
Packit ae235b
  gint64 = 'long long'
Packit ae235b
  glib_extension='G_GNUC_EXTENSION '
Packit ae235b
  gint64_modifier=int64_m
Packit ae235b
  gint64_format=int64_m + 'i'
Packit ae235b
  guint64_format=int64_m + 'u'
Packit ae235b
  gint64_constant='(G_GNUC_EXTENSION (val##LL))'
Packit ae235b
  guint64_constant='(G_GNUC_EXTENSION (val##ULL))'
Packit ae235b
  guint64_align = long_long_align
Packit ae235b
else
Packit ae235b
  error('Compiler provides no native 64-bit integer type')
Packit ae235b
endif
Packit ae235b
glibconfig_conf.set('glib_extension', glib_extension)
Packit ae235b
glibconfig_conf.set('gint64', gint64)
Packit ae235b
glibconfig_conf.set_quoted('gint64_modifier', gint64_modifier)
Packit ae235b
glibconfig_conf.set_quoted('gint64_format', gint64_format)
Packit ae235b
glibconfig_conf.set_quoted('guint64_format', guint64_format)
Packit ae235b
glibconfig_conf.set('gint64_constant', gint64_constant)
Packit ae235b
glibconfig_conf.set('guint64_constant', guint64_constant)
Packit ae235b
glib_conf.set('ALIGNOF_GUINT64', guint64_align)
Packit ae235b
Packit ae235b
if host_system == 'windows'
Packit ae235b
  glibconfig_conf.set('g_pid_type', 'void*')
Packit ae235b
  glibconfig_conf.set_quoted('g_pid_format', 'p')
Packit ae235b
  if host_machine.cpu_family() == 'x86_64'
Packit ae235b
    glibconfig_conf.set_quoted('g_pollfd_format', '%#I64x')
Packit ae235b
  else
Packit ae235b
    glibconfig_conf.set_quoted('g_pollfd_format', '%#x')
Packit ae235b
  endif
Packit ae235b
  glibconfig_conf.set('g_dir_separator', '\\\\')
Packit ae235b
  glibconfig_conf.set('g_searchpath_separator', ';')
Packit ae235b
else
Packit ae235b
  glibconfig_conf.set('g_pid_type', 'int')
Packit ae235b
  glibconfig_conf.set_quoted('g_pid_format', 'i')
Packit ae235b
  glibconfig_conf.set_quoted('g_pollfd_format', '%d')
Packit ae235b
  glibconfig_conf.set('g_dir_separator', '/')
Packit ae235b
  glibconfig_conf.set('g_searchpath_separator', ':')
Packit ae235b
endif
Packit ae235b
Packit ae235b
if sizet_size == short_size
Packit ae235b
  glibconfig_conf.set('glib_size_type_define', 'short')
Packit ae235b
  glibconfig_conf.set_quoted('gsize_modifier', 'h')
Packit ae235b
  glibconfig_conf.set_quoted('gssize_modifier', 'h')
Packit ae235b
  glibconfig_conf.set_quoted('gsize_format', 'hu')
Packit ae235b
  glibconfig_conf.set_quoted('gssize_format', 'hi')
Packit ae235b
  glibconfig_conf.set('glib_msize_type', 'SHRT')
Packit ae235b
elif sizet_size == int_size
Packit ae235b
  glibconfig_conf.set('glib_size_type_define', 'int')
Packit ae235b
  glibconfig_conf.set_quoted('gsize_modifier', '')
Packit ae235b
  glibconfig_conf.set_quoted('gssize_modifier', '')
Packit ae235b
  glibconfig_conf.set_quoted('gsize_format', 'u')
Packit ae235b
  glibconfig_conf.set_quoted('gssize_format', 'i')
Packit ae235b
  glibconfig_conf.set('glib_msize_type', 'INT')
Packit ae235b
elif sizet_size == long_size
Packit ae235b
  glibconfig_conf.set('glib_size_type_define', 'long')
Packit ae235b
  glibconfig_conf.set_quoted('gsize_modifier', 'l')
Packit ae235b
  glibconfig_conf.set_quoted('gssize_modifier', 'l')
Packit ae235b
  glibconfig_conf.set_quoted('gsize_format', 'lu')
Packit ae235b
  glibconfig_conf.set_quoted('gssize_format', 'li')
Packit ae235b
  glibconfig_conf.set('glib_msize_type', 'LONG')
Packit ae235b
elif sizet_size == long_long_size
Packit ae235b
  glibconfig_conf.set('glib_size_type_define', 'long long')
Packit ae235b
  glibconfig_conf.set_quoted('gsize_modifier', int64_m)
Packit ae235b
  glibconfig_conf.set_quoted('gssize_modifier', int64_m)
Packit ae235b
  glibconfig_conf.set_quoted('gsize_format', int64_m + 'u')
Packit ae235b
  glibconfig_conf.set_quoted('gssize_format', int64_m + 'i')
Packit ae235b
  glibconfig_conf.set('glib_msize_type', 'INT64')
Packit ae235b
else
Packit ae235b
  error('Could not determine size of size_t.')
Packit ae235b
endif
Packit ae235b
Packit ae235b
if voidp_size == int_size
Packit ae235b
  glibconfig_conf.set('glib_intptr_type_define', 'int')
Packit ae235b
  glibconfig_conf.set_quoted('gintptr_modifier', '')
Packit ae235b
  glibconfig_conf.set_quoted('gintptr_format', 'i')
Packit ae235b
  glibconfig_conf.set_quoted('guintptr_format', 'u')
Packit ae235b
  glibconfig_conf.set('glib_gpi_cast', '(gint)')
Packit ae235b
  glibconfig_conf.set('glib_gpui_cast', '(guint)')
Packit ae235b
elif voidp_size == long_size
Packit ae235b
  glibconfig_conf.set('glib_intptr_type_define', 'long')
Packit ae235b
  glibconfig_conf.set_quoted('gintptr_modifier', 'l')
Packit ae235b
  glibconfig_conf.set_quoted('gintptr_format', 'li')
Packit ae235b
  glibconfig_conf.set_quoted('guintptr_format', 'lu')
Packit ae235b
  glibconfig_conf.set('glib_gpi_cast', '(glong)')
Packit ae235b
  glibconfig_conf.set('glib_gpui_cast', '(gulong)')
Packit ae235b
elif voidp_size == long_long_size
Packit ae235b
  glibconfig_conf.set('glib_intptr_type_define', 'long long')
Packit ae235b
  glibconfig_conf.set_quoted('gintptr_modifier', int64_m)
Packit ae235b
  glibconfig_conf.set_quoted('gintptr_format', int64_m + 'i')
Packit ae235b
  glibconfig_conf.set_quoted('guintptr_format', int64_m + 'u')
Packit ae235b
  glibconfig_conf.set('glib_gpi_cast', '(gint64)')
Packit ae235b
  glibconfig_conf.set('glib_gpui_cast', '(guint64)')
Packit ae235b
else
Packit ae235b
  error('Could not determine size of void *')
Packit ae235b
endif
Packit ae235b
Packit ae235b
if long_size != 8 and long_long_size != 8 and int_size != 8
Packit ae235b
  error('GLib requires a 64-bit type. You might want to consider using the GNU C compiler.')
Packit ae235b
endif
Packit ae235b
Packit ae235b
glibconfig_conf.set('gintbits', int_size * 8)
Packit ae235b
glibconfig_conf.set('glongbits', long_size * 8)
Packit ae235b
glibconfig_conf.set('gsizebits', sizet_size * 8)
Packit ae235b
glibconfig_conf.set('gssizebits', ssizet_size * 8)
Packit ae235b
Packit ae235b
# FIXME: maybe meson should tell us the libsuffix?
Packit ae235b
if host_system == 'windows'
Packit ae235b
  g_module_suffix = 'dll'
Packit ae235b
elif host_system == 'darwin'
Packit ae235b
  g_module_suffix = 'dylib'
Packit ae235b
else
Packit ae235b
  g_module_suffix = 'so'
Packit ae235b
endif
Packit ae235b
glibconfig_conf.set('g_module_suffix', g_module_suffix)
Packit ae235b
Packit ae235b
glibconfig_conf.set('GLIB_MAJOR_VERSION', major_version)
Packit ae235b
glibconfig_conf.set('GLIB_MINOR_VERSION', minor_version)
Packit ae235b
glibconfig_conf.set('GLIB_MICRO_VERSION', micro_version)
Packit ae235b
glibconfig_conf.set('GLIB_VERSION', glib_version)
Packit ae235b
Packit ae235b
glibconfig_conf.set('glib_void_p', voidp_size)
Packit ae235b
glibconfig_conf.set('glib_long', long_size)
Packit ae235b
glibconfig_conf.set('glib_size_t', sizet_size)
Packit ae235b
glibconfig_conf.set('glib_ssize_t', ssizet_size)
Packit ae235b
if host_machine.endian() == 'big'
Packit ae235b
  glibconfig_conf.set('g_byte_order', 'G_BIG_ENDIAN')
Packit ae235b
  glibconfig_conf.set('g_bs_native', 'BE')
Packit ae235b
  glibconfig_conf.set('g_bs_alien', 'LE')
Packit ae235b
else
Packit ae235b
  glibconfig_conf.set('g_byte_order', 'G_LITTLE_ENDIAN')
Packit ae235b
  glibconfig_conf.set('g_bs_native', 'LE')
Packit ae235b
  glibconfig_conf.set('g_bs_alien', 'BE')
Packit ae235b
endif
Packit ae235b
Packit ae235b
# === va_copy checks ===
Packit ae235b
# we currently check for all three va_copy possibilities, so we get
Packit ae235b
# all results in config.log for bug reports.
Packit ae235b
Packit ae235b
va_copy_func = ''
Packit ae235b
foreach try_func : [ '__va_copy', 'va_copy' ]
Packit ae235b
  if cc.compiles('''#include <stdarg.h>
Packit ae235b
                    #include <stdlib.h>
Packit ae235b
                    #ifdef _MSC_VER
Packit ae235b
                    # include "msvc_recommended_pragmas.h"
Packit ae235b
                    #endif
Packit ae235b
                    void f (int i, ...) {
Packit ae235b
                    va_list args1, args2;
Packit ae235b
                    va_start (args1, i);
Packit ae235b
                    @0@ (args2, args1);
Packit ae235b
                    if (va_arg (args2, int) != 42 || va_arg (args1, int) != 42)
Packit ae235b
                      exit (1);
Packit ae235b
                    va_end (args1); va_end (args2);
Packit ae235b
                    }
Packit ae235b
                    int main() {
Packit ae235b
                      f (0, 42);
Packit ae235b
                      return 0;
Packit ae235b
                    }'''.format(try_func),
Packit ae235b
                    name : try_func + ' check')
Packit ae235b
    va_copy_func = try_func
Packit ae235b
  endif
Packit ae235b
endforeach
Packit ae235b
if va_copy_func != ''
Packit ae235b
  glib_conf.set('G_VA_COPY', va_copy_func)
Packit ae235b
  glib_vacopy = '#define G_VA_COPY ' + va_copy_func
Packit ae235b
else
Packit ae235b
  glib_vacopy = '/* #undef G_VA_COPY */'
Packit ae235b
endif
Packit ae235b
Packit ae235b
va_list_val_copy_prog = '''
Packit ae235b
  #include <stdarg.h>
Packit ae235b
  #include <stdlib.h>
Packit ae235b
  void f (int i, ...) {
Packit ae235b
    va_list args1, args2;
Packit ae235b
    va_start (args1, i);
Packit ae235b
    args2 = args1;
Packit ae235b
    if (va_arg (args2, int) != 42 || va_arg (args1, int) != 42)
Packit ae235b
      exit (1);
Packit ae235b
    va_end (args1); va_end (args2);
Packit ae235b
  }
Packit ae235b
  int main() {
Packit ae235b
    f (0, 42);
Packit ae235b
    return 0;
Packit ae235b
  }'''
Packit ae235b
Packit ae235b
# We do this in two steps so if compilation fails already it looks less alarming
Packit ae235b
glib_va_val_copy = false
Packit ae235b
if cc.compiles(va_list_val_copy_prog, name : 'va_lists can be copied as values')
Packit ae235b
  # FIXME: what to do when cross-compiling?
Packit ae235b
  if cc.run(va_list_val_copy_prog, name : 'va_lists can be copied as values').returncode() == 0
Packit ae235b
    glib_va_val_copy = true
Packit ae235b
  endif
Packit ae235b
endif
Packit ae235b
if not glib_va_val_copy
Packit ae235b
  glib_va_val_copy = false
Packit ae235b
  glib_vacopy = glib_vacopy + '\n#define G_VA_COPY_AS_ARRAY 1'
Packit ae235b
  glib_conf.set('G_VA_COPY_AS_ARRAY', 1)
Packit ae235b
endif
Packit ae235b
glibconfig_conf.set('glib_vacopy', glib_vacopy)
Packit ae235b
Packit ae235b
# check for flavours of varargs macros
Packit ae235b
g_have_iso_c_varargs = cc.compiles('''
Packit ae235b
  void some_func (void) {
Packit ae235b
    int a(int p1, int p2, int p3);
Packit ae235b
    #define call_a(...) a(1,__VA_ARGS__)
Packit ae235b
    call_a(2,3);
Packit ae235b
  }''', name : 'ISO C99 varargs macros in C')
Packit ae235b
Packit ae235b
if g_have_iso_c_varargs
Packit ae235b
  glibconfig_conf.set('g_have_iso_c_varargs', '''
Packit ae235b
#ifndef __cplusplus
Packit ae235b
# define G_HAVE_ISO_VARARGS 1
Packit ae235b
#endif''')
Packit ae235b
endif
Packit ae235b
Packit ae235b
g_have_iso_cxx_varargs = cxx.compiles('''
Packit ae235b
  void some_func (void) {
Packit ae235b
    int a(int p1, int p2, int p3);
Packit ae235b
    #define call_a(...) a(1,__VA_ARGS__)
Packit ae235b
    call_a(2,3);
Packit ae235b
  }''', name : 'ISO C99 varargs macros in C++')
Packit ae235b
Packit ae235b
if g_have_iso_cxx_varargs
Packit ae235b
  glibconfig_conf.set('g_have_iso_cxx_varargs', '''
Packit ae235b
#ifdef __cplusplus
Packit ae235b
# define G_HAVE_ISO_VARARGS 1
Packit ae235b
#endif''')
Packit ae235b
endif
Packit ae235b
Packit ae235b
g_have_gnuc_varargs = cc.compiles('''
Packit ae235b
  void some_func (void) {
Packit ae235b
    int a(int p1, int p2, int p3);
Packit ae235b
    #define call_a(params...) a(1,params)
Packit ae235b
    call_a(2,3);
Packit ae235b
  }''', name : 'GNUC varargs macros')
Packit ae235b
Packit ae235b
if cc.has_header('alloca.h')
Packit ae235b
  glibconfig_conf.set('GLIB_HAVE_ALLOCA_H', true)
Packit ae235b
endif
Packit ae235b
has_syspoll = cc.has_header('sys/poll.h')
Packit ae235b
has_systypes = cc.has_header('sys/types.h')
Packit ae235b
if has_syspoll
Packit ae235b
  glibconfig_conf.set('GLIB_HAVE_SYS_POLL_H', true)
Packit ae235b
endif
Packit ae235b
has_winsock2 = cc.has_header('winsock2.h')
Packit ae235b
Packit ae235b
if has_syspoll and has_systypes
Packit ae235b
  templ = '''#include<sys/poll.h>
Packit ae235b
#include<sys/types.h>
Packit ae235b
#include<stdio.h>
Packit ae235b
int main(int argc, char **argv) {
Packit ae235b
  printf("%d\n", (int)@0@);
Packit ae235b
  return 0;
Packit ae235b
}'''
Packit ae235b
elif has_winsock2
Packit ae235b
  templ = '''#define _WIN32_WINNT 0x0600
Packit ae235b
#include <stdio.h>
Packit ae235b
#include <winsock2.h>
Packit ae235b
int main(int argc, char **argv) {
Packit ae235b
  printf("%d\n", (int)@0@);
Packit ae235b
  return 0;
Packit ae235b
}'''
Packit ae235b
else
Packit ae235b
  # FIXME?
Packit ae235b
  error('FIX POLL* defines')
Packit ae235b
endif
Packit ae235b
Packit ae235b
value_POLLIN = cc.run(templ.format('POLLIN'), name : 'POLLIN value').stdout().strip()
Packit ae235b
value_POLLOUT = cc.run(templ.format('POLLOUT'), name : 'POLLOUT value').stdout().strip()
Packit ae235b
value_POLLPRI = cc.run(templ.format('POLLPRI'), name : 'POLLPRI value').stdout().strip()
Packit ae235b
value_POLLERR = cc.run(templ.format('POLLERR'), name : 'POLLERR value').stdout().strip()
Packit ae235b
value_POLLHUP = cc.run(templ.format('POLLHUP'), name : 'POLLHUP value').stdout().strip()
Packit ae235b
value_POLLNVAL = cc.run(templ.format('POLLNVAL'), name : 'POLLNVAL value').stdout().strip()
Packit ae235b
Packit ae235b
glibconfig_conf.set('g_pollin', value_POLLIN)
Packit ae235b
glibconfig_conf.set('g_pollout', value_POLLOUT)
Packit ae235b
glibconfig_conf.set('g_pollpri', value_POLLPRI)
Packit ae235b
glibconfig_conf.set('g_pollerr', value_POLLERR)
Packit ae235b
glibconfig_conf.set('g_pollhup', value_POLLHUP)
Packit ae235b
glibconfig_conf.set('g_pollnval', value_POLLNVAL)
Packit ae235b
Packit ae235b
# Internet address families
Packit ae235b
# FIXME: what about Cygwin (G_WITH_CYGWIN)
Packit ae235b
if host_system == 'windows'
Packit ae235b
  glib_inet_includes= '''
Packit ae235b
#include <winsock2.h>
Packit ae235b
'''
Packit ae235b
else
Packit ae235b
  glib_inet_includes='''
Packit ae235b
#include <sys/types.h>
Packit ae235b
#include <sys/socket.h>
Packit ae235b
'''
Packit ae235b
endif
Packit ae235b
Packit ae235b
net_defines = [
Packit ae235b
  [ 'AF_UNIX', 'g_af_unix' ],
Packit ae235b
  [ 'AF_INET', 'g_af_inet' ],
Packit ae235b
  [ 'AF_INET6', 'g_af_inet6' ],
Packit ae235b
  [ 'MSG_OOB', 'g_msg_oob' ],
Packit ae235b
  [ 'MSG_PEEK', 'g_msg_peek' ],
Packit ae235b
  [ 'MSG_DONTROUTE', 'g_msg_dontroute' ],
Packit ae235b
]
Packit ae235b
foreach d : net_defines
Packit ae235b
  templ = '''@0@
Packit ae235b
#include <stdio.h>
Packit ae235b
int main(int argc, char **argv) {
Packit ae235b
  printf("%d\n", (int)@1@);
Packit ae235b
  return 0;
Packit ae235b
}'''
Packit ae235b
  # FIXME: fix for cross-compilation
Packit ae235b
  if not meson.has_exe_wrapper()
Packit ae235b
    error('Fix sys define detection for cross build')
Packit ae235b
  endif
Packit ae235b
  val = cc.run(templ.format(glib_inet_includes, d[0]), name : d[0] + ' value').stdout().strip()
Packit ae235b
  glibconfig_conf.set(d[1], val)
Packit ae235b
endforeach
Packit ae235b
Packit ae235b
glibconfig_conf.set('GLIB_USING_SYSTEM_PRINTF', true) # FIXME!
Packit ae235b
Packit ae235b
# We need a more robust approach here...
Packit ae235b
host_cpu_family = host_machine.cpu_family()
Packit ae235b
if host_cpu_family == 'x86' or host_cpu_family == 'x86_64' or host_cpu_family == 's390' or host_cpu_family == 's390x' or host_cpu_family.startswith('arm') or host_cpu_family.startswith('crisv32') or host_cpu_family.startswith('etrax')
Packit ae235b
  glib_memory_barrier_needed = false
Packit ae235b
elif host_cpu_family.startswith('sparc') or host_cpu_family.startswith('alpha') or host_cpu_family.startswith('powerpc') or host_cpu_family == 'ia64'
Packit ae235b
  glib_memory_barrier_needed = true
Packit ae235b
else
Packit ae235b
  warning('Unknown host cpu: ' + host_cpu_family)
Packit ae235b
  glib_memory_barrier_needed = true
Packit ae235b
endif
Packit ae235b
glibconfig_conf.set('G_ATOMIC_OP_MEMORY_BARRIER_NEEDED', glib_memory_barrier_needed)
Packit ae235b
Packit ae235b
# Note that the atomic ops are only available with GCC on x86 when
Packit ae235b
# using -march=i486 or higher.  If we detect that the atomic ops are
Packit ae235b
# not available but would be available given the right flags, we want
Packit ae235b
# to abort and advise the user to fix their CFLAGS.  It's better to do
Packit ae235b
# that then to silently fall back on emulated atomic ops just because
Packit ae235b
# the user had the wrong build environment.
Packit ae235b
atomictest = '''void func() {
Packit ae235b
  volatile int atomic = 2;
Packit ae235b
  __sync_bool_compare_and_swap (&atomic, 2, 3);
Packit ae235b
}
Packit ae235b
'''
Packit ae235b
if cc.compiles(atomictest)
Packit ae235b
  glibconfig_conf.set('G_ATOMIC_LOCK_FREE', true)
Packit ae235b
else
Packit ae235b
  if host_machine.cpu_family() == 'x86' and cc.compiles(atomictest, args : '-march=i486')
Packit ae235b
    error('GLib must be built with -march=i486 or later.')
Packit ae235b
  endif
Packit ae235b
  glibconfig_conf.set('G_ATOMIC_LOCK_FREE', false)
Packit ae235b
endif
Packit ae235b
Packit ae235b
# === Threads ===
Packit ae235b
Packit ae235b
# Let meson figure out all this business and whether -pthread or whatnot is needed
Packit ae235b
# FIXME: probably needs more tweaking in meson for things like -D_REENTRANT etc.
Packit ae235b
thread_dep = dependency('threads')
Packit ae235b
Packit ae235b
# Determination of thread implementation
Packit ae235b
if host_system == 'windows'
Packit ae235b
  glibconfig_conf.set('g_threads_impl_def', 'WIN32')
Packit ae235b
  glib_conf.set('THREADS_WIN32', 1)
Packit ae235b
else
Packit ae235b
  glibconfig_conf.set('g_threads_impl_def', 'POSIX')
Packit ae235b
  glib_conf.set('THREADS_POSIX', 1)
Packit ae235b
  if cc.has_header_symbol('pthread.h', 'pthread_attr_setstacksize')
Packit ae235b
    glib_conf.set('HAVE_PTHREAD_ATTR_SETSTACKSIZE', 1)
Packit ae235b
  endif
Packit ae235b
  if cc.has_header_symbol('pthread.h', 'pthread_condattr_setclock')
Packit ae235b
    glib_conf.set('HAVE_PTHREAD_CONDATTR_SETCLOCK', 1)
Packit ae235b
  endif
Packit ae235b
  if cc.has_header_symbol('pthread.h', 'pthread_cond_timedwait_relative_np')
Packit ae235b
    glib_conf.set('HAVE_PTHREAD_COND_TIMEDWAIT_RELATIVE_NP', 1)
Packit ae235b
  endif
Packit ae235b
  # Assume that pthread_setname_np is available in some form; same as configure
Packit ae235b
  if cc.links('''#ifndef _GNU_SOURCE
Packit ae235b
              # define _GNU_SOURCE
Packit ae235b
              #endif
Packit ae235b
              #include <pthread.h>
Packit ae235b
              int main() {
Packit ae235b
                pthread_setname_np("example");
Packit ae235b
              }''',
Packit ae235b
              name : 'pthread_setname_np(const char*)',
Packit ae235b
              dependencies : thread_dep)
Packit ae235b
    # macOS and iOS
Packit ae235b
    glib_conf.set('HAVE_PTHREAD_SETNAME_NP_WITHOUT_TID', 1)
Packit ae235b
  elif cc.links('''#ifndef _GNU_SOURCE
Packit ae235b
                # define _GNU_SOURCE
Packit ae235b
                #endif
Packit ae235b
                #include <pthread.h>
Packit ae235b
                int main() {
Packit ae235b
                  pthread_setname_np(pthread_self(), "example");
Packit ae235b
                }''',
Packit ae235b
                name : 'pthread_setname_np(pthread_t, const char*)',
Packit ae235b
                dependencies : thread_dep)
Packit ae235b
    # Linux, Solaris, etc.
Packit ae235b
    glib_conf.set('HAVE_PTHREAD_SETNAME_NP_WITH_TID', 1)
Packit ae235b
  endif
Packit ae235b
endif
Packit ae235b
Packit ae235b
# FIXME: how to do this when cross-compiling?
Packit ae235b
# FIXME: we should make it print the result and always return 0, so that
Packit ae235b
# the output in meson shows up as green
Packit ae235b
stack_grows_check_prog = '''
Packit ae235b
  volatile int *a = 0, *b = 0;
Packit ae235b
  void f (int i) {
Packit ae235b
    volatile int x = 5;
Packit ae235b
    if (i == 0)
Packit ae235b
      b = &x;
Packit ae235b
    else
Packit ae235b
      f (i - 1);
Packit ae235b
  }
Packit ae235b
  int main () {
Packit ae235b
    volatile int y = 7;
Packit ae235b
    a = &y;
Packit ae235b
    f (100);
Packit ae235b
    return b > a ? 0 : 1;
Packit ae235b
  }'''
Packit ae235b
stack_grows_run_result = cc.run(stack_grows_check_prog, name : 'stack grows check')
Packit ae235b
if stack_grows_run_result.compiled() and stack_grows_run_result.returncode() == 0
Packit ae235b
  glibconfig_conf.set('G_HAVE_GROWING_STACK', 1)
Packit ae235b
else
Packit ae235b
  glibconfig_conf.set('G_HAVE_GROWING_STACK', 0)
Packit ae235b
endif
Packit ae235b
Packit ae235b
# Tests for iconv
Packit ae235b
#
Packit ae235b
# USE_LIBICONV_GNU: Using GNU libiconv
Packit ae235b
# USE_LIBICONV_NATIVE: Using a native impl of iconv in a separate library
Packit ae235b
#
Packit ae235b
# We should never use the MinGW C library's iconv. On Windows we use the
Packit ae235b
# GNU implementation that ships with MinGW.
Packit ae235b
Packit ae235b
# On Windows, just always use the built-in implementation
Packit ae235b
if host_system == 'windows'
Packit ae235b
  libiconv = []
Packit ae235b
  glib_conf.set('USE_LIBICONV_NATIVE', true)
Packit ae235b
else
Packit ae235b
  found_iconv = false
Packit ae235b
  iconv_opt = get_option('iconv')
Packit ae235b
  if iconv_opt == 'libc'
Packit ae235b
    if cc.has_function('iconv_open')
Packit ae235b
      libiconv = []
Packit ae235b
      found_iconv = true
Packit ae235b
    endif
Packit ae235b
  elif iconv_opt == 'gnu'
Packit ae235b
    if cc.has_header_symbol('iconv.h', 'libiconv_open')
Packit ae235b
      glib_conf.set('USE_LIBICONV_GNU', true)
Packit ae235b
      libiconv = [cc.find_library('iconv')]
Packit ae235b
      found_iconv = true
Packit ae235b
    endif
Packit ae235b
  elif iconv_opt == 'native'
Packit ae235b
    if cc.has_header_symbol('iconv.h', 'iconv_open')
Packit ae235b
      glib_conf.set('USE_LIBICONV_NATIVE', true)
Packit ae235b
      libiconv = [cc.find_library('iconv')]
Packit ae235b
      found_iconv = true
Packit ae235b
    endif
Packit ae235b
  endif
Packit ae235b
Packit ae235b
  if not found_iconv
Packit ae235b
    error('No iconv() implementation found in C library or libiconv')
Packit ae235b
  endif
Packit ae235b
Packit ae235b
endif
Packit ae235b
Packit ae235b
if get_option('internal_pcre')
Packit ae235b
  pcre = []
Packit ae235b
  use_system_pcre = false
Packit ae235b
else
Packit ae235b
  pcre = dependency('libpcre', required : false) # Should check for Unicode support, too. FIXME
Packit ae235b
  if not pcre.found()
Packit ae235b
    if cc.get_id() == 'msvc'
Packit ae235b
    # MSVC: Search for the PCRE library by the configuration, which corresponds
Packit ae235b
    # to the output of CMake builds of PCRE.  Note that debugoptimized
Packit ae235b
    # is really a Release build with .PDB files.
Packit ae235b
      if buildtype == 'debug'
Packit ae235b
        pcre = cc.find_library('pcred', required : false)
Packit ae235b
      else
Packit ae235b
        pcre = cc.find_library('pcre', required : false)
Packit ae235b
      endif
Packit ae235b
    endif
Packit ae235b
  endif
Packit ae235b
  use_system_pcre = pcre.found()
Packit ae235b
endif
Packit ae235b
glib_conf.set('USE_SYSTEM_PCRE', use_system_pcre)
Packit ae235b
Packit ae235b
use_pcre_static_flag = false
Packit ae235b
Packit ae235b
if host_system == 'windows'
Packit ae235b
  if not use_system_pcre
Packit ae235b
    use_pcre_static_flag = true
Packit ae235b
  else
Packit ae235b
    pcre_static = cc.links('''#define PCRE_STATIC
Packit ae235b
                              #include <pcre.h>
Packit ae235b
                              int main() {
Packit ae235b
                                void *p = NULL;
Packit ae235b
                                pcre_free(p);
Packit ae235b
                                return 0;
Packit ae235b
                              }''',
Packit ae235b
                           dependencies: pcre,
Packit ae235b
                           name : 'Windows system PCRE is a static build')
Packit ae235b
    if pcre_static
Packit ae235b
      use_pcre_static_flag = true
Packit ae235b
    endif
Packit ae235b
  endif
Packit ae235b
endif
Packit ae235b
Packit ae235b
libm = cc.find_library('m', required : false)
Packit ae235b
libffi_dep = dependency('libffi', version : '>= 3.0.0', fallback : ['libffi', 'ffi_dep'])
Packit ae235b
zlib_libname = '-lz'
Packit ae235b
if cc.get_id() != 'msvc'
Packit ae235b
  libz_dep = dependency('zlib', fallback : ['zlib', 'zlib_dep'])
Packit ae235b
else
Packit ae235b
  # MSVC: Don't use the bundled ZLib sources until we are sure that we can't
Packit ae235b
  # find the ZLib .lib
Packit ae235b
  libz_dep = dependency('zlib', required : false)
Packit ae235b
Packit ae235b
  # MSVC: Search for the ZLib .lib, which corresponds to the results of
Packit ae235b
  # of using ZLib's win32/makefile.msc.
Packit ae235b
  if not libz_dep.found()
Packit ae235b
    libz_dep = cc.find_library('zlib1', required : false)
Packit ae235b
    if libz_dep.found()
Packit ae235b
      zlib_libname = '-lzlib1'
Packit ae235b
    else
Packit ae235b
      libz_dep = cc.find_library('zlib', required : false)
Packit ae235b
      if libz_dep.found()
Packit ae235b
        zlib_libname = '-lzlib'
Packit ae235b
      else
Packit ae235b
        libz_dep = subproject('zlib').get_variable('zlib_dep')
Packit ae235b
      endif
Packit ae235b
    endif
Packit ae235b
  endif
Packit ae235b
endif
Packit ae235b
Packit ae235b
# Only used on non-glibc targets
Packit ae235b
libintl = cc.find_library('intl', required : false)
Packit ae235b
if host_system == 'windows' and not libintl.found()
Packit ae235b
  # Used only when the gettext library is not available (MSVC, not MinGW)
Packit ae235b
  libintl = subproject('proxy-libintl').get_variable('intl_dep')
Packit ae235b
  glib_conf.set('HAVE_DCGETTEXT', 1)
Packit ae235b
else
Packit ae235b
  glib_conf.set('HAVE_DCGETTEXT', cc.has_header_symbol('libintl.h', 'dcgettext'))
Packit ae235b
endif
Packit ae235b
# We require gettext to always be present
Packit ae235b
glib_conf.set('HAVE_GETTEXT', 1)
Packit ae235b
glib_conf.set_quoted('GLIB_LOCALE_DIR', join_paths(glib_datadir, 'locale'))
Packit ae235b
# xgettext is optional (on Windows for instance)
Packit ae235b
xgettext = find_program('xgettext', required : false)
Packit ae235b
Packit ae235b
# libmount is only used by gio, but we need to fetch the libs to generate the
Packit ae235b
# pkg-config file below
Packit ae235b
libmount_dep = []
Packit ae235b
if host_system == 'linux' and get_option('libmount')
Packit ae235b
  libmount_dep = [dependency('mount', version : '>=2.23', required : true)]
Packit ae235b
endif
Packit ae235b
Packit ae235b
if host_system == 'windows'
Packit ae235b
  winsock2 = cc.find_library('ws2_32')
Packit ae235b
endif
Packit ae235b
Packit ae235b
selinux_dep = []
Packit ae235b
if host_system == 'linux' and get_option('selinux')
Packit ae235b
  selinux_dep = [dependency('libselinux')]
Packit ae235b
  glib_conf.set('SELINUX_LIBS', '-lselinux')
Packit ae235b
  glib_conf.set('HAVE_SELINUX', 1)
Packit ae235b
endif
Packit ae235b
Packit ae235b
xattr_dep = []
Packit ae235b
if host_system != 'windows' and get_option('xattr')
Packit ae235b
  # either glibc or libattr can provide xattr support
Packit ae235b
  # for both of them, we check for getxattr being in
Packit ae235b
  # the library and a valid xattr header.
Packit ae235b
Packit ae235b
  # try glibc
Packit ae235b
  if cc.has_function('getxattr') and cc.has_header('sys/xattr.h')
Packit ae235b
    glib_conf.set('HAVE_SYS_XATTR_H', 1)
Packit ae235b
    glib_conf_prefix = glib_conf_prefix + '#define @0@ 1\n'.format('HAVE_SYS_XATTR_H')
Packit ae235b
  #failure. try libattr
Packit ae235b
  elif cc.has_header_symbol('attr/xattr.h', 'getxattr')
Packit ae235b
    glib_conf.set('HAVE_ATTR_XATTR_H', 1)
Packit ae235b
    glib_conf_prefix = glib_conf_prefix + '#define @0@ 1\n'.format('HAVE_ATTR_XATTR_H')
Packit ae235b
    xattr_dep = [cc.find_library('xattr')]
Packit ae235b
  else
Packit ae235b
    error('No getxattr implementation found in C library or libxattr')
Packit ae235b
  endif
Packit ae235b
Packit ae235b
  glib_conf.set('HAVE_XATTR', 1)
Packit ae235b
  if cc.compiles(glib_conf_prefix + '''
Packit ae235b
                 #include <stdio.h>
Packit ae235b
                 #ifdef HAVE_SYS_TYPES_H
Packit ae235b
                 #include <sys/types.h>
Packit ae235b
                 #endif
Packit ae235b
                 #ifdef HAVE_SYS_XATTR_H
Packit ae235b
                 #include <sys/xattr.h>
Packit ae235b
                 #elif HAVE_ATTR_XATTR_H
Packit ae235b
                 #include <attr/xattr.h>
Packit ae235b
                 #endif
Packit ae235b
Packit ae235b
                 int main (void) {
Packit ae235b
                   ssize_t len = getxattr("", "", NULL, 0, 0, XATTR_NOFOLLOW);
Packit ae235b
                 }''',
Packit ae235b
                 name : 'XATTR_NOFOLLOW')
Packit ae235b
    glib_conf.set('HAVE_XATTR_NOFOLLOW', 1)
Packit ae235b
  endif
Packit ae235b
endif
Packit ae235b
Packit ae235b
python = import('python3').find_python()
Packit ae235b
Packit ae235b
# Determine which user environment-dependent files that we want to install
Packit ae235b
have_bash = find_program('bash', required : false).found() # For completion scripts
Packit ae235b
have_m4 = find_program('m4', required : false).found() # For m4 macros
Packit ae235b
have_sh = find_program('sh', required : false).found() # For glib-gettextize
Packit ae235b
Packit ae235b
# FIXME: defines in config.h that are not actually used anywhere
Packit ae235b
# (we add them for now to minimise the diff)
Packit ae235b
glib_conf.set('HAVE_DLFCN_H', 1)
Packit ae235b
glib_conf.set('__EXTENSIONS__', 1)
Packit ae235b
glib_conf.set('STDC_HEADERS', 1)
Packit ae235b
# THREADS_NONE
Packit ae235b
glib_conf.set('SIZEOF___INT64', 8)
Packit ae235b
Packit ae235b
# Various substs needed for our pkg-config files
Packit ae235b
# FIXME: Derive these from the dependency() objects (Meson support needed)
Packit ae235b
glib_conf.set('ZLIB_LIBS', zlib_libname)
Packit ae235b
glib_conf.set('LIBFFI_LIBS', '-lffi')
Packit ae235b
if libintl.found()
Packit ae235b
  glib_conf.set('INTLLIBS', '-lintl')
Packit ae235b
endif
Packit ae235b
if libiconv.length() != 0
Packit ae235b
  glib_conf.set('ICONV_LIBS', '-liconv')
Packit ae235b
endif
Packit ae235b
if use_system_pcre
Packit ae235b
  glib_conf.set('PCRE_LIBS', '-lpcre')
Packit ae235b
endif
Packit ae235b
if libmount_dep.length() != 0
Packit ae235b
  glib_conf.set('LIBMOUNT_LIBS', '-lmount')
Packit ae235b
  glib_conf.set('HAVE_LIBMOUNT', 1)
Packit ae235b
endif
Packit ae235b
glib_conf.set('GIO_MODULE_DIR', glib_giomodulesdir)
Packit ae235b
# FIXME: Missing:
Packit ae235b
# @G_MODULE_LIBS@ @COCOA_LIBS@ @CARBON_LIBS@ @G_LIBS_EXTRA@
Packit ae235b
# @PCRE_REQUIRES@ @GLIB_EXTRA_CFLAGS@ @G_THREAD_CFLAGS@
Packit ae235b
Packit ae235b
# Tracing: dtrace
Packit ae235b
want_dtrace = get_option('dtrace')
Packit ae235b
enable_dtrace = false
Packit ae235b
Packit ae235b
# Since dtrace support is opt-in we just error out if it was requested but
Packit ae235b
# is not available. We don't bother with autodetection yet.
Packit ae235b
if want_dtrace
Packit ae235b
  if glib_have_carbon
Packit ae235b
    error('GLib dtrace support not yet compatible with macOS dtrace')
Packit ae235b
  endif
Packit ae235b
  dtrace = find_program('dtrace', required : true) # error out if not found
Packit ae235b
  if not cc.has_header('sys/sdt.h')
Packit ae235b
    error('dtrace support needs sys/sdt.h header')
Packit ae235b
  endif
Packit ae235b
  # FIXME: autotools build also passes -fPIC -DPIC but is it needed in this case?
Packit ae235b
  dtrace_obj_gen = generator(dtrace,
Packit ae235b
    output : '@BASENAME@.o',
Packit ae235b
    arguments : ['-G', '-s', '@INPUT@', '-o', '@OUTPUT@'])
Packit ae235b
  # FIXME: $(SED) -e "s,define STAP_HAS_SEMAPHORES 1,undef STAP_HAS_SEMAPHORES,"
Packit ae235b
  #               -e "s,define _SDT_HAS_SEMAPHORES 1,undef _SDT_HAS_SEMAPHORES,"
Packit ae235b
  dtrace_hdr_gen = generator(dtrace,
Packit ae235b
    output : '@BASENAME@.h',
Packit ae235b
    arguments : ['-h', '-s', '@INPUT@', '-o', '@OUTPUT@'])
Packit ae235b
  glib_conf.set('HAVE_DTRACE', 1)
Packit ae235b
  enable_dtrace = true
Packit ae235b
endif
Packit ae235b
Packit ae235b
# systemtap
Packit ae235b
want_systemtap = get_option('systemtap')
Packit ae235b
enable_systemtap = false
Packit ae235b
Packit ae235b
if want_systemtap and enable_dtrace
Packit ae235b
  tapset_install_dir = get_option('tapset_install_dir')
Packit ae235b
  if tapset_install_dir == ''
Packit ae235b
    tapset_install_dir = join_paths(get_option('datadir'), 'systemtap/tapset', host_machine.cpu_family())
Packit ae235b
  endif
Packit ae235b
  stp_cdata = configuration_data()
Packit ae235b
  stp_cdata.set('ABS_GLIB_RUNTIME_LIBDIR', glib_libdir)
Packit ae235b
  stp_cdata.set('LT_CURRENT', minor_version * 100)
Packit ae235b
  stp_cdata.set('LT_REVISION', micro_version)
Packit ae235b
  enable_systemtap = true
Packit ae235b
endif
Packit ae235b
Packit ae235b
Packit ae235b
windows = import('windows')
Packit ae235b
subdir('glib')
Packit ae235b
subdir('gobject')
Packit ae235b
subdir('gthread')
Packit ae235b
subdir('gmodule')
Packit ae235b
subdir('gio')
Packit ae235b
if xgettext.found()
Packit ae235b
  subdir('po')
Packit ae235b
endif
Packit ae235b
subdir('tests')
Packit ae235b
Packit ae235b
# Configure and install pkg-config files
Packit ae235b
pc_files = [
Packit ae235b
  'gobject-2.0.pc',
Packit ae235b
  'glib-2.0.pc',
Packit ae235b
  'gthread-2.0.pc',
Packit ae235b
  'gmodule-2.0.pc',
Packit ae235b
  'gmodule-export-2.0.pc',
Packit ae235b
  'gmodule-no-export-2.0.pc',
Packit ae235b
  'gio-2.0.pc',
Packit ae235b
]
Packit ae235b
if host_system == 'windows'
Packit ae235b
  pc_files += ['gio-windows-2.0.pc']
Packit ae235b
else
Packit ae235b
  pc_files += ['gio-unix-2.0.pc']
Packit ae235b
endif
Packit ae235b
Packit ae235b
foreach pc : pc_files
Packit ae235b
  configure_file(input : pc + '.in',
Packit ae235b
    install : true,
Packit ae235b
    install_dir : glib_pkgconfigreldir,
Packit ae235b
    output : pc,
Packit ae235b
    configuration : glib_conf)
Packit ae235b
endforeach
Packit ae235b
Packit ae235b
# NOTE: We skip glib-zip.in because the filenames it assumes don't match ours
Packit ae235b
Packit ae235b
# Install glib-gettextize executable, if a UNIX-style shell is found
Packit ae235b
if have_sh
Packit ae235b
  configure_file(input : 'glib-gettextize.in',
Packit ae235b
    install : true,
Packit ae235b
    install_dir : 'bin',
Packit ae235b
    output : 'glib-gettextize',
Packit ae235b
    configuration : glib_conf)
Packit ae235b
endif
Packit ae235b
Packit ae235b
if have_m4
Packit ae235b
  # Install m4 macros that other projects use
Packit ae235b
  install_data('m4macros/glib-2.0.m4', 'm4macros/glib-gettext.m4', 'm4macros/gsettings.m4',
Packit ae235b
    install_dir : join_paths(get_option('datadir'), 'aclocal'))
Packit ae235b
endif
Packit ae235b
Packit ae235b
if host_system != 'windows'
Packit ae235b
  # Install Valgrind suppression file (except on Windows,
Packit ae235b
  # as Valgrind is currently not supported on Windows)
Packit ae235b
  install_data('glib.supp',
Packit ae235b
    install_dir : join_paths(get_option('datadir'), 'glib-2.0', 'valgrind'))
Packit ae235b
endif
Packit ae235b
Packit ae235b
configure_file(input : 'config.h.meson',
Packit ae235b
  output : 'config.h',
Packit ae235b
  configuration : glib_conf)
Packit ae235b
Packit ae235b
if host_system == 'windows'
Packit ae235b
  install_headers([ 'msvc_recommended_pragmas.h' ], subdir : 'glib-2.0')
Packit ae235b
endif
Packit ae235b
Packit ae235b
if get_option('man')
Packit ae235b
  xsltproc = find_program('xsltproc', required : true)
Packit ae235b
  xsltproc_command = [
Packit ae235b
    xsltproc,
Packit ae235b
    '--nonet',
Packit ae235b
    '--stringparam', 'man.output.quietly', '1',
Packit ae235b
    '--stringparam', 'funcsynopsis.style', 'ansi',
Packit ae235b
    '--stringparam', 'man.th.extra1.suppress', '1',
Packit ae235b
    '--stringparam', 'man.authors.section.enabled', '0',
Packit ae235b
    '--stringparam', 'man.copyright.section.enabled', '0',
Packit ae235b
    '-o', '@OUTPUT@',
Packit ae235b
    'http://docbook.sourceforge.net/release/xsl/current/manpages/docbook.xsl',
Packit ae235b
    '@INPUT@',
Packit ae235b
  ]
Packit ae235b
  man1_dir = get_option('mandir') + '/man1'
Packit ae235b
endif
Packit ae235b
Packit ae235b
gnome = import('gnome')
Packit ae235b
subdir('docs/reference/glib')
Packit ae235b
subdir('docs/reference/gobject')
Packit ae235b
subdir('docs/reference/gio')