diff options
-rw-r--r-- | Makefile.am | 3 | ||||
-rwxr-xr-x | build-aux/meson/check-spice-common | 5 | ||||
-rw-r--r-- | docs/Makefile.am | 1 | ||||
-rw-r--r-- | docs/manual/Makefile.am | 1 | ||||
-rw-r--r-- | docs/manual/meson.build | 18 | ||||
-rw-r--r-- | docs/meson.build | 14 | ||||
-rw-r--r-- | meson.build | 251 | ||||
-rw-r--r-- | meson_options.txt | 47 | ||||
-rw-r--r-- | server/Makefile.am | 1 | ||||
-rw-r--r-- | server/meson.build | 188 | ||||
-rw-r--r-- | server/tests/Makefile.am | 1 | ||||
-rw-r--r-- | server/tests/meson.build | 90 | ||||
-rw-r--r-- | tools/Makefile.am | 4 | ||||
-rw-r--r-- | tools/meson.build | 4 |
14 files changed, 628 insertions, 0 deletions
diff --git a/Makefile.am b/Makefile.am index 3845f2b5..7106e8dd 100644 --- a/Makefile.am +++ b/Makefile.am @@ -17,7 +17,10 @@ DISTCHECK_CONFIGURE_FLAGS = \ $(NULL) EXTRA_DIST = \ + meson.build \ + meson_options.txt \ build-aux/git-version-gen \ + build-aux/meson/check-spice-common \ .version \ $(NULL) diff --git a/build-aux/meson/check-spice-common b/build-aux/meson/check-spice-common new file mode 100755 index 00000000..a0d03a60 --- /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/docs/Makefile.am b/docs/Makefile.am index 45667a60..aa4298fd 100644 --- a/docs/Makefile.am +++ b/docs/Makefile.am @@ -2,6 +2,7 @@ NULL = ASCIIDOC_FLAGS = -a icons -a toc EXTRA_DIST = \ + meson.build \ spice_style.html \ spice_style.txt \ spice_threading_model.html \ diff --git a/docs/manual/Makefile.am b/docs/manual/Makefile.am index 24a11fe0..bffccfd3 100644 --- a/docs/manual/Makefile.am +++ b/docs/manual/Makefile.am @@ -3,6 +3,7 @@ SUFFIXES = .html ASCIIDOC_FLAGS = -a icons -a toc EXTRA_DIST = \ + meson.build \ images/icons/important.png \ images/icons/note.png \ manual.html \ diff --git a/docs/manual/meson.build b/docs/manual/meson.build new file mode 100644 index 00000000..4218b546 --- /dev/null +++ b/docs/manual/meson.build @@ -0,0 +1,18 @@ +txt = files('manual.txt') + +if asciidoc.found() + custom_target('manual.html', + input : txt, + output : 'manual.html', + build_by_default : true, + command : [asciidoc, '-n', asciidoc_args, '-o', '@OUTPUT@', '@INPUT@']) +endif + +a2x = find_program('a2x', required : false) +if a2x.found() + custom_target('manual.chunked', + input : txt, + output : 'manual.chunked', + build_by_default : true, + command : [a2x, '-f', 'chunked', '-D', meson.current_build_dir(), asciidoc_args, '@INPUT@']) +endif diff --git a/docs/meson.build b/docs/meson.build new file mode 100644 index 00000000..82864bb8 --- /dev/null +++ b/docs/meson.build @@ -0,0 +1,14 @@ +if get_option('manual') + asciidoc = find_program('asciidoc', required : false) + if asciidoc.found() + asciidoc_args = ['-a', 'data-uri', '-a', 'icons', '-a', 'toc'] + foreach doc : ['style', 'threading_model'] + custom_target('spice_@0@.html'.format(doc), + input : 'spice_@0@.txt'.format(doc), + output : 'spice_@0@.html'.format(doc), + build_by_default: true, + command : [asciidoc, '-n', asciidoc_args, '-o', '@OUTPUT@', '@INPUT@']) + endforeach + endif + subdir('manual') +endif diff --git a/meson.build b/meson.build new file mode 100644 index 00000000..2db2a953 --- /dev/null +++ b/meson.build @@ -0,0 +1,251 @@ +# +# project definition +# +project('spice', '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) + + +# +# soversion +# The versioning is defined by the forumla (CURRENT-AGE.AGE.REVISION) +# +# XXX: KEEP IN SYNC WITH configure.ac file +# +# Follow the libtool manual for the so version: +# http://www.gnu.org/software/libtool/manual/html_node/Updating-version-info.html +# - If the library source code has changed at all since the last update, +# then increment revision (‘c:r:a’ becomes ‘c:r+1:a’). +# - If any interfaces have been added, removed, or changed since the last update, +# increment current, and set revision to 0. +# - If any interfaces have been added since the last public release, +# then increment age. +# - If any interfaces have been removed or changed since the last public release, +# then set age to 0. +# +# +spice_server_current = 13 +spice_server_revision = 5 +spice_server_age = 12 +spice_server_so_version = '@0@.@1@.@2@'.format(spice_server_current - spice_server_age, + spice_server_age, + spice_server_revision) +message('libspice.so version: ' + spice_server_so_version) + +# some global vars +spice_server_global_cflags = ['-fvisibility=hidden', + '-DSPICE_SERVER_INTERNAL', + '-DG_LOG_DOMAIN="Spice"', + '-DHAVE_CONFIG_H', + #'-Werror', + '-Wall', + '-Wextra', + '-Wno-sign-compare', + '-Wno-unused-parameter'] + +compiler = meson.get_compiler('c') +spice_server_config_data = configuration_data() +spice_server_include = [include_directories('.')] +spice_server_deps = [] +spice_server_link_args = [] +spice_server_requires = '' + +# +# Spice common subproject +# +spice_common = subproject('spice-common', default_options : 'generate-code=server') +spice_server_config_data.merge_from(spice_common.get_variable('spice_common_config_data')) +spice_server_deps += spice_common.get_variable('spice_common_server_dep') + +# +# check for system headers +# +headers = ['sys/time.h', + 'execinfo.h', + 'linux/sockios.h', + 'pthread_np.h'] + +foreach header : headers + if compiler.has_header(header) + spice_server_config_data.set('HAVE_@0@'.format(header.underscorify().to_upper()), '1') + endif +endforeach + +# TCP_KEEPIDLE definition in netinet/tcp.h +if compiler.has_header_symbol('netinet/tcp.h', 'TCP_KEEPIDLE') + spice_server_config_data.set('HAVE_TCP_KEEPIDLE', '1') +endif + +# +# 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_server_deps += dependency(dep, version : version) +endforeach + +# TODO: specify minimum version for jpeg and zlib? +foreach dep : ['libjpeg', 'zlib'] + spice_server_deps += dependency(dep) +endforeach + +foreach dep : ['librt', 'libm'] + spice_server_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') + endif +endforeach + +# gstreamer +spice_server_has_gstreamer = false +spice_server_gst_version = get_option('gstreamer') +if spice_server_gst_version != 'no' + gst_deps = ['gstreamer', 'gstreamer-base', 'gstreamer-app', 'gstreamer-video'] + foreach dep : gst_deps + dep = '@0@-@1@'.format(dep, spice_server_gst_version) + spice_server_deps += dependency(dep) + endforeach + spice_server_deps += dependency('orc-0.4') + + gst_def = 'HAVE_GSTREAMER' + if spice_server_gst_version == '1.0' + gst_def = 'HAVE_GSTREAMER_1_0' + endif + + spice_server_config_data.set(gst_def, '1') + spice_server_has_gstreamer = true +endif + +# lz4 +spice_server_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 + + if compiler.has_function('LZ4_compress_fast_continue', dependencies : lz4_dep) + spice_server_config_data.set('HAVE_LZ4_COMPRESS_FAST_CONTINUE', '1') + endif + + spice_server_deps += lz4_dep + spice_server_config_data.set('USE_LZ4', '1') + spice_server_has_lz4 = true +endif + +# sasl +spice_server_has_sasl = false +if get_option('sasl') + spice_server_deps += dependency('libsasl2') + spice_server_config_data.set('HAVE_SASL', '1') + spice_server_has_sasl = true +endif + +# smartcard check +spice_server_has_smartcard = false +if get_option('smartcard') + smartcard_dep = dependency('libcacard', required : false, version : '>= 2.5.1') + if smartcard_dep.found() + spice_server_deps += smartcard_dep + spice_server_config_data.set('USE_SMARTCARD', '1') + else + smartcard012_dep = dependency('libcacard', required : false, version : '>= 0.1.2') + if smartcard012_dep.found() + spice_server_deps += smartcard012_dep + spice_server_config_data.set('USE_SMARTCARD_012', '1') + endif + endif + + spice_server_has_smartcard = smartcard_dep.found() or smartcard012_dep.found() + if not spice_server_has_smartcard + error('Building with smartcard support but dependency not found') + endif + + spice_server_requires += 'libcacard >= 0.1.2 ' +endif + +# +# global C defines +# +glib_major_minor = glib_version.split('.') +glib_encoded_version = 'GLIB_VERSION_@0@_@1@'.format(glib_major_minor[0], glib_major_minor[1]) +spice_server_global_cflags += ['-DGLIB_VERSION_MIN_REQUIRED=@0@'.format(glib_encoded_version), + '-DGLIB_VERSION_MAX_ALLOWED=@0@'.format(glib_encoded_version)] + +foreach arg : compiler.get_supported_arguments(spice_server_global_cflags) + add_project_arguments(arg, language : 'c') +endforeach + +# +# Subdirectories +# +subdir('server') +subdir('tools') +subdir('docs') + +# +# write config.h +# +spice_server_config_data.set_quoted('VERSION', meson.project_version()) +spice_server_config_data.set('SPICE_USE_SAFER_CONTAINEROF', '1') + +if get_option('statistics') + spice_server_config_data.set('RED_STATISTICS', '1') +endif + +configure_file(output : 'config.h', + install : false, + configuration : spice_server_config_data) + +# +# write spice-server.pc +# +spice_server_pc = configuration_data() +spice_server_pc.set('prefix', get_option('prefix')) +spice_server_pc.set('exec_prefix', '${prefix}') +spice_server_pc.set('libdir', join_paths('${exec_prefix}', get_option('libdir'))) +spice_server_pc.set('includedir', join_paths('${prefix}', get_option('includedir'))) +spice_server_pc.set('VERSION', meson.project_version()) +spice_server_pc.set('SPICE_PROTOCOL_MIN_VER', spice_protocol_version) +spice_server_requires += 'glib-2.0 @0@ gio-2.0 @0@ gobject-2.0 @0@ pixman-1 @1@ openssl'.format(glib_version_info, pixman_version) +spice_server_pc.set('SPICE_REQUIRES', spice_server_requires) +spice_server_pc.set('SPICE_NONPKGCONFIG_LIBS', '-pthread -lm -lrt') + +configure_file(input : 'spice-server.pc.in', + output : 'spice-server.pc', + install_dir : join_paths(get_option('libdir'), 'pkgconfig'), + configuration : spice_server_pc) diff --git a/meson_options.txt b/meson_options.txt new file mode 100644 index 00000000..9568c97e --- /dev/null +++ b/meson_options.txt @@ -0,0 +1,47 @@ +option('gstreamer', + type : 'combo', + choices : ['1.0', '0.10', 'no'], + description : 'Enable gstreamer support') + +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') + +option('alignment-checks', + type : 'boolean', + value : false, + description : 'Enable runtime checks for cast alignment') + +option('extra-checks', + type : 'boolean', + value: false, + description : 'Enable extra checks on code') + +option('statistics', + type : 'boolean', + value: false, + description : 'Build SPICE with statistic code enabled') + +option('manual', + type : 'boolean', + value : true, + description : 'Build SPICE manual') diff --git a/server/Makefile.am b/server/Makefile.am index 3e3b0a18..91b3c8ae 100644 --- a/server/Makefile.am +++ b/server/Makefile.am @@ -213,6 +213,7 @@ spice-server-enums.h: spice-server.h spice-server-enums.h.tmpl $(AM_V_GEN)glib-mkenums --template $(srcdir)/spice-server-enums.h.tmpl $< > $@ EXTRA_DIST = \ + meson.build \ spice-bitmap-utils.tmpl.c \ cache-item.tmpl.c \ glz-encode-match.tmpl.c \ diff --git a/server/meson.build b/server/meson.build new file mode 100644 index 00000000..0b89acb0 --- /dev/null +++ b/server/meson.build @@ -0,0 +1,188 @@ +spice_server_include += [include_directories('.')] + +# +# 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].to_int() +if not version_info[3].contains('git') + micro += 1 +endif +micro = '@0@'.format(micro) +cmd = run_command('printf', ['0x%02x%02x%02x', major, minor, micro], check : true) +version_data = configuration_data() +version_data.set('SPICE_SERVER_VERSION', cmd.stdout().strip()) +spice_version_h = configure_file(input : 'spice-version.h.in', + output : 'spice-version.h', + configuration : version_data) + +# +# libspice-server.so +# +spice_server_headers = [ + spice_version_h, + 'spice-audio.h', + 'spice-char.h', + 'spice-core.h', + 'spice-experimental.h', + 'spice-input.h', + 'spice-migration.h', + 'spice-qxl.h', + 'spice-server.h', + 'spice-replay.h', + 'spice.h', +] + +install_headers(spice_server_headers, subdir : 'spice-server') + +# generate enums +gnome = import('gnome') +spice_server_enums = gnome.mkenums_simple('spice-server-enums', + sources : 'spice-server.h', + symbol_prefix : 'SPICE') + +spice_server_sources = [ + spice_server_headers, + spice_server_enums, + 'agent-msg-filter.c', + 'agent-msg-filter.h', + 'cache-item.h', + 'char-device.c', + 'char-device.h', + 'common-graphics-channel.c', + 'common-graphics-channel.h', + 'cursor-channel.c', + 'cursor-channel-client.c', + 'cursor-channel-client.h', + 'cursor-channel.h', + 'dcc.c', + 'dcc.h', + 'dcc-private.h', + 'dcc-send.c', + 'demarshallers.h', + 'dispatcher.c', + 'dispatcher.h', + 'display-channel.c', + 'display-channel.h', + 'display-channel-private.h', + 'display-limits.h', + 'event-loop.c', + 'glib-compat.h', + 'glz-encoder.c', + 'glz-encoder-dict.c', + 'glz-encoder-dict.h', + 'glz-encoder.h', + 'glz-encoder-priv.h', + 'image-cache.c', + 'image-cache.h', + 'image-encoders.c', + 'image-encoders.h', + 'inputs-channel.c', + 'inputs-channel-client.c', + 'inputs-channel-client.h', + 'inputs-channel.h', + 'jpeg-encoder.c', + 'jpeg-encoder.h', + 'main-channel.c', + 'main-channel-client.c', + 'main-channel-client.h', + 'main-channel.h', + 'main-dispatcher.c', + 'main-dispatcher.h', + 'memslot.c', + 'memslot.h', + 'migration-protocol.h', + 'mjpeg-encoder.c', + 'net-utils.c', + 'net-utils.h', + 'pixmap-cache.c', + 'pixmap-cache.h', + 'red-channel.c', + 'red-channel-capabilities.c', + 'red-channel-capabilities.h', + 'red-channel-client.c', + 'red-channel-client.h', + 'red-channel.h', + 'red-client.c', + 'red-client.h', + 'red-common.h', + 'red-parse-qxl.c', + 'red-parse-qxl.h', + 'red-pipe-item.c', + 'red-pipe-item.h', + 'red-qxl.c', + 'red-qxl.h', + 'red-record-qxl.c', + 'red-record-qxl.h', + 'red-replay-qxl.c', + 'reds.c', + 'reds.h', + 'reds-private.h', + 'red-stream.c', + 'red-stream.h', + 'red-worker.c', + 'red-worker.h', + 'sound.c', + 'sound.h', + 'spice-bitmap-utils.c', + 'spice-bitmap-utils.h', + 'spicevmc.c', + 'stat-file.c', + 'stat-file.h', + 'stat.h', + 'stream-channel.c', + 'stream-channel.h', + 'red-stream-device.c', + 'red-stream-device.h', + 'sw-canvas.c', + 'tree.c', + 'tree.h', + 'utils.c', + 'utils.h', + 'video-encoder.h', + 'video-stream.c', + 'video-stream.h', + 'zlib-encoder.c', + 'zlib-encoder.h', +] + +if spice_server_has_lz4 == true + spice_server_sources += ['lz4-encoder.c', + 'lz4-encoder.h'] +endif + +if spice_server_has_smartcard == true + spice_server_sources += ['smartcard.c', + 'smartcard.h', + 'smartcard-channel-client.c', + 'smartcard-channel-client.h'] +endif + +if spice_server_has_gstreamer == true + spice_server_sources += ['gstreamer-encoder.c'] +endif + +# +# custom link_args +# +spice_server_syms = files('spice-server.syms') +spice_server_syms_path = join_paths(meson.current_source_dir(), 'spice-server.syms') +spice_server_link_args = ['-Wl,--no-copy-dt-needed-entries', + '-Wl,-z,relro', + '-Wl,-z,now', + '-Wl,--version-script=@0@'.format(spice_server_syms_path)] + +spice_server_libs = both_libraries('spice-server', spice_server_sources, + version : spice_server_so_version, + install : true, + include_directories : spice_server_include, + link_args : compiler.get_supported_link_arguments(spice_server_link_args), + link_depends : spice_server_syms, + dependencies : spice_server_deps) + +spice_server_shared_lib = spice_server_libs.get_shared_lib() +spice_server_static_lib = spice_server_libs.get_static_lib() + +subdir('tests') diff --git a/server/tests/Makefile.am b/server/tests/Makefile.am index 238f25af..46cbe8cf 100644 --- a/server/tests/Makefile.am +++ b/server/tests/Makefile.am @@ -4,6 +4,7 @@ NULL = VALGRIND_SUPPRESSIONS_FILES = $(srcdir)/valgrind/glib.supp EXTRA_DIST = \ $(VALGRIND_SUPPRESSIONS_FILES) \ + meson.build \ pki/ca-cert.pem \ pki/server-cert.pem \ pki/server-key.pem \ diff --git a/server/tests/meson.build b/server/tests/meson.build new file mode 100644 index 00000000..23794cc9 --- /dev/null +++ b/server/tests/meson.build @@ -0,0 +1,90 @@ +test_lib_include = [spice_server_include, include_directories('.')] +test_lib_deps = [spice_server_deps, dependency('gio-unix-2.0')] + +test_lib_sources = [ + 'basic-event-loop.c', + 'basic-event-loop.h', + 'test-display-base.c', + 'test-display-base.h', + 'test-glib-compat.c', + 'test-glib-compat.h', +] + +test_libs = [] +test_libs += static_library('testlib', test_lib_sources, + link_with: spice_server_static_lib, + include_directories : test_lib_include, + dependencies : test_lib_deps, + install : false) + +stat_test_libs = {'testlib_stat1' : ['1', '0', '0'], + 'testlib_stat2' : ['2', '0', '1'], + 'testlib_stat3' : ['3', '1', '0'], + 'testlib_stat4' : ['4', '1', '1']} +foreach lib, params : stat_test_libs + test_libs += static_library(lib, 'stat-test.c', + c_args : ['-DTEST_NAME=stat_test@0@'.format(params[0]), + '-DTEST_COMPRESS_STAT=@0@'.format(params[1]), + '-DTEST_RED_WORKER_STAT=@0@'.format(params[2])], + include_directories : test_lib_include, + dependencies : test_lib_deps, + install : false) +endforeach + +tests = [ + ['test-codecs-parsing', true], + ['test-options', true], + ['test-stat', true], + ['test-stream', true], + ['test-agent-msg-filter', true], + ['test-loop', true], + ['test-qxl-parsing', true], + ['test-stat-file', true], + ['test-leaks', true], + ['test-vdagent', true], + ['test-fail-on-null-core-interface', true], + ['test-empty-success', true], + ['test-channel', true], + ['test-stream-device', true], + ['test-listen', true], + ['test-display-no-ssl', false], + ['test-display-streaming', false], + ['test-playback', false], + ['test-display-resolution-changes', false], + ['test-two-servers', false], + ['test-display-width-stride', false], +] + +if spice_server_has_sasl + tests += [['test-sasl', true]] +endif + +if spice_server_has_gstreamer + tests += [['test-gst', false]] + if get_option('extra-checks') + test('video-encoders', files('video-encoders')) + endif +endif + +foreach t : tests + test_name = t[0] + is_test = t[1] + exe = executable(test_name, + sources : '@0@.c'.format(test_name), + link_with : test_libs, + include_directories : test_lib_include, + c_args : ['-DSPICE_TOP_SRCDIR="@0@"'.format(meson.source_root())], + dependencies : test_lib_deps, + install : false) + + if is_test + test(test_name, exe) + endif +endforeach + +executable('spice-server-replay', + sources : ['replay.c', join_paths('..', 'event-loop.c'), 'basic-event-loop.c', 'basic-event-loop.h'], + link_with : spice_server_shared_lib, + include_directories : test_lib_include, + dependencies : test_lib_deps, + install : false) diff --git a/tools/Makefile.am b/tools/Makefile.am index 03980c5e..cfb0a213 100644 --- a/tools/Makefile.am +++ b/tools/Makefile.am @@ -17,3 +17,7 @@ noinst_PROGRAMS = \ reds_stat_SOURCES = \ reds_stat.c \ $(NULL) + +EXTRA_DIST = \ + meson.build \ + $(NULL) diff --git a/tools/meson.build b/tools/meson.build new file mode 100644 index 00000000..1d78340b --- /dev/null +++ b/tools/meson.build @@ -0,0 +1,4 @@ +executable('reds_stat', 'reds_stat.c', + install : false, + include_directories : spice_server_include, + dependencies : spice_server_deps) |