[PATCH wayland v3 2/4] Add Meson build to Wayland
Peter Hutterer
peter.hutterer at who-t.net
Fri Jul 27 05:24:16 UTC 2018
On Sat, Jul 21, 2018 at 04:31:22PM +0100, Daniel Stone wrote:
> From: Emmanuele Bassi <ebassi at gnome.org>
>
> Meson is a next generation build system, simpler than Autotools and,
> more importantly, faster and more portable. While the latter
> consideration is of lesser importance for Wayland, being easier to
> understand and faster are pretty much key reasons to switch.
>
> This is mostly a mechanical port of Wayland to the Meson build system.
>
> The goal is to maintain feature parity of the Meson build with the
> Autotools build, until such time when we can drop the latter.
>
> [daniels: Changed to bump version, use GitLab issues URL, remove header
> checks not used in any code, remove pre-pkg-config Expat
> support, added missing include paths to wayland-egl and
> cpp-compile-test, added GitLab CI.]
>
> Reviewed-by: Daniel Stone <daniels at collabora.com>
> ---
> .gitlab-ci.yml | 24 +++++-
> cursor/meson.build | 30 +++++++
> doc/meson.build | 5 ++
> egl/meson.build | 45 ++++++++++
> meson.build | 94 +++++++++++++++++++++
> meson_options.txt | 20 +++++
> src/meson.build | 203 +++++++++++++++++++++++++++++++++++++++++++++
> tests/meson.build | 180 ++++++++++++++++++++++++++++++++++++++++
> 8 files changed, 599 insertions(+), 2 deletions(-)
> create mode 100644 cursor/meson.build
> create mode 100644 doc/meson.build
> create mode 100644 egl/meson.build
> create mode 100644 meson.build
> create mode 100644 meson_options.txt
> create mode 100644 src/meson.build
> create mode 100644 tests/meson.build
>
> diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
> index 24896659..1d0018b1 100644
> --- a/.gitlab-ci.yml
> +++ b/.gitlab-ci.yml
> @@ -9,10 +9,11 @@ before_script:
> - echo '#!/bin/sh' > /usr/sbin/policy-rc.d
> - echo 'exit 101' >> /usr/sbin/policy-rc.d
> - chmod +x /usr/sbin/policy-rc.d
> + - echo 'deb http://deb.debian.org/debian stretch-backports main' >> /etc/apt/sources.list
> - apt-get update
> - - apt-get -y --no-install-recommends install build-essential automake autoconf libtool pkg-config libexpat1-dev libffi-dev libxml2-dev doxygen graphviz xmlto xsltproc docbook-xsl
> + - apt-get -y --no-install-recommends install build-essential automake autoconf libtool pkg-config libexpat1-dev libffi-dev libxml2-dev doxygen graphviz xmlto xsltproc docbook-xsl meson/stretch-backports
>
> -build-native:
> +build-native-autotools:
> stage: build
> script:
> - export BUILD_ID="wayland-$CI_JOB_NAME_$CI_COMMIT_SHA-$CI_JOB_ID"
> @@ -34,3 +35,22 @@ build-native:
> - build-*/wayland*/_build/sub/*.log
> - build-*/*.log
> - prefix-*
> +
> +build-native-meson:
> + stage: build
> + script:
> + - export BUILD_ID="wayland-$CI_JOB_NAME_$CI_COMMIT_SHA-$CI_JOB_ID"
> + - export PREFIX="$(pwd)/prefix-$BUILD_ID"
> + - export BUILDDIR="$(pwd)/build-$BUILD_ID"
> + - export MAKEFLAGS="-j4"
> + - mkdir "$BUILDDIR" "$PREFIX"
> + - cd "$BUILDDIR"
> + - meson --prefix="$PREFIX" -Dicon_directory=/usr/share/X11/icons ..
> + - ninja -k0 test
> + - ninja clean
> + artifacts:
> + name: wayland-meson-$CI_COMMIT_SHA-$CI_JOB_ID
> + when: always
> + paths:
> + - build-meson/meson-logs
> + - prefix-*
> diff --git a/cursor/meson.build b/cursor/meson.build
> new file mode 100644
> index 00000000..c8ed1aab
> --- /dev/null
> +++ b/cursor/meson.build
> @@ -0,0 +1,30 @@
> +icondir = get_option('icon_directory')
> +if icondir == ''
> + icondir = join_paths(get_option('prefix'), get_option('datadir'), 'icons')
> +endif
> +
> +wayland_cursor = library(
> + 'wayland-cursor',
> + sources: [
> + 'wayland-cursor.c',
> + 'os-compatibility.c',
> + 'xcursor.c',
> + ],
> + version: '0.0.0',
> + dependencies: [ wayland_client_dep ],
> + c_args: [
> + '-DICONDIR="@0@"'.format(icondir),
> + ],
> + install: true,
> +)
> +
> +install_headers('wayland-cursor.h')
> +
> +pkgconfig.generate(
> + name: 'Wayland Cursor',
> + description: 'Wayland cursor helper library',
> + version: meson.project_version(),
> + libraries: wayland_cursor,
> + filebase: 'wayland-cursor',
> + install_dir: join_paths(get_option('prefix'), get_option('libdir'), 'pkgconfig'),
two things here: this is the default directory anyway so you could skip this
line. But if not, this is going to be annoying at some point, I recommend
defining a dir_pkgconfig variable once and re-using it. Same for the other
places where install_dir is defined.
same for wayland_client_protocol_core_h and friends, probably better to
fetch this once and then use the same variable everywhere.
Acked-by: Peter Hutterer <peter.hutterer at who-t.net> for the series, but I
started glossing over with the doxygen bits :)
Cheers,
Peter
> +)
> diff --git a/doc/meson.build b/doc/meson.build
> new file mode 100644
> index 00000000..8c743fe9
> --- /dev/null
> +++ b/doc/meson.build
> @@ -0,0 +1,5 @@
> +xsltproc = find_program('xsltproc', required: false)
> +doxygen = find_program('doxygen')
> +xmlto = find_program('xmlto')
> +dot = find_program('dot')
> +
> diff --git a/egl/meson.build b/egl/meson.build
> new file mode 100644
> index 00000000..8d488c36
> --- /dev/null
> +++ b/egl/meson.build
> @@ -0,0 +1,45 @@
> +wayland_egl = library(
> + 'wayland-egl',
> + sources: [
> + 'wayland-egl.c',
> + get_variable('wayland_client_protocol_h'),
> + ],
> + include_directories: src_inc,
> + version: '1.0.0',
> + install: true,
> +)
> +
> +executable('wayland-egl-abi-check', 'wayland-egl-abi-check.c')
> +
> +nm_path = find_program('nm').path()
> +
> +test(
> + 'wayland-egl symbols check',
> + find_program('wayland-egl-symbols-check'),
> + env: [
> + 'WAYLAND_EGL_LIB=@0@'.format(wayland_egl.full_path()),
> + 'NM=@0@'.format(nm_path),
> + ],
> +)
> +
> +install_headers([
> + 'wayland-egl.h',
> + 'wayland-egl-core.h',
> + 'wayland-egl-backend.h',
> +])
> +
> +pkgconfig.generate(
> + name: 'wayland-egl',
> + description: 'Frontend wayland-egl library',
> + version: '18.1.0',
> + requires: 'wayland-client',
> + libraries: wayland_egl,
> + install_dir: join_paths(get_option('prefix'), get_option('libdir'), 'pkgconfig'),
> +)
> +
> +pkgconfig.generate(
> + name: 'wayland-egl-backend',
> + description: 'Backend wayland-egl library',
> + version: '3',
> + install_dir: join_paths(get_option('prefix'), get_option('libdir'), 'pkgconfig'),
> +)
> diff --git a/meson.build b/meson.build
> new file mode 100644
> index 00000000..44213216
> --- /dev/null
> +++ b/meson.build
> @@ -0,0 +1,94 @@
> +project('wayland', 'c', 'cpp',
> + version: '1.15.91',
> + license: 'MIT',
> + meson_version: '>= 0.45.0',
> + default_options: [
> + 'warning_level=2',
> + 'buildtype=debugoptimized',
> + ])
> +
> +config_h = configuration_data()
> +config_h.set_quoted('PACKAGE', meson.project_name())
> +config_h.set_quoted('PACKAGE_NAME', meson.project_name())
> +config_h.set_quoted('PACKAGE_VERSION', meson.project_version())
> +config_h.set_quoted('VERSION', meson.project_version())
> +config_h.set_quoted('PACKAGE_URL', 'http://wayland.freedesktop.org')
> +config_h.set_quoted('PACKAGE_BUGREPORT', 'https://gitlab.freedesktop.org/wayland/wayland/issues/')
> +
> +cc = meson.get_compiler('c')
> +
> +compiler_flags = cc.get_supported_arguments([
> + '-Wno-unused-parameter',
> + '-Wstrict-prototypes',
> + '-Wmissing-prototypes',
> + '-fvisibility=hidden',
> +])
> +
> +add_project_arguments(compiler_flags, language: 'c')
> +
> +foreach h: [ 'sys/prctl.h' ]
> + config_h.set('HAVE_' + h.underscorify().to_upper(), cc.has_header(h))
> +endforeach
> +
> +foreach f: [ 'accept4', 'mkostemp', 'posix_fallocate', 'prctl', ]
> + config_h.set('HAVE_' + f.underscorify().to_upper(), cc.has_function(f))
> +endforeach
> +
> +if get_option('libraries')
> + ffi_dep = dependency('libffi')
> +
> + decls = [
> + [ 'sys/signalfd.h', 'SFD_CLOEXEC' ],
> + [ 'sys/timerfd.h', 'TFD_CLOEXEC' ],
> + [ 'time.h', 'CLOCK_MONOTONIC' ],
> + ]
> +
> + foreach d: decls
> + if not cc.has_header_symbol(d[0], d[1])
> + error('@0@ is needed to compile Wayland libraries'.format(d[1]))
> + endif
> + endforeach
> +endif
> +
> +expat_dep = dependency('expat', required: false)
> +
> +if get_option('dtd_validation')
> + libxml2_dep = dependency('libxml-2.0')
> + config_h.set('HAVE_LIBXML', 1)
> +endif
> +
> +configure_file(
> + output: 'config.h',
> + configuration: config_h,
> +)
> +
> +add_project_arguments([ '-DHAVE_CONFIG_H' ], language: 'c')
> +
> +pkgconfig = import('pkgconfig')
> +
> +root_inc = include_directories('.')
> +protocol_inc = include_directories('protocol')
> +src_inc = include_directories('src')
> +
> +subdir('src')
> +
> +if get_option('libraries')
> + subdir('cursor')
> + subdir('egl')
> + subdir('tests')
> +endif
> +
> +if get_option('documentation')
> + subdir('doc')
> +endif
> +
> +install_data([
> + 'wayland-scanner.mk',
> + 'protocol/wayland.xml',
> + 'protocol/wayland.dtd',
> +])
> +
> +install_data(
> + [ 'wayland-scanner.m4' ],
> + install_dir: join_paths(get_option('prefix'), get_option('datadir'), 'aclocal'),
> +)
> diff --git a/meson_options.txt b/meson_options.txt
> new file mode 100644
> index 00000000..78e9f9f9
> --- /dev/null
> +++ b/meson_options.txt
> @@ -0,0 +1,20 @@
> +option('libraries',
> + description: 'Compile Wayland libraries',
> + type: 'boolean',
> + value: 'true')
> +option('host_scanner',
> + description: 'Use wayland-scanner from PATH during build',
> + type: 'boolean',
> + value: 'false')
> +option('documentation',
> + description: 'Build the documentation (requires Doxygen)',
> + type: 'boolean',
> + value: 'true')
> +option('dtd_validation',
> + description: 'Validate the protocol DTD (requires libxml2)',
> + type: 'boolean',
> + value: 'true')
> +option('icon_directory',
> + description: 'Location used to look for cursors (defaults to ${datadir}/icons if unset)',
> + type: 'string',
> + value: '')
> diff --git a/src/meson.build b/src/meson.build
> new file mode 100644
> index 00000000..376ba9a1
> --- /dev/null
> +++ b/src/meson.build
> @@ -0,0 +1,203 @@
> +wayland_version = meson.project_version().split('.')
> +wayland_version_h = configuration_data()
> +wayland_version_h.set('WAYLAND_VERSION', meson.project_version())
> +wayland_version_h.set('WAYLAND_VERSION_MAJOR', wayland_version[0].to_int())
> +wayland_version_h.set('WAYLAND_VERSION_MINOR', wayland_version[1].to_int())
> +wayland_version_h.set('WAYLAND_VERSION_MICRO', wayland_version[2].to_int())
> +configure_file(
> + input: 'wayland-version.h.in',
> + output: 'wayland-version.h',
> + configuration: wayland_version_h,
> + install: true,
> + install_dir: join_paths(get_option('prefix'), get_option('includedir')),
> +)
> +
> +wayland_util = static_library(
> + 'wayland-util',
> + sources: 'wayland-util.c',
> +)
> +
> +wayland_util_dep = declare_dependency(
> + link_with: wayland_util,
> + include_directories: include_directories('.'),
> +)
> +
> +if get_option('host_scanner')
> + wayland_scanner = find_program('wayland-scanner')
> + wayland_scanner_code_arg = 'code'
> +else
> + configure_file(
> + input: '../protocol/wayland.dtd',
> + output: 'wayland.dtd.embed',
> + configuration: configuration_data(),
> + )
> +
> + wayland_scanner = executable(
> + 'wayland-scanner',
> + 'scanner.c',
> + 'dtddata.S',
> + include_directories: [ root_inc, protocol_inc ],
> + dependencies: [ expat_dep, libxml2_dep, wayland_util_dep, ],
> + install: true,
> + )
> + wayland_scanner_code_arg = 'public-code'
> +
> + pkgconfig.generate(
> + name: 'Wayland Scanner',
> + description: 'Wayland scanner',
> + version: meson.project_version(),
> + variables: [
> + 'bindir=${prefix}/@0@'.format(get_option('bindir')),
> + 'datarootdir=${prefix}/@0@'.format(get_option('datadir')),
> + 'pkgdatadir=${prefix}/@0@/@1@'.format(get_option('datadir'), meson.project_name()),
> + 'wayland_scanner=${bindir}/wayland-scanner',
> + ],
> + filebase: 'wayland-scanner',
> + install_dir: join_paths(get_option('prefix'), get_option('libdir'), 'pkgconfig'),
> + )
> +endif
> +
> +if get_option('libraries')
> + mathlib_dep = cc.find_library('m', required: false)
> + rt_dep = dependency('threads', required: false)
> +
> + wayland_protocol_xml = files('../protocol/wayland.xml')
> +
> + wayland_private = static_library(
> + 'wayland-private',
> + sources: [
> + 'connection.c',
> + 'wayland-os.c',
> + ],
> + dependencies: [ ffi_dep, ],
> + )
> +
> + wayland_private_dep = declare_dependency(
> + link_with: wayland_private,
> + include_directories: include_directories('.'),
> + )
> +
> + generated_headers = [
> + [ 'server header', ['server-header'], 'wayland-server-protocol.h', true, ],
> + [ 'core server header', ['server-header', '-c'], 'wayland-server-protocol-core.h', false, ],
> + [ 'client header', ['client-header'], 'wayland-client-protocol.h', true, ],
> + [ 'core client header', ['client-header', '-c'], 'wayland-client-protocol-core.h', false, ],
> + ]
> +
> + foreach gen: generated_headers
> + target_name = gen[0]
> + scanner_args = gen[1]
> + output_file = gen[2]
> + install_file = gen[3]
> + install_dir = join_paths(get_option('prefix'), get_option('includedir'))
> + var_name = output_file.underscorify()
> +
> + target = custom_target(
> + target_name,
> + command: [
> + wayland_scanner, scanner_args, '@INPUT@', '@OUTPUT@',
> + ],
> + input: wayland_protocol_xml,
> + output: output_file,
> + install: install_file,
> + install_dir: install_dir,
> + )
> +
> + set_variable(var_name, target)
> + endforeach
> +
> + wayland_protocol_c = custom_target('protocol source',
> + command: [
> + wayland_scanner, wayland_scanner_code_arg, '@INPUT@', '@OUTPUT@',
> + ],
> + input: wayland_protocol_xml,
> + output: 'wayland-protocol.c',
> + )
> +
> + wayland_server = library(
> + 'wayland-server',
> + sources: [
> + get_variable('wayland_server_protocol_core_h'),
> + get_variable('wayland_server_protocol_h'),
> + wayland_protocol_c,
> + 'wayland-server.c',
> + 'wayland-shm.c',
> + 'event-loop.c',
> + ],
> + version: '0.1.0',
> + dependencies: [
> + ffi_dep,
> + wayland_private_dep,
> + wayland_util_dep,
> + mathlib_dep,
> + rt_dep,
> + ],
> + include_directories: root_inc,
> + install: true,
> + )
> +
> + wayland_server_dep = declare_dependency(
> + link_with: wayland_server,
> + include_directories: [ root_inc, include_directories('.') ],
> + dependencies: [ ffi_dep, mathlib_dep, rt_dep, ],
> + sources: [
> + get_variable('wayland_server_protocol_core_h'),
> + get_variable('wayland_server_protocol_h'),
> + ],
> + )
> +
> + pkgconfig.generate(
> + name: 'Wayland Server',
> + description: 'Server side implementation of the Wayland protocol',
> + version: meson.project_version(),
> + libraries: wayland_server,
> + filebase: 'wayland-server',
> + install_dir: join_paths(get_option('prefix'), get_option('libdir'), 'pkgconfig'),
> + )
> +
> + wayland_client = library(
> + 'wayland-client',
> + sources: [
> + get_variable('wayland_client_protocol_core_h'),
> + get_variable('wayland_client_protocol_h'),
> + wayland_protocol_c,
> + 'wayland-client.c',
> + ],
> + version: '0.3.0',
> + dependencies: [
> + ffi_dep,
> + wayland_private_dep,
> + wayland_util_dep,
> + mathlib_dep,
> + rt_dep,
> + ],
> + include_directories: root_inc,
> + install: true,
> + )
> +
> + pkgconfig.generate(
> + name: 'Wayland Client',
> + description: 'Wayland client side library',
> + version: meson.project_version(),
> + libraries: wayland_client,
> + filebase: 'wayland-client',
> + install_dir: join_paths(get_option('prefix'), get_option('libdir'), 'pkgconfig'),
> + )
> +
> + wayland_client_dep = declare_dependency(
> + link_with: wayland_client,
> + include_directories: [ root_inc, include_directories('.') ],
> + sources: [
> + get_variable('wayland_client_protocol_core_h'),
> + get_variable('wayland_client_protocol_h'),
> + ],
> + )
> +
> + install_headers([
> + 'wayland-util.h',
> + 'wayland-server.h',
> + 'wayland-server-core.h',
> + 'wayland-client.h',
> + 'wayland-client-core.h',
> + ])
> +endif
> diff --git a/tests/meson.build b/tests/meson.build
> new file mode 100644
> index 00000000..8a2c7769
> --- /dev/null
> +++ b/tests/meson.build
> @@ -0,0 +1,180 @@
> +test_runner = static_library(
> + 'test-runner',
> + sources: [
> + 'test-runner.c',
> + 'test-helpers.c',
> + 'test-compositor.c',
> + ],
> + include_directories: [ root_inc, src_inc ],
> + dependencies: [
> + cc.find_library('dl', required: false),
> + dependency('threads'),
> + ffi_dep,
> + wayland_util_dep,
> + wayland_private_dep,
> + wayland_client_dep,
> + wayland_server_dep,
> + ],
> +)
> +
> +test_runner_dep = declare_dependency(
> + link_with: test_runner,
> + include_directories: [ src_inc ],
> + dependencies: [
> + dependency('threads'),
> + cc.find_library('dl', required: false),
> + ],
> +)
> +
> +tests_protocol_xml = files('../protocol/tests.xml')
> +
> +tests_server_protocol_h = custom_target(
> + 'test server protocol header',
> + command: [ wayland_scanner, 'server-header', '@INPUT@', '@OUTPUT@' ],
> + input: tests_protocol_xml,
> + output: 'tests-server-protocol.h',
> +)
> +
> +tests_client_protocol_c = custom_target(
> + 'test client protocol header',
> + command: [ wayland_scanner, 'client-header', '@INPUT@', '@OUTPUT@' ],
> + input: tests_protocol_xml,
> + output: 'tests-client-protocol.h',
> +)
> +
> +tests_protocol_c = custom_target(
> + 'test protocol source',
> + command: [ wayland_scanner, wayland_scanner_code_arg, '@INPUT@', '@OUTPUT@' ],
> + input: tests_protocol_xml,
> + output: 'tests-protocol.c',
> +)
> +
> +benchmark(
> + 'fixed-benchmark',
> + executable(
> + 'fixed-benchmark',
> + 'fixed-benchmark.c',
> + dependencies: test_runner_dep,
> + ),
> +)
> +
> +executable(
> + 'exec-fd-leak-checker',
> + 'exec-fd-leak-checker.c',
> + dependencies: test_runner_dep,
> +)
> +
> +test(
> + 'cpp-compile-test',
> + executable('cpp-compile-test',
> + 'cpp-compile-test.cpp',
> + get_variable('wayland_server_protocol_core_h'),
> + include_directories: src_inc,
> + )
> +)
> +
> +sed_path = find_program('sed').path()
> +
> +test(
> + 'scanner-test',
> + find_program('scanner-test.sh'),
> + env: [
> + 'TEST_DATA_DIR=@0@/data'.format(meson.current_source_dir()),
> + 'TEST_OUTPUT_DIR=@0@/output'.format(meson.current_build_dir()),
> + 'SED=@0@'.format(sed_path),
> + 'WAYLAND_SCANNER=@0@'.format(wayland_scanner.full_path()),
> + ],
> +)
> +
> +# test name, extra sources, extra dependencies
> +tests = [
> + [ 'array-test' ],
> + [ 'client-test', [
> + get_variable('wayland_server_protocol_h'),
> + ]
> + ],
> + [ 'display-test', [
> + tests_server_protocol_h,
> + tests_client_protocol_c,
> + tests_protocol_c,
> + ],
> + ],
> + [ 'connection-test', [
> + get_variable('wayland_server_protocol_h'),
> + ]
> + ],
> + [ 'event-loop-test', [
> + get_variable('wayland_server_protocol_h'),
> + ]
> + ],
> + [ 'fixed-test' ],
> + [ 'interface-test', [
> + get_variable('wayland_client_protocol_h'),
> + ]
> + ],
> + [ 'list-test' ],
> + [ 'map-test' ],
> + [ 'sanity-test', [
> + get_variable('wayland_server_protocol_h'),
> + ]
> + ],
> + [ 'socket-test', [
> + get_variable('wayland_client_protocol_h'),
> + get_variable('wayland_server_protocol_h'),
> + ]
> + ],
> + [ 'queue-test', [
> + get_variable('wayland_client_protocol_h'),
> + get_variable('wayland_server_protocol_h'),
> + ]
> + ],
> + [ 'signal-test', [
> + get_variable('wayland_server_protocol_h'),
> + ]
> + ],
> + [ 'newsignal-test', [
> + files('../src/wayland-server.c'),
> + get_variable('wayland_server_protocol_h'),
> + ],
> + ],
> + [ 'resources-test', [
> + get_variable('wayland_server_protocol_core_h'),
> + ],
> + ],
> + [ 'message-test', [
> + get_variable('wayland_client_protocol_h'),
> + get_variable('wayland_server_protocol_h'),
> + ]
> + ],
> + [ 'compositor-introspection-test', [
> + get_variable('wayland_client_protocol_h'),
> + get_variable('wayland_server_protocol_h'),
> + ]
> + ],
> + [ 'protocol-logger-test', [
> + get_variable('wayland_server_protocol_core_h'),
> + get_variable('wayland_client_protocol_core_h'),
> + ],
> + ],
> + [ 'headers-test', [
> + 'headers-protocol-test.c',
> + 'headers-protocol-core-test.c',
> + get_variable('wayland_server_protocol_core_h'),
> + get_variable('wayland_client_protocol_core_h'),
> + ],
> + ],
> + [ 'os-wrappers-test' ],
> +]
> +
> +foreach t: tests
> + t_name = t.get(0)
> + t_sources = [ t_name + '.c' ] + t.get(1, [])
> + t_deps = [test_runner_dep] + t.get(2, [])
> + bin = executable(t_name, t_sources, dependencies: t_deps)
> + test(t_name, bin,
> + env: [
> + 'TEST_SRC_DIR=@0@'.format(meson.current_source_dir()),
> + 'TEST_BUILD_DIR=@0@'.format(meson.current_build_dir()),
> + ],
> + )
> +endforeach
> --
> 2.17.1
>
> _______________________________________________
> wayland-devel mailing list
> wayland-devel at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/wayland-devel
More information about the wayland-devel
mailing list