[v3,2/4] Add Meson build to Wayland

Submitted by Daniel Stone on July 21, 2018, 3:31 p.m.

Details

Message ID 20180721153124.17946-3-daniels@collabora.com
State New
Series "Meson build"
Headers show

Commit Message

Daniel Stone July 21, 2018, 3:31 p.m.
From: Emmanuele Bassi <ebassi@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@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

Patch hide | download patch | download mbox

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'),
+)
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

Comments

Peter Hutterer July 27, 2018, 5:24 a.m.
On Sat, Jul 21, 2018 at 04:31:22PM +0100, Daniel Stone wrote:
> From: Emmanuele Bassi <ebassi@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@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@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@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/wayland-devel