| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222 |
- project('libinput', 'c',
- version : '1.31.0',
- license : 'MIT/Expat',
- default_options : [ 'c_std=gnu99', 'warning_level=2' ],
- meson_version : '>= 0.64.0')
- libinput_version = meson.project_version().split('.')
- dir_data = get_option('prefix') / get_option('datadir') / 'libinput'
- dir_etc = get_option('prefix') / get_option('sysconfdir')
- dir_overrides = get_option('prefix') / get_option('sysconfdir') / 'libinput'
- dir_libexec = get_option('prefix') / get_option('libexecdir') / 'libinput'
- dir_lib = get_option('prefix') / get_option('libdir')
- dir_man1 = get_option('prefix') / get_option('mandir') / 'man1'
- dir_system_udev = get_option('prefix') / 'lib' / 'udev'
- dir_src_quirks = meson.current_source_dir() / 'quirks'
- dir_src_test = meson.current_source_dir() / 'test'
- dir_src = meson.current_source_dir() / 'src'
- dir_gitlab_ci = meson.current_source_dir() / '.gitlab-ci'
- dir_udev = get_option('udev-dir')
- if dir_udev == ''
- dir_udev = dir_system_udev
- endif
- dir_udev_callouts = dir_udev
- dir_udev_rules = dir_udev / 'rules.d'
- # Collection of man pages, we'll append to that
- src_man = files()
- # We use libtool-version numbers because it's easier to understand.
- # Before making a release, the libinput_so_*
- # numbers should be modified. The components are of the form C:R:A.
- # a) If binary compatibility has been broken (eg removed or changed interfaces)
- # change to C+1:0:0.
- # b) If interfaces have been changed or added, but binary compatibility has
- # been preserved, change to C+1:0:A+1
- # c) If the interface is the same as the previous version, change to C:R+1:A
- libinput_lt_c=23
- libinput_lt_r=0
- libinput_lt_a=13
- # convert to soname
- libinput_so_version = '@0@.@1@.@2@'.format((libinput_lt_c - libinput_lt_a),
- libinput_lt_a, libinput_lt_r)
- # Compiler setup
- cc = meson.get_compiler('c')
- cflags = [
- '-Wno-error=deprecated-declarations',
- '-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',
- '-Wno-missing-field-initializers',
- '-Wmissing-declarations',
- '-fvisibility=hidden',
- ]
- add_project_arguments(cc.get_supported_arguments(cflags), language : 'c')
- # config.h
- config_h = configuration_data()
- doc_url_base = 'https://wayland.freedesktop.org/libinput/doc'
- if libinput_version[2].to_int() >= 90
- doc_url = '@0@/latest'.format(doc_url_base)
- else
- doc_url = '@0@/@1@'.format(doc_url_base, meson.project_version())
- endif
- config_h.set_quoted('HTTP_DOC_LINK', doc_url)
- config_h.set('_GNU_SOURCE', '1')
- is_debug_build = get_option('buildtype') == 'debug' or get_option('buildtype') == 'debugoptimized'
- if is_debug_build
- config_h.set('IS_DEBUG_BUILD', '1')
- config_h.set_quoted('MESON_BUILD_ROOT', meson.current_build_dir())
- endif
- prefix = '''#define _GNU_SOURCE 1
- #include <assert.h>
- '''
- if cc.get_define('static_assert', prefix : prefix) == ''
- config_h.set('static_assert(...)', '/* */')
- endif
- # Coverity breaks because it doesn't define _Float128 correctly, you'll end
- # up with a bunch of messages in the form:
- # "/usr/include/stdlib.h", line 133: error #20: identifier "_Float128" is
- # undefined
- # extern _Float128 strtof128 (const char *__restrict __nptr,
- # ^
- # We don't use float128 ourselves, it gets pulled in from math.h or
- # something, so let's just define it as uint128 and move on.
- # Unfortunately we can't detect the coverity build at meson configure
- # time, we only know it fails at runtime. So make this an option instead, to
- # be removed when coverity fixes this again.
- if get_option('coverity')
- config_h.set('_Float128', '__uint128_t')
- config_h.set('_Float32', 'int')
- config_h.set('_Float32x', 'int')
- config_h.set('_Float64', 'long')
- config_h.set('_Float64x', 'long')
- endif
- if cc.has_header_symbol('dirent.h', 'versionsort', prefix : prefix)
- config_h.set('HAVE_VERSIONSORT', '1')
- endif
- if cc.get_define('SYS_pidfd_open', prefix: '#include <sys/syscall.h>') != ''
- config_h.set('HAVE_PIDFD_OPEN', '1')
- endif
- if cc.has_function('sigabbrev_np', prefix: '#define _GNU_SOURCE 1\n#include <string.h>')
- config_h.set('HAVE_SIGABBREV_NP', '1')
- endif
- if not cc.has_header_symbol('errno.h', 'program_invocation_short_name', prefix : prefix)
- if cc.has_header_symbol('stdlib.h', 'getprogname')
- config_h.set('program_invocation_short_name', 'getprogname()')
- endif
- endif
- if cc.has_header('xlocale.h')
- config_h.set('HAVE_XLOCALE_H', '1')
- endif
- code = '''
- #include <time.h>
- void func() { auto foo = gmtime(NULL); foo->tm_sec = 0; }
- '''
- if cc.compiles(code, name: 'has C23 auto keyword')
- config_h.set('HAVE_C23_AUTO', '1')
- endif
- code = '''
- #include <locale.h>
- void main(void) { newlocale(LC_NUMERIC_MASK, "C", (locale_t)0); }
- '''
- if cc.links(code, name : 'locale.h')
- config_h.set('HAVE_LOCALE_H', '1')
- endif
- if not cc.has_header_symbol('sys/ptrace.h', 'PTRACE_ATTACH', prefix : prefix)
- config_h.set('PTRACE_ATTACH', 'PT_ATTACH')
- config_h.set('PTRACE_CONT', 'PT_CONTINUE')
- config_h.set('PTRACE_DETACH', 'PT_DETACH')
- endif
- if get_option('install-tests')
- config_h.set('HAVE_INSTALLED_TESTS', 1)
- endif
- # Dependencies
- pkgconfig = import('pkgconfig')
- dep_udev = dependency('libudev')
- dep_libevdev = dependency('libevdev', version: '>= 1.10.0')
- dep_lm = cc.find_library('m', required : false)
- dep_rt = cc.find_library('rt', required : false)
- dep_lua = dependency('lua-5.4', 'lua5.4', 'lua',
- version : '>= 5.4',
- required : get_option('lua-plugins'))
- have_lua = dep_lua.found()
- if have_lua
- config_h.set('HAVE_LUA', 1)
- endif
- have_plugins = dep_lua.found()
- if have_plugins
- config_h.set('HAVE_PLUGINS', 1)
- endif
- autoload_plugins = get_option('autoload-plugins')
- if autoload_plugins
- config_h.set('AUTOLOAD_PLUGINS', 1)
- endif
- summary({
- 'Plugins enabled' : have_plugins,
- 'Autoload plugins' : autoload_plugins,
- 'Lua Plugin support' : have_lua,
- },
- section : 'Plugins',
- bool_yn : true)
- # Include directories
- includes_include = include_directories('include')
- includes_src = include_directories('src')
- ############ mtdev configuration ############
- have_mtdev = get_option('mtdev')
- if have_mtdev
- config_h.set('HAVE_MTDEV', 1)
- dep_mtdev = dependency('mtdev', version : '>= 1.1.0')
- else
- dep_mtdev = declare_dependency()
- endif
- ############ libwacom configuration ############
- have_libwacom = get_option('libwacom')
- if have_libwacom
- config_h.set('HAVE_LIBWACOM', 1)
- dep_libwacom = dependency('libwacom', version : '>= 0.27')
- if cc.has_header_symbol('libwacom/libwacom.h', 'WACOM_BUTTON_DIAL_MODESWITCH',
- dependencies : dep_libwacom)
- config_h.set('HAVE_LIBWACOM_BUTTON_DIAL_MODESWITCH', '1')
- endif
- if cc.has_function('libwacom_get_button_modeswitch_mode',
- dependencies: dep_libwacom)
- config_h.set('HAVE_LIBWACOM_BUTTON_MODESWITCH_MODE', '1')
- endif
- if cc.has_function('libwacom_stylus_is_generic',
- dependencies: dep_libwacom)
- config_h.set('HAVE_LIBWACOM_STYLUS_IS_GENERIC', '1')
- endif
- else
- dep_libwacom = declare_dependency()
- endif
- ############ udev bits ############
- executable('libinput-device-group',
- 'udev/libinput-device-group.c',
- dependencies : [dep_udev, dep_libwacom],
- include_directories : [includes_src, includes_include],
- install : true,
- install_tag : 'runtime',
- install_dir : dir_udev_callouts)
- executable('libinput-fuzz-extract',
- 'udev/libinput-fuzz-extract.c',
- 'src/util-strings.c',
- 'src/util-prop-parsers.c',
- dependencies : [dep_udev, dep_libevdev, dep_lm],
- include_directories : [includes_src, includes_include],
- install : true,
- install_tag : 'runtime',
- install_dir : dir_udev_callouts)
- executable('libinput-fuzz-to-zero',
- 'udev/libinput-fuzz-to-zero.c',
- dependencies : [dep_udev, dep_libevdev],
- include_directories : [includes_src, includes_include],
- install : true,
- install_tag : 'runtime',
- install_dir : dir_udev_callouts)
- udev_rules_config = configuration_data()
- udev_rules_config.set('UDEV_TEST_PATH', dir_udev_callouts + '/')
- configure_file(input : 'udev/80-libinput-device-groups.rules.in',
- output : '80-libinput-device-groups.rules',
- install_dir : dir_udev_rules,
- configuration : udev_rules_config)
- configure_file(input : 'udev/90-libinput-fuzz-override.rules.in',
- output : '90-libinput-fuzz-override.rules',
- install_dir : dir_udev_rules,
- configuration : udev_rules_config)
- litest_udev_rules_config = configuration_data()
- litest_udev_rules_config.set('UDEV_TEST_PATH', meson.current_build_dir() + '/')
- litest_groups_rules_file = configure_file(input : 'udev/80-libinput-device-groups.rules.in',
- output : '80-libinput-device-groups-litest.rules',
- configuration : litest_udev_rules_config)
- litest_fuzz_override_file = configure_file(input : 'udev/90-libinput-fuzz-override.rules.in',
- output : '90-libinput-fuzz-override-litest.rules',
- configuration : litest_udev_rules_config)
- ############ Check for leftover udev rules ########
- # This test should be defined first so we don't waste time testing anything
- # else if we're about to fail anyway. ninja test will execute tests in the
- # order of them defined in meson.build
- if get_option('tests')
- test('leftover-rules',
- find_program('test/check-leftover-udev-rules.sh'),
- is_parallel : false,
- suite : ['all'])
- endif
- ############ libepoll-shim (BSD) ############
- if cc.has_header_symbol('sys/epoll.h', 'epoll_create1', prefix : prefix)
- # epoll is built-in (Linux, illumos)
- dep_libepoll = declare_dependency()
- else
- # epoll is implemented in userspace by libepoll-shim (FreeBSD)
- dir_libepoll = get_option('epoll-dir')
- if dir_libepoll == ''
- dir_libepoll = get_option('prefix')
- endif
- includes_epoll = include_directories(dir_libepoll / 'include' / 'libepoll-shim')
- dep_libepoll = cc.find_library('epoll-shim', dirs : dir_libepoll / 'lib')
- code = '''
- #include <sys/epoll.h>
- int main(void) { epoll_create1(0); }
- '''
- if not cc.links(code,
- name : 'libepoll-shim check',
- dependencies : [dep_libepoll, dep_rt],
- include_directories : includes_epoll) # note: wants an include_directories object
- error('No built-in epoll or libepoll-shim found.')
- endif
- dep_libepoll = declare_dependency(
- include_directories : includes_epoll,
- dependencies : [dep_libepoll, dep_rt])
- endif
- ############ libinput-util.a ############
- # Basic compilation test to make sure the headers include and define all the
- # necessary bits.
- util_headers = [
- 'util-backtrace.h',
- 'util-bits.h',
- 'util-input-event.h',
- 'util-list.h',
- 'util-files.h',
- 'util-macros.h',
- 'util-matrix.h',
- 'util-prop-parsers.h',
- 'util-ratelimit.h',
- 'util-stringbuf.h',
- 'util-strings.h',
- 'util-time.h',
- ]
- foreach h: util_headers
- c = configuration_data()
- c.set_quoted('FILE', h)
- testfile = configure_file(input : 'test/test-util-includes.c.in',
- output : 'test-util-includes-@0@.c'.format(h),
- configuration : c)
- executable('test-build-@0@'.format(h),
- testfile,
- include_directories : [includes_src, includes_include],
- dependencies: [dep_libevdev],
- install : false)
- endforeach
- src_libinput_util = [
- 'src/util-files.c',
- 'src/util-list.c',
- 'src/util-ratelimit.c',
- 'src/util-strings.c',
- 'src/util-prop-parsers.c',
- ]
- libinput_util = static_library('libinput-util',
- src_libinput_util,
- dependencies : [dep_udev, dep_libevdev, dep_libwacom],
- include_directories : includes_include)
- dep_libinput_util = declare_dependency(link_with : libinput_util)
- ############ libfilter.a ############
- src_libfilter = [
- 'src/filter.c',
- 'src/filter-custom.c',
- 'src/filter-flat.c',
- 'src/filter-low-dpi.c',
- 'src/filter-mouse.c',
- 'src/filter-touchpad.c',
- 'src/filter-touchpad-flat.c',
- 'src/filter-touchpad-x230.c',
- 'src/filter-tablet.c',
- 'src/filter-trackpoint.c',
- 'src/filter-trackpoint-flat.c',
- ]
- libfilter = static_library('filter', src_libfilter,
- dependencies : [dep_udev, dep_libwacom, dep_libevdev],
- include_directories : includes_include)
- dep_libfilter = declare_dependency(link_with : libfilter)
- ############ libquirks.a #############
- libinput_data_path = dir_data
- libinput_data_override_path = dir_overrides / 'local-overrides.quirks'
- config_h.set_quoted('LIBINPUT_QUIRKS_DIR', dir_data)
- config_h.set_quoted('LIBINPUT_QUIRKS_OVERRIDE_FILE', libinput_data_override_path)
- config_h.set_quoted('LIBINPUT_QUIRKS_SRCDIR', dir_src_quirks)
- install_subdir('quirks',
- exclude_files: ['README.md'],
- install_dir : dir_data,
- strip_directory : true)
- src_libquirks = [
- 'src/quirks.c',
- ]
- deps_libquirks = [dep_udev, dep_libwacom, dep_libinput_util]
- libquirks = static_library('quirks', src_libquirks,
- dependencies : deps_libquirks,
- include_directories : includes_include)
- dep_libquirks = declare_dependency(link_with : libquirks)
- # Create /etc/libinput
- install_emptydir(dir_etc / 'libinput')
- ############ libinput.so ############
- if get_option('internal-event-debugging')
- config_h.set('EVENT_DEBUGGING', 1)
- endif
- config_h.set_quoted('LIBINPUT_PLUGIN_LIBDIR', dir_lib / 'libinput' / 'plugins')
- config_h.set_quoted('LIBINPUT_PLUGIN_ETCDIR', dir_etc / 'libinput' / 'plugins')
- install_headers('src/libinput.h')
- src_libinput = src_libfilter + [
- 'src/libinput.c',
- 'src/libinput-plugin.c',
- 'src/libinput-plugin-button-debounce.c',
- 'src/libinput-plugin-mouse-wheel.c',
- 'src/libinput-plugin-mouse-wheel-lowres.c',
- 'src/libinput-plugin-tablet-double-tool.c',
- 'src/libinput-plugin-tablet-eraser-button.c',
- 'src/libinput-plugin-tablet-forced-tool.c',
- 'src/libinput-plugin-tablet-proximity-timer.c',
- 'src/libinput-private-config.c',
- 'src/evdev.c',
- 'src/evdev-fallback.c',
- 'src/evdev-plugin.c',
- 'src/evdev-totem.c',
- 'src/evdev-middle-button.c',
- 'src/evdev-mt-touchpad.c',
- 'src/evdev-mt-touchpad-tap.c',
- 'src/evdev-mt-touchpad-thumb.c',
- 'src/evdev-mt-touchpad-buttons.c',
- 'src/evdev-mt-touchpad-edge-scroll.c',
- 'src/evdev-mt-touchpad-gestures.c',
- 'src/evdev-tablet.c',
- 'src/evdev-tablet-pad.c',
- 'src/evdev-tablet-pad-leds.c',
- 'src/path-seat.c',
- 'src/udev-seat.c',
- 'src/timer.c',
- 'src/util-libinput.c',
- ]
- if have_mtdev
- src_libinput += ['src/libinput-plugin-mtdev.c']
- endif
- if dep_lua.found()
- src_libinput += [
- 'src/libinput-plugin-lua.c',
- ]
- endif
- deps_libinput = [
- dep_mtdev,
- dep_udev,
- dep_libevdev,
- dep_libepoll,
- dep_lm,
- dep_rt,
- dep_libwacom,
- dep_libinput_util,
- dep_libquirks,
- dep_lua,
- ]
- libinput_version_h_config = configuration_data()
- libinput_version_h_config.set('LIBINPUT_VERSION_MAJOR', libinput_version[0])
- libinput_version_h_config.set('LIBINPUT_VERSION_MINOR', libinput_version[1])
- libinput_version_h_config.set('LIBINPUT_VERSION_MICRO', libinput_version[2])
- libinput_version_h_config.set('LIBINPUT_VERSION', meson.project_version())
- libinput_version_h = configure_file(
- input : 'src/libinput-version.h.in',
- output : 'libinput-version.h',
- configuration : libinput_version_h_config,
- )
- mapfile = dir_src / 'libinput.sym'
- version_flag = '-Wl,--version-script,@0@'.format(mapfile)
- lib_libinput = shared_library('input',
- src_libinput,
- include_directories : [include_directories('.'), includes_include],
- dependencies : deps_libinput,
- version : libinput_so_version,
- link_args : version_flag,
- link_depends : mapfile,
- install : true
- )
- dep_libinput = declare_dependency(
- link_with : lib_libinput,
- dependencies : deps_libinput)
- meson.override_dependency('libinput', dep_libinput)
- pkgconfig.generate(
- filebase : 'libinput',
- name : 'Libinput',
- description : 'Input device library',
- version : meson.project_version(),
- libraries : lib_libinput,
- requires_private : dep_udev,
- variables : [
- 'plugindir=${libdir}/libinput/plugins'
- ]
- )
- git_version_h = vcs_tag(command : ['git', 'describe'],
- fallback : 'unknown',
- input : 'src/libinput-git-version.h.in',
- output :'libinput-git-version.h')
- subdir('plugins')
- ############ documentation ############
- if get_option('documentation')
- subdir('doc/api')
- subdir('doc/user')
- endif
- ############ shell completion #########
- subdir('completion/zsh')
- ############ libinput-util-libinput.a ############
- # This one needs libinput itself
- src_libinput_util_libinput = [
- 'src/util-libinput.c'
- ]
- libinput_util_libinput = static_library('libinput-util-libinput',
- src_libinput_util_libinput,
- dependencies : [dep_libevdev, dep_libinput_util, dep_libinput],
- include_directories : includes_include)
- dep_libinput_util_libinput = declare_dependency(link_with : libinput_util_libinput)
- ############ tools ############
- libinput_tool_path = dir_libexec
- config_h.set_quoted('LIBINPUT_TOOL_PATH', libinput_tool_path)
- tools_shared_sources = [ 'tools/shared.c' ]
- deps_tools_shared = [ dep_libinput, dep_libevdev, dep_libinput_util_libinput ]
- lib_tools_shared = static_library('tools_shared',
- tools_shared_sources,
- include_directories : [includes_src, includes_include],
- dependencies : deps_tools_shared)
- dep_tools_shared = declare_dependency(link_with : lib_tools_shared,
- dependencies : deps_tools_shared)
- deps_tools = [ dep_tools_shared, dep_libinput ]
- libinput_debug_events_sources = [
- 'tools/libinput-debug-events.c',
- libinput_version_h,
- ]
- executable('libinput-debug-events',
- libinput_debug_events_sources,
- dependencies : deps_tools,
- include_directories : [includes_src, includes_include],
- install_dir : libinput_tool_path,
- install_tag : 'bin',
- install : true
- )
- libinput_debug_tablet_sources = [ 'tools/libinput-debug-tablet.c' ]
- executable('libinput-debug-tablet',
- libinput_debug_tablet_sources,
- dependencies : deps_tools,
- include_directories : [includes_src, includes_include],
- install_dir : libinput_tool_path,
- install_tag : 'bin',
- install : true)
- libinput_debug_tablet_pad_sources = [ 'tools/libinput-debug-tablet-pad.c' ]
- executable('libinput-debug-tablet-pad',
- libinput_debug_tablet_pad_sources,
- dependencies : deps_tools,
- include_directories : [includes_src, includes_include],
- install_dir : libinput_tool_path,
- install_tag : 'bin',
- install : true)
- libinput_quirks_sources = [ 'tools/libinput-quirks.c' ]
- libinput_quirks = executable('libinput-quirks',
- libinput_quirks_sources,
- dependencies : [dep_libquirks, dep_tools_shared, dep_libinput],
- include_directories : [includes_src, includes_include],
- install_dir : libinput_tool_path,
- install_tag : 'bin',
- install : true
- )
- test('validate-quirks',
- libinput_quirks,
- args: ['validate', '--data-dir=@0@'.format(dir_src_quirks)],
- suite : ['all']
- )
- quirks_file_tester = find_program('test/test_quirks_files.py')
- test('validate-quirks-files',
- quirks_file_tester,
- suite : ['all'],
- env: ['MESON_SOURCE_ROOT=@0@'.format(meson.project_source_root())],
- )
- libinput_list_devices_sources = [ 'tools/libinput-list-devices.c' ]
- libinput_list_devices = executable('libinput-list-devices',
- libinput_list_devices_sources,
- dependencies : deps_tools,
- include_directories : [includes_src, includes_include],
- install_dir : libinput_tool_path,
- install_tag : 'bin',
- install : true,
- )
- test('list-devices',
- libinput_list_devices,
- suite : ['all', 'root', 'hardware'])
- libinput_measure_sources = [ 'tools/libinput-measure.c' ]
- executable('libinput-measure',
- libinput_measure_sources,
- dependencies : deps_tools,
- include_directories : [includes_src, includes_include],
- install_dir : libinput_tool_path,
- install_tag : 'bin',
- install : true,
- )
- libinput_analyze_sources = [ 'tools/libinput-analyze.c' ]
- executable('libinput-analyze',
- libinput_analyze_sources,
- dependencies : deps_tools,
- include_directories : [includes_src, includes_include],
- install_dir : libinput_tool_path,
- install_tag : 'bin',
- install : true,
- )
- src_python_tools = files(
- 'tools/libinput-analyze-buttons.py',
- 'tools/libinput-analyze-per-slot-delta.py',
- 'tools/libinput-analyze-recording.py',
- 'tools/libinput-analyze-touch-down-state.py',
- 'tools/libinput-list-kernel-devices.py',
- 'tools/libinput-measure-fuzz.py',
- 'tools/libinput-measure-touchpad-size.py',
- 'tools/libinput-measure-touchpad-tap.py',
- 'tools/libinput-measure-touchpad-pressure.py',
- 'tools/libinput-measure-touch-size.py',
- 'tools/libinput-replay.py'
- )
- foreach t : src_python_tools
- configure_file(input: t,
- output: '@BASENAME@',
- copy: true,
- install_dir : libinput_tool_path
- )
- endforeach
- libinput_record_sources = [ 'tools/libinput-record.c', git_version_h ]
- executable('libinput-record',
- libinput_record_sources,
- dependencies : deps_tools + [dep_udev],
- include_directories : [includes_src, includes_include],
- install_dir : libinput_tool_path,
- install_tag : 'bin',
- install : true,
- )
- if get_option('debug-gui')
- config_h.set('HAVE_DEBUG_GUI', 1)
- dep_gtk = dependency('gtk4', version : '>= 4.0', required : false)
- if dep_gtk.found()
- config_h.set('HAVE_GTK4', 1)
- else
- dep_gtk = dependency('gtk+-3.0', version : '>= 3.20')
- if dep_gtk.found()
- config_h.set('HAVE_GTK3', 1)
- endif
- endif
- gtk_targets = dep_gtk.get_variable('targets')
- have_gtk_wayland = gtk_targets.contains('wayland')
- have_gtk_x11 = gtk_targets.contains('x11')
- dep_cairo = dependency('cairo')
- dep_glib = dependency('glib-2.0')
- dep_x11 = dependency('x11', required : false)
- dep_wayland_client = dependency('wayland-client', required : false)
- dep_wayland_protocols = dependency('wayland-protocols', required : false)
- if have_gtk_x11 and dep_x11.found()
- config_h.set('HAVE_GTK_X11', 1)
- endif
- debug_gui_sources = [ 'tools/libinput-debug-gui.c' ]
- if have_gtk_wayland and dep_wayland_client.found() and dep_wayland_protocols.found()
- wayland_scanner = find_program('wayland-scanner')
- wlproto_dir = dep_wayland_protocols.get_variable('pkgdatadir')
- proto_name = 'pointer-constraints-unstable-v1'
- input = files(wlproto_dir / 'unstable' / 'pointer-constraints' / '@0@.xml'.format(proto_name))
- wayland_headers = custom_target('@0@ client header'.format(proto_name),
- input: input,
- output: '@0@-client-protocol.h'.format(proto_name),
- command: [wayland_scanner, 'client-header', '@INPUT@', '@OUTPUT@'],
- )
- wayland_sources = custom_target('@0@ source'.format(proto_name),
- input: input,
- output: '@0@-protocol.c'.format(proto_name),
- command: [wayland_scanner, 'private-code', '@INPUT@', '@OUTPUT@'],
- )
- debug_gui_sources += [ wayland_headers, wayland_sources ]
- config_h.set('HAVE_GTK_WAYLAND', 1)
- endif
- deps_debug_gui = [
- dep_gtk,
- dep_cairo,
- dep_glib,
- dep_wayland_client,
- dep_wayland_protocols,
- dep_x11,
- ] + deps_tools
- executable('libinput-debug-gui',
- debug_gui_sources,
- dependencies : deps_debug_gui,
- include_directories : [includes_src, includes_include],
- install_dir : libinput_tool_path,
- install_tag : 'bin',
- install : true
- )
- src_man += files('tools/libinput-debug-gui.man')
- endif
- libinput_sources = [ 'tools/libinput-tool.c' ]
- libinput_tool = executable('libinput',
- libinput_sources,
- dependencies : deps_tools,
- include_directories : [includes_src, includes_include],
- install_tag : 'bin',
- install : true
- )
- ptraccel_debug_sources = [ 'tools/ptraccel-debug.c' ]
- executable('ptraccel-debug',
- ptraccel_debug_sources,
- dependencies : [ dep_libfilter, dep_libinput ],
- include_directories : [includes_src, includes_include],
- install : false
- )
- # Don't run the test during a release build because we rely on the magic
- # subtool lookup
- if is_debug_build
- config_tool_option_test = configuration_data()
- config_tool_option_test.set('DISABLE_WARNING', 'yes')
- config_tool_option_test.set('MESON_ENABLED_DEBUG_GUI', get_option('debug-gui').to_string())
- config_tool_option_test.set('MESON_BUILD_ROOT', meson.current_build_dir())
- config_tool_option_test.set('TOOL_PATH', libinput_tool.full_path())
- tool_option_test = configure_file(input: 'tools/test_tool_option_parsing.py',
- output: '@PLAINNAME@',
- configuration : config_tool_option_test)
- test('tool-option-parsing',
- tool_option_test,
- args : [tool_option_test],
- suite : ['all', 'root'],
- timeout : 240)
- endif
- # the libinput tools check whether we execute from the builddir, this is
- # the test to verify that lookup. We test twice, once as normal test
- # run from the builddir, once after copying to /tmp
- test_builddir_lookup = executable('test-builddir-lookup',
- 'test/test-builddir-lookup.c',
- dependencies : [ dep_tools_shared],
- include_directories : [includes_src, includes_include],
- install : false)
- test('tools-builddir-lookup',
- test_builddir_lookup,
- args : ['--builddir-is-set'],
- suite : ['all'])
- test('tools-builddir-lookup-installed',
- find_program('test/helper-copy-and-exec-from-tmp.sh'),
- args : [test_builddir_lookup.full_path(), '--builddir-is-null'],
- env : ['LD_LIBRARY_PATH=@0@'.format(meson.current_build_dir())],
- suite : ['all'],
- workdir : '/tmp')
- ############ tests ############
- summary({
- 'Tests enabled' : get_option('tests'),
- 'Install tests' : get_option('install-tests'),
- },
- section : 'Tests',
- bool_yn : true)
- test('symbols-leak-test',
- find_program('test/symbols-leak-test'),
- args : [ dir_src / 'libinput.sym', dir_src],
- suite : ['all'])
- # build-test only
- executable('test-build-pedantic',
- 'test/build-pedantic.c',
- dependencies : [dep_udev],
- include_directories : [includes_src, includes_include],
- c_args : ['-std=c99', '-pedantic', '-Werror'],
- install : false)
- # build-test only
- executable('test-build-std-gnuc90',
- 'test/build-pedantic.c',
- dependencies : [dep_udev],
- include_directories : [includes_src, includes_include],
- c_args : ['-std=gnu89', '-Werror'],
- install : false)
- # test for linking with the minimal linker flags
- executable('test-build-linker',
- 'test/build-pedantic.c',
- include_directories : [includes_src, includes_include],
- dependencies : [ dep_libinput, dep_libinput_util ],
- install : false)
- # test including from C++ (in case CPP compiler is available)
- if add_languages('cpp', native: false, required: false)
- executable('test-build-cxx',
- 'test/build-cxx.cc',
- dependencies : [dep_udev],
- include_directories : [includes_src, includes_include],
- install : false)
- endif
- libinput_test_sources = [ 'tools/libinput-test.c' ]
- executable('libinput-test',
- libinput_test_sources,
- dependencies : deps_tools,
- include_directories : [includes_src, includes_include],
- install_dir : libinput_tool_path,
- install_tag : 'tests',
- install : true,
- )
- # This is the test suite runner, we allow disabling that one because of
- # dependencies
- if get_option('tests')
- dep_check = dependency('check', version : '>= 0.9.10', required: false)
- gstack = find_program('gstack', required : false)
- if gstack.found()
- config_h.set('HAVE_GSTACK', 1)
- endif
- # for inhibit support during test run
- dep_libsystemd = dependency('libsystemd', version : '>= 221', required : false)
- if dep_libsystemd.found()
- config_h.set('HAVE_LIBSYSTEMD', 1)
- endif
- litest_sources = [
- 'src/libinput-private-config.c',
- 'test/litest-device-absinfo-override.c',
- 'test/litest-device-acer-hawaii-keyboard.c',
- 'test/litest-device-acer-hawaii-touchpad.c',
- 'test/litest-device-aiptek-tablet.c',
- 'test/litest-device-alps-3fg.c',
- 'test/litest-device-alps-semi-mt.c',
- 'test/litest-device-alps-dualpoint.c',
- 'test/litest-device-anker-mouse-kbd.c',
- 'test/litest-device-apple-appletouch.c',
- 'test/litest-device-apple-internal-keyboard.c',
- 'test/litest-device-apple-magicmouse.c',
- 'test/litest-device-asus-rog-gladius.c',
- 'test/litest-device-atmel-hover.c',
- 'test/litest-device-bcm5974.c',
- 'test/litest-device-calibrated-touchscreen.c',
- 'test/litest-device-cyborg-rat-5.c',
- 'test/litest-device-dell-canvas-totem.c',
- 'test/litest-device-dell-canvas-totem-touch.c',
- 'test/litest-device-elantech-touchpad.c',
- 'test/litest-device-elan-tablet.c',
- 'test/litest-device-format-string.c',
- 'test/litest-device-generic-pressurepad.c',
- 'test/litest-device-generic-singletouch.c',
- 'test/litest-device-generic-usb-keyboard.c',
- 'test/litest-device-generic-usb-touchpad.c',
- 'test/litest-device-gpio-keys.c',
- 'test/litest-device-huion-pentablet.c',
- 'test/litest-device-huion-q620m-dial.c',
- 'test/litest-device-hp-wmi-hotkeys.c',
- 'test/litest-device-ignored-mouse.c',
- 'test/litest-device-keyboard.c',
- 'test/litest-device-keyboard-all-codes.c',
- 'test/litest-device-keyboard-quirked.c',
- 'test/litest-device-keyboard-razer-blackwidow.c',
- 'test/litest-device-keyboard-razer-blade-stealth.c',
- 'test/litest-device-keyboard-razer-blade-stealth-videoswitch.c',
- 'test/litest-device-keypad-slide-switch.c',
- 'test/litest-device-lenovo-scrollpoint.c',
- 'test/litest-device-lid-switch.c',
- 'test/litest-device-lid-switch-surface3.c',
- 'test/litest-device-logitech-media-keyboard-elite.c',
- 'test/litest-device-logitech-trackball.c',
- 'test/litest-device-nexus4-touch-screen.c',
- 'test/litest-device-magic-trackpad.c',
- 'test/litest-device-mouse.c',
- 'test/litest-device-mouse-wheel-tilt.c',
- 'test/litest-device-mouse-wheel-hires-disabled.c',
- 'test/litest-device-mouse-ps2.c',
- 'test/litest-device-mouse-roccat.c',
- 'test/litest-device-mouse-low-dpi.c',
- 'test/litest-device-mouse-virtual.c',
- 'test/litest-device-mouse-wheel-click-angle.c',
- 'test/litest-device-mouse-wheel-click-count.c',
- 'test/litest-device-ms-nano-transceiver-mouse.c',
- 'test/litest-device-ms-surface-cover.c',
- 'test/litest-device-ploopy-pavonis-stylus.c',
- 'test/litest-device-qemu-usb-tablet.c',
- 'test/litest-device-sony-vaio-keys.c',
- 'test/litest-device-synaptics-x220.c',
- 'test/litest-device-synaptics-hover.c',
- 'test/litest-device-synaptics-i2c.c',
- 'test/litest-device-synaptics-pressurepad.c',
- 'test/litest-device-synaptics-rmi4.c',
- 'test/litest-device-synaptics-st.c',
- 'test/litest-device-synaptics-t440.c',
- 'test/litest-device-synaptics-x1-carbon-3rd.c',
- 'test/litest-device-synaptics-phantomclicks.c',
- 'test/litest-device-tablet-doubledial.c',
- 'test/litest-device-tablet-mode-switch.c',
- 'test/litest-device-tablet-rel-dial.c',
- 'test/litest-device-thinkpad-extrabuttons.c',
- 'test/litest-device-trackpoint.c',
- 'test/litest-device-touch-screen.c',
- 'test/litest-device-touchpad-palm-threshold-zero.c',
- 'test/litest-device-touchscreen-invalid-range.c',
- 'test/litest-device-touchscreen-fuzz.c',
- 'test/litest-device-touchscreen-mt-tool.c',
- 'test/litest-device-uclogic-tablet.c',
- 'test/litest-device-wacom-bamboo-2fg-finger.c',
- 'test/litest-device-wacom-bamboo-2fg-pad.c',
- 'test/litest-device-wacom-bamboo-2fg-pen.c',
- 'test/litest-device-wacom-bamboo-16fg-pen.c',
- 'test/litest-device-wacom-calibrated-tablet.c',
- 'test/litest-device-wacom-cintiq-12wx-pen.c',
- 'test/litest-device-wacom-cintiq-13hdt-finger.c',
- 'test/litest-device-wacom-cintiq-13hdt-pad.c',
- 'test/litest-device-wacom-cintiq-13hdt-pen.c',
- 'test/litest-device-wacom-cintiq-24hd-pen.c',
- 'test/litest-device-wacom-cintiq-24hdt-pad.c',
- 'test/litest-device-wacom-cintiq-pro-16-finger.c',
- 'test/litest-device-wacom-cintiq-pro-16-pad.c',
- 'test/litest-device-wacom-cintiq-pro-16-pen.c',
- 'test/litest-device-wacom-ekr.c',
- 'test/litest-device-wacom-hid4800-pen.c',
- 'test/litest-device-wacom-intuos3-pad.c',
- 'test/litest-device-wacom-intuos5-finger.c',
- 'test/litest-device-wacom-intuos5-pad.c',
- 'test/litest-device-wacom-intuos5-pen.c',
- 'test/litest-device-wacom-isdv4-4200-pen.c',
- 'test/litest-device-wacom-isdv4-524c-pen.c',
- 'test/litest-device-wacom-isdv4-e6-pen.c',
- 'test/litest-device-wacom-isdv4-e6-finger.c',
- 'test/litest-device-wacom-mobilestudio-pro-pad.c',
- 'test/litest-device-waltop-tablet.c',
- 'test/litest-device-wheel-only.c',
- 'test/litest-device-xen-virtual-pointer.c',
- 'test/litest-device-vmware-virtual-usb-mouse.c',
- 'test/litest-device-yubikey.c',
- 'test/litest-runner.c',
- 'test/litest.c',
- 'test/litest-main.c',
- ]
- if have_mtdev
- litest_sources += [
- 'test/litest-device-protocol-a-touch-screen.c',
- ]
- endif
- dep_dl = cc.find_library('dl')
- deps_litest = [
- dep_libinput,
- dep_udev,
- dep_libevdev,
- dep_dl,
- dep_lm,
- dep_libsystemd,
- dep_libquirks,
- dep_libinput_util_libinput,
- ]
- litest_config_h = configuration_data()
- litest_config_h.set_quoted('LIBINPUT_DEVICE_GROUPS_RULES_FILE',
- meson.current_build_dir() /
- '80-libinput-device-groups-litest.rules')
- litest_config_h.set_quoted('LIBINPUT_FUZZ_OVERRIDE_UDEV_RULES_FILE',
- meson.current_build_dir() /
- '90-libinput-fuzz-override-litest.rules')
- if dep_check.found()
- def_disable_backtrace = '-DLITEST_DISABLE_BACKTRACE_LOGGING'
- defs_litest_selftest = [
- def_disable_backtrace,
- '-Wno-unused',
- ]
- test_litest_selftest_sources = [
- 'test/litest-selftest.c',
- 'test/litest-runner.c',
- 'test/litest.c',
- ]
- test_litest_selftest = executable('test-litest-selftest',
- test_litest_selftest_sources,
- include_directories : [includes_src, includes_include],
- dependencies : [deps_litest, dep_check],
- c_args : defs_litest_selftest,
- install : false)
- test('test-litest-selftest',
- test_litest_selftest,
- suite : ['all'],
- timeout : 100)
- endif
- def_LT_VERSION = '-DLIBINPUT_LT_VERSION="@0@:@1@:@2@"'.format(libinput_lt_c, libinput_lt_r, libinput_lt_a)
- test_library_version = executable('test-library-version',
- ['test/test-library-version.c'],
- c_args : [ def_LT_VERSION ],
- install : false)
- test('test-library-version',
- test_library_version,
- suite : ['all'])
- test_utils_sources = [
- 'test/test-utils.c',
- 'test/litest-runner.c',
- 'test/litest.c',
- ]
- test_utils = executable('libinput-test-utils',
- test_utils_sources,
- include_directories : [includes_src, includes_include],
- dependencies : deps_litest,
- install_dir : libinput_tool_path,
- install : get_option('install-tests'))
- test('test-utils',
- test_utils,
- suite : ['all'])
- tests_sources = [
- 'test/test-udev.c',
- 'test/test-path.c',
- 'test/test-pointer.c',
- 'test/test-touch.c',
- 'test/test-log.c',
- 'test/test-tablet.c',
- 'test/test-totem.c',
- 'test/test-pad.c',
- 'test/test-touchpad.c',
- 'test/test-touchpad-tap.c',
- 'test/test-touchpad-buttons.c',
- 'test/test-trackpoint.c',
- 'test/test-trackball.c',
- 'test/test-misc.c',
- 'test/test-keyboard.c',
- 'test/test-device.c',
- 'test/test-gestures.c',
- 'test/test-switch.c',
- 'test/test-quirks.c',
- ]
- if have_plugins and have_lua
- tests_sources += ['test/test-plugins-lua.c']
- endif
- libinput_test_runner_sources = litest_sources + tests_sources
- libinput_test_runner = executable('libinput-test-suite',
- libinput_test_runner_sources,
- include_directories : [includes_src, includes_include],
- dependencies : deps_litest,
- install_dir : libinput_tool_path,
- install : get_option('install-tests'))
- src_man += 'test/libinput-test-suite.man'
- # When adding new TEST_COLLECTION() macros, add to this list and the CI
- # $ git grep TEST_COLLECTION test/test-* | sed -e "s|.*TEST_COLLECTION(\(.*\))|\t\t'\1',|" | sort
- collections = [
- 'device',
- 'gestures',
- 'keyboard',
- 'log',
- 'misc',
- 'pad',
- 'path',
- 'pointer',
- 'quirks',
- 'switch',
- 'tablet',
- 'tablet_eraser',
- 'tablet_left_handed',
- 'tablet_proximity',
- 'tablet_tip',
- 'totem',
- 'touch',
- 'touchpad',
- 'touchpad_buttons',
- 'touchpad_dwt',
- 'touchpad_palm',
- 'touchpad_tap',
- 'touchpad_tap_drag',
- 'touchpad_tap_palm',
- 'trackball',
- 'trackpoint',
- 'udev',
- ]
- if have_plugins and have_lua
- collections += ['lua']
- endif
- foreach group : collections
- test('libinput-test-suite-@0@'.format(group),
- libinput_test_runner,
- suite : ['all', 'valgrind', 'root', 'hardware'],
- args : ['--filter-group=@0@'.format(group)],
- is_parallel : false,
- timeout : 1100)
- endforeach
- test('libinput-test-deviceless',
- libinput_test_runner,
- suite : ['all', 'valgrind'],
- args: ['--filter-deviceless'])
- valgrind = find_program('valgrind', required : false)
- if valgrind.found()
- valgrind_env = environment()
- valgrind_suppressions_file = dir_src_test / 'valgrind.suppressions'
- add_test_setup('valgrind',
- exe_wrapper : [ valgrind,
- '--log-file=valgrind.%p.log',
- '--leak-check=full',
- '--gen-suppressions=all',
- '--error-exitcode=3',
- '--suppressions=' + valgrind_suppressions_file ],
- env : valgrind_env,
- timeout_multiplier : 3)
- else
- message('valgrind not found, disabling valgrind test suite')
- endif
- configure_file(output : 'litest-config.h',
- configuration : litest_config_h)
- endif
- ############ man pages ############
- man_config = configuration_data()
- man_config.set('LIBINPUT_VERSION', meson.project_version())
- man_config.set('LIBINPUT_DATA_DIR', dir_data)
- if get_option('install-tests')
- man_config.set('HAVE_INSTALLED_TESTS', '.\"')
- else
- man_config.set('HAVE_INSTALLED_TESTS', '')
- endif
- if get_option('debug-gui')
- man_config.set('HAVE_DEBUG_GUI', '')
- else
- man_config.set('HAVE_DEBUG_GUI', '.\"')
- endif
- src_man += files(
- 'tools/libinput.man',
- 'tools/libinput-analyze.man',
- 'tools/libinput-analyze-buttons.man',
- 'tools/libinput-analyze-per-slot-delta.man',
- 'tools/libinput-analyze-recording.man',
- 'tools/libinput-analyze-touch-down-state.man',
- 'tools/libinput-debug-events.man',
- 'tools/libinput-debug-tablet.man',
- 'tools/libinput-debug-tablet-pad.man',
- 'tools/libinput-list-devices.man',
- 'tools/libinput-list-kernel-devices.man',
- 'tools/libinput-measure.man',
- 'tools/libinput-measure-fuzz.man',
- 'tools/libinput-measure-touchpad-size.man',
- 'tools/libinput-measure-touchpad-tap.man',
- 'tools/libinput-measure-touchpad-pressure.man',
- 'tools/libinput-measure-touch-size.man',
- 'tools/libinput-quirks.man',
- 'tools/libinput-record.man',
- 'tools/libinput-replay.man',
- 'tools/libinput-test.man',
- )
- foreach m : src_man
- configure_file(input : m,
- output : '@BASENAME@.1',
- configuration : man_config,
- install_dir : dir_man1)
- endforeach
- # Same man page for the subtools to stay consistent with the other tools
- configure_file(input : 'tools/libinput-quirks.man',
- output : 'libinput-quirks-list.1',
- configuration : man_config,
- install_dir : dir_man1,
- )
- configure_file(input : 'tools/libinput-quirks.man',
- output : 'libinput-quirks-validate.1',
- configuration : man_config,
- install_dir : dir_man1,
- )
- ############ output files ############
- configure_file(output : 'config.h', configuration : config_h)
|