From fe2a9887a8ccb14f2386e01b14834e97a33bc2d7 Mon Sep 17 00:00:00 2001 From: Nirbheek Chauhan Date: Wed, 21 Dec 2016 04:07:24 +0530 Subject: [PATCH] meson: Improve MSVC and MinGW support and fix dependencies everywhere Disable gio tests on Windows, fix .gitignore to not ignore config.h.meson, and add more things to it. Rename the library file naming and versioning to match what Autotools outputs, e.g., libglib-2.0.so.0.5000.2 on Linux, libglib-2.0-0.dll and glib-2.0-0.dll on Windows with MSVC. Several more tiny fixes, more executables built and installed, install pkg-config and m4 files, fix building of gobject tests. Changes to gdbus-codegen to support out-of-tree builds without environment variables set (which you can't in Meson). We now add the build directory to the Python module search path. --- .gitignore | 15 +- config.h.meson | 15 +- gio/build_mkenum.py | 16 +- gio/data-to-c.py | 16 + gio/gdbus-2.0/codegen/codegen.py | 2 +- gio/gdbus-2.0/codegen/config.py.in | 3 - gio/gdbus-2.0/codegen/gdbus-codegen.in | 12 +- gio/gdbus-2.0/codegen/meson.build | 35 ++ gio/inotify/meson.build | 3 +- gio/kqueue/meson.build | 4 +- gio/meson.build | 367 +++++------- gio/tests/meson.build | 40 +- gio/tests/modules/meson.build | 6 +- gio/win32/meson.build | 4 +- gio/xdgmime/meson.build | 2 +- glib/libcharset/meson.build | 2 +- glib/meson.build | 95 ++- glib/pcre/meson.build | 50 ++ glib/tests/meson.build | 50 +- gmodule/meson.build | 40 +- gobject/gmarshal-list-to-strings.py | 21 + gobject/meson.build | 53 +- gobject/tests/gobject_test_marshal.py | 10 +- gobject/tests/meson.build | 20 +- gthread/meson.build | 9 +- meson.build | 797 ++++++++++++++----------- 26 files changed, 981 insertions(+), 706 deletions(-) create mode 100644 gio/data-to-c.py create mode 100644 gio/gdbus-2.0/codegen/meson.build create mode 100644 glib/pcre/meson.build create mode 100644 gobject/gmarshal-list-to-strings.py diff --git a/.gitignore b/.gitignore index 9edb72cce..886da4fb4 100644 --- a/.gitignore +++ b/.gitignore @@ -25,7 +25,16 @@ tags # autofoo stuff here compile -config.* +config.cache +config.guess +config.h +config.h.in +config.h-new +config.log +config.lt +config.rpath +config.status* +config.sub configure depcomp aclocal.m4 @@ -47,3 +56,7 @@ README ChangeLog /glib-lcov.info /glib-lcov/ + +# Meson +/meson-build/ +/subprojects/ diff --git a/config.h.meson b/config.h.meson index eeb2deab1..b8b419ea4 100644 --- a/config.h.meson +++ b/config.h.meson @@ -15,6 +15,9 @@ /* poll doesn't work on devices */ #mesondefine BROKEN_POLL +/* Whether we're building a DLL and hence need symbols exported for a DLL */ +#mesondefine DLL_EXPORT + /* Define to one of `_getb67', `GETB67', `getb67' for Cray-2 and Cray-YMP systems. This function is required for `alloca.c' support on those systems. */ @@ -316,9 +319,18 @@ /* Have function pthread_attr_setstacksize */ #mesondefine HAVE_PTHREAD_ATTR_SETSTACKSIZE +/* Have function pthread_cond_timedwait_relative_np */ +#mesondefine HAVE_PTHREAD_COND_TIMEDWAIT_RELATIVE_NP + /* Have function pthread_condattr_setclock */ #mesondefine HAVE_PTHREAD_CONDATTR_SETCLOCK +/* Have function pthread_setname_np without TID as argument */ +#mesondefine HAVE_PTHREAD_SETNAME_NP_WITHOUT_TID + +/* Have function pthread_setname_np with TID as argument */ +#mesondefine HAVE_PTHREAD_SETNAME_NP_WITH_TID + /* Define to 1 if the system has the type `ptrdiff_t'. */ #mesondefine HAVE_PTRDIFF_T @@ -511,9 +523,6 @@ /* Define to 1 if you have the header file. */ #mesondefine HAVE_SYS_POLL_H -/* Define to 1 if you have the header file. */ -#mesondefine HAVE_SYS_PRCTL_H - /* Define to 1 if you have the header file. */ #mesondefine HAVE_SYS_RESOURCE_H diff --git a/gio/build_mkenum.py b/gio/build_mkenum.py index c93ee32b4..5d40e9f5d 100755 --- a/gio/build_mkenum.py +++ b/gio/build_mkenum.py @@ -7,15 +7,17 @@ import sys, os, shutil, subprocess -ofilename = sys.argv[1] -template_file_dir = sys.argv[2] -template_file_path = template_file_dir + '/' + ofilename + '.template' -headers = sys.argv[3:] +perl = sys.argv[1] +glib_mkenums = sys.argv[2] +ofilename = sys.argv[3] +ofile_rel = os.path.basename(ofilename) +template_file_dir = sys.argv[4] +template_file_path = template_file_dir + '/' + ofile_rel + '.template' +headers = sys.argv[5:] -arg_array = ['--template', template_file_path ] +arg_array = ['--template', template_file_path] -# FIXME: should use $top_builddir/gobject/glib-mkenums -cmd = [shutil.which('perl'), shutil.which('glib-mkenums')] +cmd = [perl, glib_mkenums] pc = subprocess.Popen(cmd + arg_array + headers, stdout=subprocess.PIPE) (stdo, _) = pc.communicate() if pc.returncode != 0: diff --git a/gio/data-to-c.py b/gio/data-to-c.py new file mode 100644 index 000000000..7a8d8a865 --- /dev/null +++ b/gio/data-to-c.py @@ -0,0 +1,16 @@ +#!/usr/bin/env python3 + +import sys + +if len(sys.argv) < 4: + print('Usage: {0} ') + +with open(sys.argv[1], 'rb') as f: + in_data = f.read().decode('utf-8', 'backslashreplace') +b = [r'\x{:02x}'.format(ord(c)) for c in in_data] + +out_data = "const char {0}[] = \"".format(sys.argv[2]) +out_data += "".join(b) + "\";" + +with open(sys.argv[3], 'w') as f: + f.write(out_data) diff --git a/gio/gdbus-2.0/codegen/codegen.py b/gio/gdbus-2.0/codegen/codegen.py index 15cf96124..3a8347fb3 100644 --- a/gio/gdbus-2.0/codegen/codegen.py +++ b/gio/gdbus-2.0/codegen/codegen.py @@ -50,7 +50,7 @@ class CodeGenerator: self.ns_upper = '' self.ns_lower = '' self.interface_prefix = interface_prefix - self.header_guard = header_name.upper().replace('.', '_').replace('-', '_').replace('/', '_') + self.header_guard = header_name.upper().replace('.', '_').replace('-', '_').replace('/', '_').replace(':', '_') # ---------------------------------------------------------------------------------------------------- diff --git a/gio/gdbus-2.0/codegen/config.py.in b/gio/gdbus-2.0/codegen/config.py.in index 80d20ee78..a91178a95 100644 --- a/gio/gdbus-2.0/codegen/config.py.in +++ b/gio/gdbus-2.0/codegen/config.py.in @@ -19,7 +19,4 @@ # # Author: David Zeuthen -DATADIR = "@datarootdir@" -DATADIR = DATADIR.replace( - "${prefix}", "@prefix@") VERSION = "@VERSION@" diff --git a/gio/gdbus-2.0/codegen/gdbus-codegen.in b/gio/gdbus-2.0/codegen/gdbus-codegen.in index 9c086fe87..4558aa37c 100644 --- a/gio/gdbus-2.0/codegen/gdbus-codegen.in +++ b/gio/gdbus-2.0/codegen/gdbus-codegen.in @@ -24,14 +24,18 @@ import os import sys srcdir = os.getenv('UNINSTALLED_GLIB_SRCDIR', None) +filedir = os.path.dirname(__file__) if srcdir is not None: path = os.path.join(srcdir, 'gio', 'gdbus-2.0') -elif os.name == 'nt': - # Makes gdbus-codegen 'relocatable' at runtime on Windows. - path = os.path.join(os.path.dirname(__file__), '..', 'share', 'glib-2.0') +elif os.path.basename(filedir) == 'bin': + # Make the prefix containing gdbus-codegen 'relocatable' at runtime by + # adding /some/prefix/bin/../share/glib-2.0 to the python path + path = os.path.join(filedir, '..', 'share', 'glib-2.0') else: - path = os.path.join('@datadir@', 'glib-2.0') + # Assume that the modules we need are in the current directory and add the + # parent directory to the python path. + path = os.path.join(filedir, '..') sys.path.insert(0, os.path.abspath(path)) from codegen import codegen_main diff --git a/gio/gdbus-2.0/codegen/meson.build b/gio/gdbus-2.0/codegen/meson.build new file mode 100644 index 000000000..b062cfbdf --- /dev/null +++ b/gio/gdbus-2.0/codegen/meson.build @@ -0,0 +1,35 @@ +gdbus_codegen_files = [ + '__init__.py', + 'codegen.py', + 'codegen_main.py', + 'codegen_docbook.py', + 'dbustypes.py', + 'parser.py', + 'utils.py', +] + +gdbus_codegen_conf = configuration_data() +gdbus_codegen_conf.set('VERSION', glib_version) +gdbus_codegen_conf.set('PYTHON', python.path()) + +# Install gdbus-codegen executable +# FIXME: Set permissions +gdbus_codegen = configure_file(input : 'gdbus-codegen.in', + output : 'gdbus-codegen', + install : true, + install_dir : 'bin', configuration : gdbus_codegen_conf) + +configure_file(input : 'config.py.in', + output : 'config.py', + install : true, + install_dir : 'share/glib-2.0/codegen', configuration : gdbus_codegen_conf) + +blank_conf = configuration_data() +foreach f : gdbus_codegen_files + # Copy these into the builddir so that gdbus-codegen can be used uninstalled + # and then install it too so that it can be used after installation + configure_file(input : f, output : f, + install : true, + install_dir : 'share/glib-2.0/codegen', + configuration : blank_conf) +endforeach diff --git a/gio/inotify/meson.build b/gio/inotify/meson.build index cc3165610..3f00d943a 100644 --- a/gio/inotify/meson.build +++ b/gio/inotify/meson.build @@ -9,5 +9,6 @@ inotify_sources = [ inotify_lib = static_library('inotify', sources : inotify_sources, - include_directories : inc_dirs, + include_directories : [configinc, glibinc, gmoduleinc], + dependencies : [gioenumtypes_dep], c_args : [ '-DHAVE_CONFIG_H', '-fPIC', '-DG_DISABLE_DEPRECATED' ] + gio_c_args) diff --git a/gio/kqueue/meson.build b/gio/kqueue/meson.build index 7405d68c2..326915ca7 100644 --- a/gio/kqueue/meson.build +++ b/gio/kqueue/meson.build @@ -7,9 +7,11 @@ kqueue_sources = [ 'kqueue-utils.c', 'kqueue-exclusions.c', 'dep-list.c', + # gkqueuefilemonitor.h includes gio.h which includes this + gioenumtypes_h, ] kqueue_lib = static_library('kqueue', sources : kqueue_sources, - include_directories : inc_dirs, + include_directories : [configinc, glibinc, gmoduleinc], c_args : [ '-DHAVE_CONFIG_H', '-fPIC', '-DG_DISABLE_DEPRECATED' ] + gio_c_args) diff --git a/gio/meson.build b/gio/meson.build index 4b0aeea59..1249cbb84 100644 --- a/gio/meson.build +++ b/gio/meson.build @@ -1,24 +1,22 @@ gio_c_args = [ '-DG_LOG_DOMAIN="GLib-GIO"', '-DGIO_COMPILATION', - '-DGIO_MODULE_DIR="@0@/gio/modules"'.format(get_option('libdir')), + '-DGIO_MODULE_DIR="@0@"'.format(glib_giomodulesdir), ] -# FIXME: subdir('gdbus-2.0/codegen') - gnetworking_h_conf = configuration_data() gnetworking_h_wspiapi_include = '' gnetworking_h_nameser_compat_include = '' -if host_machine.system() == 'windows' +if host_system == 'windows' # in the Windows SDK and in mingw-w64 has wrappers for # inline workarounds for getaddrinfo, getnameinfo and freeaddrinfo if # they aren't present at run-time (on Windows 2000). gnetworking_h_wspiapi_include = '#include ' endif -if host_machine.system().contains('android') +if host_system.contains('android') # Android does not have C_IN in public headers, we define it wherever necessary if not cc.compiles('''#include #include @@ -38,7 +36,7 @@ endif network_libs = [ ] network_args = [ ] -if host_machine.system() != 'windows' +if host_system != 'windows' # res_query() res_query_test = '''#include int main (int argc, char ** argv) { @@ -50,10 +48,10 @@ if host_machine.system() != 'windows' ''' + res_query_test if not cc.links(res_query_test_full, name : 'res_query()') if cc.links(res_query_test_full, args : '-lresolv', name : 'res_query() in -lresolv') - network_libs += [ find_library('resolv') ] + network_libs += [ cc.find_library('resolv') ] network_args += [ '-lresolv' ] elif cc.links(res_query_test, args : '-lbind', name : 'res_query() in -lbind') - network_libs += [ find_library('bind') ] + network_libs += [ cc.find_library('bind') ] network_args += [ '-lbind' ] else error('Could not find res_query()') @@ -68,7 +66,7 @@ if host_machine.system() != 'windows' }''' if not cc.links(socket_test, name : 'socket()') if cc.links(socket_test, args : '-lsocket', name : 'socket() in -lsocket') - network_libs += [ find_library('socket') ] + network_libs += [ cc.find_library('socket') ] network_args += [ '-lsocket' ] else error('Could not find socket()') @@ -93,12 +91,18 @@ if host_machine.system() != 'windows' endif endif +network_args_string = '' +foreach arg : network_args + network_args_string += arg + ' ' +endforeach +glib_conf.set('NETWORK_LIBS', network_args_string) + gnetworking_h_conf.set('WSPIAPI_INCLUDE', gnetworking_h_wspiapi_include) gnetworking_h_conf.set('NAMESER_COMPAT_INCLUDE', gnetworking_h_nameser_compat_include) gnetworking_h = configure_file(input : 'gnetworking.h.in', output : 'gnetworking.h', - install_dir : 'include/glib-2.0/gio/', + install_dir : 'include/glib-2.0/gio', configuration : gnetworking_h_conf) gdbus_headers = [ @@ -156,16 +160,17 @@ gdbus_sources = [ 'gtestdbus.c', ] -# FIXME: These are not built into the library yet -#EXTRA_DIST += gdbusdaemon.c gdbusdaemon.h dbus-daemon.xml -#gdbus-daemon-generated.h gdbus-daemon-generated.c: $(srcdir)/dbus-daemon.xml $(srcdir)/gdbus-2.0/codegen/gdbus-codegen.in -# $(AM_V_GEN) UNINSTALLED_GLIB_SRCDIR=$(top_srcdir) ', -# UNINSTALLED_GLIB_BUILDDIR=$(top_builddir) ', -# $(PYTHON) $(srcdir)/gdbus-2.0/codegen/gdbus-codegen.in ', -# --interface-prefix org. ', -# --generate-c-code gdbus-daemon-generated ', -# --c-namespace _G ', -# $(srcdir)/dbus-daemon.xml +# Generate gdbus-codegen +subdir('gdbus-2.0/codegen') + +# Generate gdbus-generated.{c,h} +gdbus_daemon_generated = custom_target('gdbus-daemon-generated', + input : ['dbus-daemon.xml'], + output : ['gdbus-daemon-generated.h', 'gdbus-daemon-generated.c'], + command : [python, gdbus_codegen, + '--interface-prefix', 'org.', + '--generate-c-code', '@OUTDIR@/gdbus-daemon-generated', + '--c-namespace', '_G', '@INPUT@']) settings_headers = [ 'gsettingsbackend.h', @@ -185,7 +190,7 @@ settings_sources = [ 'gsettings.c', ] -if host_machine.system() == 'windows' +if host_system == 'windows' settings_sources += [ 'gregistrysettingsbackend.c' ] endif @@ -267,37 +272,15 @@ local_sources = [ 'thumbnail-verify.c', ] -platform_deps = [ ] -internal_deps = [ ] -appinfo_sources = [ ] +platform_deps = [] +internal_deps = [] +appinfo_sources = [] -# inotify -if glib_conf.has('HAVE_SYS_INOTIFY_H') and have_func_inotify_init1 - subdir('inotify') - internal_deps += [ inotify_lib ] -endif - -# kevent -if have_func_kqueue and have_func_kevent - subdir('kqueue') - internal_deps += [ kqueue_lib ] -endif - -if host_machine.system() == 'windows' - subdir('win32') - internal_deps += [ giowin32_lib ] -endif - -# FIXME: FAM support -#if HAVE_FAM -# subdir('fam') -#endif - -unix_sources = [ ] -if host_machine.system() != 'windows' - appinfo_sources += [ 'gdesktopappinfo.c' ] +unix_sources = [] +if host_system != 'windows' + appinfo_sources += ['gdesktopappinfo.c'] subdir('xdgmime') - internal_deps += [ xdgmime_lib ] + internal_deps += [xdgmime_lib] unix_sources = [ 'gfiledescriptorbased.c', 'gunixconnection.c', @@ -349,25 +332,24 @@ endif gdbus_daemon_sources = [ 'gdbusdaemon.c', - 'gdbus-daemon-generated.c', + gdbus_daemon_generated, ] -win32_actual_sources = gdbus_daemon_sources + [ - 'gwin32registrykey.c', - 'gcontenttype-win32.c', - 'gwin32mount.c', - 'gwin32volumemonitor.c', - 'gwin32inputstream.c', - 'gwin32outputstream.c', -] - -if host_machine.system() == 'windows' - appinfo_sources += [ 'gwin32appinfo.c' ] - platform_deps += [ find_library('shlwapi'), - find_library('ws2_32'), - find_library('dnsapi'), - find_library('iphlpapi') ] - # win32_sources = $(win32_actual_sources) +win32_sources = gdbus_daemon_sources +if host_system == 'windows' + appinfo_sources += ['gwin32appinfo.c'] + platform_deps += [cc.find_library('shlwapi'), + cc.find_library('dnsapi'), + cc.find_library('iphlpapi'), + winsock2] + win32_sources += [ + 'gwin32registrykey.c', + 'gcontenttype-win32.c', + 'gwin32mount.c', + 'gwin32volumemonitor.c', + 'gwin32inputstream.c', + 'gwin32outputstream.c', + ] gio_win32_include_headers = [ 'gwin32inputstream.h', @@ -491,144 +473,37 @@ gio_sources = [ 'gvolumemonitor.c', 'gzlibcompressor.c', 'gzlibdecompressor.c', -# FIXME 'gioenumtypes.c', 'glistmodel.c', 'gliststore.c', ] -# FIXME gio_sources += appinfo_sources gio_sources += unix_sources -#gio_sources += win32_sources +gio_sources += win32_sources gio_sources += application_sources gio_sources += settings_sources gio_sources += gdbus_sources gio_sources += local_sources -foo = ''' +MISSING_STUFF = ''' if OS_WIN32_AND_DLL_COMPILATION gio_win32_res = gio-win32-res.o gio_win32_res_ldflag = -Wl,$(gio_win32_res) endif - -if OS_COCOA -# This is dumb. The ObjC source file should be properly named .m -libgio_2_0_la_CFLAGS += -xobjective-c -libgio_2_0_la_LDFLAGS += -Wl,-framework,Foundation -Wl,-framework,AppKit -endif - -libgio_2_0_la_DEPENDENCIES = $(gio_win32_res) $(gio_def) $(platform_deps) - gio-win32-res.o: gio.rc '$(WINDRES) gio.rc $@ -gioincludedir=$(includedir)/glib-2.0/gio/ -gioinclude_HEADERS =', - '$(gio_headers)', - 'gioenumtypes.h - -# these sources (also mentioned above) are generated. -BUILT_SOURCES +=', - 'gconstructor_as_data.h', - 'gioenumtypes.h', - 'gioenumtypes.c', - 'gdbus-daemon-generated.c', - 'gdbus-daemon-generated.h', - 'gnetworking.h', - '$(NULL) - -BUILT_EXTRA_DIST +=', - 'gio.rc - # This is read by gobject-introspection/misc/ and gtk-doc gio-public-headers.txt: Makefile '$(AM_V_GEN) echo $(gioinclude_HEADERS) $(giowin32include_HEADERS) $(giounixinclude_HEADERS) > $@.tmp && mv $@.tmp $@ -all-local: gio-public-headers.txt - -gioenumtypes.h: $(gio_headers) gioenumtypes.h.template - '$(AM_V_GEN) $(top_builddir)/gobject/glib-mkenums --template $(filter %.template,$^) $(filter-out %.template,$^) >', - ' gioenumtypes.h.tmp && mv gioenumtypes.h.tmp gioenumtypes.h - -gioenumtypes.c: $(gio_headers) gioenumtypes.c.template - '$(AM_V_GEN) $(top_builddir)/gobject/glib-mkenums --template $(filter %.template,$^) $(filter-out %.template,$^) >', - ' gioenumtypes.c.tmp && mv gioenumtypes.c.tmp gioenumtypes.c - gio.def: libgio-2.0.la '$(AM_V_GEN) dumpbin.exe -exports .libs/libgio-2.0-0.dll | awk 'BEGIN { print "EXPORTS" } / +[[:digit:]]+ +[[:xdigit:]]+ +[[:xdigit:]]+/{ print $$4 }' > gio.def.tmp && mv gio.def.tmp gio.def gio-2.0.lib: libgio-2.0.la gio.def '$(AM_V_GEN) lib.exe -machine:@LIB_EXE_MACHINE_FLAG@ -name:libgio-2.0-$(LT_CURRENT_MINUS_AGE).dll -def:$(builddir)/gio.def -out:$@ -bin_PROGRAMS = gio-querymodules glib-compile-schemas glib-compile-resources gsettings - -glib_compile_resources_LDADD = libgio-2.0.la', - '$(top_builddir)/gobject/libgobject-2.0.la', - '$(top_builddir)/gmodule/libgmodule-2.0.la', - '$(top_builddir)/glib/libglib-2.0.la', - '$(NULL) - -glib_compile_resources_SOURCES =', - 'gvdb/gvdb-format.h', - 'gvdb/gvdb-builder.h', - 'gvdb/gvdb-builder.c', - 'glib-compile-resources.c - -gio_querymodules_SOURCES = gio-querymodules.c -gio_querymodules_LDADD = libgio-2.0.la', - '$(top_builddir)/gobject/libgobject-2.0.la', - '$(top_builddir)/gmodule/libgmodule-2.0.la', - '$(top_builddir)/glib/libglib-2.0.la', - '$(NULL) - -gconstructor_as_data.h: $(top_srcdir)/glib/gconstructor.h data-to-c.pl - '$(AM_V_GEN) $(srcdir)/data-to-c.pl $(top_srcdir)/glib/gconstructor.h gconstructor_code > $@.tmp && mv $@.tmp $@ - -glib_compile_schemas_LDADD = $(top_builddir)/glib/libglib-2.0.la -glib_compile_schemas_SOURCES =', - 'gconstructor_as_data.h', - 'gvdb/gvdb-format.h', - 'gvdb/gvdb-builder.h', - 'gvdb/gvdb-builder.c', - 'glib-compile-schemas.c - -gsettings_LDADD = libgio-2.0.la', - '$(top_builddir)/gobject/libgobject-2.0.la', - '$(top_builddir)/gmodule/libgmodule-2.0.la', - '$(top_builddir)/glib/libglib-2.0.la', - '$(NULL) -gsettings_SOURCES = gsettings-tool.c - -schemadir = $(datadir)/glib-2.0/schemas -dist_schema_DATA = gschema.dtd - -itsdir = $(datadir)/gettext/its -dist_its_DATA = gschema.loc gschema.its - -# ------------------------------------------------------------------------ -# gdbus(1) tool - -bin_PROGRAMS += gdbus -gdbus_SOURCES = gdbus-tool.c -gdbus_LDADD = libgio-2.0.la', - '$(top_builddir)/gobject/libgobject-2.0.la', - '$(top_builddir)/gmodule/libgmodule-2.0.la', - '$(top_builddir)/glib/libglib-2.0.la', - '$(NULL) - -if OS_UNIX -# ------------------------------------------------------------------------ -# gapplication(1) tool -bin_PROGRAMS += gapplication -gapplication_SOURCES = gapplication-tool.c -gapplication_LDADD = libgio-2.0.la', - '$(top_builddir)/gobject/libgobject-2.0.la', - '$(top_builddir)/gmodule/libgmodule-2.0.la', - '$(top_builddir)/glib/libglib-2.0.la', - '$(NULL) -endif - completiondir = $(datadir)/bash-completion/completions completion_DATA =', 'completion/gapplication', @@ -745,58 +620,146 @@ gio_headers = [ 'glistmodel.h', 'gliststore.h', ] -# FIXME: 'gnetworking.h', - generated? was in nodist_gioinclude_HEADERS + gio_headers += application_headers gio_headers += settings_headers gio_headers += gdbus_headers install_headers(gio_headers, subdir : 'glib-2.0/gio/') -gio_mkenums = find_program('build_mkenum.py') +gio_build_mkenum = find_program('build_mkenum.py') gioenumtypes_h = custom_target('gioenumtypes_h', output : 'gioenumtypes.h', input : gio_headers, install : true, install_dir : 'include/glib-2.0/gio/', - depends : [ ], - command : [ gio_mkenums, '@OUTPUT@', meson.source_root(), '@INPUT@', gnetworking_h ]) + depends : [], + command : [gio_build_mkenum, perl, glib_mkenums, + '@OUTPUT@', meson.current_source_dir(), + '@INPUT@', gnetworking_h]) gioenumtypes_c = custom_target('gioenumtypes_c', output : 'gioenumtypes.c', input : gio_headers, - depends : [ gioenumtypes_h ], - command : [ gio_mkenums, '@OUTPUT@', meson.source_root(), '@INPUT@', gnetworking_h, ]) + depends : [gioenumtypes_h], + command : [gio_build_mkenum, perl, glib_mkenums, + '@OUTPUT@', meson.current_source_dir(), + '@INPUT@', gnetworking_h]) -libgio = shared_library('gio', +gioenumtypes_dep = declare_dependency(sources : [gioenumtypes_h]) + +# inotify +if glib_conf.has('HAVE_SYS_INOTIFY_H') and have_func_inotify_init1 + subdir('inotify') + internal_deps += [ inotify_lib ] +endif + +# kevent +if have_func_kqueue and have_func_kevent + subdir('kqueue') + internal_deps += [ kqueue_lib ] +endif + +if host_system == 'windows' + subdir('win32') + internal_deps += [ giowin32_lib ] +endif + +# FIXME: FAM support +#if HAVE_FAM +# subdir('fam') +#endif + +libgio = shared_library('gio-2.0', gioenumtypes_h, gioenumtypes_c, gnetworking_h, gio_sources, - version : glib_version, - soversion : interface_version, + version : library_version, + soversion : soversion, install : true, - include_directories : inc_dirs, - link_with : [ libglib, libgobject, libgmodule ] + internal_deps, + include_directories : [configinc, gioinc], + link_with : internal_deps, #libgio_2_0_la_LDFLAGS = $(GLIB_LINK_FLAGS)', # '$(gio_win32_res_ldflag)', - # '-version-info $(LT_CURRENT):$(LT_REVISION):$(LT_AGE)', - # '-export-dynamic $(no_undefined) - #$(ZLIB_LIBS) #$(SELINUX_LIBS) - #$(GLIB_LIBS) #$(XATTR_LIBS) - #$(NETWORK_LIBS) - dependencies : [ libz_dep, libdl_dep ] + platform_deps + network_libs, - c_args : gio_c_args + dependencies : [libintl, libz_dep, libdl_dep, libglib_dep, libgobject_dep, + libgmodule_dep] + platform_deps + network_libs, + c_args : gio_c_args, + # intl.lib is not compatible with SAFESEH + link_args : noseh_link_args, ) -# gresource tool +libgio_dep = declare_dependency(link_with : libgio, + dependencies : [gioenumtypes_dep], + # We sadly need to export configinc here because everyone includes + include_directories : [configinc, gioinc]) + +# Dependencies used by executables below libelf = dependency('libelf', version : '>= 0.8.12', required : false) if libelf.found() glib_conf.set('HAVE_LIBELF', 1) endif -executable('gresource', 'gresource-tool.c', - include_directories : inc_dirs, - c_args : [ '-DHAVE_CONFIG_H=1' ], - link_with : [ libgio, libgobject, libgmodule, libglib ], - dependencies : libelf, -) -subdir('tests') +gconstructor_as_data_h = custom_target('gconstructor_as_data.h', + input : ['data-to-c.py', meson.source_root() + '/glib/gconstructor.h'], + output : ['gconstructor_as_data.h'], + command : [python, '@INPUT0@', '@INPUT1@', 'gconstructor_code', '@OUTPUT@']) + +# Several installed executables +executable('gresource', 'gresource-tool.c', + install : true, + c_args : ['-DHAVE_CONFIG_H=1'], + # intl.lib is not compatible with SAFESEH + link_args : noseh_link_args, + dependencies : [libelf, libintl, libgio_dep, libgobject_dep, libgmodule_dep, libglib_dep]) + +executable('gio-querymodules', 'gio-querymodules.c', + install : true, + c_args : ['-DHAVE_CONFIG_H=1'] + gio_c_args, + # intl.lib is not compatible with SAFESEH + link_args : noseh_link_args, + dependencies : [libgio_dep, libgobject_dep, libgmodule_dep, libglib_dep]) + +executable('glib-compile-schemas', + [gconstructor_as_data_h, 'gvdb/gvdb-builder.c', 'glib-compile-schemas.c'], + install : true, + c_args : ['-DHAVE_CONFIG_H=1'], + # intl.lib is not compatible with SAFESEH + link_args : noseh_link_args, + dependencies : [libintl, libgio_dep, libgobject_dep, libgmodule_dep, libglib_dep]) + +executable('glib-compile-resources', + [gconstructor_as_data_h, 'gvdb/gvdb-builder.c', 'glib-compile-resources.c'], + install : true, + c_args : ['-DHAVE_CONFIG_H=1'] + gio_c_args, + # intl.lib is not compatible with SAFESEH + link_args : noseh_link_args, + dependencies : [libintl, libgio_dep, libgobject_dep, libgmodule_dep, libglib_dep]) + +executable('gsettings', 'gsettings-tool.c', + install : true, + c_args : ['-DHAVE_CONFIG_H=1'] + gio_c_args, + # intl.lib is not compatible with SAFESEH + link_args : noseh_link_args, + dependencies : [libintl, libgio_dep, libgobject_dep, libgmodule_dep, libglib_dep]) +install_data(['gschema.dtd', 'gschema.loc', 'gschema.its'], + install_dir : 'share/glib-2.0/schemas') + +executable('gdbus', 'gdbus-tool.c', + install : true, + c_args : ['-DHAVE_CONFIG_H=1'] + gio_c_args, + # intl.lib is not compatible with SAFESEH + link_args : noseh_link_args, + dependencies : [libintl, libgio_dep, libgobject_dep, libgmodule_dep, libglib_dep]) + +if host_system != 'windows' + executable('gapplication', 'gapplication-tool.c', + install : true, + c_args : ['-DHAVE_CONFIG_H=1'] + gio_c_args, + # intl.lib is not compatible with SAFESEH + link_args : noseh_link_args, + dependencies : [libintl, libgio_dep, libgobject_dep, libgmodule_dep, libglib_dep]) +endif + +if host_system != 'windows' + subdir('tests') +endif diff --git a/gio/tests/meson.build b/gio/tests/meson.build index 3715005c7..1a3cbd917 100644 --- a/gio/tests/meson.build +++ b/gio/tests/meson.build @@ -88,11 +88,9 @@ foreach test_name : gio_tests test_name = 'autoptr-gio' endif exe = executable(test_name, src_file, - include_directories : inc_dirs, install : false, c_args : test_c_args, - link_with : [ libgio, libgmodule, libglib ], - dependencies : deps, + dependencies : [libglib_dep, libgmodule_dep, libgio_dep], ) if test_name == 'testfilemonitor' test(test_name, exe, env : test_env, timeout : 45) @@ -129,11 +127,9 @@ uninstalled_test_extra_programs = [ foreach extra_program : uninstalled_test_extra_programs exe = executable(extra_program, '@0@.c'.format(extra_program), - include_directories : inc_dirs, install : false, c_args : test_c_args, - link_with : [ libgio, libgmodule, libglib ], - dependencies : deps, + dependencies : [libglib_dep, libgmodule_dep, libgio_dep], ) endforeach @@ -143,26 +139,20 @@ test_extra_programs = [ ] exe = executable('tls-certificate', 'tls-certificate.c', 'gtesttlsbackend.c', - include_directories : inc_dirs, c_args : test_c_args, - link_with : [ libgio, libgmodule, libglib ], - dependencies : deps, + dependencies : [libglib_dep, libgmodule_dep, libgio_dep], ) test('tls-certificate', exe, env : test_env) exe = executable('socket-client', 'socket-client.c', 'gtlsconsoleinteraction.c', - include_directories : inc_dirs, c_args : test_c_args, - link_with : [ libgio, libgmodule, libglib ], - dependencies : deps, + dependencies : [libglib_dep, libgmodule_dep, libgio_dep], ) #exe = executable('gdbus-daemon', 'gdbus-daemon.c', '../gdbusdaemon.c', # #meson.build_root() + '/gio/gdbus-daemon-generated.c', # FIXME -# include_directories : inc_dirs, # c_args : test_c_args, -# link_with : [ libgio, libgmodule, libglib ], -# dependencies : deps, +# dependencies : [libglib_dep, libgmodule_dep, libgio_dep], #) #test('gdbus-daemon', exe, env : test_env) @@ -174,45 +164,35 @@ endif # FIXME: consolidate all of these into the array exe = executable('overflow-fallback', 'overflow.c', - include_directories : inc_dirs, c_args : [ '-DHAVE_CONFIG_H=1', '-D_GLIB_TEST_OVERFLOW_FALLBACK' ], - link_with : libglib, - dependencies : deps, + dependencies : [libglib_dep], ) test('overflow-fallback', exe, env : test_env) exe = executable('642026-ec', '642026.c', - include_directories : inc_dirs, c_args : [ '-DHAVE_CONFIG_H=1', '-DG_ERRORCHECK_MUTEXES' ], - link_with : libglib, - dependencies : deps, + dependencies : [libglib_dep], ) test('642026-ec', exe, env : test_env) exe = executable('1bit-emufutex', '1bit-mutex.c', - include_directories : inc_dirs, c_args : [ '-DHAVE_CONFIG_H=1', '-DTEST_EMULATED_FUTEX' ], - link_with : libglib, - dependencies : deps, + dependencies : [libglib_dep], ) test('1bit-emufutex', exe, env : test_env) if glib_conf.has('HAVE_EVENTFD') exe = executable('gwakeup-fallback', 'gwakeuptest.c', '../gwakeup.c', - include_directories : inc_dirs, c_args : [ '-DHAVE_CONFIG_H=1', '-DTEST_EVENTFD_FALLBACK' ], - link_with : libglib, - dependencies : deps, + dependencies : [libglib_dep], ) test('gwakeup-fallback', exe, env : test_env) endif # test-spawn-echo helper binary required by the spawn tests executable('test-spawn-echo', 'test-spawn-echo.c', - include_directories : inc_dirs, c_args : [ '-DHAVE_CONFIG_H=1', '-DG_LOG_DOMAIN="GLib"' ], - link_with : libglib, - dependencies : deps, + dependencies : [libglib_dep], ) ''' diff --git a/gio/tests/modules/meson.build b/gio/tests/modules/meson.build index 3d4af5061..c219015d3 100644 --- a/gio/tests/modules/meson.build +++ b/gio/tests/modules/meson.build @@ -1,13 +1,11 @@ libtestmodulea = shared_library('testmodulea', 'test-module-a.c', install : false, - include_directories : inc_dirs, - link_with : [ libglib, libgobject, libgmodule, libgio ], + dependencies : [libglib_dep, libgobject_dep, libgmodule_dep, libgio_dep], c_args : [ ] ) libtestmoduleb = shared_library('testmoduleb', 'test-module-b.c', install : false, - include_directories : inc_dirs, - link_with : [ libglib, libgobject, libgmodule, libgio ], + dependencies : [libglib_dep, libgobject_dep, libgmodule_dep, libgio_dep], c_args : [ ] ) diff --git a/gio/win32/meson.build b/gio/win32/meson.build index 52d720ebb..72b521c1e 100644 --- a/gio/win32/meson.build +++ b/gio/win32/meson.build @@ -8,6 +8,6 @@ giowin32_sources = [ ] giowin32_lib = static_library('giowin32', - sources : giowin32_sources, - include_directories : inc_dirs, + sources : [giowin32_sources, gioenumtypes_h], + include_directories : [configinc, glibinc, gioinc, gmoduleinc], c_args : [ '-DHAVE_CONFIG_H', '-fPIC', '-DG_DISABLE_DEPRECATED' ] + gio_c_args) diff --git a/gio/xdgmime/meson.build b/gio/xdgmime/meson.build index 4b042215c..5e1fb4a63 100644 --- a/gio/xdgmime/meson.build +++ b/gio/xdgmime/meson.build @@ -11,5 +11,5 @@ xdgmime_sources = [ xdgmime_lib = static_library('xdgmime', sources : xdgmime_sources, - include_directories : inc_dirs, + include_directories : [configinc], c_args : [ '-DHAVE_CONFIG_H', '-DXDG_PREFIX=_gio_xdg', '-fPIC' ]) diff --git a/glib/libcharset/meson.build b/glib/libcharset/meson.build index 1ee08cc5f..9f267efb1 100644 --- a/glib/libcharset/meson.build +++ b/glib/libcharset/meson.build @@ -1,3 +1,3 @@ charset_lib = static_library('charset', 'localcharset.c', - include_directories : inc_dirs, + include_directories : configinc, c_args : [ '-DLIBDIR="lib"', '-fPIC' ]) diff --git a/glib/meson.build b/glib/meson.build index 0c99dfc94..ac32637d4 100644 --- a/glib/meson.build +++ b/glib/meson.build @@ -1,6 +1,12 @@ -configure_file(input : 'glibconfig.h.in', output : 'glibconfig.h', configuration : glibconfig_conf) +configure_file(input : 'glibconfig.h.in', output : 'glibconfig.h', + install : true, + install_dir : 'lib/glib-2.0/include', + configuration : glibconfig_conf) subdir('libcharset') +if not pcre.found() + subdir('pcre') +endif glib_headers = [ 'glib.h', @@ -17,7 +23,7 @@ glib_deprecated_headers = [ 'deprecated/grel.h', 'deprecated/gthread.h', ] -install_headers(glib_deprecated_headers, subdir : 'glib-2.0/deprecated/') +install_headers(glib_deprecated_headers, subdir : 'glib-2.0/glib/deprecated/') glib_sub_headers = [ 'glib-autocleanups.h', @@ -96,14 +102,6 @@ glib_sub_headers = [ ] install_headers(glib_sub_headers, subdir : 'glib-2.0/glib/') -if host_machine.system() == 'windows' - thread_src = ['gthread-win32.c'] - plat_src = [] -else - thread_src = ['gthread-posix.c'] - plat_src = ['glib-unix.c'] -endif - deprecated_sources = [ 'deprecated/gallocator.c', 'deprecated/gcache.c', @@ -164,7 +162,6 @@ glib_sources = [ 'gstrfuncs.c', 'gstring.c', 'gstringchunk.c', -'gtester.c', 'gtestutils.c', 'gthread.c', 'gthreadpool.c', @@ -190,19 +187,69 @@ glib_sources = [ 'gwakeup.c', 'gprintf.c',] -extra_src = ['gspawn.c', 'giounix.c'] +if host_system == 'windows' + thread_src = ['gthread-win32.c'] + plat_src = ['gwin32.c', 'gspawn-win32.c', 'giowin32.c'] + platform_deps = [winsock2, cc.find_library('winmm')] +else + thread_src = ['gthread-posix.c'] + plat_src = ['glib-unix.c', 'gspawn.c', 'giounix.c'] + platform_deps = [] +endif -#'gspawn-win32.c', # FIXME -#'gspawn-win32-helper.c', # FIXME +libglib = shared_library('glib-2.0', + sources : [deprecated_sources, glib_sources, thread_src, plat_src], + version : library_version, + soversion : soversion, + install : true, + # intl.lib is not compatible with SAFESEH + link_args : noseh_link_args, + include_directories : configinc, + link_with : charset_lib, + dependencies : [pcre, thread_dep, libintl, librt] + libiconv + platform_deps, + c_args : ['-DG_LOG_DOMAIN="GLib"', '-DGLIB_COMPILATION', '-DPCRE_STATIC'] +) -libglib = shared_library('glib', -sources : [deprecated_sources, glib_sources, thread_src, plat_src, extra_src], -version : glib_version, -soversion : interface_version, -install : true, -include_directories : inc_dirs, -link_with : charset_lib, -dependencies : [ pcre, thread_dep, libiconv, librt ], -c_args : ['-DG_LOG_DOMAIN="GLib"', '-DGLIB_COMPILATION', '-DPCRE_STATIC']) +libglib_dep = declare_dependency(link_with : libglib, + # We sadly need to export configinc here because everyone includes + include_directories : [configinc, glibinc]) -subdir('tests') +# On Windows, glib needs a spawn helper for g_spawn* API +if host_system == 'windows' + if host_machine.cpu_family() == 'x86' + executable('gspawn-win32-helper', 'gspawn-win32-helper.c', + install : true, + gui_app : true, + c_args : ['-DHAVE_CONFIG_H=1'], + include_directories : configinc, + dependencies : [libglib_dep]) + executable('gspawn-win32-helper-console', 'gspawn-win32-helper.c', + install : true, + c_args : ['-DHAVE_CONFIG_H=1', '-DHELPER_CONSOLE'], + include_directories : configinc, + dependencies : [libglib_dep]) + else + executable('gspawn-win64-helper', 'gspawn-win32-helper.c', + install : true, + gui_app : true, + c_args : ['-DHAVE_CONFIG_H=1'], + include_directories : configinc, + dependencies : [libglib_dep]) + executable('gspawn-win64-helper-console', 'gspawn-win32-helper.c', + install : true, + c_args : ['-DHAVE_CONFIG_H=1', '-DHELPER_CONSOLE'], + include_directories : configinc, + dependencies : [libglib_dep]) + endif +else + executable('gtester', 'gtester.c', + install : true, + c_args : ['-DHAVE_CONFIG_H=1'], + include_directories : configinc, + dependencies : [libglib_dep]) +endif + +# gtester doesn't work on native windows +if cc.get_id() != 'msvc' + subdir('tests') +endif diff --git a/glib/pcre/meson.build b/glib/pcre/meson.build new file mode 100644 index 000000000..3c6c8f07f --- /dev/null +++ b/glib/pcre/meson.build @@ -0,0 +1,50 @@ +pcre_sources = [ + 'pcre_byte_order.c', + 'pcre_chartables.c', + 'pcre_compile.c', + 'pcre_config.c', + 'pcre_dfa_exec.c', + 'pcre_exec.c', + 'pcre_fullinfo.c', + 'pcre_get.c', + 'pcre_globals.c', + 'pcre_jit_compile.c', + 'pcre_newline.c', + 'pcre_ord2utf8.c', + 'pcre_string_utils.c', + 'pcre_study.c', + 'pcre_tables.c', + 'pcre_valid_utf8.c', + 'pcre_version.c', + 'pcre_xclass.c', + 'pcre.h', + 'pcre_internal.h', + 'ucp.h', +] + +libpcre = static_library('pcre', + sources : [pcre_sources], + install : false, + include_directories : [configinc, glibinc], + dependencies : [], + c_args : ['-DG_LOG_DOMAIN="GLib-GRegex"', + '-DHAVE_MEMMOVE', + '-DSUPPORT_UCP', + '-DSUPPORT_UTF', + '-DSUPPORT_UTF8', + '-DNEWLINE=-1', + '-DMATCH_LIMIT=10000000', + '-DMATCH_LIMIT_RECURSION=8192', + '-DMAX_NAME_SIZE=32', + '-DMAX_NAME_COUNT=10000', + '-DMAX_DUPLENGTH=30000', + '-DLINK_SIZE=2', + '-DPOSIX_MALLOC_THRESHOLD=10', + '-DPCRE_STATIC', + '-UBSR_ANYCRLF', + '-UEBCDIC', + '-DGLIB_COMPILATION', + '-fPIC',] +) + +pcre = declare_dependency(link_with : libpcre) diff --git a/glib/tests/meson.build b/glib/tests/meson.build index 9ef1b3d35..983485b0d 100644 --- a/glib/tests/meson.build +++ b/glib/tests/meson.build @@ -88,57 +88,51 @@ test_env = [ 'G_TEST_BUILDDIR=' + meson.current_build_dir(), ] +test_cargs = ['-DHAVE_CONFIG_H=1', '-DG_LOG_DOMAIN="GLib"'] + foreach test_name : glib_tests - deps = [ libm, thread_dep ] + deps = [libm, thread_dep, libglib_dep] if test_name == 'regex' - deps += [ pcre ] + deps += [pcre] endif exe = executable(test_name, '@0@.c'.format(test_name), - include_directories : inc_dirs, - c_args : [ '-DHAVE_CONFIG_H=1', '-DG_LOG_DOMAIN="GLib"' ], - link_with : libglib, - dependencies : deps, - install : false, + c_args : ['-DPCRE_STATIC'] + test_cargs, + dependencies : deps, + install : false, ) test(test_name, exe, env : test_env) endforeach -c_args_atomic = [ ] +c_args_atomic = [] if cc.get_id() == 'gcc' - c_args_atomic += [ '-Wstrict-aliasing=2' ] + c_args_atomic += ['-Wstrict-aliasing=2'] endif +deps = [libm, thread_dep, libglib_dep] + exe = executable('atomic', 'atomic.c', - include_directories : inc_dirs, - c_args : [ '-DHAVE_CONFIG_H=1' ] + c_args_atomic, - link_with : libglib, + c_args : test_cargs + c_args_atomic, dependencies : deps, ) test('atomic', exe, env : test_env) # FIXME: consolidate all of these into the array exe = executable('overflow-fallback', 'overflow.c', - include_directories : inc_dirs, - c_args : [ '-DHAVE_CONFIG_H=1', '-D_GLIB_TEST_OVERFLOW_FALLBACK' ], - link_with : libglib, + c_args : test_cargs + ['-D_GLIB_TEST_OVERFLOW_FALLBACK'], dependencies : deps, install : false, ) test('overflow-fallback', exe, env : test_env) exe = executable('642026-ec', '642026.c', - include_directories : inc_dirs, - c_args : [ '-DHAVE_CONFIG_H=1', '-DG_ERRORCHECK_MUTEXES' ], - link_with : libglib, + c_args : test_cargs + ['-DG_ERRORCHECK_MUTEXES'], dependencies : deps, install : false, ) test('642026-ec', exe, env : test_env) exe = executable('1bit-emufutex', '1bit-mutex.c', - include_directories : inc_dirs, - c_args : [ '-DHAVE_CONFIG_H=1', '-DTEST_EMULATED_FUTEX' ], - link_with : libglib, + c_args : test_cargs + ['-DTEST_EMULATED_FUTEX'], dependencies : deps, install : false, ) @@ -146,20 +140,16 @@ test('1bit-emufutex', exe, env : test_env) if glib_conf.has('HAVE_EVENTFD') exe = executable('gwakeup-fallback', 'gwakeuptest.c', '../gwakeup.c', - include_directories : inc_dirs, - c_args : [ '-DHAVE_CONFIG_H=1', '-DTEST_EVENTFD_FALLBACK' ], - link_with : libglib, + c_args : test_cargs + ['-DTEST_EVENTFD_FALLBACK'], dependencies : deps, install : false, ) test('gwakeup-fallback', exe, env : test_env) endif -# test-spawn-echo helper binary required by the spawn tests +# test-spawn-echo helper binary required by the spawn tests above executable('test-spawn-echo', 'test-spawn-echo.c', - include_directories : inc_dirs, - c_args : [ '-DHAVE_CONFIG_H=1', '-DG_LOG_DOMAIN="GLib"' ], - link_with : libglib, - dependencies : deps, - install : false, + c_args : test_cargs, + dependencies : deps, + install : false, ) diff --git a/gmodule/meson.build b/gmodule/meson.build index 465c4e4de..3319740a3 100644 --- a/gmodule/meson.build +++ b/gmodule/meson.build @@ -22,21 +22,21 @@ int main (int argc, char ** argv) { }''' # On Windows force native WIN32 shared lib loader -if host_machine.system() == 'windows' +if host_system == 'windows' g_module_impl = 'G_MODULE_IMPL_WIN32' # Force native AIX library loader # dlopen() filepath must be of the form /path/libname.a(libname.so) -elif host_machine.system() == 'aix' +elif host_system == 'aix' g_module_impl = 'G_MODULE_IMPL_AR' elif cc.links(dlopen_dlsym_test_code, name : 'dlopen() and dlsym() in system libraries') g_module_impl = 'G_MODULE_IMPL_DL' # NSLinkModule (dyld) in system libraries (Darwin) -elif cc.has_function('NSLinkModule', prefix : '#include ', name : 'NSLinkModule') +elif cc.has_function('NSLinkModule') g_module_impl = 'G_MODULE_IMPL_DYLD' g_module_need_uscore = 1 elif cc.links(dlopen_dlsym_test_code, args : '-ldl', name : 'dlopen() and dlsym() in libdl') g_module_impl = 'G_MODULE_IMPL_DL' - libdl_dep = find_library('dl') + libdl_dep = cc.find_library('dl') g_module_lib_args = '-ldl' endif @@ -45,17 +45,23 @@ if g_module_impl == 'G_MODULE_IMPL_DL' # FIXME: check for OSF1/5.0 RTLD_GLOBAL brokenness (is this still relevant?) # Check whether we need preceding underscores - if not meson.is_cross_build() + if cc.get_id() == 'msvc' + message('Building for MSVC: assuming that symbols are prefixed with underscore') + g_module_need_uscore = 1 + elif meson.has_exe_wrapper() # FIXME: communicate result via stdout instead of return value, so non-0 return is not printed in bold red rres = cc.run(dlopen_dlsym_test_code, args : g_module_lib_args, name : 'dlsym() preceding underscores') - if rres.compiled() and rres.returncode() == 0 + if host_system == 'windows' or rres.returncode() == 0 g_module_need_uscore = 1 endif + else + message('Cross-compiling: assuming that symbols aren\'t prefixed with underscore') + g_module_need_uscore = 0 endif - if cc.has_function('dlerror', prefix : '#include ', args : g_module_lib_args, name : 'dlerror') + if cc.has_function('dlerror', args : g_module_lib_args) g_module_have_dlerror = 1 endif endif @@ -76,15 +82,17 @@ gmoduleconf_h = configure_file(input : 'gmoduleconf.h.in', output : 'gmoduleconf.h', configuration : gmoduleconf_conf) -install_headers([ 'gmodule.h' ], subdir : 'glib-2.0/') +install_headers(['gmodule.h'], subdir : 'glib-2.0/') -libgmodule = shared_library('gmodule', - sources : [ 'gmodule.c' ], - version : glib_version, - soversion : interface_version, +libgmodule = shared_library('gmodule-2.0', + sources : ['gmodule.c'], + version : library_version, + soversion : soversion, install : true, - include_directories : inc_dirs, - link_with : libglib, - dependencies : libdl_dep, - c_args : ['-DG_LOG_DOMAIN="GModule"', '-DG_DISABLE_DEPRECATED' ], + include_directories : [configinc, gmoduleinc], + dependencies : [libdl_dep, libglib_dep], + c_args : ['-DG_LOG_DOMAIN="GModule"', '-DG_DISABLE_DEPRECATED'], ) + +libgmodule_dep = declare_dependency(link_with : libgmodule, + include_directories : gmoduleinc) diff --git a/gobject/gmarshal-list-to-strings.py b/gobject/gmarshal-list-to-strings.py new file mode 100644 index 000000000..ee609532d --- /dev/null +++ b/gobject/gmarshal-list-to-strings.py @@ -0,0 +1,21 @@ +#!/usr/bin/env python3 +# Does the same thing as `marshal-genstrings.pl` and the 'gmarshal.strings' +# target in Makefile.am + +import re +import sys + +prefix = '"g_cclosure_marshal_' +suffix = '",\n' + +if len(sys.argv) != 3: + print('Usage: {0} '.format(sys.argv[0])) + +fin = open(sys.argv[1], 'r') +fout = open(sys.argv[2], 'w') + +for line in fin: + if not line[0].isalpha(): + continue + symbol = line[:-1].replace(':', '__').replace(',', '_') + fout.write(prefix + symbol + suffix) diff --git a/gobject/meson.build b/gobject/meson.build index cdb644317..22a3f5154 100644 --- a/gobject/meson.build +++ b/gobject/meson.build @@ -1,10 +1,3 @@ -#FIXME -#if host_machine.system() == 'windows' -# plat_src = [] -#else -# plat_src = [] -#endif - gobject_install_headers = [ 'gobject-autocleanups.h', 'glib-types.h', @@ -52,14 +45,42 @@ gobject_c_sources = [ 'gvaluetypes.c', ] -libgobject = shared_library('gobject', -sources : [ gobject_c_sources ], -version : glib_version, -soversion : interface_version, -install : true, -include_directories : inc_dirs, -link_with : libglib, -dependencies : libffi_dep, -c_args : ['-DG_LOG_DOMAIN="GLib-GObject"', '-DGOBJECT_COMPILATION' ]) +libgobject = shared_library('gobject-2.0', + sources : [gobject_c_sources], + version : library_version, + soversion : soversion, + install : true, + include_directories : [configinc], + dependencies : [libffi_dep, libglib_dep], + c_args : ['-DG_LOG_DOMAIN="GLib-GObject"', '-DGOBJECT_COMPILATION']) + +libgobject_dep = declare_dependency(link_with : libgobject, + include_directories : gobjectinc) + +glib_mkenums_conf = configuration_data() +glib_mkenums_conf.set('GLIB_VERSION', glib_version) +glib_mkenums_conf.set('PERL_PATH', perl.path()) + +# FIXME: Set permissions +glib_mkenums = configure_file(input : 'glib-mkenums.in', + output : 'glib-mkenums', + install : true, + install_dir : 'bin', configuration : glib_mkenums_conf) + +executable('gobject-query', 'gobject-query.c', + install : true, + c_args : ['-DHAVE_CONFIG_H=1'], + dependencies : [libglib_dep, libgobject_dep]) + +gmarshal_strings = custom_target('gmarshal.strings', + input : ['gmarshal-list-to-strings.py', 'gmarshal.list'], + output : ['gmarshal.strings'], + command : [python, '@INPUT0@', '@INPUT1@', '@OUTPUT@']) + +glib_genmarshal = executable('glib-genmarshal', + gmarshal_strings, 'glib-genmarshal.c', + install : true, + c_args : ['-DHAVE_CONFIG_H=1'], + dependencies : [libglib_dep, libgobject_dep]) subdir('tests') diff --git a/gobject/tests/gobject_test_marshal.py b/gobject/tests/gobject_test_marshal.py index a0f685265..66a7aecae 100755 --- a/gobject/tests/gobject_test_marshal.py +++ b/gobject/tests/gobject_test_marshal.py @@ -4,14 +4,18 @@ import sys, subprocess -assert(len(sys.argv) == 3) +if len(sys.argv) != 3: + print('Usage: {0} ') + sys.exit(0) -_, listname, outname = sys.argv +glib_genmarshal = sys.argv[1] +listname = sys.argv[2] +outname = sys.argv[3] if outname.endswith('.h'): arg = '--header' else: arg = '--body' -output = subprocess.check_output(['glib-genmarshal', '--prefix=test', '--valist-marshallers', arg, listname]) +output = subprocess.check_output([glib_genmarshal, '--prefix=test', '--valist-marshallers', arg, listname]) open(outname, 'wb').write(output) diff --git a/gobject/tests/meson.build b/gobject/tests/meson.build index 21aefd966..03be192a0 100644 --- a/gobject/tests/meson.build +++ b/gobject/tests/meson.build @@ -23,16 +23,14 @@ test_env = [ ] foreach test_name : gobject_tests - deps = [ libm, thread_dep ] + deps = [libm, thread_dep, libglib_dep, libgobject_dep] test_src = '@0@.c'.format(test_name) # private is an existing or reserved target it seems if test_name == 'private' test_name = 'gobject-private' endif exe = executable(test_name, test_src, - include_directories : inc_dirs, - c_args : [ '-DHAVE_CONFIG_H=1', '-DG_LOG_DOMAIN="GLib-GObject"' ], - link_with : [ libglib, libgobject ], + c_args : ['-DHAVE_CONFIG_H=1', '-DG_LOG_DOMAIN="GLib-GObject"'], dependencies : deps, ) test(test_name, exe, env : test_env) @@ -40,29 +38,23 @@ endforeach # The marshalers test requires running a binary, so we cannot build it when # cross-compiling -if not meson.is_cross_build() - # FIXME: need to pass this as argument to the genmarshal script - # and somehow we need to specify it as build dep of the custom targets - # lib_genmarshal = meson.build_root() + '/gobject/glib-genmarshal' - +if not meson.has_exe_wrapper() genmarshal = find_program('gobject_test_marshal.py') marshalers_h = custom_target('marshalers_h', output : 'marshalers.h', input : 'marshalers.list', - command : [ genmarshal, '@INPUT@', '@OUTPUT@' ], + command : [genmarshal, glib_genmarshal, '@INPUT@', '@OUTPUT@'], ) marshalers_c = custom_target('marshalers_c', output : 'marshalers.c', input : 'marshalers.list', - command : [ genmarshal, '@INPUT@', '@OUTPUT@' ], + command : [genmarshal, glib_genmarshal, '@INPUT@', '@OUTPUT@'], ) exe = executable('signals', 'signals.c', marshalers_h, marshalers_c, - include_directories : inc_dirs, - c_args : [ '-DHAVE_CONFIG_H=1', '-DG_LOG_DOMAIN="GLib-GObject"' ], - link_with : [ libglib, libgobject ], + c_args : ['-DHAVE_CONFIG_H=1', '-DG_LOG_DOMAIN="GLib-GObject"'], dependencies : deps, ) test('signals', exe, env : test_env) diff --git a/gthread/meson.build b/gthread/meson.build index a12c420c8..1efe1e3ce 100644 --- a/gthread/meson.build +++ b/gthread/meson.build @@ -1,11 +1,10 @@ # Just a skeleton lib for backwards compatibility since all the functionaliy # has been moved into glib now -libgthread = shared_library('gthread', +libgthread = shared_library('gthread-2.0', sources : [ 'gthread-impl.c' ], - version : glib_version, - soversion : interface_version, + version : library_version, + soversion : soversion, install : true, - include_directories : inc_dirs, - link_with : libglib, + dependencies : [libglib_dep], c_args : ['-DG_LOG_DOMAIN="GThread"' ], ) diff --git a/meson.build b/meson.build index 19092a49e..3658e738c 100644 --- a/meson.build +++ b/meson.build @@ -1,23 +1,60 @@ project('glib', 'c', 'cpp', - version : '2.47.6', - meson_version : '>= 0.30.0', + version : '2.51.0', + meson_version : '>= 0.32.0', default_options : [ 'warning_level=1', - 'c_std=gnu99', + 'c_std=gnu89', 'buildtype=debugoptimized' ]) cc = meson.get_compiler('c') cxx = meson.get_compiler('cpp') -add_global_arguments('-Werror', language : 'c') # FIXME +if cc.get_id() == 'msvc' + # Ignore several spurious warnings for things glib does very commonly + # If a warning is completely useless and spammy, use '/wdXXXX' to suppress it + # If a warning is harmless but hard to fix, use '/woXXXX' so it's shown once + # NOTE: Only add warnings here if you are sure they're spurious + add_global_arguments('/wd4244', '/wd4305', '/wd4035', '/wd4715', '/wd4116', + '/wd4046', '/wd4068', '/wo4090', language : 'c') + # Disable SAFESEH with MSVC for plugins and libs that use external deps that + # are built with MinGW + noseh_link_args = ['/SAFESEH:NO'] +else + noseh_link_args = [] + # -mms-bitfields vs -fnative-struct ? +endif -major_version = 2 -minor_version = 47 -micro_version = 6 -interface_version = 2 # FIXME +host_system = host_machine.system() + +#add_global_arguments('-Werror', language : 'c') # FIXME glib_version = meson.project_version() -inc_dirs = include_directories('.', 'glib', 'gmodule', 'gio') +version_arr = glib_version.split('.') +major_version = version_arr[0] +minor_version = version_arr[1] +micro_version = version_arr[2] +soversion = 0 +# Maintain compatibility with previous libtool versioning +# current = minor * 100 + micro +library_version = '@0@.@1@.0'.format(soversion, minor_version.to_int() * 100 + micro_version.to_int()) + +configinc = include_directories('.') +glibinc = include_directories('glib') +gobjectinc = include_directories('gobject') +gmoduleinc = include_directories('gmodule') +gioinc = include_directories('gio') + +glib_prefix = get_option('prefix') +glib_libdir = glib_prefix + '/' + get_option('libdir') +glib_datadir = glib_prefix + '/share' +glib_includedir = glib_prefix + '/include' +glib_giomodulesdir = glib_libdir + '/gio/modules' + +glib_pkgconfigreldir = get_option('libdir') + '/pkgconfig' + +######################## +# Configuration begins # +######################## glib_conf = configuration_data() glibconfig_conf = configuration_data() @@ -25,11 +62,12 @@ glibconfig_conf = configuration_data() # use them later in test programs (autoconf does this automatically) glib_conf_prefix = '' +glib_conf.set('GLIB_VERSION', glib_version) 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', major_version * 100 + minor_version * 10 + micro_version) +glib_conf.set('GLIB_BINARY_AGE', 100 * minor_version.to_int() + micro_version.to_int()) glib_conf.set('GETTEXT_PACKAGE', '"glib20"') glib_conf.set('PACKAGE_BUGREPORT', '"http://bugzilla.gnome.org/enter_bug.cgi?product=glib"') glib_conf.set('PACKAGE_NAME', '"glib"') @@ -40,8 +78,40 @@ glib_conf.set('PACKAGE_VERSION', '"@0@"'.format(meson.project_version())) glib_conf.set('ENABLE_NLS', 1) glib_conf.set('HAVE_GOOD_PRINTF', 1) # FIXME +# Variables used in glib-gettextize and pkg-config files +# These should not contain " quotes around the values +glib_conf.set('PACKAGE', 'glib') +glib_conf.set('VERSION', meson.project_version()) +glib_conf.set('prefix', glib_prefix) +glib_conf.set('exec_prefix', glib_prefix) +glib_conf.set('libdir', glib_libdir) +glib_conf.set('includedir', glib_includedir) +glib_conf.set('datadir', glib_datadir) +glib_conf.set('datarootdir', glib_datadir) + glib_conf.set('_GNU_SOURCE', 1) +if host_system == 'windows' + # Poll doesn't work on devices on Windows + glib_conf.set('BROKEN_POLL', true) +endif + +# Detect and set symbol visibility +if get_option('default_library') != 'static' + if host_system == 'windows' + glib_conf.set('DLL_EXPORT', true) + if cc.get_id() == 'msvc' + glib_conf.set('_GLIB_EXTERN', '__declspec(dllexport) extern') + else + glib_conf.set('_GLIB_EXTERN', '__attribute__((visibility("default"))) __declspec(dllexport) extern') + add_global_arguments('-fvisibility=hidden', language : 'c') + endif + else + glib_conf.set('_GLIB_EXTERN', '__attribute__((visibility("default"))) extern') + add_global_arguments('-fvisibility=hidden', language : 'c') + endif +endif + if run_command('xgettext', '--help').returncode() != 0 error('GNU Gettext required currently.') endif @@ -49,9 +119,9 @@ glib_conf.set('HAVE_GETTEXT', 1) glib_conf.set('GLIB_LOCALE_DIR', '"@0@/share/locale"'.format(get_option('prefix'))) # FIXME: what about Cygwin (G_WITH_CYGWIN) -if host_machine.system() == 'windows' +if host_system == 'windows' glib_os = '''#define G_OS_WIN32 - #define G_PLATFORM_WIN32''' +#define G_PLATFORM_WIN32''' else glib_os = '#define G_OS_UNIX' endif @@ -59,75 +129,66 @@ glibconfig_conf.set('glib_os', glib_os) # check for header files -include_sys_param_h_if_available = ''' -#ifdef HAVE_SYS_PARAM_H -#include -#endif''' - headers = [ - [ 'stdlib.h', 'HAVE_STDLIB_H' ], - [ 'string.h', 'HAVE_STRING_H' ], - [ 'strings.h', 'HAVE_STRINGS_H' ], - [ 'memory.h', 'HAVE_MEMORY_H' ], - [ 'alloca.h', 'HAVE_ALLOCA_H' ], - [ 'locale.h', 'HAVE_LOCALE_H' ], - [ 'xlocale.h', 'HAVE_XLOCALE_H' ], - [ 'float.h', 'HAVE_FLOAT_H' ], - [ 'limits.h', 'HAVE_LIMITS_H' ], - [ 'pwd.h', 'HAVE_PWD_H' ], - [ 'grp.h', 'HAVE_GRP_H' ], - [ 'poll.h', 'HAVE_POLL_H' ], - [ 'sys/param.h', 'HAVE_SYS_PARAM_H' ], - [ 'sys/resource.h', 'HAVE_SYS_RESOURCE_H' ], - [ 'mach/mach_time.h', 'HAVE_MACH_MACH_TIME_H' ], - [ 'sys/select.h', 'HAVE_SYS_SELECT_H' ], - [ 'stdint.h', 'HAVE_STDINT_H' ], - [ 'inttypes.h', 'HAVE_INTTYPES_H' ], - [ 'sched.h', 'HAVE_SCHED_H' ], - [ 'malloc.h', 'HAVE_MALLOC_H' ], - [ 'sys/vfs.h', 'HAVE_SYS_VFS_H' ], - [ 'sys/vmount.h', 'HAVE_SYS_VMOUNT_H' ], - [ 'sys/statfs.h', 'HAVE_SYS_STATFS_H' ], - [ 'sys/statvfs.h', 'HAVE_SYS_STATVFS_H' ], - [ 'sys/filio.h', 'HAVE_SYS_FILIO_H' ], - [ 'mntent.h', 'HAVE_MNTENT_H' ], - [ 'sys/mnttab.h', 'HAVE_SYS_MNTTAB_H' ], - [ 'sys/vfstab.h', 'HAVE_SYS_VFSTAB_H' ], - [ 'sys/mntctl.h', 'HAVE_SYS_mntctl_H' ], - [ 'fstab.h', 'HAVE_FSTAB_H' ], - [ 'linux/magic.h', 'HAVE_LINUX_MAGIC_H' ], - [ 'sys/prctl.h', 'HAVE_SYS_PRCTL_H' ], - [ 'dirent.h', 'HAVE_DIRENT_H' ], # Some versions of MSC lack these - [ 'sys/time.h', 'HAVE_SYS_TIME_H' ], # Some versions of MSC lack these - [ 'sys/times.h', 'HAVE_SYS_TIMES_H' ], - [ 'sys/wait.h', 'HAVE_SYS_WAIT_H' ], - [ 'unistd.h', 'HAVE_UNISTD_H' ], - [ 'values.h', 'HAVE_VALUES_H' ], - [ 'sys/types.h', 'HAVE_SYS_TYPES_H' ], - [ 'sys/uio.h', 'HAVE_SYS_UIO_H' ], - [ 'sys/mkdev.h', 'HAVE_SYS_MKDEV_H' ], - [ 'sys/mount.h', 'HAVE_SYS_MOUNT_H', include_sys_param_h_if_available ], - [ 'sys/sysctl.h', 'HAVE_SYS_SYSCTL_H', include_sys_param_h_if_available ], - [ 'crt_externs.h', 'HAVE_CRT_EXTERNS_H' ], - [ 'linux/netlink.h', 'HAVE_NETLINK', '#include ' ], - [ 'sys/inotify.h', 'HAVE_SYS_INOTIFY_H' ], - [ 'sys/event.h', 'HAVE_SYS_EVENT_H' ], + ['stdlib.h', 'HAVE_STDLIB_H'], + ['string.h', 'HAVE_STRING_H'], + ['strings.h', 'HAVE_STRINGS_H'], + ['memory.h', 'HAVE_MEMORY_H'], + ['alloca.h', 'HAVE_ALLOCA_H'], + ['locale.h', 'HAVE_LOCALE_H'], + ['xlocale.h', 'HAVE_XLOCALE_H'], + ['float.h', 'HAVE_FLOAT_H'], + ['limits.h', 'HAVE_LIMITS_H'], + ['pwd.h', 'HAVE_PWD_H'], + ['grp.h', 'HAVE_GRP_H'], + ['poll.h', 'HAVE_POLL_H'], + ['sys/param.h', 'HAVE_SYS_PARAM_H'], + ['sys/resource.h', 'HAVE_SYS_RESOURCE_H'], + ['mach/mach_time.h', 'HAVE_MACH_MACH_TIME_H'], + ['sys/select.h', 'HAVE_SYS_SELECT_H'], + ['stdint.h', 'HAVE_STDINT_H'], + ['inttypes.h', 'HAVE_INTTYPES_H'], + ['sched.h', 'HAVE_SCHED_H'], + ['malloc.h', 'HAVE_MALLOC_H'], + ['sys/vfs.h', 'HAVE_SYS_VFS_H'], + ['sys/vmount.h', 'HAVE_SYS_VMOUNT_H'], + ['sys/statfs.h', 'HAVE_SYS_STATFS_H'], + ['sys/statvfs.h', 'HAVE_SYS_STATVFS_H'], + ['sys/filio.h', 'HAVE_SYS_FILIO_H'], + ['mntent.h', 'HAVE_MNTENT_H'], + ['sys/mnttab.h', 'HAVE_SYS_MNTTAB_H'], + ['sys/vfstab.h', 'HAVE_SYS_VFSTAB_H'], + ['sys/mntctl.h', 'HAVE_SYS_mntctl_H'], + ['fstab.h', 'HAVE_FSTAB_H'], + ['linux/magic.h', 'HAVE_LINUX_MAGIC_H'], + ['sys/prctl.h', 'HAVE_SYS_PRCTL_H'], + ['dirent.h', 'HAVE_DIRENT_H'], # Some versions of MSC lack these + ['sys/time.h', 'HAVE_SYS_TIME_H'], # Some versions of MSC lack these + ['sys/times.h', 'HAVE_SYS_TIMES_H'], + ['sys/wait.h', 'HAVE_SYS_WAIT_H'], + ['unistd.h', 'HAVE_UNISTD_H'], + ['values.h', 'HAVE_VALUES_H'], + ['sys/types.h', 'HAVE_SYS_TYPES_H'], + ['sys/uio.h', 'HAVE_SYS_UIO_H'], + ['sys/mkdev.h', 'HAVE_SYS_MKDEV_H'], + ['sys/mount.h', 'HAVE_SYS_MOUNT_H'], + ['sys/sysctl.h', 'HAVE_SYS_SYSCTL_H'], + ['crt_externs.h', 'HAVE_CRT_EXTERNS_H'], + ['linux/netlink.h', 'HAVE_NETLINK'], + ['sys/inotify.h', 'HAVE_SYS_INOTIFY_H'], + ['sys/event.h', 'HAVE_SYS_EVENT_H'], + ['sys/stat.h', 'HAVE_SYS_STAT_H'], ] foreach h : headers - header_check_prefix = glib_conf_prefix - if h.length() == 3 - header_check_prefix = header_check_prefix + h[2] - endif - if cc.has_header(h[0], prefix: header_check_prefix) + if cc.has_header(h[0]) glib_conf.set(h[1], 1) glib_conf_prefix = glib_conf_prefix + '#define @0@ 1\n'.format(h[1]) endif endforeach if glib_conf.has('HAVE_LOCALE_H') - if cc.compiles('''#include - void foo() { LC_MESSAGES; }''') + if cc.has_header_symbol('locale.h', 'LC_MESSAGES') glib_conf.set('HAVE_LC_MESSAGES', 1) endif endif @@ -182,140 +243,90 @@ foreach m : struct_members endif endforeach -#FIXME: maybe we should add available includes all to the glib_conf_prefix list -# functions functions = [ - [ 'alloca', 'HAVE_ALLOCA', '#include ' ], - [ 'mmap', 'HAVE_MMAP', '#include ' ], - [ 'posix_memalign', 'HAVE_POSIX_MEMALIGN', '#include ' ], - [ 'memalign', 'HAVE_MEMALIGN', '#include ' ], - [ 'valloc', 'HAVE_VALLOC', '#include ' ], - [ 'fsync', 'HAVE_FSYNC', '''#ifdef HAVE_UNISTD_H - #include - #endif''' ], - [ 'pipe2', 'HAVE_PIPE2', '''#define _GNU_SOURCE - #include - #include ''' ], - [ 'issetugid', 'HAVE_ISSETUGID', '#include ' ], - [ 'timegm', 'HAVE_TIMEGM', '#include ' ], - [ 'gmtime_r', 'HAVE_GMTIME_R', '#include ' ], - [ 'strerror_r', 'HAVE_STRERROR_R', '#include ' ], - [ 'lstat', 'HAVE_LSTAT', '''#include - #include - #include '''], - [ 'strsignal', 'HAVE_STRSIGNAL', '#include ' ], - [ 'vsnprintf', 'HAVE_VSNPRINTF', '#include ' ], - [ 'stpcpy', 'HAVE_STPCPY', '#include ' ], - [ 'strcasecmp', 'HAVE_STRCASECMP', '#include ' ], - [ 'strncasecmp', 'HAVE_STRNCASECMP', '#include ' ], - [ 'poll', 'HAVE_POLL', '#include ' ], - [ 'vasprintf', 'HAVE_VASPRINTF', '''#define _GNU_SOURCE - #include ''' ], - [ 'setenv', 'HAVE_SETENV', '#include ' ], - [ 'unsetenv', 'HAVE_UNSETENV', '#include ' ], - [ 'getc_unlocked', 'HAVE_GETC_UNLOCKED', '#include ' ], - [ 'readlink', 'HAVE_READLINK', '#include ' ], - [ 'symlink', 'HAVE_SYMLINK', '#include ' ], - [ 'fdwalk', 'HAVE_FDWALK', '#include ' ], - [ 'memmem', 'HAVE_MEMMEM', '''#define _GNU_SOURCE - #include ''' ], -# FIXME: this check doesn't work right, meson detects that it exists even if it's unusable -# [ 'lchmod', 'HAVE_LCHMOD', '''#include -# #include ''' ], - [ 'lchown', 'HAVE_LCHOWN', '#include ' ], - [ 'fchmod', 'HAVE_FCHMOD', '#include ' ], - [ 'fchown', 'HAVE_FCHOWN', '#include ' ], - [ 'utimes', 'HAVE_UTIMES', '#include ' ], - [ 'getresuid', 'HAVE_GETRESUID', '''#define _GNU_SOURCE - #include ''' ], - [ 'getmntent_r', 'HAVE_GETMNTENT_R', '''#include - #include '''], - [ 'setmntent', 'HAVE_SETMNTENT', '''#include - #include '''], - [ 'endmntent', 'HAVE_ENDMNTENT', '''#include - #include '''], - [ 'hasmntopt', 'HAVE_HASMNTOPT', '''#include - #include '''], - [ 'getfsstat', 'HAVE_GETFSSTAT', '''#include - #include - #include - #include ''' ], - [ 'fallocate', 'HAVE_FALLOCATE', '''#define _GNU_SOURCE - #include ''' ], - [ 'localtime_r', 'HAVE_LOCALTIME_R', '#include ' ], - [ 'gmtime_r', 'HAVE_GMTIME_R', '#include ' ], - [ 'getpwuid_r', 'HAVE_GETPWUID_R', '''#include - #include ''' ], - [ 'getgrgid_r', 'HAVE_GETGRGID_R', '''#include - #include ''' ], - [ 'prlimit', 'HAVE_PRLIMIT', '''#define _GNU_SOURCE - #include - #include ''' ], - [ 'snprintf', 'HAVE_SNPRINTF', '#include ' ], - [ 'strnlen', 'HAVE_STRNLEN', '#include ' ], - [ 'wcslen', 'HAVE_WCSLEN', '#include ' ], - [ 'wcsnlen', 'HAVE_WCSNLEN', '#include ' ], - [ 'mbrtowc', 'HAVE_MBRTOWC', '#include ' ], - [ 'wcrtomb', 'HAVE_WCRTOMB', '#include ' ], - [ 'newlocale', 'HAVE_NEWLOCALE', '#include ' ], - [ 'uselocale', 'HAVE_USELOCALE', '#include ' ], - [ 'strtod_l', 'HAVE_STRTOD_L', '''#define _GNU_SOURCE - #include - #ifdef HAVE_XLOCALE_H - #include - #endif''' ], - [ 'strtoll_l', 'HAVE_STRTOLL_L', '''#define _GNU_SOURCE - #include - #include - #ifdef HAVE_XLOCALE_H - #include - #endif''' ], - [ 'strtoull_l', 'HAVE_STRTOULL_L', '''#define _GNU_SOURCE - #include - #include - #ifdef HAVE_XLOCALE_H - #include - #endif''' ], - [ 'inotify_init1', 'HAVE_INOTIFY_INIT1', '#include ' ], - [ 'kqueue', 'HAVE_KQUEUE', '#include ' ], - [ 'kevent', 'HAVE_KEVENT', '#include ' ], - [ 'getservent', 'HAVE_GETSERVENT', '#include ' ], - [ 'getprotobyname_r', 'HAVE_GETPROTOBYNAME_R', '#include ' ], - [ 'if_indextoname', 'HAVE_IF_INDEXTONAME', '#include ' ], - [ 'if_nametoindex', 'HAVE_IF_NAMETOINDEX', '#include ' ], - [ 'sendmmsg', 'HAVE_SENDMMSG', '''#define _GNU_SOURCE - #include ''' ], - [ 'recvmmsg', 'HAVE_RECVMMSG', '''#define _GNU_SOURCE - #include ''' ], + ['alloca', 'HAVE_ALLOCA'], + ['mmap', 'HAVE_MMAP'], + ['posix_memalign', 'HAVE_POSIX_MEMALIGN'], + ['memalign', 'HAVE_MEMALIGN'], + ['valloc', 'HAVE_VALLOC'], + ['fsync', 'HAVE_FSYNC'], + ['pipe2', 'HAVE_PIPE2'], + ['issetugid', 'HAVE_ISSETUGID'], + ['timegm', 'HAVE_TIMEGM'], + ['gmtime_r', 'HAVE_GMTIME_R'], + ['strerror_r', 'HAVE_STRERROR_R'], + ['lstat', 'HAVE_LSTAT'], + ['strsignal', 'HAVE_STRSIGNAL'], + ['vsnprintf', 'HAVE_VSNPRINTF'], + ['stpcpy', 'HAVE_STPCPY'], + ['poll', 'HAVE_POLL'], + ['vasprintf', 'HAVE_VASPRINTF'], + ['setenv', 'HAVE_SETENV'], + ['unsetenv', 'HAVE_UNSETENV'], + ['getc_unlocked', 'HAVE_GETC_UNLOCKED'], + ['readlink', 'HAVE_READLINK'], + ['symlink', 'HAVE_SYMLINK'], + ['fdwalk', 'HAVE_FDWALK'], + ['memmem', 'HAVE_MEMMEM'], + ['lchmod', 'HAVE_LCHMOD'], + ['lchown', 'HAVE_LCHOWN'], + ['fchmod', 'HAVE_FCHMOD'], + ['fchown', 'HAVE_FCHOWN'], + ['utimes', 'HAVE_UTIMES'], + ['getresuid', 'HAVE_GETRESUID'], + ['getmntent_r', 'HAVE_GETMNTENT_R'], + ['setmntent', 'HAVE_SETMNTENT'], + ['endmntent', 'HAVE_ENDMNTENT'], + ['hasmntopt', 'HAVE_HASMNTOPT'], + ['getfsstat', 'HAVE_GETFSSTAT'], + ['getvfsstat', 'HAVE_GETVFSSTAT'], + ['fallocate', 'HAVE_FALLOCATE'], + ['localtime_r', 'HAVE_LOCALTIME_R'], + ['gmtime_r', 'HAVE_GMTIME_R'], + ['getpwuid_r', 'HAVE_GETPWUID_R'], + ['getgrgid_r', 'HAVE_GETGRGID_R'], + ['prlimit', 'HAVE_PRLIMIT'], + ['strnlen', 'HAVE_STRNLEN'], + ['wcslen', 'HAVE_WCSLEN'], + ['wcsnlen', 'HAVE_WCSNLEN'], + ['mbrtowc', 'HAVE_MBRTOWC'], + ['wcrtomb', 'HAVE_WCRTOMB'], + ['newlocale', 'HAVE_NEWLOCALE'], + ['uselocale', 'HAVE_USELOCALE'], + ['strtod_l', 'HAVE_STRTOD_L'], + ['strtoll_l', 'HAVE_STRTOLL_L'], + ['strtoull_l', 'HAVE_STRTOULL_L'], + ['inotify_init1', 'HAVE_INOTIFY_INIT1'], + ['kqueue', 'HAVE_KQUEUE'], + ['kevent', 'HAVE_KEVENT'], + ['getservent', 'HAVE_GETSERVENT'], + ['getprotobyname_r', 'HAVE_GETPROTOBYNAME_R'], + ['if_indextoname', 'HAVE_IF_INDEXTONAME'], + ['if_nametoindex', 'HAVE_IF_NAMETOINDEX'], + ['sendmmsg', 'HAVE_SENDMMSG'], + ['recvmmsg', 'HAVE_RECVMMSG'], ] if glib_conf.has('HAVE_SYS_STATVFS_H') - functions += [ [ 'statvfs', 'HAVE_STATVFS', '#include '] ] + functions += [['statvfs', 'HAVE_STATVFS']] +else + have_func_statvfs = false endif if glib_conf.has('HAVE_SYS_STATFS_H') or glib_conf.has('HAVE_SYS_MOUNT_H') - functions += [ [ 'statfs', 'HAVE_STATFS', '''#ifdef HAVE_SYS_STATFS_H - #include - #endif - #ifdef HAVE_SYS_MOUNT_H - #include - #endif'''] ] + functions += [['statfs', 'HAVE_STATFS']] +else + have_func_statfs = false endif # AIX splice is something else -if host_machine.system() != 'aix' +if host_system != 'aix' functions += [ - [ 'splice', 'HAVE_SPLICE', '''#define _GNU_SOURCE - #include ''' ] + [ 'splice', 'HAVE_SPLICE' ] ] endif foreach f : functions - header_check_prefix = glib_conf_prefix - if f.length() == 3 - header_check_prefix = header_check_prefix + f[2] - endif - if cc.has_function (f[0], prefix : header_check_prefix) + if cc.has_function(f[0]) glib_conf.set(f[1], 1) glib_conf_prefix = glib_conf_prefix + '#define @0@ 1\n'.format(f[1]) set_variable('have_func_' + f[0], true) @@ -324,6 +335,34 @@ foreach f : functions endif endforeach +# Special-case these functions that have alternative names on Windows/MSVC +if cc.has_function('snprintf') or cc.has_header_symbol('stdio.h', 'snprintf') + glib_conf.set('HAVE_SNPRINTF', 1) + glib_conf_prefix = glib_conf_prefix + '#define HAVE_SNPRINTF 1\n' +elif cc.has_function('_snprintf') or cc.has_header_symbol('stdio.h', '_snprintf') + hack_define = '1\n#define snprintf _snprintf' + glib_conf.set('HAVE_SNPRINTF', hack_define) + glib_conf_prefix = glib_conf_prefix + '#define HAVE_SNPRINTF ' + hack_define +endif + +if cc.has_function('strcasecmp') + glib_conf.set('HAVE_STRCASECMP', 1) + glib_conf_prefix = glib_conf_prefix + '#define HAVE_STRCASECMP 1\n' +elif cc.has_function('_stricmp') + hack_define = '1\n#define strcasecmp _stricmp' + glib_conf.set('HAVE_STRCASECMP', hack_define) + glib_conf_prefix = glib_conf_prefix + '#define HAVE_STRCASECMP ' + hack_define +endif + +if cc.has_function('strncasecmp') + glib_conf.set('HAVE_STRNCASECMP', 1) + glib_conf_prefix = glib_conf_prefix + '#define HAVE_STRNCASECMP 1\n' +elif cc.has_function('_strnicmp') + hack_define = '1\n#define strncasecmp _strnicmp' + glib_conf.set('HAVE_STRNCASECMP', hack_define) + glib_conf_prefix = glib_conf_prefix + '#define HAVE_STRNCASECMP ' + hack_define +endif + # Check whether to use statfs or statvfs # Some systems have both statfs and statvfs, pick the most "native" for these if have_func_statfs and have_func_statvfs @@ -358,15 +397,6 @@ else CARBON_LIBS='' endif -# Check for nl_langinfo and CODESET -if cc.links('''#include - int main (int argc, char ** argv) { - char *codeset = nl_langinfo (CODESET); - return 0; - }''', name : 'nl_langinfo and CODESET') - glib_conf.set('HAVE_LANGINFO_CODESET', 1) -endif - # Check for futex(2) if cc.links('''#include #include @@ -394,13 +424,12 @@ clock_gettime_test_code = ''' int main (int argc, char ** argv) { return clock_gettime(CLOCK_REALTIME, &t); }''' -# FIXME: or will librt be in the meson threads dep already? -librt = [ ] +librt = [] if cc.links(clock_gettime_test_code, name : 'clock_gettime') glib_conf.set('HAVE_CLOCK_GETTIME', 1) elif cc.links(clock_gettime_test_code, args : '-lrt', name : 'clock_gettime in librt') glib_conf.set('HAVE_CLOCK_GETTIME', 1) - librt = find_library('rt') + librt = cc.find_library('rt') endif # if statfs() takes 2 arguments (Posix) or 4 (Solaris) @@ -463,7 +492,7 @@ endif # AC_FUNC_VSNPRINTF_C99 # Check whether there is a snprintf() function with C99 semantics installed. # AC_FUNC_SNPRINTF_C99 -if host_machine.system() == 'windows' and cc.get_id() == 'gcc' # FIXME: is it mingw on windows? +if host_system == 'windows' and cc.get_id() == 'gcc' # Unfortunately the mingw implementations of C99-style snprintf and vsnprintf # don't seem to be quite good enough, at least not in mingw-runtime-3.14. # (Sorry, I don't know exactly what is the problem, but it is related to @@ -558,7 +587,7 @@ main(void) endif endif -if host_machine.system() == 'windows' +if host_system == 'windows' glib_conf.set('EXEEXT', '".exe"') else glib_conf.set('EXEEXT', '""') @@ -566,30 +595,18 @@ endif # Check whether the printf() family supports Unix98 %n$ positional parameters # AC_FUNC_PRINTF_UNIX98 -printf_unix98_test_code = ''' -#include +# Nothing uses HAVE_UNIX98_PRINTF -int -main (void) -{ - char buffer[128]; - - sprintf (buffer, "%2\$d %3\$d %1\$d", 1, 2, 3); - if (strcmp ("2 3 1", buffer) == 0) - exit (0); - exit (1); -}''' -rres = cc.run(printf_unix98_test_code, name : 'printf unix98 position parameters') -if rres.compiled() and rres.returncode() == 0 - glib_conf.set('HAVE_UNIX98_PRINTF', 1) -endif +glib_conf.set('HAVE_DCGETTEXT', cc.has_header_symbol('libintl.h', 'dcgettext')) # Check for nl_langinfo and CODESET +# FIXME: Check for HAVE_BIND_TEXTDOMAIN_CODESET if cc.links('''#include int main (int argc, char ** argv) { char *codeset = nl_langinfo (CODESET); return 0; - }''', name : 'nl_langinfo (CODESET)') + }''', name : 'nl_langinfo and CODESET') + glib_conf.set('HAVE_LANGINFO_CODESET', 1) glib_conf.set('HAVE_CODESET', 1) endif @@ -634,8 +651,7 @@ if not cc.compiles('''signed char x;''', name : 'signed') endif # Check if the ptrdiff_t type exists -if cc.compiles('''#include - ptrdiff_t x;''', name : 'ptrdiff_t') +if cc.has_header_symbol('stddef.h', 'ptrdiff_t') glib_conf.set('HAVE_PTRDIFF_T', 1) endif @@ -649,8 +665,9 @@ if cc.links('''#include glib_conf.set('HAVE_SIG_ATOMIC_T', 1) endif -# Check if 'long long' works. +# Check if 'long long' works and what format can be used to print it # jm_AC_TYPE_LONG_LONG +# Nothing uses HAVE_LONG_LONG_FORMAT and HAVE_INT64_AND_I64 if cc.compiles('''long long ll = 1LL; int i = 63; int some_func (void) { @@ -673,16 +690,12 @@ if cc.compiles('''/* The Stardent Vistra knows sizeof(long double), but does not endif #dnl Test whether has the 'wchar_t' type. -if cc.compiles('''#include - wchar_t foo = (wchar_t)'\0';''', - name : 'wchar_t') +if cc.has_header_symbol('stddef.h', 'wchar_t') glib_conf.set('HAVE_WCHAR_T', 1) endif # Test whether has the 'wint_t' type. -if cc.compiles('''#include - wint_t foo = (wchar_t)'\0';''', - name : 'wint_t') +if cc.has_header_symbol('wchar.h', 'wint_t') glib_conf.set('HAVE_WINT_T', 1) endif @@ -735,13 +748,28 @@ else long_long_size = 0 endif sizet_size = cc.sizeof('size_t') -ssizet_size = cc.sizeof('ssize_t') +if cc.get_id() == 'msvc' + ssizet_size = cc.sizeof('SSIZE_T', prefix : '#include ') +else + ssizet_size = cc.sizeof('ssize_t') +endif + +# On Windows, MSVC supports both ll and I64 as format specifiers for 64-bit +# integers, but some versions (at least 4.7.x) of MinGW only support I64. +if host_system == 'windows' + int64_m = '"I64' +else + int64_m = '"ll' +endif 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') +# NOTE: We don't check for size of __int64 because long long is guaranteed to +# be 64-bit in C99, and it is available on all supported compilers sizet_align = cc.alignment('size_t') glib_conf.set('ALIGNOF_UNSIGNED_LONG', long_align) @@ -755,47 +783,44 @@ glib_conf.set('SIZEOF_SIZE_T', sizet_size) glib_conf.set('SIZEOF_SSIZE_T', ssizet_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"' +elif int_size == 2 + gint16 = 'int' + gint16_modifier='""' + gint16_format='"i"' + guint16_format='"u"' +else + error('Compiler provides no native 16-bit integer type') 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 +elif int_size == 4 + gint32 = 'int' + gint32_modifier='""' + gint32_format='"i"' + guint32_format='"u"' + guint32_align = int_align +elif long_size == 4 + gint32 = 'long' + gint32_modifier='"l"' + gint32_format='"li"' + guint32_format='"lu"' + guint32_align = long_align +else + error('Compiler provides no native 32-bit integer type') endif glibconfig_conf.set('gint32', gint32) glibconfig_conf.set('gint32_modifier', gint32_modifier) @@ -803,20 +828,6 @@ 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='""' @@ -826,10 +837,26 @@ if int_size == 8 gint64_constant='(val)' guint64_constant='(val)' guint64_align = int_align -endif -if short_size == 8 - # Another one broken in configure.ac - gint64 = 'short' +elif long_size == 8 + gint64 = 'long' + glib_extension='' + gint64_modifier='"l"' + gint64_format='"li"' + guint64_format='"lu"' + gint64_constant='(val##L)' + guint64_constant='(val##UL)' + guint64_align = long_align +elif long_long_size == 8 + gint64 = 'long long' + glib_extension='' + gint64_modifier=int64_m + '"' + gint64_format=int64_m + 'i"' + guint64_format=int64_m + 'u"' + gint64_constant='(val##LL)' + guint64_constant='(val##ULL)' + guint64_align = long_long_align +else + error('Compiler provides no native 64-bit integer type') endif glibconfig_conf.set('gint64', gint64) glibconfig_conf.set('gint64_modifier', gint64_modifier) @@ -839,7 +866,7 @@ glibconfig_conf.set('gint64_constant', gint64_constant) glibconfig_conf.set('guint64_constant', guint64_constant) glib_conf.set('ALIGNOF_GUINT64', guint64_align) -if host_machine.system() == 'windows' +if host_system == 'windows' glibconfig_conf.set('g_pid_type', 'void*') if host_machine.cpu_family() == 'x86_64' glibconfig_conf.set('g_pollfd_format', '"%#I64x"') @@ -874,10 +901,10 @@ elif sizet_size == long_size 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('gssize_modifier', '"I64"') - glibconfig_conf.set('gsize_format', '"I64u"') - glibconfig_conf.set('gssize_format', '"I64i"') + glibconfig_conf.set('gsize_modifier', int64_m + '"') + glibconfig_conf.set('gssize_modifier', int64_m + '"') + glibconfig_conf.set('gsize_format', int64_m + 'u"') + glibconfig_conf.set('gssize_format', int64_m + 'i"') glibconfig_conf.set('glib_msize_type', 'INT64') else error('Could not determine size of size_t.') @@ -899,32 +926,28 @@ elif voidp_size == long_size glibconfig_conf.set('glib_gpui_cast', '(gulong)') elif voidp_size == long_long_size glibconfig_conf.set('glib_intptr_type_define', 'long long') - glibconfig_conf.set('gintptr_modifier', '"I64"') - glibconfig_conf.set('gintptr_format', '"I64i"') - glibconfig_conf.set('guintptr_format', '"I64u"') + glibconfig_conf.set('gintptr_modifier', int64_m + '"') + glibconfig_conf.set('gintptr_format', int64_m + 'i"') + glibconfig_conf.set('guintptr_format', int64_m + 'u"') glibconfig_conf.set('glib_gpi_cast', '(gint64)') glibconfig_conf.set('glib_gpui_cast', '(guint64)') -# FIXME -#elif voidp_size == __int64_size -# glib_intptr_type_define=__int64 -# gintptr_modifier='"I64"' -# gintptr_format='"I64i"' -# guintptr_format='"I64u"' -# glib_gpi_cast='(gint64)' -# glib_gpui_cast='(guint64)' else error('Could not determine size of void *') endif +if long_size != 8 and long_long_size != 8 and int_size != 8 + error('GLib requires a 64-bit type. You might want to consider using the GNU C compiler.') +endif + glibconfig_conf.set('gintbits', int_size * 8) glibconfig_conf.set('glongbits', long_size * 8) glibconfig_conf.set('gsizebits', sizet_size * 8) glibconfig_conf.set('gssizebits', ssizet_size * 8) # FIXME: maybe meson should tell us the libsuffix? -if host_machine.system() == 'windows' +if host_system == 'windows' g_module_suffix = 'dll' -elif host_machine.system() == 'darwin' +elif host_system == 'darwin' g_module_suffix = 'dylib' else g_module_suffix = 'so' @@ -995,7 +1018,7 @@ va_list_val_copy_prog = ''' glib_va_val_copy = false if cc.compiles(va_list_val_copy_prog, name : 'va_lists can be copied as values') # FIXME: what to do when cross-compiling? - if cc.run(va_list_val_copy_prog, 'va_lists can be copied as values').returncode() == 0 + if cc.run(va_list_val_copy_prog, name : 'va_lists can be copied as values').returncode() == 0 glib_va_val_copy = true endif endif @@ -1050,6 +1073,7 @@ has_systypes = cc.has_header('sys/types.h') if has_syspoll glibconfig_conf.set('GLIB_HAVE_SYS_POLL_H', true) endif +has_winsock2 = cc.has_header('winsock2.h') if has_syspoll and has_systypes templ = '''#include @@ -1059,23 +1083,26 @@ 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() +elif has_winsock2 + templ = '''#define _WIN32_WINNT 0x0600 +#include +#include +int main(int argc, char **argv) { + printf("%d\n", (int)@0@); + return 0; +}''' else # FIXME? error('FIX POLL* defines') - value_POLLIN = 1 - value_POLLOUT = 4 - value_POLLPRI = 2 - value_POLLERR = 8 - value_POLLHUP = 16 - value_POLLNVAL = 32 endif +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() + glibconfig_conf.set('g_pollin', value_POLLIN) glibconfig_conf.set('g_pollout', value_POLLOUT) glibconfig_conf.set('g_pollpri', value_POLLPRI) @@ -1085,7 +1112,7 @@ glibconfig_conf.set('g_pollnval', value_POLLNVAL) # Internet address families # FIXME: what about Cygwin (G_WITH_CYGWIN) -if host_machine.system() == 'windows' +if host_system == 'windows' glib_inet_includes= ''' #include ''' @@ -1112,7 +1139,7 @@ int main(int argc, char **argv) { return 0; }''' # FIXME: fix for cross-compilation - if meson.is_cross_build() + if not meson.has_exe_wrapper() error('Fix sys define detection for cross build') endif val = cc.run(templ.format(glib_inet_includes, d[0])).stdout().strip() @@ -1128,7 +1155,7 @@ if host_cpu_family == 'x86' or host_cpu_family == 'x86_64' or host_cpu_family == elif host_cpu_family.startswith('sparc') or host_cpu_family.startswith('alpha') or host_cpu_family.startswith('powerpc') or host_cpu_family == 'ia64' glib_memory_barrier_needed = true else - # FIXME: should warn perhaps + error('Unknown host cpu: ' + host_cpu_family) glib_memory_barrier_needed = true endif glibconfig_conf.set('G_ATOMIC_OP_MEMORY_BARRIER_NEEDED', glib_memory_barrier_needed) @@ -1151,12 +1178,32 @@ endif thread_dep = dependency('threads') # Determination of thread implementation -if host_machine.system() == 'windows' +if host_system == 'windows' glibconfig_conf.set('g_threads_impl_def', 'WIN32') glib_conf.set('THREADS_WIN32', 1) else glibconfig_conf.set('g_threads_impl_def', 'POSIX') glib_conf.set('THREADS_POSIX', 1) + if cc.has_header_symbol('pthread.h', 'pthread_attr_setstacksize') + glib_conf.set('HAVE_PTHREAD_ATTR_SETSTACKSIZE', 1) + endif + if cc.has_header_symbol('pthread.h', 'pthread_condattr_setclock') + glib_conf.set('HAVE_PTHREAD_CONDATTR_SETCLOCK', 1) + endif + if cc.has_header_symbol('pthread.h', 'pthread_cond_timedwait_relative_np') + glib_conf.set('HAVE_PTHREAD_COND_TIMEDWAIT_RELATIVE_NP', 1) + endif + if cc.links('''#include + int main() { + pthread_setname_np("example"); + }''', name : 'pthread_setname_np(const char*)') + glib_conf.set('HAVE_PTHREAD_SETNAME_NP_WITHOUT_TID', 1) + elif cc.links('''#include + int main() { + pthread_setname_np(pthread_self(), "example"); + }''', name : 'pthread_setname_np(pthread_t, const char*)') + glib_conf.set('HAVE_PTHREAD_SETNAME_NP_WITH_TID', 1) + endif endif # FIXME: how to do this when cross-compiling? @@ -1185,40 +1232,59 @@ else endif # Tests for iconv +# +# First, we check if the C library provides iconv, then GNU libiconv, then +# a native implementation +# FIXME: add option as well +# # USE_LIBICONV_GNU: Using GNU libiconv -# USE_LIBICONV_NATIVE: Using a native implementation of iconv in a separate library -# On Windows we use a native implementation -if host_machine.system() == 'windows' +# USE_LIBICONV_NATIVE: Using a native impl of iconv in a separate library +# +# We should never use the MinGW C library's iconv. On Windows we use the +# GNU implementation that ships with MinGW. + +# On Windows, just always use the built-in implementation +if host_system == 'windows' + libiconv = [] glib_conf.set('USE_LIBICONV_NATIVE', true) - libiconv = find_library('iconv') +# Check C library; never check MinGW C library +elif cc.has_function('iconv_open') + libiconv = [] +# Check for libiconv +elif cc.has_header_symbol('iconv.h', 'libiconv_open') + glib_conf.set('USE_LIBICONV_GNU', true) + libiconv = [cc.find_library('iconv')] +# Check for a custom iconv implementation +elif cc.has_header_symbol('iconv.h', 'iconv_open') + glib_conf.set('USE_LIBICONV_NATIVE', true) + libiconv = [cc.find_library('iconv')] else - # FIXME: add option as well - if cc.has_function('iconv_open', prefix : '#include ', name : 'C library iconv') - libiconv = [ ] - # FIXME: this is all wrong, meson needs a more intuitive check for this, like cc.has_lib_function() or such - elif cc.compiles('''#include - void somefunc (void) { - libiconv_open("foo", "bar") - }''', args : '-liconv', name : 'GNU libiconv') - glib_conf.set('USE_LIBICONV_GNU', true) - libiconv = find_library('iconv') - elif cc.compiles('''#include - void somefunc (void) { - iconv_open("foo", "bar") - }''', args : '-liconv', name : 'other libiconv') - glib_conf.set('USE_LIBICONV_NATIVE', true) - libiconv = find_library('iconv') - else - error('No iconv() implementation found in C library or libiconv') - endif + error('No iconv() implementation found in C library or libiconv') endif -pcre = dependency('libpcre') # Should check for Unicode support, too. FIXME -glib_conf.set('USE_SYSTEM_PCRE', '/**/') +pcre = dependency('libpcre', required : false) # Should check for Unicode support, too. FIXME +glib_conf.set('USE_SYSTEM_PCRE', pcre.found()) -libm = find_library('m') +libm = cc.find_library('m', required : false) libffi_dep = dependency('libffi', version : '>= 3.0.0') libz_dep = dependency('zlib') +# Only used on non-glibc targets +libintl = cc.find_library('intl', required : false) + +if host_system == 'windows' + winsock2 = cc.find_library('ws2_32') +endif + +# Needed for glib-mkenums +perl = find_program('perl') + +python = find_program('python3', required : false) +if not python.found() + # All our scripts are compatible with python 2, so it's ok if this is Python 2 + # Also, we don't check for 'python2' because if the user doesn't have Python + # installed, we want them to see that we want 'python', not 'python2'. + python = find_program('python') +endif # FIXME: defines in config.h that are not actually used anywhere # (we add them for now to minimise the diff) @@ -1226,7 +1292,25 @@ glib_conf.set('HAVE_DLFCN_H', 1) glib_conf.set('__EXTENSIONS__', 1) glib_conf.set('STDC_HEADERS', 1) # THREADS_NONE -glib_conf.set('SIZEOF___INT64', 0) +glib_conf.set('SIZEOF___INT64', 8) + +# Various substs needed for our pkg-config files +# FIXME: Derive these from the dependency() objects (Meson support needed) +glib_conf.set('ZLIB_LIBS', '-lz') +glib_conf.set('LIBFFI_LIBS', '-lffi') +if libintl.found() + glib_conf.set('INTLLIBS', '-lintl') +endif +if libiconv.length() != 0 + glib_conf.set('ICONV_LIBS', '-liconv') +endif +if pcre.found() + glib_conf.set('PCRE_LIBS', '-lpcre') +endif +glib_conf.set('GIO_MODULE_DIR', '${libdir}/gio/modules') +# FIXME: Missing: +# @G_MODULE_LIBS@ @SELINUX_LIBS@ @COCOA_LIBS@ @CARBON_LIBS@ @G_LIBS_EXTRA@ +# @PCRE_REQUIRES@ @GLIB_EXTRA_CFLAGS@ @G_THREAD_CFLAGS@ subdir('glib') subdir('gobject') @@ -1234,4 +1318,43 @@ subdir('gthread') subdir('gmodule') subdir('gio') -configure_file(input : 'config.h.meson', output : 'config.h', configuration : glib_conf) +# Configure and install pkg-config files +pc_files = [ + 'gobject-2.0.pc', + 'glib-2.0.pc', + 'gthread-2.0.pc', + 'gmodule-2.0.pc', + 'gmodule-export-2.0.pc', + 'gmodule-no-export-2.0.pc', + 'gio-2.0.pc', +] +if host_system == 'windows' + pc_files += ['gio-windows-2.0.pc'] +else + pc_files += ['gio-unix-2.0.pc'] +endif + +foreach pc : pc_files + configure_file(input : pc + '.in', + install : true, + install_dir : glib_pkgconfigreldir, + output : pc, + configuration : glib_conf) +endforeach + +# NOTE: We skip glib-zip.in because the filenames it assumes don't match ours + +# Install glib-gettextize executable +configure_file(input : 'glib-gettextize.in', + install : true, + install_dir : 'bin', + output : 'glib-gettextize', + configuration : glib_conf) + +# Install m4 macros that other projects use +install_data('m4macros/glib-2.0.m4', 'm4macros/glib-gettext.m4', 'm4macros/gsettings.m4', + install_dir : 'share/aclocal') + +configure_file(input : 'config.h.meson', + output : 'config.h', + configuration : glib_conf)