glib/gio/meson.build
Marco Trevisan (Treviño) 9c4ff01feb build: Move gir generation to an introspection folder
Generating gir and typelib files has inter-dependencies that may depend
on other elements.

For example, glib requires gobject and gdump generated files require
gmodule, so we've a cyclic dependency because gmodule requires gobject,
that requires glib.

To prevent this, let's just generate the introspection files at once in
a different meson file so that we don't have to deal with this.

As per this we could even revert commit fa37ab6d0 since gio is now
compiled before the gir files.
2023-12-20 21:35:53 +01:00

1111 lines
32 KiB
Meson

gio_c_args = [
'-DG_LOG_DOMAIN="GLib-GIO"',
'-DGIO_LAUNCH_DESKTOP="@0@"'.format(glib_prefix / multiarch_libexecdir / 'gio-launch-desktop'),
'-DGIO_MODULE_DIR="@0@"'.format(glib_giomodulesdir),
'-DLOCALSTATEDIR="@0@"'.format(glib_localstatedir),
]
gio_c_args_internal = [
'-DGIO_COMPILATION',
]
# Install empty glib_giomodulesdir
install_emptydir(glib_giomodulesdir)
gio_includedir = glib_includedir / 'gio'
gnetworking_h_conf = configuration_data()
gnetworking_h_nameser_compat_include = ''
if host_system not in ['windows', 'android']
# Don't check for C_IN on Android since it does not define it in public
# headers, we define it ourselves wherever necessary
if not cc.compiles('''#include <sys/types.h>
#include <arpa/nameser.h>
int qclass = C_IN;''',
name : 'C_IN in public headers (no arpa/nameser_compat.h needed)')
if cc.compiles('''#include <sys/types.h>
#include <arpa/nameser.h>
#include <arpa/nameser_compat.h>
int qclass = C_IN;''',
name : 'arpa/nameser_compat.h needed for C_IN')
gnetworking_h_nameser_compat_include = '#include <arpa/nameser_compat.h>'
else
error('Could not find required includes for ARPA C_IN')
endif
endif
endif
network_libs = [ ]
network_args = [ ]
if host_system != 'windows'
# res_query()
res_query_test = '''#include <resolv.h>
int main (int argc, char ** argv) {
return res_query("test", 0, 0, (void *)0, 0);
}'''
res_query_test_full = '''#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/nameser.h>
''' + 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 += [ cc.find_library('resolv') ]
network_args += [ '-lresolv' ]
elif cc.links(res_query_test, args : '-lbind', name : 'res_query() in -lbind')
network_libs += [ cc.find_library('bind') ]
network_args += [ '-lbind' ]
elif cc.links(res_query_test, args : '-lsocket', name : 'res_query() in -lsocket')
network_libs += [ cc.find_library('socket') ]
network_args += [ '-lsocket' ]
else
error('Could not find res_query()')
endif
endif
# socket()
socket_test = '''#include <sys/types.h>
#include <sys/socket.h>
int main (int argc, char ** argv) {
return socket(1, 2, 3);
}'''
if not cc.links(socket_test, name : 'socket()')
if cc.links(socket_test, args : '-lsocket', name : 'socket() in -lsocket')
network_libs += [ cc.find_library('socket') ]
network_args += [ '-lsocket' ]
else
error('Could not find socket()')
endif
endif
# dn_comp()
if cc.links('''#include <resolv.h>
int main (int argc, char ** argv) {
return dn_comp(NULL, NULL, 0, NULL, NULL) == -1;
} ''', args : network_args, name : 'dn_comp()')
glib_conf.set('HAVE_DN_COMP', 1)
endif
# res_nclose()
if cc.links('''#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/nameser.h>
#include <resolv.h>
int main (int argc, char ** argv) {
struct __res_state res;
res_nclose(&res);
return 0;
}''', args : network_args, name : 'res_nclose()')
glib_conf.set('HAVE_RES_NCLOSE', 1)
endif
# res_ndestroy()
if cc.links('''#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/nameser.h>
#include <resolv.h>
int main (int argc, char ** argv) {
struct __res_state res;
res_ndestroy(&res);
return 0;
}''', args : network_args, name : 'res_ndestroy()')
glib_conf.set('HAVE_RES_NDESTROY', 1)
endif
# res_ninit()
if cc.links('''#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/nameser.h>
#include <resolv.h>
int main (int argc, char ** argv) {
struct __res_state res;
return res_ninit(&res);
}''', args : network_args, name : 'res_ninit()')
glib_conf.set('HAVE_RES_NINIT', 1)
endif
# res_nquery()
if cc.links('''#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/nameser.h>
#include <resolv.h>
int main (int argc, char ** argv) {
struct __res_state res;
return res_nquery(&res, "test", 0, 0, (void *)0, 0);
}''', args : network_args, name : 'res_nquery()')
glib_conf.set('HAVE_RES_NQUERY', 1)
endif
if cc.has_type('struct ip_mreqn', prefix : '#include <netinet/in.h>')
glib_conf.set('HAVE_IP_MREQN', 1)
endif
if cc.compiles('''#include <sys/ioctl.h>
#include <net/if.h>
int main (int argc, char ** argv) {
struct ifreq ifr;
ioctl(0, SIOCGIFADDR, &ifr);
return 0;
}''',
name : 'ioctl with request SIOCGIFADDR')
glib_conf.set('HAVE_SIOCGIFADDR', '/**/')
endif
endif
if host_system == 'android'
# struct ip_mreq_source definition is broken on Android NDK <= r16
# See https://bugzilla.gnome.org/show_bug.cgi?id=740791
if not cc.compiles('''#include <netinet/in.h>
int main(int argc, char ** argv) {
struct ip_mreq_source mc_req_src;
mc_req_src.imr_interface.s_addr = 0;
return 0;
}''',
name : 'ip_mreq_source.imr_interface has s_addr member')
glib_conf.set('BROKEN_IP_MREQ_SOURCE_STRUCT', 1)
endif
endif
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 : gio_includedir,
install_tag : 'devel',
configuration : gnetworking_h_conf)
gdbus_headers = files(
'gdbusauthobserver.h',
'gcredentials.h',
'gdbusutils.h',
'gdbuserror.h',
'gdbusaddress.h',
'gdbusconnection.h',
'gdbusmessage.h',
'gdbusnameowning.h',
'gdbusnamewatching.h',
'gdbusproxy.h',
'gdbusintrospection.h',
'gdbusmethodinvocation.h',
'gdbusserver.h',
'gdbusinterface.h',
'gdbusinterfaceskeleton.h',
'gdbusobject.h',
'gdbusobjectskeleton.h',
'gdbusobjectproxy.h',
'gdbusobjectmanager.h',
'gdbusobjectmanagerclient.h',
'gdbusobjectmanagerserver.h',
'gtestdbus.h',
)
gdbus_sources = files(
'gdbusutils.c',
'gdbusaddress.c',
'gdbusauthobserver.c',
'gdbusauth.c',
'gdbusauthmechanism.c',
'gdbusauthmechanismanon.c',
'gdbusauthmechanismexternal.c',
'gdbusauthmechanismsha1.c',
'gdbuserror.c',
'gdbusconnection.c',
'gdbusmessage.c',
'gdbusnameowning.c',
'gdbusnamewatching.c',
'gdbusproxy.c',
'gdbusprivate.c',
'gdbusintrospection.c',
'gdbusmethodinvocation.c',
'gdbusserver.c',
'gdbusinterface.c',
'gdbusinterfaceskeleton.c',
'gdbusobject.c',
'gdbusobjectskeleton.c',
'gdbusobjectproxy.c',
'gdbusobjectmanager.c',
'gdbusobjectmanagerclient.c',
'gdbusobjectmanagerserver.c',
'gtestdbus.c',
)
# Generate gdbus-codegen
subdir('gdbus-2.0/codegen')
# Generate xdp-dbus.{c,h}
xdp_dbus_generated = custom_target('xdp-dbus',
input : ['org.freedesktop.portal.Documents.xml',
'org.freedesktop.portal.OpenURI.xml',
'org.freedesktop.portal.ProxyResolver.xml',
'org.freedesktop.portal.Trash.xml'],
output : ['xdp-dbus.h', 'xdp-dbus.c'],
depend_files : gdbus_codegen_built_files,
depends : gdbus_codegen_built_targets,
command : [python, gdbus_codegen,
'--interface-prefix', 'org.freedesktop.portal.',
'--output-directory', '@OUTDIR@',
'--generate-c-code', 'xdp-dbus',
'--c-namespace', 'GXdp',
'@INPUT@'])
# 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'],
depend_files : gdbus_codegen_built_files,
depends : gdbus_codegen_built_targets,
command : [python, gdbus_codegen,
'--interface-prefix', 'org.',
'--output-directory', '@OUTDIR@',
'--generate-c-code', 'gdbus-daemon-generated',
'--c-namespace', '_G', '@INPUT@'])
settings_headers = files(
'gsettingsbackend.h',
'gsettingsschema.h',
'gsettings.h',
)
settings_sources = files(
'gdelayedsettingsbackend.c',
'gkeyfilesettingsbackend.c',
'gmemorysettingsbackend.c',
'gnullsettingsbackend.c',
'gsettingsbackend.c',
'gsettingsschema.c',
'gsettings-mapping.c',
'gsettings.c',
)
application_headers = files(
'gapplication.h',
'gapplicationcommandline.h',
'gactiongroup.h',
'gactionmap.h',
'gsimpleactiongroup.h',
'gremoteactiongroup.h',
'gactiongroupexporter.h',
'gdbusactiongroup.h',
'gaction.h',
'gpropertyaction.h',
'gsimpleaction.h',
'gmenumodel.h',
'gmenu.h',
'gmenuexporter.h',
'gdbusmenumodel.h',
'gnotification.h',
)
application_sources = files(
'gapplication.c',
'gapplicationcommandline.c',
'gapplicationimpl-dbus.c',
'gactiongroup.c',
'gactionmap.c',
'gsimpleactiongroup.c',
'gremoteactiongroup.c',
'gactiongroupexporter.c',
'gdbusactiongroup.c',
'gaction.c',
'gpropertyaction.c',
'gsimpleaction.c',
'gmenumodel.c',
'gmenu.c',
'gmenuexporter.c',
'gdbusmenumodel.c',
'gnotification.c',
'gnotificationbackend.c',
)
local_sources = files(
'ghttpproxy.c',
'glocalfile.c',
'glocalfileenumerator.c',
'glocalfileinfo.c',
'glocalfileinputstream.c',
'glocalfilemonitor.c',
'glocalfileoutputstream.c',
'glocalfileiostream.c',
'glocalvfs.c',
'gsocks4proxy.c',
'gsocks4aproxy.c',
'gsocks5proxy.c',
'thumbnail-verify.c',
)
platform_deps = []
internal_deps = []
appinfo_sources = []
contenttype_sources = []
portal_sources = []
unix_sources = []
win32_sources = []
# This is also used by tests/gdbus-daemon, so use files() to include the path
gdbus_daemon_sources = [
files('gdbusdaemon.c'),
gdbus_daemon_generated,
]
if host_system != 'windows'
unix_sources = files(
'gfiledescriptorbased.c',
'giounix-private.c',
'gunixfdmessage.c',
'gunixmount.c',
'gunixmounts.c',
'gunixvolume.c',
'gunixvolumemonitor.c',
'gunixinputstream.c',
'gunixoutputstream.c',
'gfdonotificationbackend.c',
'ggtknotificationbackend.c',
)
portal_sources = [files(
'gdocumentportal.c',
'gopenuriportal.c',
'gmemorymonitorportal.c',
'gnetworkmonitorportal.c',
'gpowerprofilemonitorportal.c',
'gproxyresolverportal.c',
'gtrashportal.c',
'gportalsupport.c',
'gportalnotificationbackend.c',
'gsandbox.c',
),
xdp_dbus_generated
]
gio_unix_include_headers = files(
'gfiledescriptorbased.h',
'gunixmounts.h',
'gunixfdmessage.h',
'gunixinputstream.h',
'gunixoutputstream.h',
)
if glib_have_cocoa
settings_sources += files('gnextstepsettingsbackend.m')
contenttype_sources += files('gosxcontenttype.m')
appinfo_sources += files('gosxappinfo.m')
framework_dep = dependency('appleframeworks', modules : ['Foundation', 'CoreFoundation', 'AppKit'])
platform_deps += [framework_dep]
if glib_have_os_x_9_or_later
unix_sources += files('gcocoanotificationbackend.m')
endif
application_headers += files('gosxappinfo.h')
else
contenttype_sources += files('gcontenttype.c')
appinfo_sources += files('gdesktopappinfo.c')
gio_unix_include_headers += files('gdesktopappinfo.h')
launch_desktop_sources = files('gio-launch-desktop.c')
if host_system == 'linux'
launch_desktop_sources += files('../glib/gjournal-private.c')
endif
gio_launch_desktop = executable('gio-launch-desktop', launch_desktop_sources,
include_directories : glibinc,
install : true,
install_dir : multiarch_libexecdir,
install_tag : 'bin',
c_args : gio_c_args,
# intl.lib is not compatible with SAFESEH
link_args : noseh_link_args)
endif
subdir('xdgmime')
internal_deps += [xdgmime_lib]
install_headers(gio_unix_include_headers, subdir : 'gio-unix-2.0/gio')
if glib_conf.has('HAVE_NETLINK')
unix_sources += files(
'gnetworkmonitornetlink.c',
'gnetworkmonitornm.c',
)
endif
else
appinfo_sources += files('gwin32appinfo.c')
contenttype_sources += files('gcontenttype-win32.c')
platform_deps += [cc.find_library('shlwapi'),
cc.find_library('dnsapi'),
iphlpapi_dep,
winsock2]
platform_deps += uwp_gio_deps
win32_sources += files(
'gmemorymonitorwin32.c',
'gregistrysettingsbackend.c',
'gwin32registrykey.c',
'gwin32mount.c',
'gwin32volumemonitor.c',
'gwin32inputstream.c',
'gwin32outputstream.c',
'gwin32file-sync-stream.c',
'gwin32packageparser.c',
'gwin32networkmonitor.c',
'gwin32networkmonitor.h',
'gwin32notificationbackend.c',
'gwin32sid.c',
'gwin32sid.h',
)
gio_win_rc = configure_file(
input: 'gio.rc.in',
output: 'gio.rc',
configuration: glibconfig_conf,
)
gio_win_res = windows.compile_resources(gio_win_rc)
win32_sources += [gio_win_res]
gio_win32_include_headers = files(
'gregistrysettingsbackend.h',
'gwin32inputstream.h',
'gwin32outputstream.h',
)
install_headers(gio_win32_include_headers, subdir : 'gio-win32-2.0/gio')
endif
gio_base_sources = files(
'gappinfo.c',
'gasynchelper.c',
'gasyncinitable.c',
'gasyncresult.c',
'gbufferedinputstream.c',
'gbufferedoutputstream.c',
'gbytesicon.c',
'gcancellable.c',
'gcharsetconverter.c',
'gcontextspecificgroup.c',
'gconverter.c',
'gconverterinputstream.c',
'gconverteroutputstream.c',
'gcredentials.c',
'gdatagrambased.c',
'gdatainputstream.c',
'gdataoutputstream.c',
'gdebugcontroller.c',
'gdebugcontrollerdbus.c',
'gdrive.c',
'gdummyfile.c',
'gdummyproxyresolver.c',
'gdummytlsbackend.c',
'gemblem.c',
'gemblemedicon.c',
'gfile.c',
'gfileattribute.c',
'gfileenumerator.c',
'gfileicon.c',
'gfileinfo.c',
'gfileinputstream.c',
'gfilemonitor.c',
'gfilenamecompleter.c',
'gfileoutputstream.c',
'gfileiostream.c',
'gfilterinputstream.c',
'gfilteroutputstream.c',
'gicon.c',
'ginetaddress.c',
'ginetaddressmask.c',
'ginetsocketaddress.c',
'ginitable.c',
'ginputstream.c',
'gioerror.c',
'giomodule.c',
'giomodule-priv.c',
'gioscheduler.c',
'giostream.c',
'gloadableicon.c',
'gmarshal-internal.c',
'gmount.c',
'gmemorymonitor.c',
'gmemorymonitordbus.c',
'gmemoryinputstream.c',
'gmemoryoutputstream.c',
'gmountoperation.c',
'gnativesocketaddress.c',
'gnativevolumemonitor.c',
'gnetworkaddress.c',
'gnetworking.c',
'gnetworkmonitor.c',
'gnetworkmonitorbase.c',
'gnetworkservice.c',
'goutputstream.c',
'gpermission.c',
'gpollableinputstream.c',
'gpollableoutputstream.c',
'gpollableutils.c',
'gpollfilemonitor.c',
'gpowerprofilemonitor.c',
'gpowerprofilemonitordbus.c',
'gproxy.c',
'gproxyaddress.c',
'gproxyaddressenumerator.c',
'gproxyresolver.c',
'gresolver.c',
'gresource.c',
'gresourcefile.c',
'gseekable.c',
'gsimpleasyncresult.c',
'gsimpleiostream.c',
'gsimplepermission.c',
'gsimpleproxyresolver.c',
'gsocket.c',
'gsocketaddress.c',
'gsocketaddressenumerator.c',
'gsocketclient.c',
'gsocketconnectable.c',
'gsocketconnection.c',
'gsocketcontrolmessage.c',
'gsocketinputstream.c',
'gsocketlistener.c',
'gsocketoutputstream.c',
'gsocketservice.c',
'gsrvtarget.c',
'gsubprocesslauncher.c',
'gsubprocess.c',
'gtask.c',
'gtcpconnection.c',
'gtcpwrapperconnection.c',
'gthemedicon.c',
'gthreadedsocketservice.c',
'gthreadedresolver.c',
'gthreadedresolver.h',
'gtlsbackend.c',
'gtlscertificate.c',
'gtlsclientconnection.c',
'gtlsconnection.c',
'gtlsdatabase.c',
'gtlsfiledatabase.c',
'gtlsinteraction.c',
'gtlspassword.c',
'gtlsserverconnection.c',
'gdtlsconnection.c',
'gdtlsclientconnection.c',
'gdtlsserverconnection.c',
'gunionvolumemonitor.c',
'gunixconnection.c',
'gunixfdlist.c',
'gunixcredentialsmessage.c',
'gunixsocketaddress.c',
'gvfs.c',
'gvolume.c',
'gvolumemonitor.c',
'gzlibcompressor.c',
'gzlibdecompressor.c',
'glistmodel.c',
'gliststore.c',
)
gio_sources = gio_base_sources
if glib_build_shared
gio_sources += files ('../glib/gtrace.c')
endif
gio_sources += appinfo_sources
gio_sources += contenttype_sources
gio_sources += gdbus_daemon_sources
gio_sources += unix_sources
gio_sources += win32_sources
gio_sources += application_sources
gio_sources += settings_sources
gio_sources += gdbus_sources
gio_sources += portal_sources
gio_sources += local_sources
MISSING_STUFF = '''
# 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 $@
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:$@
'''
gio_headers = files(
'gappinfo.h',
'gasyncinitable.h',
'gasyncresult.h',
'gbufferedinputstream.h',
'gbufferedoutputstream.h',
'gbytesicon.h',
'gcancellable.h',
'gcontenttype.h',
'gcharsetconverter.h',
'gconverter.h',
'gconverterinputstream.h',
'gconverteroutputstream.h',
'gdatagrambased.h',
'gdatainputstream.h',
'gdataoutputstream.h',
'gdebugcontroller.h',
'gdebugcontrollerdbus.h',
'gdrive.h',
'gemblem.h',
'gemblemedicon.h',
'gfile.h',
'gfileattribute.h',
'gfileenumerator.h',
'gfileicon.h',
'gfileinfo.h',
'gfileinputstream.h',
'gfilemonitor.h',
'gfilenamecompleter.h',
'gfileoutputstream.h',
'gfileiostream.h',
'gfilterinputstream.h',
'gfilteroutputstream.h',
'gicon.h',
'ginetaddress.h',
'ginetaddressmask.h',
'ginetsocketaddress.h',
'ginitable.h',
'ginputstream.h',
'gio.h',
'gio-autocleanups.h',
'gioenums.h',
'gioerror.h',
'giomodule.h',
'gioscheduler.h',
'giostream.h',
'giotypes.h',
'gloadableicon.h',
'gmount.h',
'gmemoryinputstream.h',
'gmemorymonitor.h',
'gmemoryoutputstream.h',
'gmountoperation.h',
'gnativesocketaddress.h',
'gnativevolumemonitor.h',
'gnetworkaddress.h',
'gnetworkmonitor.h',
'gnetworkservice.h',
'goutputstream.h',
'gpermission.h',
'gpollableinputstream.h',
'gpollableoutputstream.h',
'gpollableutils.h',
'gpowerprofilemonitor.h',
'gproxy.h',
'gproxyaddress.h',
'gproxyaddressenumerator.h',
'gproxyresolver.h',
'gresolver.h',
'gresource.h',
'gseekable.h',
'gsimpleasyncresult.h',
'gsimpleiostream.h',
'gsimplepermission.h',
'gsimpleproxyresolver.h',
'gsocket.h',
'gsocketaddress.h',
'gsocketaddressenumerator.h',
'gsocketclient.h',
'gsocketconnectable.h',
'gsocketconnection.h',
'gsocketcontrolmessage.h',
'gsocketlistener.h',
'gsocketservice.h',
'gsrvtarget.h',
'gsubprocess.h',
'gsubprocesslauncher.h',
'gtask.h',
'gtcpconnection.h',
'gtcpwrapperconnection.h',
'gthemedicon.h',
'gthreadedsocketservice.h',
'gtlsbackend.h',
'gtlscertificate.h',
'gtlsclientconnection.h',
'gtlsconnection.h',
'gtlsdatabase.h',
'gtlsfiledatabase.h',
'gtlsinteraction.h',
'gtlspassword.h',
'gtlsserverconnection.h',
'gdtlsconnection.h',
'gdtlsclientconnection.h',
'gdtlsserverconnection.h',
'gunixconnection.h',
'gunixcredentialsmessage.h',
'gunixfdlist.h',
'gunixsocketaddress.h',
'gvfs.h',
'gvolume.h',
'gvolumemonitor.h',
'gzlibcompressor.h',
'gzlibdecompressor.h',
'glistmodel.h',
'gliststore.h',
)
gio_visibility_h = custom_target(
output: 'gio-visibility.h',
command: [gen_visibility_macros, meson.project_version(), 'visibility-macros', 'GIO', '@OUTPUT@'],
install: true,
install_dir: gio_includedir,
# FIXME: Not needed with Meson >= 0.64.0
install_tag: 'devel',
)
gio_sources += gio_visibility_h
gio_headers += application_headers
gio_headers += settings_headers
gio_headers += gdbus_headers
install_headers(gio_headers, install_dir : gio_includedir)
# We can't use gnome.mkenums() because the GNOME module looks for glib-mkenums
# in PATH, which means you can't bootstrap glib with its own glib-mkenums.
gioenumtypes_h = custom_target('gioenumtypes_h',
output : 'gioenumtypes.h',
capture : true,
input : gio_headers,
install : true,
install_dir : gio_includedir,
# FIXME: Not needed with Meson >= 0.64.0
install_tag: 'devel',
command : [python, glib_mkenums,
'--template', files('gioenumtypes.h.template'),
'@INPUT@', gnetworking_h])
gioenumtypes_c = custom_target('gioenumtypes_c',
output : 'gioenumtypes.c',
capture : true,
input : gio_headers,
depends : [gioenumtypes_h],
command : [python, glib_mkenums,
'--template', files('gioenumtypes.c.template'),
'@INPUT@', gnetworking_h])
gioenumtypes_dep = declare_dependency(sources : [gioenumtypes_h, glib_enumtypes_h, gio_visibility_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
if have_bash
bash_comp_inst_dir = ''
if bash_comp_dep.found()
bash_comp_dir_override = bash_comp_dep.version().version_compare('>= 2.10') ? ['datadir', get_option('datadir')] : ['prefix', get_option('prefix')]
bash_comp_inst_dir = bash_comp_dep.get_variable('completionsdir', pkgconfig_define: bash_comp_dir_override)
endif
if bash_comp_inst_dir == ''
message('Found bash-completion but the .pc file did not set \'completionsdir\', fallback to a predefined path')
bash_comp_inst_dir = join_paths(get_option('datadir'), 'bash-completion/completions')
endif
install_data([
'completion/gapplication',
'completion/gdbus',
'completion/gio',
'completion/gsettings',
'completion/gresource'
],
install_dir: bash_comp_inst_dir,
install_tag: 'bin',
)
endif
if enable_dtrace
gio_dtrace_obj = dtrace_obj_gen.process('gio_probes.d')
gio_dtrace_hdr = dtrace_hdr_gen.process('gio_probes.d')
else
gio_dtrace_obj = []
gio_dtrace_hdr = []
endif
libgio = library('gio-2.0',
gioenumtypes_h, gioenumtypes_c, gnetworking_h, gio_sources,
gio_dtrace_hdr, gio_dtrace_obj,
version : library_version,
soversion : soversion,
darwin_versions : darwin_versions,
install : true,
include_directories : [configinc, gioinc],
# '$(gio_win32_res_ldflag)',
link_with: internal_deps,
dependencies : [libz_dep, libdl_dep, libmount_dep, libglib_dep,
libgobject_dep, libgmodule_dep, selinux_dep, xattr_dep,
platform_deps, network_libs, libsysprof_capture_dep,
gioenumtypes_dep, gvdb_dep],
c_args : [gio_c_args, gio_c_args_internal],
objc_args : [gio_c_args, gio_c_args_internal],
gnu_symbol_visibility : 'hidden',
# intl.lib is not compatible with SAFESEH
link_args : [noseh_link_args, glib_link_flags],
)
if get_option('gio_module_dir') != ''
pkgconfig_giomodulesdir = join_paths('${prefix}', get_option('gio_module_dir'))
else
pkgconfig_giomodulesdir = join_paths('${libdir}', 'gio', 'modules')
endif
schemas_subdir = join_paths('glib-2.0', 'schemas')
dtds_subdir = join_paths('glib-2.0', 'dtds')
libgio_dep = declare_dependency(link_with : libgio,
dependencies : [libgmodule_dep, libgobject_dep, gioenumtypes_dep],
include_directories : [gioinc],
variables : [
'schemasdir=' + join_paths(glib_datadir, schemas_subdir),
'giomoduledir=' + glib_giomodulesdir,
'dtdsdir=' + join_paths(glib_datadir, dtds_subdir)
],
)
pkg.generate(libgio,
requires : ['glib-2.0', 'gobject-2.0'],
variables : [
'schemasdir=' + '${datadir}' / schemas_subdir,
'dtdsdir=' + '${datadir}' / dtds_subdir,
'giomoduledir=' + pkgconfig_giomodulesdir,
'gio=' + '${bindir}' / 'gio',
'gio_querymodules=' + pkgconfig_multiarch_bindir / 'gio-querymodules',
'glib_compile_schemas=' + pkgconfig_multiarch_bindir / 'glib-compile-schemas',
'glib_compile_resources=' + '${bindir}' / 'glib-compile-resources',
'gdbus=' + '${bindir}' /'gdbus',
'gdbus_codegen=' + '${bindir}' / 'gdbus-codegen',
'gresource=' + '${bindir}' / 'gresource',
'gsettings=' + '${bindir}' / 'gsettings',
],
version : glib_version,
install_dir : glib_pkgconfigreldir,
filebase : 'gio-2.0',
name : 'GIO',
description : 'glib I/O library',
)
meson.override_dependency('gio-2.0', libgio_dep)
if host_system == 'windows'
pkg.generate(requires : ['gobject-2.0', 'gmodule-no-export-2.0', 'gio-2.0'],
subdirs : ['gio-win32-2.0'],
version : glib_version,
install_dir : glib_pkgconfigreldir,
filebase : 'gio-windows-2.0',
name : 'GIO Windows specific APIs',
description : 'Windows specific headers for glib I/O library',
)
meson.override_dependency('gio-windows-2.0', libgio_dep)
else
pkg.generate(requires : ['gobject-2.0', 'gio-2.0'],
subdirs : ['gio-unix-2.0'],
version : glib_version,
install_dir : glib_pkgconfigreldir,
filebase : 'gio-unix-2.0',
name : 'GIO unix specific APIs',
description : 'unix specific headers for glib I/O library',
)
meson.override_dependency('gio-unix-2.0', libgio_dep)
endif
if host_system == 'windows'
# Hack till https://github.com/mesonbuild/meson/issues/2324 is fixed
libgiounix_dep = dependency('', required : false)
libgiowin32_dep = libgio_dep
else
libgiowin32_dep = dependency('', required : false)
libgiounix_dep = libgio_dep
endif
# Dependencies used by executables below
have_libelf = false
libelf = dependency('libelf', version : '>= 0.8.12', required : false)
if libelf.found() and get_option('libelf').allowed()
have_libelf = true
else
# This fallback is necessary on *BSD. elfutils isn't the only libelf
# implementation, and *BSD usually includes their own libelf as a system
# library which doesn't have a corresponding .pc file.
libelf = cc.find_library('elf', required : get_option ('libelf'))
have_libelf = libelf.found()
have_libelf = have_libelf and cc.has_function('elf_begin', dependencies : libelf)
have_libelf = have_libelf and cc.has_function('elf_getshdrstrndx', dependencies : libelf)
have_libelf = have_libelf and cc.has_function('elf_getshdrnum', dependencies : libelf)
have_libelf = have_libelf and cc.has_header('libelf.h')
endif
if have_libelf
glib_conf.set('HAVE_LIBELF', 1)
else
libelf = []
endif
gconstructor_as_data_h = custom_target('gconstructor_as_data.h',
input : ['data-to-c.py', files('../glib/gconstructor.h')],
output : ['gconstructor_as_data.h'],
command : [python, '@INPUT0@', '@INPUT1@', 'gconstructor_code', '@OUTPUT@'])
# Several installed executables
gio_tool_sources = [
'gio-tool.c',
'gio-tool.h',
'gio-tool-cat.c',
'gio-tool-copy.c',
'gio-tool-info.c',
'gio-tool-launch.c',
'gio-tool-list.c',
'gio-tool-mime.c',
'gio-tool-mkdir.c',
'gio-tool-monitor.c',
'gio-tool-mount.c',
'gio-tool-move.c',
'gio-tool-open.c',
'gio-tool-rename.c',
'gio-tool-remove.c',
'gio-tool-save.c',
'gio-tool-set.c',
'gio-tool-trash.c',
'gio-tool-tree.c',
]
gio_tool = executable('gio', gio_tool_sources,
install : true,
install_tag : 'bin',
c_args : 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('gresource', 'gresource-tool.c',
install : true,
install_tag : 'bin',
# intl.lib is not compatible with SAFESEH
link_args : noseh_link_args,
dependencies : [libelf, libgio_dep, libgobject_dep, libgmodule_dep, libglib_dep])
gio_querymodules = executable('gio-querymodules', 'gio-querymodules.c', 'giomodule-priv.c',
install : true,
install_dir : multiarch_bindir,
install_tag : 'bin',
c_args : gio_c_args,
# intl.lib is not compatible with SAFESEH
link_args : noseh_link_args,
dependencies : [libgio_dep, libgobject_dep, libgmodule_dep, libglib_dep])
glib_compile_schemas = executable('glib-compile-schemas',
['glib-compile-schemas.c'],
install : true,
install_dir : multiarch_bindir,
install_tag : 'bin',
# intl.lib is not compatible with SAFESEH
link_args : noseh_link_args,
dependencies : [libgio_dep, libgobject_dep, libgmodule_dep, libglib_dep, gvdb_dep])
glib_compile_resources = executable('glib-compile-resources',
[gconstructor_as_data_h, 'glib-compile-resources.c'],
install : true,
install_tag : 'bin-devel',
c_args : gio_c_args,
# intl.lib is not compatible with SAFESEH
link_args : noseh_link_args,
dependencies : [libgio_dep, libgobject_dep, libgmodule_dep, libglib_dep, gvdb_dep])
install_data('gresource.dtd',
install_dir: get_option('datadir') / dtds_subdir,
install_tag: 'devel',
)
# Cannot override those programs in cross compilation case because they are
# native executables that cannot be run on the build machine.
# See https://gitlab.gnome.org/GNOME/glib/issues/1859.
if meson.can_run_host_binaries()
meson.override_find_program('glib-compile-schemas', glib_compile_schemas)
meson.override_find_program('glib-compile-resources', glib_compile_resources)
meson.override_find_program('gio-querymodules', gio_querymodules)
endif
executable('gsettings', 'gsettings-tool.c',
install : true,
install_tag : 'bin',
c_args : gio_c_args,
# intl.lib is not compatible with SAFESEH
link_args : noseh_link_args,
dependencies : [libgio_dep, libgobject_dep, libgmodule_dep, libglib_dep])
install_data('gschema.dtd',
install_dir : get_option('datadir') / schemas_subdir,
install_tag : 'devel',
)
install_data(['gschema.loc', 'gschema.its'],
install_dir : get_option('datadir') / 'gettext' / 'its',
install_tag : 'devel',
)
executable('gdbus', 'gdbus-tool.c',
install : true,
install_tag : 'bin',
c_args : gio_c_args,
# intl.lib is not compatible with SAFESEH
link_args : noseh_link_args,
dependencies : [libgio_dep, libgobject_dep, libgmodule_dep, libglib_dep])
if host_system != 'windows' and not glib_have_cocoa
executable('gapplication', 'gapplication-tool.c',
install : true,
install_tag : 'bin',
c_args : gio_c_args,
# intl.lib is not compatible with SAFESEH
link_args : noseh_link_args,
dependencies : [libgio_dep, libgobject_dep, libgmodule_dep, libglib_dep])
endif
if enable_systemtap
gio_stp = configure_file(input : 'gio.stp.in',
output : '@0@.stp'.format(libgio.full_path().split('/').get(-1)),
configuration : stp_cdata,
install_dir : tapset_install_dir,
install_tag : 'systemtap',
)
endif
if multiarch_bindir != get_option('bindir')
foreach exe : ['gio-querymodules', 'glib-compile-schemas']
install_symlink(
exe,
install_dir : get_option('bindir'),
pointing_to : get_option('prefix') / multiarch_bindir / exe,
)
endforeach
endif
if build_tests
subdir('tests')
endif
# The following is an example for building internal marshallers that are used
# by GIO. We cannot guarantee glib-genmarshal availability while building GLib
# so they are pre-generated and placed into gmarshal-internal.[ch].
#
# gmarshal_internal = gnome.genmarshal('gmarshal-internal',
# sources: 'gmarshal-internal.list',
# prefix: '_g_cclosure_marshal',
# valist_marshallers: true,
# internal: true,
# )