meson: Add option to control building wayland-scanner

Wayland requires a binary, wayland-scanner, to be run during the build
process. For any configuration other than native builds (including
cross compiling and even 32-bit x86 builds on an x86-64 build machine)
Wayland's build process builds and uses its own wayland-scanner.

For any builds using a cross file, wayland-scanner is built for the host
machine and therefore cannot be executed during the build of the Wayland
libraries. Instead builds using a cross file must execute the build
machine's wayland-scanner (typically /usr/bin/wayland-scanner).

As such, to build Wayland's libraries for a non-native ABI a package
manager must build and install /usr/bin/wayland-scanner first. But then
the build for the native ABI then rebuilds wayland-scanner itself and
doesn't use the system's, and worse, wants to install its own, which
conflicts with the /usr/bin/wayland-scanner already installed!

So, add the -Dscanner=... option to control whether to install
wayland-scanner.

Signed-off-by: Matt Turner <mattst88@gmail.com>
This commit is contained in:
Matt Turner 2020-03-05 12:04:36 -08:00
parent 5ddb8dff87
commit 618663c791
4 changed files with 80 additions and 58 deletions

View File

@ -84,19 +84,20 @@ if get_option('libraries')
subdir('cursor')
subdir('egl')
subdir('tests')
if get_option('documentation')
subdir('doc')
endif
endif
if get_option('documentation')
subdir('doc')
if get_option('scanner')
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'),
)
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'),
)

View File

@ -2,6 +2,10 @@ option('libraries',
description: 'Compile Wayland libraries',
type: 'boolean',
value: 'true')
option('scanner',
description: 'Compile wayland-scanner binary',
type: 'boolean',
value: 'true')
option('documentation',
description: 'Build the documentation (requires Doxygen, dot, xmlto, xsltproc)',
type: 'boolean',

View File

@ -4,12 +4,6 @@ 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',
@ -21,40 +15,48 @@ wayland_util_dep = declare_dependency(
include_directories: include_directories('.')
)
# wayland-scanner
if get_option('scanner')
# wayland-scanner
configure_file(
input: '../protocol/wayland.dtd',
output: 'wayland.dtd.embed',
copy: true
)
configure_file(
input: 'wayland-version.h.in',
output: 'wayland-version.h',
configuration: wayland_version_h,
)
wayland_scanner_sources = [ 'scanner.c', 'dtddata.S' ]
wayland_scanner_includes = [ root_inc, protocol_inc ]
configure_file(
input: '../protocol/wayland.dtd',
output: 'wayland.dtd.embed',
copy: true
)
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
)
wayland_scanner_sources = [ 'scanner.c', 'dtddata.S' ]
wayland_scanner_includes = [ root_inc, protocol_inc ]
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'
)
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
)
if meson.is_cross_build()
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'
)
endif
if meson.is_cross_build() or not get_option('scanner')
scanner_dep = dependency('wayland-scanner', native: true, version: meson.project_version())
wayland_scanner_for_build = find_program(scanner_dep.get_pkgconfig_variable('wayland_scanner'))
else
@ -62,6 +64,19 @@ else
endif
if get_option('libraries')
# wayland libraries
# Duplicated inside the "if get_option('scanner')" block above since we
# still need the wayland-version.h to build the scanner, but do not want
# to install it. Meson 0.50 adds "install: bool" which will let us
# deduplicate this block.
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'))
)
mathlib_dep = cc.find_library('m', required: false)
threads_dep = dependency('threads', required: false)

View File

@ -76,16 +76,18 @@ test(
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()),
],
)
if get_option('scanner')
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()),
],
)
endif
tests = {
'array-test': [],