project('libwacom', 'c',
version: '2.6.0',
license: 'MIT/Expat',
default_options: [ 'c_std=gnu99', 'warning_level=2' ],
meson_version: '>= 0.51.0')
dir_bin = get_option('prefix') / get_option('bindir')
dir_data = get_option('prefix') / get_option('datadir') / 'libwacom'
dir_etc = get_option('prefix') / get_option('sysconfdir') / 'libwacom'
dir_src = meson.current_source_dir() / 'libwacom'
dir_src_data= meson.current_source_dir() / 'data'
dir_test = meson.current_source_dir() / 'test'
dir_sys_udev= get_option('prefix') / 'lib' / 'udev'
dir_udev = get_option('udev-dir')
if dir_udev == ''
dir_udev = dir_sys_udev
endif
pymod = import('python')
python = pymod.find_installation('python3', required: true)
# Do not modify this, use symbol versioning instead.
libwacom_lt_c=9
libwacom_lt_r=0
libwacom_lt_a=0
# convert ltversion to soname
libwacom_so_version = '@0@.@1@.@2@'.format((libwacom_lt_c - libwacom_lt_a),
libwacom_lt_a, libwacom_lt_r)
# Compiler setup
cc = meson.get_compiler('c')
cflags = cc.get_supported_arguments(
'-Wno-unused-parameter',
'-Wmissing-prototypes',
'-Wstrict-prototypes',
'-Wundef',
'-Wlogical-op',
'-Wpointer-arith',
'-Wuninitialized',
'-Winit-self',
'-Wstrict-prototypes',
'-Wimplicit-fallthrough',
'-Wredundant-decls',
'-Wincompatible-pointer-types',
'-Wformat=2',
'-Wsign-compare',
'-Wmissing-declarations',
)
add_project_arguments(cflags, language: 'c')
# Dependencies
pkgconfig = import('pkgconfig')
dep_gudev = dependency('gudev-1.0')
dep_glib = dependency('glib-2.0')
includes_include = include_directories('include')
includes_src = include_directories('libwacom')
# config.h
config_h = configuration_data()
config_h.set10('HAVE_G_MEMDUP2',
cc.has_function('g_memdup2',
dependencies: dep_glib))
#################### libwacom.so ########################
src_libwacom = [
'include/linux/input-event-codes.h',
'libwacom/libwacom.h',
'libwacom/libwacomint.h',
'libwacom/libwacom.c',
'libwacom/libwacom-error.c',
'libwacom/libwacom-database.c',
]
deps_libwacom = [
dep_gudev,
dep_glib
]
inc_libwacom = [
includes_include,
includes_src,
]
mapfile = dir_src / 'libwacom.sym'
version_flag = '-Wl,--version-script,@0@'.format(mapfile)
lib_libwacom = shared_library('wacom',
src_libwacom,
include_directories: inc_libwacom,
dependencies: deps_libwacom,
version: libwacom_so_version,
link_args: version_flag,
link_depends: mapfile,
c_args: [
'-DG_LOG_DOMAIN="@0@"'.format(meson.project_name()),
'-DDATADIR="@0@"'.format(dir_data),
'-DETCDIR="@0@"'.format(dir_etc),
],
gnu_symbol_visibility: 'hidden',
install: true)
dep_libwacom = declare_dependency(link_with: lib_libwacom)
install_headers('libwacom/libwacom.h', subdir: 'libwacom-1.0/libwacom')
pkgconfig.generate(filebase: 'libwacom',
name: 'libwacom',
description: 'Wacom model feature query library',
version: meson.project_version(),
subdirs: 'libwacom-1.0',
requires_private: deps_libwacom,
libraries: lib_libwacom)
#################### data files ########################
install_subdir('data',
install_dir: dir_data,
strip_directory: true,
exclude_files: ['wacom.example',
'layouts/README.md'])
test('files-in-git',
find_program('test/check-files-in-git.sh'),
args: [meson.current_source_dir()],
suite: ['all'])
# This is a generic pytest invocation. If we end up with more than one
# pytest-compatible test somewhere, we'll conveniently run that one too.
pytest = find_program('pytest-3', required: false)
if pytest.found()
test('pytests', pytest,
args: ['-vv', '--log-level=DEBUG'],
workdir: meson.current_source_dir(),
env: ['LIBWACOM_DATA_DIR=@0@'.format(dir_src_data)])
endif
############### tools ###########################
executable('libwacom-list-local-devices',
'tools/list-local-devices.c',
dependencies: [dep_libwacom, dep_glib, dep_gudev],
include_directories: [includes_src],
install: true)
tools_cflags = ['-DDATABASEPATH="@0@"'.format(dir_src_data)]
updatedb = configure_file(input: 'tools/libwacom-update-db.py',
output: '@BASENAME@',
copy: true,
install: true,
install_dir: dir_bin)
custom_target('hwdb',
command: [python, updatedb, '--buildsystem-mode', dir_src_data],
capture: true,
output: '65-libwacom.hwdb',
install: true,
install_dir: dir_udev / 'hwdb.d')
configure_file(input: 'tools/65-libwacom.rules.in',
output: '65-libwacom.rules',
copy: true,
install: true,
install_dir: dir_udev / 'rules.d')
# The non-installed version of list-devices uses the git tree's data files
executable('list-devices',
'tools/list-devices.c',
dependencies: [dep_libwacom, dep_glib],
include_directories: [includes_src],
c_args: tools_cflags,
install: false)
# The installed version of list-devices uses the installed data files
executable('libwacom-list-devices',
'tools/list-devices.c',
dependencies: [dep_libwacom, dep_glib],
include_directories: [includes_src],
install: true)
executable('list-compatible-styli',
'tools/list-compatible-styli.c',
dependencies: [dep_libwacom, dep_glib],
include_directories: [includes_src],
c_args: tools_cflags,
install: false)
install_man(configure_file(input: 'tools/libwacom-list-local-devices.man',
output: '@BASENAME@.1',
copy: true))
install_man(configure_file(input: 'tools/libwacom-list-devices.man',
output: '@BASENAME@.1',
copy: true))
showstylus_config = configuration_data()
showstylus_config.set('DATADIR', dir_data)
showstylus_config.set('ETCDIR', dir_etc)
configure_file(output: 'libwacom-show-stylus',
input: 'tools/show-stylus.py',
configuration: showstylus_config,
install_dir: dir_bin,
install: true)
############### docs ###########################
docs_feature = get_option('documentation')
doxygen = find_program('doxygen', required: docs_feature)
if doxygen.found()
src_doxygen = [
dir_src / 'libwacom.h',
]
doc_config = configuration_data()
doc_config.set('PACKAGE_NAME', meson.project_name())
doc_config.set('PACKAGE_VERSION', meson.project_version())
doc_config.set('TOPSRCDIR', meson.current_source_dir())
doxyfile = configure_file(input: 'doc/doxygen.conf.in',
output: 'doxygen.conf',
configuration: doc_config)
custom_target('doxygen',
input: [doxyfile] + src_doxygen,
output: ['html'],
command: [doxygen, doxyfile],
install: false,
build_by_default: true)
endif
############# tests ############################
if get_option('tests').enabled()
dep_libxml = dependency('libxml-2.0', required : false)
dep_dl = cc.find_library('dl')
tests_cflags = ['-DTOPSRCDIR="@0@"'.format(meson.current_source_dir())]
test_load = executable('test-load',
'test/test-load.c',
dependencies: [dep_libwacom, dep_glib],
include_directories: [includes_include, includes_src],
c_args: tests_cflags,
install: false)
test('test-load', test_load, suite: ['all', 'valgrind'])
test_dbverify = executable('test-dbverify',
'test/test-dbverify.c',
dependencies: [dep_libwacom, dep_glib],
include_directories: [includes_src],
c_args: tests_cflags,
install: false)
test('test-dbverify', test_dbverify, suite: ['all', 'valgrind'])
test_tablet_validity = executable('test-tablet-validity',
'test/test-tablet-validity.c',
dependencies: [dep_libwacom, dep_glib],
include_directories: [includes_src],
c_args: tests_cflags,
install: false)
test('test-tablet-validity', test_tablet_validity, suite: ['all', 'valgrind'])
test_stylus_validity= executable('test-stylus-validity',
'test/test-stylus-validity.c',
dependencies: [dep_libwacom, dep_glib],
include_directories: [includes_src],
c_args: tests_cflags,
install: false)
test('test-stylus-validity', test_stylus_validity, suite: ['all', 'valgrind'])
if dep_libxml.found()
test_svg_validity = executable('test-svg-validity',
'test/test-tablet-svg-validity.c',
dependencies: [dep_libwacom, dep_libxml, dep_glib],
include_directories: [includes_src],
c_args: tests_cflags,
install: false)
test('test-svg-validity', test_svg_validity, suite: ['all', 'valgrind'])
endif
valgrind = find_program('valgrind', required : false)
if valgrind.found()
valgrind_suppressions_file = dir_test / 'valgrind.suppressions'
add_test_setup('valgrind',
exe_wrapper: [valgrind,
'--leak-check=full',
'--gen-suppressions=all',
'--error-exitcode=3',
'--suppressions=' + valgrind_suppressions_file ],
timeout_multiplier : 100)
else
message('valgrind not found, disabling valgrind test suite')
endif
pymod.find_installation(modules: ['libevdev', 'pyudev', 'pytest'])
pytest = find_program('pytest-3', 'pytest')
test('pytest',
pytest,
args: [meson.current_source_dir()],
env: ['MESON_SOURCE_ROOT=@0@'.format(meson.current_source_dir())],
suite: ['all'])
endif
# This is a non-optional test
lt_version = '@0@:@1@:@2@'.format( libwacom_lt_c, libwacom_lt_r, libwacom_lt_a)
test_ltversion = executable('test-ltversion',
'test/test-ltversion.c',
c_args: ['-DLIBWACOM_LT_VERSION="@0@"'.format(lt_version)],
install: false)
test('test-ltversion', test_ltversion, suite: ['all'])
############ output files ############
configure_file(output: 'config.h', configuration: config_h)
# vim: set noexpandtab tabstop=8 shiftwidth=8: