On 01/08/18 18:51, Eduardo Lima (Etrunko) wrote: > Signed-off-by: Eduardo Lima (Etrunko) <etrunko@xxxxxxxxxx> > --- > Makefile.am | 4 + > build-aux/meson/check-spice-common | 5 + > data/Makefile.am | 1 + > data/meson.build | 4 + > doc/Makefile.am | 2 + > doc/meson.build | 1 + > doc/reference/Makefile.am | 2 + > doc/reference/meson.build | 51 +++++ > man/Makefile.am | 1 + > man/meson.build | 11 + > meson.build | 440 +++++++++++++++++++++++++++++++++++++ > meson_options.txt | 102 +++++++++ > po/meson.build | 3 + > src/Makefile.am | 1 + > src/meson.build | 359 ++++++++++++++++++++++++++++++ > subprojects/spice-common | 2 +- > tests/Makefile.am | 2 + > tests/meson.build | 30 +++ > tools/Makefile.am | 2 + > tools/meson.build | 32 +++ > vapi/Makefile.am | 1 + > vapi/meson.build | 13 ++ > 22 files changed, 1068 insertions(+), 1 deletion(-) > create mode 100755 build-aux/meson/check-spice-common > create mode 100644 data/meson.build > create mode 100644 doc/meson.build > create mode 100644 doc/reference/meson.build > create mode 100644 man/meson.build > create mode 100644 meson.build > create mode 100644 meson_options.txt > create mode 100644 po/meson.build > create mode 100644 src/meson.build > create mode 100644 tests/meson.build > create mode 100644 tools/meson.build > create mode 100644 vapi/meson.build > > diff --git a/Makefile.am b/Makefile.am > index 875c25c..e9dfbe4 100644 > --- a/Makefile.am > +++ b/Makefile.am > @@ -25,7 +25,11 @@ endif > DISTCLEANFILES = $(pkgconfig_DATA) > > EXTRA_DIST = \ > + meson.build \ > + meson_options.txt \ > + po/meson.build \ > build-aux/git-version-gen \ > + build-aux/meson/check-spice-common \ > gtk-doc.make \ > .version \ > $(NULL) > diff --git a/build-aux/meson/check-spice-common b/build-aux/meson/check-spice-common > new file mode 100755 > index 0000000..a0d03a6 > --- /dev/null > +++ b/build-aux/meson/check-spice-common > @@ -0,0 +1,5 @@ > +#!/bin/sh > +set -e > +if git ls-files --error-unmatch ${MESON_SOURCE_ROOT}/subprojects/spice-common > /dev/null 2>&1; then > + git --git-dir="${MESON_SOURCE_ROOT}/.git" submodule update --init --recursive > +fi > diff --git a/data/Makefile.am b/data/Makefile.am > index 59e90f9..457079e 100644 > --- a/data/Makefile.am > +++ b/data/Makefile.am > @@ -1,6 +1,7 @@ > NULL= > > EXTRA_DIST = \ > + meson.build \ > org.spice-space.lowlevelusbaccess.policy \ > $(NULL) > > diff --git a/data/meson.build b/data/meson.build > new file mode 100644 > index 0000000..ba549eb > --- /dev/null > +++ b/data/meson.build > @@ -0,0 +1,4 @@ > +if spice_gtk_has_polkit > + install_data('org.spice-space.lowlevelusbaccess.policy', > + install_dir : spice_gtk_policy_dir) > +endif > diff --git a/doc/Makefile.am b/doc/Makefile.am > index 034926c..870cd26 100644 > --- a/doc/Makefile.am > +++ b/doc/Makefile.am > @@ -1,3 +1,5 @@ > SUBDIRS = reference > > +EXTRA_DIST = meson.build > + > -include $(top_srcdir)/git.mk > diff --git a/doc/meson.build b/doc/meson.build > new file mode 100644 > index 0000000..ead14c4 > --- /dev/null > +++ b/doc/meson.build > @@ -0,0 +1 @@ > +subdir('reference') > diff --git a/doc/reference/Makefile.am b/doc/reference/Makefile.am > index 9fda456..0cc26c9 100644 > --- a/doc/reference/Makefile.am > +++ b/doc/reference/Makefile.am > @@ -66,6 +66,8 @@ GTKDOC_LIBS = $(top_builddir)/src/libspice-client-glib-2.0.la $(top_builddir)/sr > > include $(top_srcdir)/gtk-doc.make > > +EXTRA_DIST += meson.build > + > # Comment this out if you want 'make check' to test you doc status > # and run some sanity checks > if ENABLE_GTK_DOC > diff --git a/doc/reference/meson.build b/doc/reference/meson.build > new file mode 100644 > index 0000000..7ac703f > --- /dev/null > +++ b/doc/reference/meson.build > @@ -0,0 +1,51 @@ > +ignore_headers = [ > + 'bio-gio.h', > + 'channel-display-priv.h', > + 'channel-usbredir-priv.h', > + 'client_sw_canvas.h', > + 'continuation.h', > + 'coroutine.h', > + 'decode.h', > + 'desktop-integration.h', > + 'display', > + 'gio-coroutine.h', > + 'giopipe.h', > + 'smartcard-manager-priv.h', > + 'spice-audio-priv.h', > + 'spice-channel-cache.h', > + 'spice-channel-priv.h', > + 'spice-cmdline.h', > + 'spice-common.h', > + 'spice-file-transfer-task-priv.h', > + 'spice-grabsequence-priv.h', > + 'spice-gstaudio.h', > + 'spice-gtk-session-priv.h', > + 'spice-marshal.h', > + 'spice-pulse.h', > + 'spice-session-priv.h', > + 'spice-uri-priv.h', > + 'spice-util-priv.h', > + 'spice-widget-priv.h', > + 'spicy-connect.h', > + 'usb-acl-helper.h', > + 'usb-device-manager-priv.h', > + 'usbdk_api.h', > + 'usbutil.h', > + 'vmcstream.h', > + 'vncdisplaykeymap.h', > + 'win-usb-dev.h', > +] > + > +spice_gtk_doc_dep = declare_dependency(include_directories: spice_gtk_include, > + link_args : spice_gtk_link_args, > + link_with : [spice_client_gtk_lib, spice_client_glib_lib]) > + > +gnome.gtkdoc('spice-gtk', > + content_files : ['spice-gtk-overrides.txt', 'spice-gtk-overrides.txt'], > + dependencies : spice_gtk_doc_dep, > + main_xml : 'spice-gtk-docs.xml', > + gobject_typesfile : files('spice-gtk.types'), > + ignore_headers : ignore_headers, > + install : true, > + scan_args : ['--deprecated-guards="SPICE_DISABLE_DEPRECATED"', '--ignore-decorators="G_GNUC_INTERNAL"'], > + src_dir : join_paths(meson.source_root(), 'src')) > diff --git a/man/Makefile.am b/man/Makefile.am > index a8f7e3f..7d5341b 100644 > --- a/man/Makefile.am > +++ b/man/Makefile.am > @@ -5,6 +5,7 @@ dist_man_MANS = \ > $(NULL) > > EXTRA_DIST = \ > + meson.build \ > spice-client.pod \ > $(NULL) > > diff --git a/man/meson.build b/man/meson.build > new file mode 100644 > index 0000000..de07ba4 > --- /dev/null > +++ b/man/meson.build > @@ -0,0 +1,11 @@ > +pod2man = find_program('pod2man') > + > +if pod2man.found() > + custom_target('spice-client.1', > + output : 'spice-client.1', > + input : 'spice-client.pod', > + install : true, > + install_dir : join_paths(spice_gtk_datadir, 'man', 'man1'), > + build_by_default : true, > + command : [pod2man, '-c', 'Spice-GTK Documentation', '@INPUT@', '@OUTPUT@']) > +endif > diff --git a/meson.build b/meson.build > new file mode 100644 > index 0000000..f556149 > --- /dev/null > +++ b/meson.build > @@ -0,0 +1,440 @@ > +# > +# project definition > +# > +project('spice-gtk', 'c', > + version : run_command('build-aux/git-version-gen', '${MESON_SOURCE_ROOT}/.tarball-version').stdout().strip(), > + license : 'LGPLv2.1', > + meson_version : '>= 0.47.0') > + > +# double check meson.project_version() > +# we can not use 'check' keyword in run_command() for git-version-gen above > +# https://github.com/mesonbuild/meson/issues/3944 > +version = run_command('build-aux/git-version-gen', '${MESON_SOURCE_ROOT}/.tarball-version', check : true).stdout().strip() > +if meson.project_version() != version > + error('Wrong project version') > +endif > + > +message('Updating submodules') > +run_command('build-aux/meson/check-spice-common', check : true) > + > +# > +# global C defines > +# > +spice_gtk_prefix = get_option('prefix') > +spice_gtk_bindir = join_paths(spice_gtk_prefix, get_option('bindir')) > +spice_gtk_datadir = join_paths(spice_gtk_prefix, get_option('datadir')) > +spice_gtk_localedir = join_paths(spice_gtk_datadir, 'locale') > +spice_gtk_includedir = join_paths(spice_gtk_prefix, get_option('includedir')) > +spice_gtk_global_cflags = ['-DHAVE_CONFIG_H', > + '-DSPICE_COMPILATION', > + '-DG_LOG_DOMAIN="GSpice"', > + #'-Werror', > + '-Wall', > + '-Wextra', > + '-Wno-sign-compare', > + '-Wno-unused-parameter', > + ] > + > +foreach arg : spice_gtk_global_cflags > + add_project_arguments(arg, language : 'c') > +endforeach > + > +# other global vars > +compiler = meson.get_compiler('c') > +spice_gtk_config_data = configuration_data() > +spice_protocol_min_version='0.12.13' > +spice_gtk_include = [include_directories('.')] > +spice_gtk_c_args = [] > +spice_gtk_libs = [] > +spice_gtk_deps = [] > +spice_gtk_link_args = [] > +spice_gtk_host_system = host_machine.system() > + > +# > +# Spice common subproject > +# > +spice_common = subproject('spice-common', default_options : ['generate-code=client']) > +spice_gtk_config_data.merge_from(spice_common.get_variable('spice_common_config_data')) > +spice_gtk_deps += spice_common.get_variable('spice_common_client_dep') > + > +# > +# check for system headers > +# > +headers = ['termios.h', > + 'X11/XKBlib.h'] > + > +foreach header : headers > + if compiler.has_header(header) > + spice_gtk_config_data.set('HAVE_@0@'.format(header.underscorify().to_upper()), '1') > + endif > +endforeach > + > +spice_gtk_has_egl = compiler.has_header('epoxy/egl.h') > +if spice_gtk_has_egl > + spice_gtk_config_data.set('HAVE_EPOXY_EGL_H', '1') > + spice_gtk_config_data.set('HAVE_EGL', '1') # FIXME: Use single define? > +endif > + > +# > +# check for system functions > +# > +foreach func : ['clearenv', 'strtok_r'] > + if compiler.has_function(func) > + spice_gtk_config_data.set('HAVE_@0@'.format(func.underscorify().to_upper()), '1') > + endif > +endforeach > + > +# > +# check for mandatory dependencies > +# > +spice_protocol_version='0.12.15' > + > +glib_version = '2.38' > +glib_version_info = '>= @0@'.format(glib_version) > +pixman_version = '>= 0.17.7' > + > +deps = {'spice-protocol' : '>= @0@'.format(spice_protocol_version), > + 'glib-2.0' : glib_version_info, > + 'gio-2.0' : glib_version_info, > + 'gobject-2.0' : glib_version_info, > + 'pixman-1' : pixman_version, > + 'openssl' : '>= 1.0.0'} > + > +foreach dep, version : deps > + spice_gtk_deps += dependency(dep, version : version) > +endforeach > + > +# TODO: specify minimum version for cairo, jpeg and zlib? > +deps = ['cairo', 'libjpeg', 'zlib'] > +if spice_gtk_host_system == 'windows' > + deps += 'gio-windows-2.0' > +else > + deps += 'gio-unix-2.0' > +endif > + > +foreach dep : deps > + spice_gtk_deps += dependency(dep) > +endforeach > + > +deps = ['librt', 'libm'] > +if spice_gtk_host_system == 'windows' > + deps += ['libws2_32', 'libgdi32'] > +endif > + > +foreach dep : deps > + spice_gtk_deps += compiler.find_library(dep) > +endforeach > + > +# > +# Non-mandatory/optional dependencies > +# > +optional_deps = {'celt051' : '>= 0.5.1.1', > + 'opus' : '>= 0.9.14'} > +foreach dep, version : optional_deps > + d = dependency(dep, required : get_option(dep), version : version) > + if d.found() > + spice_server_deps += d > + spice_server_config_data.set('HAVE_@0@'.format(dep.underscorify().to_upper()), '1') Meh, I've sent this from a wrong branch, with no commit message at all and these "spice_server_" variables. Follow up coming soon. > + endif > +endforeach > + > +# gtk > +spice_gtk_has_gtk = false > +spice_gtk_gtk_version_required = '>= 3.12' > +if get_option('gtk') > + gtk_dep = dependency('gtk+-3.0', version : spice_gtk_gtk_version_required) > + gtk_encoded_version='GDK_VERSION_3_12' > + spice_gtk_c_args += ['-DGDK_VERSION_MIN_REQUIRED=@0@'.format(gtk_encoded_version), > + '-DGDK_VERSION_MAX_ALLOWED=@0@'.format(gtk_encoded_version)] > + if compiler.has_function('gdk_event_get_scancode', dependencies : gtk_dep) > + spice_gtk_config_data.set('HAVE_GDK_EVENT_GET_SCANCODE', '1') > + endif > + spice_gtk_deps += gtk_dep > + spice_gtk_deps += dependency('x11') > + if spice_gtk_host_system != 'windows' > + spice_gtk_deps += dependency('epoxy') > + endif > + spice_gtk_has_gtk = true > +endif > + > +# webdav > +spice_gtk_has_phodav = false > +if get_option('webdav') > + spice_gtk_deps += dependency('libphodav-2.0') > + spice_gtk_deps += dependency('libsoup-2.4', version : '>= 2.49.91') > + spice_gtk_config_data.set('USE_PHODAV', '1') > + spice_gtk_has_phodav = true > +endif > + > +# pulse > +spice_gtk_has_pulse = false > +if get_option('pulse') > + deps = ['libpulse', 'libpulse-mainloop-glib'] > + foreach dep : deps > + spice_gtk_deps += dependency(dep) > + endforeach > + spice_gtk_config_data.set('HAVE_PULSE', '1') > + spice_gtk_has_pulse = true > +endif > + > +# gstaudio > +gst_base_deps = ['gstreamer-1.0', 'gstreamer-base-1.0', 'gstreamer-app-1.0'] > +spice_gtk_has_gstaudio = false > +if get_option('gstaudio') > + deps = gst_base_deps + ['gstreamer-audio-1.0'] > + foreach dep : deps > + spice_gtk_deps += dependency(dep) > + endforeach > + spice_gtk_config_data.set('HAVE_GSTAUDIO', '1') > + spice_gtk_has_gstaudio = true > +endif > + > +# gstvideo > +spice_gtk_has_gstvideo = false > +if get_option('gstvideo') > + deps = ['gstreamer-video-1.0'] > + if not spice_gtk_has_gstaudio > + deps += gst_base_deps > + endif > + foreach dep : deps > + spice_gtk_deps += dependency(dep) > + endforeach > + spice_gtk_config_data.set('HAVE_GSTVIDEO', '1') > + spice_gtk_has_gstvideo = true > +endif > + > +# builtin-mjpeg > +spice_gtk_has_builtin_mjpeg = false > +if get_option('builtin-mjpeg') > + spice_gtk_config_data.set('HAVE_BUILTIN_MJPEG', '1') > + spice_gtk_has_builtin_mjpeg = true > +endif > + > +if not spice_gtk_has_gstvideo and not spice_gtk_has_builtin_mjpeg > + warning('No builtin MJPEG or GStreamer decoder, video will not be streamed') > +endif > + > +# usbredir > +spice_gtk_has_usbredir = false > +if get_option('usbredir') > + usb_dep = dependency('libusbredirparser-0.5', required : false) > + if not usb_dep.found() > + usb_dep = dependency('libusbredirparser', version : '>= 0.4') > + endif > + spice_gtk_deps += usb_dep > + > + deps = {'libusbredirhost' : '>= 0.4.2', > + 'libusb-1.0' : '>= 1.0.9'} > + > + foreach dep, version : deps > + usb_dep = dependency(dep, version : version) > + spice_gtk_deps += usb_dep > + endforeach > + > + if spice_gtk_host_system != 'windows' > + if usb_dep.version().version_compare('>= 1.0.16') > + spice_gtk_config_data.set('USE_LIBUSB_HOTPLUG', '1') > + else > + spice_gtk_deps += dependency('gudev-1.0') > + spice_gtk_config_data.set('USE_GUDEV', '1') > + endif > + endif > + > + spice_gtk_config_data.set('USE_USBREDIR', '1') > + spice_gtk_has_usbredir = true > +endif > + > +# polkit > +spice_gtk_has_polkit = false > +if get_option('polkit') > + polkit_dep = dependency('polkit-gobject-1', version : '>= 0.96')# ,required : false) > + if polkit_dep.found() > + spice_gtk_policy_dir = polkit_dep.get_pkgconfig_variable('policydir') > + foreach func : ['polkit_authority_get_sync', 'polkit_authorization_result_get_dismissed'] > + if compiler.has_function(func, dependencies : polkit_dep) > + spice_gtk_config_data.set('HAVE_@0@'.format(func.to_upper()), '1') > + endif > + endforeach > + > + if not compiler.has_function('acl_get_file') > + acl_dep = compiler.find_library('acl') > + if not compiler.has_function('acl_get_file', dependencies : acl_dep) > + error('PolicyKit support requested, but some required packages are not available') > + endif > + spice_gtk_deps += acl_dep > + endif > + endif > + > + spice_gtk_deps += polkit_dep > + spice_gtk_config_data.set('USE_POLKIT', '1') > + spice_gtk_has_polkit = true > +endif > + > +if spice_gtk_has_usbredir and not spice_gtk_has_polkit > + warning('Building with usbredir support, but *not* building the usb acl helper') > +endif > + > +# pie > +spice_gtk_has_pie = false > +if get_option('pie') > + spice_gtk_has_pie = true > +endif > + > +# usb-acl-helper-dir > +spice_gtk_usb_acl_helper_dir = get_option('usb-acl-helper-dir') > +if spice_gtk_usb_acl_helper_dir.strip() == '' > + spice_gtk_usb_acl_helper_dir = spice_gtk_bindir > +endif > +spice_gtk_config_data.set_quoted('ACL_HELPER_PATH', spice_gtk_usb_acl_helper_dir) > + > +# usb-ids-path > +spice_gtk_usb_ids_path = get_option('usb-ids-path') > +if spice_gtk_usb_ids_path.strip() == '' > + usbutils = dependency('usbutils', required : false) > + if usbutils.found() > + spice_gtk_usb_ids_path = usbutils.get_pkgconfig_variable('usbids') > + endif > +endif > + > +if spice_gtk_usb_ids_path.strip() != '' > + spice_gtk_config_data.set('WITH_USBIDS', '1') > + spice_gtk_config_data.set_quoted('USB_IDS', spice_gtk_usb_ids_path) > +endif > + > +# coroutine > +spice_gtk_coroutine = get_option('coroutine') > +if spice_gtk_coroutine == 'ucontext' > + if compiler.has_function('makecontext') and compiler.has_function('swapcontext') and compiler.has_function('getcontext') > + spice_gtk_config_data.set('WITH_UCONTEXT', '1') > + if spice_gtk_host_system == 'darwin' > + spice_gtk_config_data.set('_XOPEN_SOURCE', '1') > + endif > + else > + spice_gtk_coroutine = 'gthread' > + endif > +endif > + > +if spice_gtk_coroutine == 'gthread' > + spice_gtk_config_data.set('WITH_GTHREAD', '1') > +endif > + > +if spice_gtk_coroutine == 'winfiber' > + spice_gtk_config_data.set('WITH_WINFIBER', '1') > +endif > + > +# introspection > +spice_gtk_has_introspection = false > +if get_option('introspection') > + spice_gtk_deps += dependency('gobject-introspection-1.0', version : '>= 0.94') > + spice_gtk_has_introspection = true > +endif > + > +# vala (depends on introspection) > +spice_gtk_has_vala = false > +if spice_gtk_has_introspection and get_option('vapi') > + vapigen_dep = dependency('vapigen') > + vapidir = vapigen_dep.get_pkgconfig_variable('vapidir') > + vapigen = dependency('vapigen').get_pkgconfig_variable('vapigen') > + spice_gtk_has_vala = true > +endif > + > +# dbus > +if get_option('dbus') > + spice_gtk_config_data.set('USE_GDBUS', '1') > +else > + warning('No D-Bus support, desktop integration and USB redirection may not work properly') > +endif > + > +# lz4 > +spice_gtk_has_lz4 = false > +if get_option('lz4') > + lz4_dep = dependency('liblz4', required : false, version : '>= 129') > + if not lz4_dep.found() > + lz4_dep = dependency('liblz4', version : '>= 1.7.3') > + endif > + > + spice_gtk_deps += lz4_dep > + spice_gtk_config_data.set('USE_LZ4', '1') > + spice_gtk_has_lz4 = true > +endif > + > +# sasl > +spice_gtk_has_sasl = false > +if get_option('sasl') > + spice_gtk_deps += dependency('libsasl2') > + spice_gtk_config_data.set('HAVE_SASL', '1') > + spice_gtk_has_sasl = true > +endif > + > +# smartcard check > +spice_gtk_has_smartcard = false > +if get_option('smartcard') > + smartcard_dep = dependency('libcacard', required : false, version : '>= 2.5.1') > + if smartcard_dep.found() > + spice_gtk_deps += smartcard_dep > + spice_gtk_config_data.set('USE_SMARTCARD', '1') > + else > + smartcard012_dep = dependency('libcacard', required : false, version : '>= 0.1.2') > + if smartcard012_dep.found() > + spice_gtk_deps += smartcard012_dep > + spice_gtk_config_data.set('USE_SMARTCARD_012', '1') > + endif > + endif > + > + spice_gtk_has_smartcard = smartcard_dep.found() or smartcard012_dep.found() > + if not spice_gtk_has_smartcard > + error('Building with smartcard support but dependency not found') > + endif > +endif > + > +# > +# Subdirectories > +# > +subdir('src') > +subdir('tools') > +subdir('tests') > +subdir('doc') > +subdir('data') > +subdir('man') > +subdir('po') > +subdir('vapi') > + > +# > +# write config.h > +# > +proj_version = meson.project_version() > +proj_name = meson.project_name() > +config_data = {'VERSION' : proj_version, > + 'PACKAGE_VERSION' : proj_version, > + 'GETTEXT_PACKAGE' : proj_name, > + 'LOCALE_DIR' : spice_gtk_localedir, > + 'PACKAGE_STRING' : '@0@ @1@'.format(proj_name, proj_version), > + 'PACKAGE_BUGREPORT' : 'spice-devel@xxxxxxxxxxxxxxxxxxxxx'} > +foreach key, value : config_data > + spice_gtk_config_data.set_quoted(key, value) > +endforeach > + > +configure_file(output : 'config.h', > + install : false, > + configuration : spice_gtk_config_data) > + > +# > +# write spice-client-glib.pc > +# > +pkgconfig = import('pkgconfig') > +pkgconfig.generate(spice_client_glib_lib, > + description : 'SPICE Client GLib 2.0 library', > + subdirs : 'spice-client-glib-2.0', > + requires : 'spice-protocol >= @0@'.format(spice_protocol_min_version), > + variables : 'exec_prefix=${prefix}') > + > +# > +# write spice-client-gtk.pc > +# > +if spice_gtk_has_gtk > + pkgconfig.generate(spice_client_gtk_lib, > + description : 'SPICE Client Gtk 3.0 library', > + subdirs : 'spice-client-gtk-3.0', > + requires : 'spice-client-glib-2.0 gtk+3.0 @0@'.format(spice_gtk_gtk_version_required), > + variables : 'exec_prefix=${prefix}') > +endif > diff --git a/meson_options.txt b/meson_options.txt > new file mode 100644 > index 0000000..c09d440 > --- /dev/null > +++ b/meson_options.txt > @@ -0,0 +1,102 @@ > +option('gtk', > + type : 'boolean', > + value : true, > + description: 'Enable gtk+') > + > +option('webdav', > + type : 'boolean', > + value : true, > + description: 'Enable webdav support') > + > +option('pulse', > + type : 'boolean', > + value : true, > + description: 'Enable the PulseAudio backend') > + > +option('gstaudio', > + type : 'boolean', > + value : true, > + description : 'Enable the GStreamer 1.0 audio backend') > + > +option('gstvideo', > + type : 'boolean', > + value : true, > + description : 'Enable GStreamer video support') > + > +option('builtin-mjpeg', > + type : 'boolean', > + value : true, > + description : 'Enable the builtin mjpeg video decoder') > + > +option('usbredir', > + type : 'boolean', > + value : true, > + description : 'Enable usbredir support') > + > +option('polkit', > + type : 'boolean', > + value : true, > + description : 'Enable PolicyKit support for the USB acl helper') > + > +option('pie', > + type : 'boolean', > + value : true, > + description : 'Enable position-independent-executable support for the USB acl helper') > + > +option('usb-acl-helper-dir', > + type : 'string', > + value : '', > + description : 'Directory where the USB ACL helper binary should be installed') > + > +option('usb-ids-path', > + type : 'string', > + value : '', > + description : 'Specify the path to usb.ids') > + > +option('coroutine', > + type : 'combo', > + choices : ['ucontext', 'gthread', 'winfiber'], > + description : 'Use ucontext or GThread for coroutines') > + > +option('introspection', > + type : 'boolean', > + value : true, > + description: 'Check for GObject instrospection requirements') > + > +option('vapi', > + type : 'boolean', > + value : true, > + description: 'Check for vala requirements') > + > +option('dbus', > + type : 'boolean', > + value : true, > + description: 'Enable dbus support for desktop integration (disabling automount)') > + > +option('alignment-checks', > + type : 'boolean', > + value : false, > + description : 'Enable runtime checks for cast alignment') > + > +option('lz4', > + type : 'boolean', > + value : true, > + description: 'Enable lz4 compression support') > + > +option('sasl', > + type : 'boolean', > + value : true, > + description : 'Use cyrus SASL authentication') > + > +option('celt051', > + type : 'feature', > + description: 'Enable celt051 audio codec') > + > +option('opus', > + type : 'feature', > + description: 'Enable Opus audio codec') > + > +option('smartcard', > + type : 'boolean', > + value : true, > + description : 'Enable smartcard support') > diff --git a/po/meson.build b/po/meson.build > new file mode 100644 > index 0000000..60c27a7 > --- /dev/null > +++ b/po/meson.build > @@ -0,0 +1,3 @@ > +i18n = import('i18n') > +i18n.gettext(meson.project_name(), > + args : '--directory=@0@'.format(meson.source_root())) > diff --git a/src/Makefile.am b/src/Makefile.am > index afad922..68dc5d9 100644 > --- a/src/Makefile.am > +++ b/src/Makefile.am > @@ -25,6 +25,7 @@ CLEANFILES = $(GLIBGENS) $(KEYMAPS) > BUILT_SOURCES = $(GLIBGENS) $(KEYMAPS) > > EXTRA_DIST = \ > + meson.build \ > decode-glz-tmpl.c \ > $(KEYMAPS) \ > $(KEYMAP_CSV) \ > diff --git a/src/meson.build b/src/meson.build > new file mode 100644 > index 0000000..6ec2551 > --- /dev/null > +++ b/src/meson.build > @@ -0,0 +1,359 @@ > +spice_gtk_include += [include_directories('.')] > + > +# > +# Source files for spice-client-glib > +# > + > +# generate spice-version.h > +version_info = meson.project_version().split('.') > +major = '@0@'.format(version_info[0]) > +minor = '@0@'.format(version_info[1]) > +micro = version_info[2].split('-')[0] > +if micro == '' > + micro = '0' > +endif > +version_data = configuration_data() > +version_data.set('SPICE_GTK_MAJOR_VERSION', major) > +version_data.set('SPICE_GTK_MINOR_VERSION', minor) > +version_data.set('SPICE_GTK_MICRO_VERSION', micro) > +spice_version_h = configure_file(input : 'spice-version.h.in', > + output : 'spice-version.h', > + configuration : version_data) > + > +spice_client_glib_headers = [ > + spice_version_h, > + 'channel-cursor.h', > + 'channel-display.h', > + 'channel-inputs.h', > + 'channel-main.h', > + 'channel-playback.h', > + 'channel-port.h', > + 'channel-record.h', > + 'channel-smartcard.h', > + 'channel-usbredir.h', > + 'channel-webdav.h', > + 'smartcard-manager.h', > + 'spice-audio.h', > + 'spice-channel.h', > + 'spice-client.h', > + 'spice-file-transfer-task.h', > + 'spice-option.h', > + 'spice-session.h', > + 'spice-types.h', > + 'spice-uri.h', > + 'spice-util.h', > + 'usb-device-manager.h', > +] > + > +install_headers(spice_client_glib_headers, subdir : 'spice-client-glib-2.0') > + > +# generate spice-marshal.[ch] > +gnome = import('gnome') > +spice_marshals = gnome.genmarshal('spice-marshal', sources : 'spice-marshal.txt') > + > +# generate spice-glib-enums.[ch] > +spice_client_glib_enums = gnome.mkenums_simple('spice-glib-enums', > + sources : ['spice-channel.h', 'channel-inputs.h', 'spice-session.h'], > + install_header : true, > + install_dir : join_paths(spice_gtk_includedir, 'spice-client-glib-2.0')) > + > +spice_client_glib_introspection_sources = [ > + spice_client_glib_headers, > + spice_client_glib_enums, > + 'channel-cursor.c', > + 'channel-display.c', > + 'channel-inputs.c', > + 'channel-main.c', > + 'channel-playback.c', > + 'channel-port.c', > + 'channel-record.c', > + 'channel-smartcard.c', > + 'channel-usbredir.c', > + 'channel-webdav.c', > + 'smartcard-manager.c', > + 'spice-audio.c', > + 'spice-channel.c', > + 'spice-client.c', > + 'spice-option.c', > + 'spice-session.c', > + 'spice-util.c', > + 'usb-device-manager.c', > +] > + > +spice_client_glib_sources = [ > + spice_marshals, > + spice_client_glib_introspection_sources, > + 'bio-gio.c', > + 'bio-gio.h', > + 'channel-base.c', > + 'channel-display-priv.h', > + 'channel-playback-priv.h', > + 'channel-usbredir-priv.h', > + 'client_sw_canvas.c', > + 'client_sw_canvas.h', > + 'coroutine.h', > + 'decode-glz.c', > + 'decode.h', > + 'decode-jpeg.c', > + 'decode-zlib.c', > + 'gio-coroutine.c', > + 'gio-coroutine.h', > + 'smartcard-manager-priv.h', > + 'spice-audio-priv.h', > + 'spice-channel-cache.h', > + 'spice-channel-priv.h', > + 'spice-common.h', > + 'spice-file-transfer-task.c', > + 'spice-file-transfer-task-priv.h', > + 'spice-glib-main.c', > + 'spice-option.h', > + 'spice-session-priv.h', > + 'spice-uri.c', > + 'spice-uri-priv.h', > + 'spice-util-priv.h', > + 'usb-device-manager-priv.h', > + 'usbutil.c', > + 'usbutil.h', > + 'vmcstream.c', > + 'vmcstream.h', > +] > + > +if spice_gtk_has_builtin_mjpeg > + spice_client_glib_sources += 'channel-display-mjpeg.c' > +endif > + > +if spice_gtk_has_gstaudio > + spice_client_glib_sources += ['spice-gstaudio.c', > + 'spice-gstaudio.h'] > +endif > + > +if spice_gtk_has_gstvideo > + spice_client_glib_sources += 'channel-display-gst.c' > +endif > + > +if spice_gtk_has_polkit > + spice_client_glib_sources += ['usb-acl-helper.c', > + 'usb-acl-helper.h'] > +endif > + > +if spice_gtk_has_phodav > + spice_client_glib_sources += ['giopipe.c', > + 'giopipe.h'] > +endif > + > +if spice_gtk_has_pulse > + spice_client_glib_sources += ['spice-pulse.c', > + 'spice-pulse.h'] > +endif > + > +if spice_gtk_coroutine == 'gthread' > + spice_client_glib_sources += 'coroutine_gthread.c' > +elif spice_gtk_coroutine == 'ucontext' > + spice_client_glib_sources += ['continuation.c', > + 'continuation.h', > + 'coroutine_ucontext.c'] > +elif spice_gtk_coroutine == 'winfiber' > + spice_client_glib_sources += 'coroutine_winfibers.c' > +endif > + > +if spice_gtk_has_usbredir and spice_gtk_host_system == 'windows' > + spice_client_glib_sources += ['usbdk_api.c', > + 'usbdk_api.h', > + 'win-usb-dev.c', > + 'win-usb-dev.h'] > +endif > + > +# > +# libspice-client-glib-2.0.so > +# > + > +# custom link_args > + > +# version-script > +spice_client_glib_syms = files('map-file') > +spice_client_glib_syms_path = join_paths(meson.current_source_dir(), 'map-file') > +spice_gtk_version_script = '-Wl,--version-script=@0@'.format(spice_client_glib_syms_path) > +spice_gtk_has_version_script = compiler.has_link_argument(spice_gtk_version_script) > +if not spice_gtk_has_version_script > + spice_client_glib_syms = files('spice-glib-sym-file') > + spice_client_glib_syms_path = join_paths(meson.current_source_dir(), 'spice-glib-sym-file') > + spice_gtk_version_script = ['-export-symbols', spice_client_glib_syms_path] > +endif > + > +spice_client_glib_lib = library('spice-client-glib-2.0', spice_client_glib_sources, > + version : '8.6.0', > + install : true, > + include_directories : spice_gtk_include, > + c_args : spice_gtk_c_args, > + link_args : spice_gtk_link_args + [spice_gtk_version_script], > + link_depends : spice_client_glib_syms, > + link_with : spice_gtk_libs, > + dependencies : spice_gtk_deps) > + > +spice_client_glib_dep = declare_dependency(sources : [spice_marshals[1], spice_client_glib_enums[1]], > + link_with : spice_client_glib_lib, > + include_directories : spice_gtk_include, > + compile_args : spice_gtk_c_args, > + link_args : spice_gtk_link_args, > + dependencies : spice_gtk_deps) > + > +# > +# SpiceClientGLib-2.0.gir > +# > +spice_client_glib_introspection_dep = declare_dependency(include_directories: spice_gtk_include, > + link_args : spice_gtk_link_args, > + link_with : spice_client_glib_lib) > + > +spice_client_glib_gir = gnome.generate_gir(spice_client_glib_lib, > + build_by_default : spice_gtk_has_introspection, > + dependencies : spice_client_glib_introspection_dep, > + export_packages : 'spice-client-glib-2.0', > + extra_args : ['--accept-unprefixed'], > + header : 'spice-client.h', > + includes : ['GObject-2.0', 'Gio-2.0'], > + identifier_prefix : 'Spice', > + symbol_prefix : 'spice', > + install : spice_gtk_has_introspection, > + namespace : 'SpiceClientGLib', > + nsversion : '2.0', > + sources : spice_client_glib_introspection_sources) > + > +# > +# spice-client-glib-usb-acl-helper > +# > +if spice_gtk_has_polkit > + usb_acl_helper_c_args = spice_gtk_c_args > + usb_acl_helper_link_args = spice_gtk_link_args > + > + if spice_gtk_has_pie > + usb_acl_helper_c_args += compiler.get_supported_arguments(['-fPIE']) > + usb_acl_helper_link_args += compiler.get_supported_link_arguments(['-pie', '-Wl,-z,relro', '-Wl,-z,now']) > + endif > + executable('spice-client-glib-usb-acl-helper', > + 'spice-client-glib-usb-acl-helper.c', > + include_directories : spice_gtk_include, > + install : true, > + install_dir : spice_gtk_usb_acl_helper_dir, > + install_mode : ['rwsr-xr-x', 'root', 'root'], > + c_args : usb_acl_helper_c_args, > + link_args : usb_acl_helper_link_args, > + dependencies : spice_gtk_deps) > +endif > + > + > +if spice_gtk_has_gtk > + # > + # Source files for spice-client-gtk > + # > + > + spice_client_gtk_headers = [ > + 'spice-client-gtk.h', > + 'spice-grabsequence.h', > + 'spice-gtk-session.h', > + 'spice-widget.h', > + 'usb-device-widget.h', > + ] > + > + install_headers(spice_client_gtk_headers, subdir : 'spice-client-gtk-3.0') > + > + # generate spice-widget-enums.[ch] > + spice_widget_enums = gnome.mkenums_simple('spice-widget-enums', > + sources : 'spice-widget.h', > + install_header : true, > + install_dir : join_paths(spice_gtk_includedir, 'spice-client-gtk-3.0')) > + > + spice_client_gtk_introspection_sources = [ > + spice_client_gtk_headers, > + spice_widget_enums, > + 'spice-grabsequence.c', > + 'spice-gtk-session.c', > + 'spice-widget.c', > + 'usb-device-widget.c', > + ] > + > + spice_client_gtk_sources = [ > + spice_marshals, > + spice_client_gtk_introspection_sources, > + 'desktop-integration.c', > + 'desktop-integration.h', > + 'spice-file-transfer-task.h', > + 'spice-grabsequence.h', > + 'spice-grabsequence-priv.h', > + 'spice-gtk-session-priv.h', > + 'spice-util.c', > + 'spice-util-priv.h', > + 'spice-widget-cairo.c', > + 'spice-widget-priv.h', > + 'vncdisplaykeymap.c', > + 'vncdisplaykeymap.h', > + ] > + > + if spice_gtk_has_egl > + spice_client_gtk_sources += 'spice-widget-egl.c' > + endif > + > + # keymaps > + python = import('python3').find_python() > + keymapgen = files('./keycodemapdb/tools/keymap-gen') > + keymapcsv = files('./keycodemapdb/data/keymaps.csv') > + keymaps = ['xorgevdev', > + 'xorgkbd', > + 'xorgxquartz', > + 'xorgxwin', > + 'osx', > + 'win32', > + 'x11'] > + > + foreach keymap : keymaps > + varname = 'keymap_@0@2xtkbd'.format(keymap) > + target = 'vncdisplay@0@.c'.format(varname) > + cmd = [python, keymapgen, '--lang', 'glib2', '--varname', varname, 'code-map', keymapcsv, keymap, 'xtkbd'] > + custom_target(target, > + output : target, > + capture : true, > + build_by_default: true, > + command : cmd) > + endforeach > + > + # > + # libspice-client-gtk.so > + # > + spice_client_gtk_syms = spice_client_glib_syms > + if not spice_gtk_has_version_script > + spice_client_gtk_syms = files('spice-gtk-sym-file') > + spice_client_gtk_syms_path = join_paths(meson.current_source_dir(), 'spice-gtk-sym-file') > + spice_gtk_version_script = ['-export-symbols', spice_client_gtk_syms_path] > + endif > + > + spice_client_gtk_lib = library('spice-client-gtk-3.0', spice_client_gtk_sources, > + version : '5.0.0', > + install : true, > + link_args : spice_gtk_link_args + [spice_gtk_version_script], > + link_depends : spice_client_gtk_syms, > + dependencies : spice_client_glib_dep) > + > + spice_client_gtk_dep = declare_dependency(sources : spice_widget_enums[1], > + link_with : spice_client_gtk_lib, > + dependencies : spice_client_glib_dep) > + > + # > + # SpiceClientGtk-3.0.gir > + # > + spice_client_gtk_introspection_dep = declare_dependency(include_directories: spice_gtk_include, > + link_args : spice_gtk_link_args, > + link_with : [spice_client_gtk_lib, spice_client_glib_lib]) > + > + spice_client_gtk_gir = gnome.generate_gir(spice_client_gtk_lib, > + build_by_default : spice_gtk_has_introspection, > + dependencies : spice_client_gtk_introspection_dep, > + export_packages : 'spice-client-gtk-3.0', > + extra_args : ['--accept-unprefixed'], > + header : 'spice-widget.h', > + includes : ['GObject-2.0', 'Gtk-3.0', 'SpiceClientGLib-2.0'], > + identifier_prefix : 'Spice', > + symbol_prefix : 'spice', > + install : spice_gtk_has_introspection, > + namespace : 'SpiceClientGtk', > + nsversion : '3.0', > + sources : spice_client_gtk_introspection_sources) > +endif > diff --git a/subprojects/spice-common b/subprojects/spice-common > index f82a6c5..5dd0c2f 160000 > --- a/subprojects/spice-common > +++ b/subprojects/spice-common > @@ -1 +1 @@ > -Subproject commit f82a6c5349a9a71485910bd3a57fe588c49d74f8 > +Subproject commit 5dd0c2f70a871f397b6550bde1eda91e9d4a8ad4 > diff --git a/tests/Makefile.am b/tests/Makefile.am > index 3a0188d..bfa43a3 100644 > --- a/tests/Makefile.am > +++ b/tests/Makefile.am > @@ -1,5 +1,7 @@ > NULL = > > +EXTRA_DIST = meson.build > + > noinst_PROGRAMS = > TESTS = test-coroutine \ > test-util \ > diff --git a/tests/meson.build b/tests/meson.build > new file mode 100644 > index 0000000..6c80776 > --- /dev/null > +++ b/tests/meson.build > @@ -0,0 +1,30 @@ > +tests_sources = [ > + 'util.c', > + 'coroutine.c', > + 'session.c', > + 'uri.c', > + 'file-transfer.c', > +] > + > +if spice_gtk_has_phodav > + tests_sources += 'pipe.c' > +endif > + > +if spice_gtk_has_polkit > + tests_sources += [ > + 'usb-acl-helper.c', > + 'mock-acl-helper.c', > + ] > +endif > + > +foreach src : tests_sources > + name = 'test-@0@'.format(src).split('.')[0] > + exe = executable(name, > + sources : src, > + c_args : '-DTESTDIR="@0@"'.format(meson.current_build_dir()), > + objects : spice_client_glib_lib.extract_all_objects(), > + dependencies : spice_client_glib_dep) > + if not name.contains('mock-acl-helper') > + test(name, exe) > + endif > +endforeach > diff --git a/tools/Makefile.am b/tools/Makefile.am > index 1e3deed..18786ae 100644 > --- a/tools/Makefile.am > +++ b/tools/Makefile.am > @@ -1,5 +1,7 @@ > bin_PROGRAMS = spicy-stats spicy-screenshot > > +EXTRA_DIST = meson.build > + > TOOLS_CPPFLAGS = \ > -DSPICE_COMPILATION \ > -I$(top_builddir)/src \ > diff --git a/tools/meson.build b/tools/meson.build > new file mode 100644 > index 0000000..33e53c2 > --- /dev/null > +++ b/tools/meson.build > @@ -0,0 +1,32 @@ > +spice_cmdline_sources = [ > + 'spice-cmdline.c', > + 'spice-cmdline.h', > +] > + > +# > +# spicy-stats and spicy-screenshot > +# > +foreach exe : ['spicy-stats', 'spicy-screenshot'] > + executable(exe, > + sources : spice_cmdline_sources + ['@0@.c'.format(exe)], > + c_args : '-Wno-deprecated-declarations', > + install : true, > + dependencies : spice_client_glib_dep) > +endforeach > + > +# > +# spicy > +# > +if spice_gtk_has_gtk > + spicy_sources = [ > + 'spicy.c', > + 'spicy-connect.c', > + 'spicy-connect.h', > + ] > + > + executable('spicy', > + sources : spicy_sources + spice_cmdline_sources, > + c_args : '-Wno-deprecated-declarations', > + install : true, > + dependencies : spice_client_gtk_dep) > +endif > diff --git a/vapi/Makefile.am b/vapi/Makefile.am > index aaab848..494ad83 100644 > --- a/vapi/Makefile.am > +++ b/vapi/Makefile.am > @@ -15,6 +15,7 @@ dist_vapi_DATA += spice-client-gtk-3.0.deps > endif > > EXTRA_DIST = \ > + meson.build \ > spice-client-gtk-3.0.deps \ > SpiceClientGLib-2.0.metadata \ > $(NULL) > diff --git a/vapi/meson.build b/vapi/meson.build > new file mode 100644 > index 0000000..4737715 > --- /dev/null > +++ b/vapi/meson.build > @@ -0,0 +1,13 @@ > +if spice_gtk_has_vala > + gnome.generate_vapi('spice-client-glib-2.0', > + install : true, > + packages : 'gio-2.0', > + sources : spice_client_glib_gir[0]) > + if spice_gtk_has_gtk > + gnome.generate_vapi('spice-client-gtk-3.0', > + install : true, > + packages : ['gtk+-3.0', 'spice-client-glib-2.0'], > + vapi_dirs : meson.current_build_dir(), > + sources : spice_client_gtk_gir[0]) > + endif > +endif > -- Eduardo de Barros Lima (Etrunko) Software Engineer - RedHat etrunko@xxxxxxxxxx _______________________________________________ Spice-devel mailing list Spice-devel@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/spice-devel