Add Meson build

Meson is a next generation build system, simpler than Autotools and also faster
and more portable. Most importantly, it will make integrating ASan easier in
CI.

The goal is to maintain feature parity of the Meson build with the
Autotools build, until such time when we can drop the latter.

Add a script which generates the desired Doxygen configuration for our various
output formats and executes it using that configuration. This is not something
Meson can or should do.

Fixes: https://gitlab.freedesktop.org/wayland/wayland/issues/80

[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.
	  Bumped version, removed unnecessary pkg-config paths.]

[daniels: Properly install into mandir/man3 via some gross
          paramaterisation, generate real stamp files.]

Pekka:
- squashed patches
- removed MAKEFLAGS from meson CI
- remove unused PACKAGE* defines
- fix up scanner dependency handling
- instead of host_scanner option, build wayland-scanner twice when cross-compiling
- changed .pc files to match more closely the autotools versions
- reorder doxygen man sources to reduce diff to autotools
- fix pkgconfig.generate syntax warnings (new in Meson)
- bump meson version to 0.47 for configure_file(copy) and run_command(check)
- move doc tool checks into doc/meson.build, needed in more places
- make all doc tools mandatory if building docs
- check dot and doxygen versions
- add build files under doc/publican
- reindent to match Weston Meson style

Simon:
- Remove install arg from configure_file
- Don't build wayland-scanner twice during cross-build
- Fix naming of the threads dependency
- Store tests in dict
- Add missing HAVE_* decls for functions
- Remove unused cc_native variable
- Make doxygen targets a dict
- Make dot_gv a dict
- Use dicts in man_pages
- Make decls use dicts
- Make generated_headers use dicts
- Align Meson version number with autotool's

Signed-off-by: Pekka Paalanen <pekka.paalanen@collabora.com>
Signed-off-by: Simon Ser <contact@emersion.fr>
This commit is contained in:
Emmanuele Bassi 2018-04-23 14:29:16 +01:00 committed by Simon Ser
parent 0d3044f2ea
commit 60acba6e0f
No known key found for this signature in database
GPG Key ID: 0FDE7BE0E88F5E48
17 changed files with 1087 additions and 3 deletions

View File

@ -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,21 @@ 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"
- 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-*

27
cursor/meson.build Normal file
View File

@ -0,0 +1,27 @@
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',
)

View File

@ -1,4 +1,3 @@
doxygen_sqlite3.db
html/
wayland.doxygen
xml/

105
doc/doxygen/gen-doxygen.py Executable file
View File

@ -0,0 +1,105 @@
#!/usr/bin/env python3
import argparse
import datetime
import errno
import os
import subprocess
import sys
# Custom configuration for each documentation format
doxygen_templates = {
'xml': [
'GENERATE_XML=YES\n',
'XML_OUTPUT={format}/{section}\n',
'INPUT= {files}\n',
],
'html': [
'GENERATE_HTML=YES\n',
'HTML_OUTPUT={format}/{section}\n',
'PROJECT_NAME=\"Wayland {section} API\"\n',
'INPUT= {files}\n',
],
'man': [
'GENERATE_MAN=YES\n',
'MAN_OUTPUT={format}\n',
'MAN_SUBDIR=.\n',
'JAVADOC_AUTOBRIEF=NO\n',
'INPUT= {files}\n',
],
}
def load_doxygen_file(doxyfile):
with open(doxyfile, 'r') as f:
res = f.readlines()
return res
def get_template(outformat):
for (k,v) in doxygen_templates.items():
if outformat.startswith(k):
return v
def gen_doxygen_file(data, outformat, section, files):
for l in get_template(outformat):
data.append(l.format(format=outformat, section=section, files=' '.join(files)))
return data
parser = argparse.ArgumentParser(description='Generate docs with Doxygen')
parser.add_argument('doxygen_file',
help='The doxygen file to use')
parser.add_argument('files',
help='The list of files to parse',
metavar='FILES',
nargs='+')
parser.add_argument('--builddir',
help='The build directory',
metavar='DIR',
default='.')
parser.add_argument('--section',
help='The section to build',
metavar='NAME',
default='Client')
parser.add_argument('--output-format',
help='The output format: xml, html, man',
metavar='FORMAT',
default='xml')
parser.add_argument('--stamp',
help='Stamp file to output',
metavar='STAMP_FILE',
nargs='?',
type=argparse.FileType('w'))
args = parser.parse_args()
# Merge the doxyfile with our custom templates
conf = load_doxygen_file(args.doxygen_file)
conf = gen_doxygen_file(conf, args.output_format, args.section, args.files)
# Doxygen is not clever enough to create the directories it
# needs beforehand
try:
os.makedirs(os.path.join(args.builddir, args.output_format))
except OSError as e:
if e.errno != errno.EEXIST:
raise e
# Run Doxygen with the generated doxyfile
cmd = subprocess.Popen(['doxygen', '-'], stdin=subprocess.PIPE)
cmd.stdin.write(''.join(conf).encode('utf-8'))
cmd.stdin.close()
if cmd.wait() != 0:
sys.exit(1)
# This is a bit of a hack; Doxygen will generate way more files than we
# want to install, but there's no way to know how many at configuration
# time. Since we want to install only the wl_* man pages anyway, we can
# delete the other files and let Meson install the whole man3 subdirectory
if args.output_format.startswith('man'):
manpath = os.path.join(args.builddir, args.output_format)
for filename in os.listdir(manpath):
full_path = os.path.join(manpath, filename)
if not filename.startswith('wl_'):
os.remove(full_path)
if args.stamp:
args.stamp.write(str(datetime.datetime.now()))

105
doc/doxygen/meson.build Normal file
View File

@ -0,0 +1,105 @@
# Here be dragons
dot_gv = {
'wayland-architecture': files('dot/wayland-architecture.gv'),
'x-architecture': files('dot/x-architecture.gv'),
}
# This is a workaround for Meson's custom_target() directive, which
# currently does not support outputs pointing to a sub-directory
# XXX: try turning these into maps, so they can be indexed with picture name
dot_png = []
dot_map = []
doxygen_conf = configuration_data()
doxygen_conf.set('VERSION', meson.project_version())
doxygen_conf.set('top_builddir', meson.build_root())
wayland_doxygen = configure_file(
input: 'wayland.doxygen.in',
output: 'wayland.doxygen',
configuration: doxygen_conf,
)
shared_files = files([
'../../src/wayland-util.h',
])
client_files = files([
'../../src/wayland-client.c',
'../../src/wayland-client.h',
'../../src/wayland-client-core.h',
])
server_files = files([
'../../src/event-loop.c',
'../../src/wayland-server.c',
'../../src/wayland-server.h',
'../../src/wayland-server-core.h',
'../../src/wayland-shm.c',
])
extra_client_files = [
'mainpage.dox',
wayland_client_protocol_h,
]
extra_server_files = [
'mainpage.dox',
wayland_server_protocol_h,
]
gen_doxygen = find_program('gen-doxygen.py')
subdir('xml')
formats = {
'html': {
'Client': shared_files + client_files + extra_client_files,
'Server': shared_files + server_files + extra_server_files,
},
}
foreach f_name, sections: formats
foreach s_name, s_files: sections
t_name = '@0@-@1@-doc'.format(f_name, s_name)
# We do not really need an output file, but Meson
# will complain if one is not set, so we use a
# dummy 'stamp' file
custom_target(
t_name,
command: [
gen_doxygen,
# XXX pass doxygen path as argument
'--builddir=@OUTDIR@',
'--section=@0@'.format(s_name),
'--output-format=@0@'.format(f_name),
'--stamp=doc/doxygen/@0@.stamp'.format(t_name),
wayland_doxygen,
'@INPUT@',
],
input: s_files,
output: '@0@.stamp'.format(t_name),
depends: [dot_png, dot_map],
build_by_default: true,
)
endforeach
endforeach
man_files = shared_files + server_files + client_files
custom_target(
'man-pages-3',
command: [
gen_doxygen,
'--builddir=@OUTDIR@',
'--output-format=man3',
'--stamp=doc/doxygen/man3.stamp',
wayland_doxygen,
'@INPUT@',
],
input: man_files,
output: 'man3',
build_by_default: true,
install: true,
install_dir: join_paths(get_option('prefix'), get_option('mandir')),
)

View File

@ -0,0 +1,18 @@
tgt = custom_target(
'xml-Client-doc',
command: [
gen_doxygen,
# XXX pass doxygen path as argument
'--builddir=@OUTDIR@',
'--section=Client',
'--output-format=xml',
wayland_doxygen,
'@INPUT@',
],
input: [ shared_files, client_files ],
output: [ 'combine.xslt', 'index.xml' ],
depends: [dot_png, dot_map]
)
doxygen_Client_combine_xslt = tgt[0]
doxygen_Client_index_xml = tgt[1]

View File

@ -0,0 +1,18 @@
tgt = custom_target(
'xml-Server-doc',
command: [
gen_doxygen,
# XXX pass doxygen path as argument
'--builddir=@OUTDIR@',
'--section=Server',
'--output-format=xml',
wayland_doxygen,
'@INPUT@',
],
input: [ shared_files, server_files ],
output: [ 'combine.xslt', 'index.xml' ],
depends: [dot_png, dot_map]
)
doxygen_Server_combine_xslt = tgt[0]
doxygen_Server_index_xml = tgt[1]

View File

@ -0,0 +1,22 @@
# dot_png: list of PNG targets
# dot_map: list of MAP targets
foreach name, infile: dot_gv
dot_png += custom_target(
name + '.png',
command: [ dot, '-Tpng', '-o@OUTPUT@', '@INPUT@' ],
input: infile,
output: name + '.png',
install: true,
install_dir: join_paths(publican_install_prefix, publican_html_dir, 'images')
)
dot_map += custom_target(
name + '.map',
command: [ dot, '-Tcmapx_np', '-o@OUTPUT@', '@INPUT@' ],
input: infile,
output: name + '.map',
)
endforeach
subdir('Client')
subdir('Server')

46
doc/man/meson.build Normal file
View File

@ -0,0 +1,46 @@
man_pages = [
{
'section': '3',
'xml': 'wl_display_connect.xml',
'name': 'wl_display_connect',
'alias': 'wl_display_connect_to_fd',
}
]
xsltproc_opts = [
'--nonet',
'--stringparam', 'man.authors.section.enabled', '0',
'--stringparam', 'man.copyright.section.enabled', '0',
'--stringparam', 'funcsynopsis.style', 'ansi',
'--stringparam', 'man.output.quietly', '1',
]
foreach page: man_pages
section_number = page['section']
xml_input = page['xml']
name = page['name']
alias = page.get('alias', '')
man_output = name + '.' + section_number
if alias != ''
alias_output = alias + '.' + section_number
else
alias_output = []
endif
man_page = custom_target(
name + '-man',
command: [
xsltproc,
xsltproc_opts,
'-o', '@OUTPUT0@',
manpage_xsl,
'@INPUT@',
],
input: xml_input,
output: [ man_output, alias_output ],
install: true,
install_dir: join_paths(get_option('prefix'), get_option('mandir'), 'man' + section_number),
build_by_default: true,
)
endforeach

38
doc/meson.build Normal file
View File

@ -0,0 +1,38 @@
dot = find_program('dot')
doxygen = find_program('doxygen')
xsltproc = find_program('xsltproc')
xmlto = find_program('xmlto')
cmd = run_command(doxygen, '--version', check: true)
message('doxygen: ' + cmd.stdout().strip())
vers = cmd.stdout().strip()
if vers.version_compare('< 1.6.0')
error('Doxygen 1.6 or later is required for building documentation, found @0@.'.format(vers))
endif
cmd = run_command(dot, '-V', check: true)
message('dot: ' + cmd.stderr().strip())
vers = cmd.stderr().split('version')[1].strip().split(' ')[0]
if vers.version_compare('< 2.26.0')
error('Dot (Graphviz) 2.26 or later is required for building documentation, found @0@.'.format(vers))
endif
manpage_xsl = 'http://docbook.sourceforge.net/release/xsl/current/manpages/docbook.xsl'
cmd = run_command(xsltproc, '--nonet', manpage_xsl)
if cmd.returncode() != 0
error('The style sheet for man pages providing "@0@" was not found.'.format(manpage_xsl))
endif
publican_install_prefix = join_paths(
get_option('prefix'),
get_option('datadir'),
'doc',
meson.project_name(),
'Wayland', 'en-US'
)
publican_html_dir = 'html'
subdir('doxygen')
subdir('man')
subdir('publican')

30
doc/publican/meson.build Normal file
View File

@ -0,0 +1,30 @@
merge_mapcoords_xsl = files('merge-mapcoords.xsl')
subdir('sources')
custom_target(
'Wayland-docbook-html',
command: [
xmlto,
'--skip-validation',
'--stringparam', 'chunk.section.depth=0',
'--stringparam', 'toc.section.depth=1',
'--stringparam', 'html.stylesheet=css/default.css',
'-o', '@OUTPUT@',
'html',
'@INPUT@'
],
input: publican_processed_main,
output: publican_html_dir,
depend_files: publican_copied_sources,
depends: [
publican_processed_targets,
ClientAPI_xml,
ServerAPI_xml,
ProtocolSpec_xml,
ProtocolInterfaces_xml
],
build_by_default: true,
install: true,
install_dir: publican_install_prefix
)

View File

@ -0,0 +1,113 @@
ProtocolSpec_xml = custom_target(
'ProtocolSpec.xml',
command: [ xsltproc, '-o', '@OUTPUT@', files('../protocol-to-docbook.xsl'), '@INPUT@' ],
input: wayland_protocol_xml,
output: 'ProtocolSpec.xml'
)
ProtocolInterfaces_xml = custom_target(
'ProtocolInterfaces.xml',
command: [ xsltproc, '-o', '@OUTPUT@', files('../protocol-interfaces-to-docbook.xsl'), '@INPUT@' ],
input: wayland_protocol_xml,
output: 'ProtocolInterfaces.xml'
)
ClientAPI_combined = custom_target(
'ClientAPI-combined',
command: [ xsltproc, '-o', '@OUTPUT@', '@INPUT@' ],
input: [ doxygen_Client_combine_xslt, doxygen_Client_index_xml ],
output: 'ClientAPI-combined.xml'
)
to_publican_xsl = files('../doxygen-to-publican.xsl')
ClientAPI_xml = custom_target(
'ClientAPI.xml',
command: [ xsltproc, '-o', '@OUTPUT@', '--stringparam', 'which', 'Client', to_publican_xsl, '@INPUT@' ],
input: ClientAPI_combined,
output: 'ClientAPI.xml'
)
ServerAPI_combined = custom_target(
'ServerAPI-combined',
command: [ xsltproc, '-o', '@OUTPUT@', '@INPUT@' ],
input: [ doxygen_Server_combine_xslt, doxygen_Server_index_xml ],
output: 'ServerAPI-combined.xml'
)
ServerAPI_xml = custom_target(
'ServerAPI.xml',
command: [ xsltproc, '-o', '@OUTPUT@', '--stringparam', 'which', 'Server', to_publican_xsl, '@INPUT@' ],
input: ServerAPI_combined,
output: 'ServerAPI.xml'
)
publican_sources = [
'Wayland.ent',
# 'Wayland.xml', # handled specially
'Book_Info.xml',
'Author_Group.xml',
'Foreword.xml',
'Preface.xml',
'Revision_History.xml',
'Protocol.xml',
'Xwayland.xml',
'Compositors.xml',
'Client.xml',
'Server.xml'
]
publican_processed_main = configure_file(
input: 'Wayland.xml',
output: 'Wayland.xml',
copy: true
)
publican_copied_sources = []
foreach src: publican_sources
publican_copied_sources += configure_file(
input: src,
output: src,
copy: true
)
endforeach
publican_processed_sources = [
'Architecture.xml',
'Introduction.xml'
]
publican_processed_targets = []
foreach src: publican_processed_sources
publican_processed_targets += custom_target(
src,
command: [ xsltproc, '-o', '@OUTPUT@', '--stringparam', 'basedir', '.', merge_mapcoords_xsl, '@INPUT@' ],
input: src,
output: src
)
endforeach
publican_css_sources = files([
'css/brand.css',
'css/common.css',
'css/default.css',
'css/epub.css',
'css/print.css'
])
install_data(
publican_css_sources,
install_dir: join_paths(publican_install_prefix, publican_html_dir, 'css')
)
publican_img_sources = files([
'images/icon.svg',
'images/wayland.png',
'images/xwayland-architecture.png'
])
install_data(
publican_img_sources,
install_dir: join_paths(publican_install_prefix, publican_html_dir, 'images')
)

43
egl/meson.build Normal file
View File

@ -0,0 +1,43 @@
wayland_egl = library(
'wayland-egl',
sources: [
'wayland-egl.c',
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
)
pkgconfig.generate(
name: 'wayland-egl-backend',
description: 'Backend wayland-egl interface',
version: '3'
)

104
meson.build Normal file
View File

@ -0,0 +1,104 @@
project(
'wayland', 'c', 'cpp',
version: '1.17.90',
license: 'MIT',
meson_version: '>= 0.47.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_VERSION', meson.project_version())
compiler_flags = [
'-Wno-unused-parameter',
'-Wstrict-prototypes',
'-Wmissing-prototypes',
'-fvisibility=hidden',
]
cc = meson.get_compiler('c')
add_project_arguments(
cc.get_supported_arguments(compiler_flags),
language: 'c'
)
foreach h: [ 'sys/prctl.h' ]
config_h.set('HAVE_' + h.underscorify().to_upper(), cc.has_header(h))
endforeach
have_funcs = [
'accept4',
'mkostemp',
'posix_fallocate',
'prctl',
'memfd_create',
'strndup',
]
foreach f: have_funcs
config_h.set('HAVE_' + f.underscorify().to_upper(), cc.has_function(f))
endforeach
if get_option('libraries')
ffi_dep = dependency('libffi')
decls = [
{ 'header': 'sys/signalfd.h', 'symbol': 'SFD_CLOEXEC' },
{ 'header': 'sys/timerfd.h', 'symbol': 'TFD_CLOEXEC' },
{ 'header': 'time.h', 'symbol': 'CLOCK_MONOTONIC' },
]
foreach d: decls
if not cc.has_header_symbol(d['header'], d['symbol'])
error('@0@ is needed to compile Wayland libraries'.format(d['symbol']))
endif
endforeach
endif
scanner_deps = [ dependency('expat') ]
if get_option('dtd_validation')
scanner_deps += 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')
wayland_protocol_xml = files('protocol/wayland.xml')
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'),
)

16
meson_options.txt Normal file
View File

@ -0,0 +1,16 @@
option('libraries',
description: 'Compile Wayland libraries',
type: 'boolean',
value: 'true')
option('documentation',
description: 'Build the documentation (requires Doxygen, dot, xmlto, xsltproc)',
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: '')

228
src/meson.build Normal file
View File

@ -0,0 +1,228 @@
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_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('.')
)
# wayland-scanner
configure_file(
input: '../protocol/wayland.dtd',
output: 'wayland.dtd.embed',
copy: true
)
wayland_scanner_sources = [ 'scanner.c', 'dtddata.S' ]
wayland_scanner_includes = [ root_inc, protocol_inc ]
wayland_scanner = executable(
'wayland-scanner',
wayland_scanner_sources,
c_args: [ '-include', 'config.h' ],
include_directories: wayland_scanner_includes,
dependencies: [ scanner_deps, wayland_util_dep, ],
install: true
)
pkgconfig.generate(
name: 'Wayland Scanner',
description: 'Wayland scanner',
version: meson.project_version(),
variables: [
'datarootdir=' + join_paths('${prefix}', get_option('datadir')),
'pkgdatadir=' + join_paths('${datarootdir}', meson.project_name()),
'bindir=' + join_paths('${prefix}', get_option('bindir')),
'wayland_scanner=${bindir}/wayland-scanner'
],
filebase: 'wayland-scanner'
)
if meson.is_cross_build()
scanner_dep = dependency('wayland-scanner', native: true)
wayland_scanner_for_build = find_program(scanner_dep.get_pkgconfig_variable('wayland_scanner'))
else
wayland_scanner_for_build = wayland_scanner
endif
if get_option('libraries')
mathlib_dep = cc.find_library('m', required: false)
threads_dep = dependency('threads', required: false)
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 = [
{
'scanner_args': ['server-header'],
'output': 'wayland-server-protocol.h',
'install': true,
},
{
'scanner_args': ['server-header', '-c'],
'output': 'wayland-server-protocol-core.h',
'install': false,
},
{
'scanner_args': ['client-header'],
'output': 'wayland-client-protocol.h',
'install': true,
},
{
'scanner_args': ['client-header', '-c'],
'output': 'wayland-client-protocol-core.h',
'install': false,
},
]
foreach gen: generated_headers
scanner_args = gen['scanner_args']
output_file = gen['output']
install_file = gen['install']
install_dir = join_paths(get_option('prefix'), get_option('includedir'))
target_name = output_file.underscorify()
target = custom_target(
target_name,
command: [
wayland_scanner_for_build, scanner_args,
'@INPUT@', '@OUTPUT@'
],
input: wayland_protocol_xml,
output: output_file,
install: install_file,
install_dir: install_dir
)
set_variable(target_name, target)
endforeach
wayland_protocol_c = custom_target(
'protocol source',
command: [
wayland_scanner_for_build, 'public-code', '@INPUT@', '@OUTPUT@'
],
input: wayland_protocol_xml,
output: 'wayland-protocol.c'
)
wayland_server = library(
'wayland-server',
sources: [
wayland_server_protocol_core_h,
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,
threads_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, threads_dep ],
sources: [
wayland_server_protocol_core_h,
wayland_server_protocol_h
]
)
pkgconfig.generate(
wayland_server,
name: 'Wayland Server',
description: 'Server side implementation of the Wayland protocol',
version: meson.project_version(),
filebase: 'wayland-server',
variables: [
'datarootdir=' + join_paths('${prefix}', get_option('datadir')),
'pkgdatadir=' + join_paths('${datarootdir}', meson.project_name())
]
)
wayland_client = library(
'wayland-client',
sources: [
wayland_client_protocol_core_h,
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,
threads_dep
],
include_directories: root_inc,
install: true
)
pkgconfig.generate(
wayland_client,
name: 'Wayland Client',
description: 'Wayland client side library',
version: meson.project_version(),
filebase: 'wayland-client',
variables: [
'datarootdir=' + join_paths('${prefix}', get_option('datadir')),
'pkgdatadir=' + join_paths('${datarootdir}', meson.project_name())
]
)
wayland_client_dep = declare_dependency(
link_with: wayland_client,
include_directories: [ root_inc, include_directories('.') ],
sources: [
wayland_client_protocol_core_h,
wayland_client_protocol_h
]
)
install_headers([
'wayland-util.h',
'wayland-server.h',
'wayland-server-core.h',
'wayland-client.h',
'wayland-client-core.h',
])
endif

153
tests/meson.build Normal file
View File

@ -0,0 +1,153 @@
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_for_build, '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_for_build, 'client-header', '@INPUT@', '@OUTPUT@' ],
input: tests_protocol_xml,
output: 'tests-client-protocol.h'
)
tests_protocol_c = custom_target(
'test protocol source',
command: [ wayland_scanner_for_build, 'public-code', '@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',
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()),
],
)
tests = {
'array-test': [],
'client-test': [ wayland_server_protocol_h ],
'display-test': [
tests_server_protocol_h,
tests_client_protocol_c,
tests_protocol_c,
],
'connection-test': [ wayland_server_protocol_h ],
'event-loop-test': [ wayland_server_protocol_h ],
'fixed-test': [],
'interface-test': [ wayland_client_protocol_h ],
'list-test': [],
'map-test': [],
'sanity-test' : [ wayland_server_protocol_h ],
'socket-test': [
wayland_client_protocol_h,
wayland_server_protocol_h,
],
'queue-test': [
wayland_client_protocol_h,
wayland_server_protocol_h,
],
'signal-test': [ wayland_server_protocol_h ],
'newsignal-test': [
# wayland-server.c is needed here to access wl_priv_* functions
files('../src/wayland-server.c'),
wayland_server_protocol_h,
],
'resources-test': [ wayland_server_protocol_core_h ],
'message-test': [
wayland_client_protocol_h,
wayland_server_protocol_h,
],
'compositor-introspection-test': [
wayland_client_protocol_h,
wayland_server_protocol_h,
],
'protocol-logger-test': [
wayland_server_protocol_core_h,
wayland_client_protocol_core_h,
],
'headers-test': [
'headers-protocol-test.c',
'headers-protocol-core-test.c',
wayland_server_protocol_core_h,
wayland_client_protocol_core_h,
],
'os-wrappers-test': [],
}
foreach test_name, test_extra_sources: tests
test_sources = [ test_name + '.c' ] + test_extra_sources
test_deps = [test_runner_dep]
bin = executable(test_name, test_sources, dependencies: test_deps)
test(
test_name,
bin,
env: [
'TEST_SRC_DIR=@0@'.format(meson.current_source_dir()),
'TEST_BUILD_DIR=@0@'.format(meson.current_build_dir()),
],
)
endforeach