1 project('libinput', 'c',
4 default_options : [ 'c_std=gnu99', 'warning_level=2' ],
5 meson_version : '>= 0.49.0')
7 libinput_version = meson.project_version().split('.')
9 dir_data = get_option('prefix') / get_option('datadir') / 'libinput'
10 dir_etc = get_option('prefix') / get_option('sysconfdir')
11 dir_overrides = get_option('prefix') / get_option('sysconfdir') / 'libinput'
12 dir_libexec = get_option('prefix') / get_option('libexecdir') / 'libinput'
13 dir_lib = get_option('prefix') / get_option('libdir')
14 dir_man1 = get_option('prefix') / get_option('mandir') / 'man1'
15 dir_system_udev = get_option('prefix') / 'lib' / 'udev'
16 dir_src_quirks = meson.current_source_dir() / 'quirks'
17 dir_src_test = meson.current_source_dir() / 'test'
18 dir_src = meson.current_source_dir() / 'src'
19 dir_gitlab_ci = meson.current_source_dir() / '.gitlab-ci'
21 dir_udev = get_option('udev-dir')
23 dir_udev = dir_system_udev
25 dir_udev_callouts = dir_udev
26 dir_udev_rules = dir_udev / 'rules.d'
28 # Collection of man pages, we'll append to that
31 # We use libtool-version numbers because it's easier to understand.
32 # Before making a release, the libinput_so_*
33 # numbers should be modified. The components are of the form C:R:A.
34 # a) If binary compatibility has been broken (eg removed or changed interfaces)
36 # b) If interfaces have been changed or added, but binary compatibility has
37 # been preserved, change to C+1:0:A+1
38 # c) If the interface is the same as the previous version, change to C:R+1:A
44 libinput_so_version = '@0@.@1@.@2@'.format((libinput_lt_c - libinput_lt_a),
45 libinput_lt_a, libinput_lt_r)
48 cc = meson.get_compiler('c')
50 '-Wno-unused-parameter',
51 '-Wmissing-prototypes',
52 '-Wstrict-prototypes',
58 '-Wstrict-prototypes',
59 '-Wimplicit-fallthrough',
61 '-Wincompatible-pointer-types',
63 '-Wno-missing-field-initializers',
64 '-Wmissing-declarations',
66 '-fvisibility=hidden',
68 add_project_arguments(cc.get_supported_arguments(cflags), language : 'c')
71 config_h = configuration_data()
73 doc_url_base = 'https://wayland.freedesktop.org/libinput/doc'
74 if libinput_version[2].to_int() >= 90
75 doc_url = '@0@/latest'.format(doc_url_base)
77 doc_url = '@0@/@1@'.format(doc_url_base, meson.project_version())
79 config_h.set_quoted('HTTP_DOC_LINK', doc_url)
81 config_h.set('_GNU_SOURCE', '1')
82 if get_option('buildtype') == 'debug' or get_option('buildtype') == 'debugoptimized'
83 config_h.set_quoted('MESON_BUILD_ROOT', meson.current_build_dir())
85 config_h.set_quoted('MESON_BUILD_ROOT', '')
88 prefix = '''#define _GNU_SOURCE 1
91 if cc.get_define('static_assert', prefix : prefix) == ''
92 config_h.set('static_assert(...)', '/* */')
95 # Coverity breaks because it doesn't define _Float128 correctly, you'll end
96 # up with a bunch of messages in the form:
97 # "/usr/include/stdlib.h", line 133: error #20: identifier "_Float128" is
99 # extern _Float128 strtof128 (const char *__restrict __nptr,
101 # We don't use float128 ourselves, it gets pulled in from math.h or
102 # something, so let's just define it as uint128 and move on.
103 # Unfortunately we can't detect the coverity build at meson configure
104 # time, we only know it fails at runtime. So make this an option instead, to
105 # be removed when coverity fixes this again.
106 if get_option('coverity')
107 config_h.set('_Float128', '__uint128_t')
108 config_h.set('_Float32', 'int')
109 config_h.set('_Float32x', 'int')
110 config_h.set('_Float64', 'long')
111 config_h.set('_Float64x', 'long')
114 if cc.has_header_symbol('dirent.h', 'versionsort', prefix : prefix)
115 config_h.set('HAVE_VERSIONSORT', '1')
118 if not cc.has_header_symbol('errno.h', 'program_invocation_short_name', prefix : prefix)
119 if cc.has_header_symbol('stdlib.h', 'getprogname')
120 config_h.set('program_invocation_short_name', 'getprogname()')
124 if cc.has_header('xlocale.h')
125 config_h.set('HAVE_XLOCALE_H', '1')
130 void main(void) { newlocale(LC_NUMERIC_MASK, "C", (locale_t)0); }
132 if cc.links(code, name : 'locale.h')
133 config_h.set('HAVE_LOCALE_H', '1')
136 if not cc.has_header_symbol('sys/ptrace.h', 'PTRACE_ATTACH', prefix : prefix)
137 config_h.set('PTRACE_ATTACH', 'PT_ATTACH')
138 config_h.set('PTRACE_CONT', 'PT_CONTINUE')
139 config_h.set('PTRACE_DETACH', 'PT_DETACH')
142 config_h.set10('HAVE_INSTALLED_TESTS', get_option('install-tests'))
145 pkgconfig = import('pkgconfig')
146 dep_udev = dependency('libudev')
147 dep_mtdev = dependency('mtdev', version : '>= 1.1.0')
148 dep_libevdev = dependency('libevdev')
149 config_h.set10('HAVE_LIBEVDEV_DISABLE_PROPERTY',
150 dep_libevdev.version().version_compare('>= 1.9.902'))
152 dep_lm = cc.find_library('m', required : false)
153 dep_rt = cc.find_library('rt', required : false)
155 # Include directories
156 includes_include = include_directories('include')
157 includes_src = include_directories('src')
159 ############ libwacom configuration ############
161 have_libwacom = get_option('libwacom')
162 config_h.set10('HAVE_LIBWACOM', have_libwacom)
164 dep_libwacom = dependency('libwacom', version : '>= 0.27')
166 dep_libwacom = declare_dependency()
169 ############ ttrace configuration ############
171 dep_ttrace = dependency('ttrace', required : false)
172 if dep_ttrace.found()
173 config_h.set10('ENABLE_TTRACE', 1)
176 ############ check udev function ############
178 if cc.has_function('input_set_default_property', dependencies : dep_udev)
179 config_h.set10('HAVE_INPUT_SET_DEFAULT_PROPERTY', 1)
182 ############ udev bits ############
184 executable('libinput-device-group',
185 'udev/libinput-device-group.c',
186 dependencies : [dep_udev, dep_libwacom],
187 include_directories : [includes_src, includes_include],
189 install_dir : dir_udev_callouts)
190 executable('libinput-fuzz-extract',
191 'udev/libinput-fuzz-extract.c',
192 'src/util-strings.c',
193 'src/util-prop-parsers.c',
194 dependencies : [dep_udev, dep_libevdev, dep_lm],
195 include_directories : [includes_src, includes_include],
197 install_dir : dir_udev_callouts)
198 executable('libinput-fuzz-to-zero',
199 'udev/libinput-fuzz-to-zero.c',
200 dependencies : [dep_udev, dep_libevdev],
201 include_directories : [includes_src, includes_include],
203 install_dir : dir_udev_callouts)
205 udev_rules_config = configuration_data()
206 udev_rules_config.set('UDEV_TEST_PATH', '')
207 configure_file(input : 'udev/80-libinput-device-groups.rules.in',
208 output : '80-libinput-device-groups.rules',
209 install_dir : dir_udev_rules,
210 configuration : udev_rules_config)
211 configure_file(input : 'udev/90-libinput-fuzz-override.rules.in',
212 output : '90-libinput-fuzz-override.rules',
213 install_dir : dir_udev_rules,
214 configuration : udev_rules_config)
216 litest_udev_rules_config = configuration_data()
217 litest_udev_rules_config.set('UDEV_TEST_PATH', meson.current_build_dir() + '/')
218 litest_groups_rules_file = configure_file(input : 'udev/80-libinput-device-groups.rules.in',
219 output : '80-libinput-device-groups-litest.rules',
220 configuration : litest_udev_rules_config)
221 litest_fuzz_override_file = configure_file(input : 'udev/90-libinput-fuzz-override.rules.in',
222 output : '90-libinput-fuzz-override-litest.rules',
223 configuration : litest_udev_rules_config)
225 ############ Check for leftover udev rules ########
227 # This test should be defined first so we don't waste time testing anything
228 # else if we're about to fail anyway. ninja test will execute tests in the
229 # order of them defined in meson.build
231 if get_option('tests')
232 test('leftover-rules',
233 find_program('test/check-leftover-udev-rules.sh'),
238 ############ libepoll-shim (BSD) ############
240 if cc.has_header_symbol('sys/epoll.h', 'epoll_create1', prefix : prefix)
241 # epoll is built-in (Linux, illumos)
242 dep_libepoll = declare_dependency()
244 # epoll is implemented in userspace by libepoll-shim (FreeBSD)
245 dir_libepoll = get_option('epoll-dir')
246 if dir_libepoll == ''
247 dir_libepoll = get_option('prefix')
249 includes_epoll = include_directories(dir_libepoll / 'include' / 'libepoll-shim')
250 dep_libepoll = cc.find_library('epoll-shim', dirs : dir_libepoll / 'lib')
252 #include <sys/epoll.h>
253 int main(void) { epoll_create1(0); }
255 if not cc.links(code,
256 name : 'libepoll-shim check',
257 dependencies : [dep_libepoll, dep_rt],
258 include_directories : includes_epoll) # note: wants an include_directories object
259 error('No built-in epoll or libepoll-shim found.')
261 dep_libepoll = declare_dependency(
262 include_directories : includes_epoll,
263 dependencies : [dep_libepoll, dep_rt])
266 ############ libinput-util.a ############
268 # Basic compilation test to make sure the headers include and define all the
272 'util-input-event.h',
276 'util-prop-parsers.h',
281 foreach h: util_headers
282 c = configuration_data()
283 c.set_quoted('FILE', h)
284 testfile = configure_file(input : 'test/test-util-includes.c',
285 output : 'test-util-includes-@0@.c'.format(h),
287 executable('test-build-@0@'.format(h),
289 include_directories : [includes_src, includes_include],
293 src_libinput_util = [
295 'src/util-ratelimit.c',
296 'src/util-strings.c',
297 'src/util-prop-parsers.c',
299 libinput_util = static_library('libinput-util',
301 dependencies : [dep_udev, dep_libevdev, dep_libwacom],
302 include_directories : includes_include)
303 dep_libinput_util = declare_dependency(link_with : libinput_util)
305 ############ libfilter.a ############
309 'src/filter-low-dpi.c',
310 'src/filter-mouse.c',
311 'src/filter-touchpad.c',
312 'src/filter-touchpad-flat.c',
313 'src/filter-touchpad-x230.c',
314 'src/filter-tablet.c',
315 'src/filter-trackpoint.c',
316 'src/filter-trackpoint-flat.c',
318 libfilter = static_library('filter', src_libfilter,
319 dependencies : [dep_udev, dep_libwacom],
320 include_directories : includes_include)
321 dep_libfilter = declare_dependency(link_with : libfilter)
323 ############ libquirks.a #############
324 libinput_data_path = dir_data
325 libinput_data_override_path = dir_overrides / 'local-overrides.quirks'
326 config_h.set_quoted('LIBINPUT_QUIRKS_DIR', dir_data)
327 config_h.set_quoted('LIBINPUT_QUIRKS_OVERRIDE_FILE', libinput_data_override_path)
329 config_h.set_quoted('LIBINPUT_QUIRKS_SRCDIR', dir_src_quirks)
330 install_subdir('quirks',
331 exclude_files: ['README.md'],
332 install_dir : dir_data,
333 strip_directory : true)
339 deps_libquirks = [dep_udev, dep_libwacom, dep_libinput_util]
340 libquirks = static_library('quirks', src_libquirks,
341 dependencies : deps_libquirks,
342 include_directories : includes_include)
343 dep_libquirks = declare_dependency(link_with : libquirks)
345 # Create /etc/libinput
346 if meson.version().version_compare('>= 0.60')
347 install_emptydir(dir_etc / 'libinput')
349 install_subdir('libinput', install_dir : dir_etc)
352 ############ libinput.so ############
353 install_headers('src/libinput.h')
354 src_libinput = src_libfilter + [
356 'src/libinput-private-config.c',
358 'src/evdev-debounce.c',
359 'src/evdev-fallback.c',
361 'src/evdev-middle-button.c',
362 'src/evdev-mt-touchpad.c',
363 'src/evdev-mt-touchpad-tap.c',
364 'src/evdev-mt-touchpad-thumb.c',
365 'src/evdev-mt-touchpad-buttons.c',
366 'src/evdev-mt-touchpad-edge-scroll.c',
367 'src/evdev-mt-touchpad-gestures.c',
368 'src/evdev-tablet.c',
369 'src/evdev-tablet-pad.c',
370 'src/evdev-tablet-pad-leds.c',
390 libinput_version_h_config = configuration_data()
391 libinput_version_h_config.set('LIBINPUT_VERSION_MAJOR', libinput_version[0])
392 libinput_version_h_config.set('LIBINPUT_VERSION_MINOR', libinput_version[1])
393 libinput_version_h_config.set('LIBINPUT_VERSION_MICRO', libinput_version[2])
394 libinput_version_h_config.set('LIBINPUT_VERSION', meson.project_version())
396 libinput_version_h = configure_file(
397 input : 'src/libinput-version.h.in',
398 output : 'libinput-version.h',
399 configuration : libinput_version_h_config,
402 mapfile = dir_src / 'libinput.sym'
403 version_flag = '-Wl,--version-script,@0@'.format(mapfile)
404 lib_libinput = shared_library('input',
406 include_directories : [include_directories('.'), includes_include],
407 dependencies : deps_libinput,
408 version : libinput_so_version,
409 link_args : version_flag,
410 link_depends : mapfile,
414 dep_libinput = declare_dependency(
415 link_with : lib_libinput,
416 dependencies : deps_libinput)
419 filebase : 'libinput',
421 description : 'Input device library',
422 version : meson.project_version(),
423 libraries : lib_libinput
426 git_version_h = vcs_tag(command : ['git', 'describe'],
427 fallback : 'unknown',
428 input : 'src/libinput-git-version.h.in',
429 output :'libinput-git-version.h')
431 ############ documentation ############
433 if get_option('documentation')
438 ############ shell completion #########
440 subdir('completion/zsh')
442 ############ tools ############
443 libinput_tool_path = dir_libexec
444 config_h.set_quoted('LIBINPUT_TOOL_PATH', libinput_tool_path)
445 tools_shared_sources = [ 'tools/shared.c' ]
446 deps_tools_shared = [ dep_libinput, dep_libevdev ]
447 lib_tools_shared = static_library('tools_shared',
448 tools_shared_sources,
449 include_directories : [includes_src, includes_include],
450 dependencies : deps_tools_shared)
451 dep_tools_shared = declare_dependency(link_with : lib_tools_shared,
452 dependencies : deps_tools_shared)
454 deps_tools = [ dep_tools_shared, dep_libinput ]
455 libinput_debug_events_sources = [
456 'tools/libinput-debug-events.c',
459 executable('libinput-debug-events',
460 libinput_debug_events_sources,
461 dependencies : deps_tools,
462 include_directories : [includes_src, includes_include],
463 install_dir : libinput_tool_path,
467 libinput_debug_tablet_sources = [ 'tools/libinput-debug-tablet.c' ]
468 executable('libinput-debug-tablet',
469 libinput_debug_tablet_sources,
470 dependencies : deps_tools,
471 include_directories : [includes_src, includes_include],
472 install_dir : libinput_tool_path,
476 libinput_quirks_sources = [ 'tools/libinput-quirks.c' ]
477 libinput_quirks = executable('libinput-quirks',
478 libinput_quirks_sources,
479 dependencies : [dep_libquirks, dep_tools_shared, dep_libinput],
480 include_directories : [includes_src, includes_include],
481 install_dir : libinput_tool_path,
484 test('validate-quirks',
486 args: ['validate', '--data-dir=@0@'.format(dir_src_quirks)],
490 libinput_list_devices_sources = [ 'tools/libinput-list-devices.c' ]
491 libinput_list_devices = executable('libinput-list-devices',
492 libinput_list_devices_sources,
493 dependencies : deps_tools,
494 include_directories : [includes_src, includes_include],
495 install_dir : libinput_tool_path,
499 libinput_list_devices,
500 suite : ['all', 'root', 'hardware'])
502 libinput_measure_sources = [ 'tools/libinput-measure.c' ]
503 executable('libinput-measure',
504 libinput_measure_sources,
505 dependencies : deps_tools,
506 include_directories : [includes_src, includes_include],
507 install_dir : libinput_tool_path,
511 libinput_analyze_sources = [ 'tools/libinput-analyze.c' ]
512 executable('libinput-analyze',
513 libinput_analyze_sources,
514 dependencies : deps_tools,
515 include_directories : [includes_src, includes_include],
516 install_dir : libinput_tool_path,
520 src_python_tools = files(
521 'tools/libinput-analyze-per-slot-delta.py',
522 'tools/libinput-analyze-recording.py',
523 'tools/libinput-analyze-touch-down-state.py',
524 'tools/libinput-measure-fuzz.py',
525 'tools/libinput-measure-touchpad-size.py',
526 'tools/libinput-measure-touchpad-tap.py',
527 'tools/libinput-measure-touchpad-pressure.py',
528 'tools/libinput-measure-touch-size.py',
529 'tools/libinput-replay.py'
532 foreach t : src_python_tools
533 configure_file(input: t,
534 output: '@BASENAME@',
536 install_dir : libinput_tool_path
540 libinput_record_sources = [ 'tools/libinput-record.c', git_version_h ]
541 executable('libinput-record',
542 libinput_record_sources,
543 dependencies : deps_tools + [dep_udev],
544 include_directories : [includes_src, includes_include],
545 install_dir : libinput_tool_path,
549 config_h.set10('HAVE_DEBUG_GUI', get_option('debug-gui'))
550 if get_option('debug-gui')
551 dep_gtk = dependency('gtk4', version : '>= 4.0', required : false)
552 config_h.set10('HAVE_GTK4', dep_gtk.found())
553 if not dep_gtk.found()
554 dep_gtk = dependency('gtk+-3.0', version : '>= 3.20')
555 config_h.set10('HAVE_GTK3', dep_gtk.found())
558 gtk_targets = dep_gtk.get_pkgconfig_variable('targets')
559 have_gtk_wayland = gtk_targets.contains('wayland')
560 have_gtk_x11 = gtk_targets.contains('x11')
562 dep_cairo = dependency('cairo')
563 dep_glib = dependency('glib-2.0')
564 dep_x11 = dependency('x11', required : false)
565 dep_wayland_client = dependency('wayland-client', required : false)
566 dep_wayland_protocols = dependency('wayland-protocols', required : false)
568 config_h.set10('HAVE_GTK_X11', have_gtk_x11 and dep_x11.found())
569 config_h.set10('HAVE_GTK_WAYLAND', false)
571 debug_gui_sources = [ 'tools/libinput-debug-gui.c' ]
573 if have_gtk_wayland and dep_wayland_client.found() and dep_wayland_protocols.found()
574 wayland_scanner = find_program('wayland-scanner')
575 wlproto_dir = dep_wayland_protocols.get_pkgconfig_variable('pkgdatadir')
577 proto_name = 'pointer-constraints-unstable-v1'
578 input = files(wlproto_dir / 'unstable' / 'pointer-constraints' / '@0@.xml'.format(proto_name))
580 wayland_headers = custom_target('@0@ client header'.format(proto_name),
582 output: '@0@-client-protocol.h'.format(proto_name),
583 command: [wayland_scanner, 'client-header', '@INPUT@', '@OUTPUT@'],
586 wayland_sources = custom_target('@0@ source'.format(proto_name),
588 output: '@0@-protocol.c'.format(proto_name),
589 command: [wayland_scanner, 'private-code', '@INPUT@', '@OUTPUT@'],
592 debug_gui_sources += [ wayland_headers, wayland_sources ]
593 config_h.set10('HAVE_GTK_WAYLAND', true)
601 dep_wayland_protocols,
604 executable('libinput-debug-gui',
606 dependencies : deps_debug_gui,
607 include_directories : [includes_src, includes_include],
608 install_dir : libinput_tool_path,
611 src_man += files('tools/libinput-debug-gui.man')
614 libinput_sources = [ 'tools/libinput-tool.c' ]
616 libinput_tool = executable('libinput',
618 dependencies : deps_tools,
619 include_directories : [includes_src, includes_include],
623 ptraccel_debug_sources = [ 'tools/ptraccel-debug.c' ]
624 executable('ptraccel-debug',
625 ptraccel_debug_sources,
626 dependencies : [ dep_libfilter, dep_libinput ],
627 include_directories : [includes_src, includes_include],
631 # Don't run the test during a release build because we rely on the magic
633 if get_option('buildtype') == 'debug' or get_option('buildtype') == 'debugoptimized'
634 config_tool_option_test = configuration_data()
635 config_tool_option_test.set('DISABLE_WARNING', 'yes')
636 config_tool_option_test.set('MESON_ENABLED_DEBUG_GUI', get_option('debug-gui'))
637 config_tool_option_test.set('MESON_BUILD_ROOT', meson.current_build_dir())
638 config_tool_option_test.set('TOOL_PATH', libinput_tool.full_path())
639 tool_option_test = configure_file(input: 'tools/test_tool_option_parsing.py',
640 output: '@PLAINNAME@',
641 configuration : config_tool_option_test)
642 test('tool-option-parsing',
644 args : [tool_option_test, '-n', 'auto'],
645 suite : ['all', 'root'],
649 # the libinput tools check whether we execute from the builddir, this is
650 # the test to verify that lookup. We test twice, once as normal test
651 # run from the builddir, once after copying to /tmp
652 test_builddir_lookup = executable('test-builddir-lookup',
653 'test/test-builddir-lookup.c',
654 dependencies : [ dep_tools_shared],
655 include_directories : [includes_src, includes_include],
657 test('tools-builddir-lookup',
658 test_builddir_lookup,
659 args : ['--builddir-is-set'],
661 test('tools-builddir-lookup-installed',
662 find_program('test/helper-copy-and-exec-from-tmp.sh'),
663 args : [test_builddir_lookup.full_path(), '--builddir-is-null'],
664 env : ['LD_LIBRARY_PATH=@0@'.format(meson.current_build_dir())],
668 ############ tests ############
670 test('symbols-leak-test',
671 find_program('test/symbols-leak-test'),
672 args : [ dir_src / 'libinput.sym', dir_src],
676 executable('test-build-pedantic',
677 'test/build-pedantic.c',
678 dependencies : [dep_udev],
679 include_directories : [includes_src, includes_include],
680 c_args : ['-std=c99', '-pedantic', '-Werror'],
683 executable('test-build-std-gnuc90',
684 'test/build-pedantic.c',
685 dependencies : [dep_udev],
686 include_directories : [includes_src, includes_include],
687 c_args : ['-std=gnu89', '-Werror'],
689 # test for linking with the minimal linker flags
690 executable('test-build-linker',
691 'test/build-pedantic.c',
692 include_directories : [includes_src, includes_include],
693 dependencies : [ dep_libinput, dep_libinput_util ],
695 # test including from C++ (in case CPP compiler is available)
696 if add_languages('cpp', required: false)
697 executable('test-build-cxx',
699 dependencies : [dep_udev],
700 include_directories : [includes_src, includes_include],
704 libinput_test_sources = [ 'tools/libinput-test.c' ]
705 executable('libinput-test',
706 libinput_test_sources,
707 dependencies : deps_tools,
708 include_directories : [includes_src, includes_include],
709 install_dir : libinput_tool_path,
713 # This is the test suite runner, we allow disabling that one because of
715 if get_option('tests')
716 dep_check = dependency('check', version : '>= 0.9.10')
718 gstack = find_program('gstack', required : false)
719 config_h.set10('HAVE_GSTACK', gstack.found())
721 # for inhibit support during test run
722 dep_libsystemd = dependency('libsystemd', version : '>= 221', required : false)
723 config_h.set10('HAVE_LIBSYSTEMD', dep_libsystemd.found())
726 'src/libinput-private-config.c',
727 'test/litest-device-absinfo-override.c',
728 'test/litest-device-acer-hawaii-keyboard.c',
729 'test/litest-device-acer-hawaii-touchpad.c',
730 'test/litest-device-aiptek-tablet.c',
731 'test/litest-device-alps-3fg.c',
732 'test/litest-device-alps-semi-mt.c',
733 'test/litest-device-alps-dualpoint.c',
734 'test/litest-device-anker-mouse-kbd.c',
735 'test/litest-device-apple-appletouch.c',
736 'test/litest-device-apple-internal-keyboard.c',
737 'test/litest-device-apple-magicmouse.c',
738 'test/litest-device-asus-rog-gladius.c',
739 'test/litest-device-atmel-hover.c',
740 'test/litest-device-bcm5974.c',
741 'test/litest-device-calibrated-touchscreen.c',
742 'test/litest-device-cyborg-rat-5.c',
743 'test/litest-device-dell-canvas-totem.c',
744 'test/litest-device-dell-canvas-totem-touch.c',
745 'test/litest-device-elantech-touchpad.c',
746 'test/litest-device-elan-tablet.c',
747 'test/litest-device-format-string.c',
748 'test/litest-device-generic-pressurepad.c',
749 'test/litest-device-generic-singletouch.c',
750 'test/litest-device-gpio-keys.c',
751 'test/litest-device-huion-pentablet.c',
752 'test/litest-device-hp-wmi-hotkeys.c',
753 'test/litest-device-ignored-mouse.c',
754 'test/litest-device-keyboard.c',
755 'test/litest-device-keyboard-all-codes.c',
756 'test/litest-device-keyboard-quirked.c',
757 'test/litest-device-keyboard-razer-blackwidow.c',
758 'test/litest-device-keyboard-razer-blade-stealth.c',
759 'test/litest-device-keyboard-razer-blade-stealth-videoswitch.c',
760 'test/litest-device-lenovo-scrollpoint.c',
761 'test/litest-device-lid-switch.c',
762 'test/litest-device-lid-switch-surface3.c',
763 'test/litest-device-logitech-media-keyboard-elite.c',
764 'test/litest-device-logitech-trackball.c',
765 'test/litest-device-nexus4-touch-screen.c',
766 'test/litest-device-magic-trackpad.c',
767 'test/litest-device-mouse.c',
768 'test/litest-device-mouse-wheel-tilt.c',
769 'test/litest-device-mouse-roccat.c',
770 'test/litest-device-mouse-low-dpi.c',
771 'test/litest-device-mouse-wheel-click-angle.c',
772 'test/litest-device-mouse-wheel-click-count.c',
773 'test/litest-device-ms-nano-transceiver-mouse.c',
774 'test/litest-device-ms-surface-cover.c',
775 'test/litest-device-protocol-a-touch-screen.c',
776 'test/litest-device-qemu-usb-tablet.c',
777 'test/litest-device-sony-vaio-keys.c',
778 'test/litest-device-synaptics-x220.c',
779 'test/litest-device-synaptics-hover.c',
780 'test/litest-device-synaptics-i2c.c',
781 'test/litest-device-synaptics-pressurepad.c',
782 'test/litest-device-synaptics-rmi4.c',
783 'test/litest-device-synaptics-st.c',
784 'test/litest-device-synaptics-t440.c',
785 'test/litest-device-synaptics-x1-carbon-3rd.c',
786 'test/litest-device-tablet-mode-switch.c',
787 'test/litest-device-thinkpad-extrabuttons.c',
788 'test/litest-device-trackpoint.c',
789 'test/litest-device-touch-screen.c',
790 'test/litest-device-touchscreen-invalid-range.c',
791 'test/litest-device-touchscreen-fuzz.c',
792 'test/litest-device-touchscreen-mt-tool.c',
793 'test/litest-device-uclogic-tablet.c',
794 'test/litest-device-wacom-bamboo-2fg-finger.c',
795 'test/litest-device-wacom-bamboo-2fg-pad.c',
796 'test/litest-device-wacom-bamboo-2fg-pen.c',
797 'test/litest-device-wacom-bamboo-16fg-pen.c',
798 'test/litest-device-wacom-cintiq-12wx-pen.c',
799 'test/litest-device-wacom-cintiq-13hdt-finger.c',
800 'test/litest-device-wacom-cintiq-13hdt-pad.c',
801 'test/litest-device-wacom-cintiq-13hdt-pen.c',
802 'test/litest-device-wacom-cintiq-24hd-pen.c',
803 'test/litest-device-wacom-cintiq-24hdt-pad.c',
804 'test/litest-device-wacom-cintiq-pro-16-finger.c',
805 'test/litest-device-wacom-cintiq-pro-16-pad.c',
806 'test/litest-device-wacom-cintiq-pro-16-pen.c',
807 'test/litest-device-wacom-ekr.c',
808 'test/litest-device-wacom-hid4800-pen.c',
809 'test/litest-device-wacom-intuos3-pad.c',
810 'test/litest-device-wacom-intuos5-finger.c',
811 'test/litest-device-wacom-intuos5-pad.c',
812 'test/litest-device-wacom-intuos5-pen.c',
813 'test/litest-device-wacom-isdv4-4200-pen.c',
814 'test/litest-device-wacom-isdv4-524c-pen.c',
815 'test/litest-device-wacom-isdv4-e6-pen.c',
816 'test/litest-device-wacom-isdv4-e6-finger.c',
817 'test/litest-device-wacom-mobilestudio-pro-pad.c',
818 'test/litest-device-waltop-tablet.c',
819 'test/litest-device-wheel-only.c',
820 'test/litest-device-xen-virtual-pointer.c',
821 'test/litest-device-vmware-virtual-usb-mouse.c',
822 'test/litest-device-yubikey.c',
826 dep_dl = cc.find_library('dl')
838 litest_config_h = configuration_data()
839 litest_config_h.set_quoted('LIBINPUT_DEVICE_GROUPS_RULES_FILE',
840 meson.current_build_dir() /
841 '80-libinput-device-groups-litest.rules')
842 litest_config_h.set_quoted('LIBINPUT_FUZZ_OVERRIDE_UDEV_RULES_FILE',
843 meson.current_build_dir() /
844 '90-libinput-fuzz-override-litest.rules')
846 def_no_main = '-DLITEST_NO_MAIN'
847 def_disable_backtrace = '-DLITEST_DISABLE_BACKTRACE_LOGGING'
848 defs_litest_selftest = [
850 def_disable_backtrace,
853 test_litest_selftest_sources = [
854 'test/litest-selftest.c',
857 test_litest_selftest = executable('test-litest-selftest',
858 test_litest_selftest_sources,
859 include_directories : [includes_src, includes_include],
860 dependencies : deps_litest,
861 c_args : defs_litest_selftest,
863 test('test-litest-selftest',
864 test_litest_selftest,
868 def_LT_VERSION = '-DLIBINPUT_LT_VERSION="@0@:@1@:@2@"'.format(libinput_lt_c, libinput_lt_r, libinput_lt_a)
869 test_library_version = executable('test-library-version',
870 ['test/test-library-version.c'],
871 c_args : [ def_LT_VERSION ],
873 test('test-library-version',
874 test_library_version,
877 test_utils_sources = [
880 test_utils = executable('libinput-test-utils',
882 include_directories : [includes_src, includes_include],
883 dependencies : deps_litest,
884 install_dir : libinput_tool_path,
885 install : get_option('install-tests'))
890 # When adding new files to this list, update the CI
894 'test/test-pointer.c',
897 'test/test-tablet.c',
900 'test/test-touchpad.c',
901 'test/test-touchpad-tap.c',
902 'test/test-touchpad-buttons.c',
903 'test/test-trackpoint.c',
904 'test/test-trackball.c',
906 'test/test-keyboard.c',
907 'test/test-device.c',
908 'test/test-gestures.c',
909 'test/test-switch.c',
910 'test/test-quirks.c',
912 libinput_test_runner_sources = litest_sources + tests_sources
913 libinput_test_runner = executable('libinput-test-suite',
914 libinput_test_runner_sources,
915 include_directories : [includes_src, includes_include],
916 dependencies : deps_litest,
917 install_dir : libinput_tool_path,
918 install : get_option('install-tests'))
920 src_man += 'test/libinput-test-suite.man'
922 foreach testfile : tests_sources
923 tfile = testfile.split('test/test-')[1]
924 group = tfile.split('.c')[0]
925 test('libinput-test-suite-@0@'.format(group),
926 libinput_test_runner,
927 suite : ['all', 'valgrind', 'root', 'hardware'],
928 args : ['--filter-group=@0@'.format(group),
929 '--xml-output=junit-@0@-XXXXXX.xml'.format(group)],
934 test('libinput-test-deviceless',
935 libinput_test_runner,
936 suite : ['all', 'valgrind'],
937 args: ['--filter-deviceless',
938 '--xml-output=junit-deviceless-XXXXXX.xml'])
940 valgrind = find_program('valgrind', required : false)
942 valgrind_env = environment()
943 valgrind_suppressions_file = dir_src_test / 'valgrind.suppressions'
944 add_test_setup('valgrind',
945 exe_wrapper : [ valgrind,
947 '--gen-suppressions=all',
948 '--error-exitcode=3',
949 '--suppressions=' + valgrind_suppressions_file ],
951 timeout_multiplier : 100)
953 message('valgrind not found, disabling valgrind test suite')
955 configure_file(output : 'litest-config.h',
956 configuration : litest_config_h)
960 ############ man pages ############
961 man_config = configuration_data()
962 man_config.set('LIBINPUT_VERSION', meson.project_version())
963 man_config.set('LIBINPUT_DATA_DIR', dir_data)
964 if get_option('install-tests')
965 man_config.set('HAVE_INSTALLED_TESTS', '.\"')
967 man_config.set('HAVE_INSTALLED_TESTS', '')
970 'tools/libinput.man',
971 'tools/libinput-analyze.man',
972 'tools/libinput-analyze-per-slot-delta.man',
973 'tools/libinput-analyze-recording.man',
974 'tools/libinput-analyze-touch-down-state.man',
975 'tools/libinput-debug-events.man',
976 'tools/libinput-debug-tablet.man',
977 'tools/libinput-list-devices.man',
978 'tools/libinput-measure.man',
979 'tools/libinput-measure-fuzz.man',
980 'tools/libinput-measure-touchpad-size.man',
981 'tools/libinput-measure-touchpad-tap.man',
982 'tools/libinput-measure-touchpad-pressure.man',
983 'tools/libinput-measure-touch-size.man',
984 'tools/libinput-quirks.man',
985 'tools/libinput-record.man',
986 'tools/libinput-replay.man',
987 'tools/libinput-test.man',
991 configure_file(input : m,
992 output : '@BASENAME@.1',
993 configuration : man_config,
994 install_dir : dir_man1)
997 # Same man page for the subtools to stay consistent with the other tools
998 configure_file(input : 'tools/libinput-quirks.man',
999 output : 'libinput-quirks-list.1',
1000 configuration : man_config,
1001 install_dir : dir_man1,
1003 configure_file(input : 'tools/libinput-quirks.man',
1004 output : 'libinput-quirks-validate.1',
1005 configuration : man_config,
1006 install_dir : dir_man1,
1009 ############ output files ############
1010 configure_file(output : 'config.h', configuration : config_h)