CI: use templates for Ubuntu
[platform/upstream/libinput.git] / meson.build
1 project('libinput', 'c',
2         version : '1.13.0',
3         license : 'MIT/Expat',
4         default_options : [ 'c_std=gnu99', 'warning_level=2' ],
5         meson_version : '>= 0.41.0')
6
7 libinput_version = meson.project_version().split('.')
8
9 dir_data        = join_paths(get_option('prefix'), get_option('datadir'), 'libinput')
10 dir_sysconf     = join_paths(get_option('prefix'), get_option('sysconfdir'), 'libinput')
11 dir_libexec     = join_paths(get_option('prefix'), get_option('libexecdir'), 'libinput')
12 dir_lib         = join_paths(get_option('prefix'), get_option('libdir'))
13 dir_man1        = join_paths(get_option('prefix'), get_option('mandir'), 'man1')
14 dir_system_udev = join_paths(get_option('prefix'), 'lib', 'udev')
15 dir_src_quirks  = join_paths(meson.source_root(), 'quirks')
16 dir_src_test    = join_paths(meson.source_root(), 'test')
17 dir_src         = join_paths(meson.source_root(), 'src')
18
19 dir_udev = get_option('udev-dir')
20 if dir_udev == ''
21         dir_udev = dir_system_udev
22 endif
23 dir_udev_callouts = dir_udev
24 dir_udev_rules    = join_paths(dir_udev, 'rules.d')
25 dir_udev_hwdb     = join_paths(dir_udev, 'hwdb.d')
26
27
28 # We use libtool-version numbers because it's easier to understand.
29 # Before making a release, the libinput_so_*
30 # numbers should be modified. The components are of the form C:R:A.
31 # a) If binary compatibility has been broken (eg removed or changed interfaces)
32 #    change to C+1:0:0.
33 # b) If interfaces have been changed or added, but binary compatibility has
34 #    been preserved, change to C+1:0:A+1
35 # c) If the interface is the same as the previous version, change to C:R+1:A
36 libinput_lt_c=23
37 libinput_lt_r=0
38 libinput_lt_a=13
39
40 # convert to soname
41 libinput_so_version = '@0@.@1@.@2@'.format((libinput_lt_c - libinput_lt_a),
42                                             libinput_lt_a, libinput_lt_r)
43
44 # Compiler setup
45 cc = meson.get_compiler('c')
46 cppflags = ['-Wno-unused-parameter', '-g', '-fvisibility=hidden']
47 cflags = cppflags + ['-Wmissing-prototypes', '-Wstrict-prototypes']
48 add_project_arguments(cflags, language : 'c')
49 add_project_arguments(cppflags, language : 'cpp')
50
51 # config.h
52 config_h = configuration_data()
53 config_h.set('_GNU_SOURCE', '1')
54 if get_option('buildtype') == 'debug' or get_option('buildtype') == 'debugoptimized'
55         config_h.set_quoted('MESON_BUILD_ROOT', meson.build_root())
56 else
57         config_h.set_quoted('MESON_BUILD_ROOT', '')
58 endif
59
60 prefix = '''#define _GNU_SOURCE 1
61 #include <assert.h>
62 '''
63 if cc.get_define('static_assert', prefix : prefix) == ''
64         config_h.set('static_assert(...)', '/* */')
65 endif
66
67 # Coverity breaks because it doesn't define _Float128 correctly, you'll end
68 # up with a bunch of messages in the form:
69 # "/usr/include/stdlib.h", line 133: error #20: identifier "_Float128" is
70 #           undefined
71 #   extern _Float128 strtof128 (const char *__restrict __nptr,
72 #          ^
73 # We don't use float128 ourselves, it gets pulled in from math.h or
74 # something, so let's just define it as uint128 and move on.
75 # Unfortunately we can't detect the coverity build at meson configure
76 # time, we only know it fails at runtime. So make this an option instead, to
77 # be removed when coverity fixes this again.
78 if get_option('coverity')
79         config_h.set('_Float128', '__uint128_t')
80         config_h.set('_Float32', 'int')
81         config_h.set('_Float32x', 'int')
82         config_h.set('_Float64', 'long')
83         config_h.set('_Float64x', 'long')
84 endif
85
86 if cc.has_header_symbol('dirent.h', 'versionsort', prefix : prefix)
87         config_h.set('HAVE_VERSIONSORT', '1')
88 endif
89
90 if not cc.has_header_symbol('errno.h', 'program_invocation_short_name', prefix : prefix)
91         if cc.has_header_symbol('stdlib.h', 'getprogname')
92                 config_h.set('program_invocation_short_name', 'getprogname()')
93         endif
94 endif
95
96 if cc.has_header('xlocale.h')
97         config_h.set('HAVE_XLOCALE_H', '1')
98 endif
99
100 code = '''
101 #include <locale.h>
102 void main(void) { newlocale(LC_NUMERIC_MASK, "C", (locale_t)0); }
103 '''
104 if cc.links(code, name : 'locale.h')
105         config_h.set('HAVE_LOCALE_H', '1')
106 endif
107
108 if not cc.has_header_symbol('sys/ptrace.h', 'PTRACE_ATTACH', prefix : prefix)
109         config_h.set('PTRACE_ATTACH', 'PT_ATTACH')
110         config_h.set('PTRACE_CONT', 'PT_CONTINUE')
111         config_h.set('PTRACE_DETACH', 'PT_DETACH')
112 endif
113
114 # Dependencies
115 pkgconfig = import('pkgconfig')
116 dep_udev = dependency('libudev')
117 dep_mtdev = dependency('mtdev', version : '>= 1.1.0')
118 dep_libevdev = dependency('libevdev')
119 dep_lm = cc.find_library('m', required : false)
120 dep_rt = cc.find_library('rt', required : false)
121
122 # Include directories
123 includes_include = include_directories('include')
124 includes_src = include_directories('src')
125
126 ############ libwacom configuration ############
127
128 have_libwacom = get_option('libwacom')
129 config_h.set10('HAVE_LIBWACOM', have_libwacom)
130 if have_libwacom
131         dep_libwacom = dependency('libwacom', version : '>= 0.20')
132
133         result = cc.has_function('libwacom_get_paired_device',
134                                  dependencies: dep_libwacom)
135         config_h.set10('HAVE_LIBWACOM_GET_PAIRED_DEVICE', result)
136
137         result = cc.has_function('libwacom_get_button_evdev_code',
138                                  dependencies: dep_libwacom)
139         config_h.set10('HAVE_LIBWACOM_GET_BUTTON_EVDEV_CODE', result)
140 else
141         dep_libwacom = declare_dependency()
142 endif
143
144 ############ udev bits ############
145
146 executable('libinput-device-group',
147            'udev/libinput-device-group.c',
148            dependencies : [dep_udev, dep_libwacom],
149            include_directories : [includes_src, includes_include],
150            install : true,
151            install_dir : dir_udev_callouts)
152 executable('libinput-model-quirks',
153            'udev/libinput-model-quirks.c',
154            dependencies : [dep_udev, dep_libevdev],
155            include_directories : [includes_src, includes_include],
156            install : true,
157            install_dir : dir_udev_callouts)
158
159 udev_rules_config = configuration_data()
160 udev_rules_config.set('UDEV_TEST_PATH', '')
161 configure_file(input : 'udev/80-libinput-device-groups.rules.in',
162                output : '80-libinput-device-groups.rules',
163                install : true,
164                install_dir : dir_udev_rules,
165                configuration : udev_rules_config)
166 configure_file(input : 'udev/90-libinput-model-quirks.rules.in',
167               output : '90-libinput-model-quirks.rules',
168               install : true,
169               install_dir : dir_udev_rules,
170               configuration : udev_rules_config)
171
172 litest_udev_rules_config = configuration_data()
173 litest_udev_rules_config.set('UDEV_TEST_PATH', meson.build_root() + '/')
174 litest_groups_rules_file = configure_file(input : 'udev/80-libinput-device-groups.rules.in',
175                output : '80-libinput-device-groups-litest.rules',
176                install : false,
177                configuration : litest_udev_rules_config)
178 litest_model_quirks_file = configure_file(input : 'udev/90-libinput-model-quirks.rules.in',
179                                           output : '90-libinput-model-quirks-litest.rules',
180                                           install : false,
181                                           configuration : litest_udev_rules_config)
182
183 ############ libepoll-shim (BSD) ############
184
185 if cc.has_header_symbol('sys/epoll.h', 'epoll_create1', prefix : prefix)
186         # epoll is built-in (Linux, illumos)
187         dep_libepoll = declare_dependency()
188 else
189         # epoll is implemented in userspace by libepoll-shim (FreeBSD)
190         dir_libepoll = get_option('epoll-dir')
191         if dir_libepoll == ''
192                 dir_libepoll = get_option('prefix')
193         endif
194         includes_epoll = include_directories(join_paths(dir_libepoll, 'include/libepoll-shim'))
195         dep_libepoll = cc.find_library('epoll-shim', dirs : join_paths(dir_libepoll, 'lib'))
196         code = '''
197         #include <sys/epoll.h>
198         int main(void) { epoll_create1(0); }
199         '''
200         if not cc.links(code,
201                 name : 'libepoll-shim check',
202                 dependencies : [dep_libepoll, dep_rt],
203                 include_directories : includes_epoll) # note: wants an include_directories object
204                 error('No built-in epoll or libepoll-shim found.')
205         endif
206         dep_libepoll = declare_dependency(
207                 include_directories : includes_epoll,
208                 dependencies : [dep_libepoll, dep_rt])
209 endif
210
211 ############ libinput-util.a ############
212 src_libinput_util = [
213                 'src/libinput-util.c',
214                 'src/libinput-util.h'
215 ]
216 libinput_util = static_library('libinput-util',
217                                src_libinput_util,
218                                dependencies : [dep_udev, dep_libevdev],
219                                include_directories : includes_include)
220 dep_libinput_util = declare_dependency(link_with : libinput_util)
221
222 ############ libfilter.a ############
223 src_libfilter = [
224                 'src/filter.c',
225                 'src/filter-flat.c',
226                 'src/filter-low-dpi.c',
227                 'src/filter-mouse.c',
228                 'src/filter-touchpad.c',
229                 'src/filter-touchpad-x230.c',
230                 'src/filter-tablet.c',
231                 'src/filter-trackpoint.c',
232                 'src/filter.h',
233                 'src/filter-private.h'
234 ]
235 libfilter = static_library('filter', src_libfilter,
236                            dependencies : dep_udev,
237                            include_directories : includes_include)
238 dep_libfilter = declare_dependency(link_with : libfilter)
239
240 ############ libquirks.a #############
241 libinput_data_path = dir_data
242 libinput_data_override_path = join_paths(dir_sysconf, 'local-overrides.quirks')
243 config_h.set_quoted('LIBINPUT_QUIRKS_DIR', dir_data)
244 config_h.set_quoted('LIBINPUT_QUIRKS_OVERRIDE_FILE', libinput_data_override_path)
245
246 quirks_data = [
247         'quirks/10-generic-keyboard.quirks',
248         'quirks/10-generic-lid.quirks',
249         'quirks/10-generic-trackball.quirks',
250         'quirks/30-vendor-aiptek.quirks',
251         'quirks/30-vendor-alps.quirks',
252         'quirks/30-vendor-contour.quirks',
253         'quirks/30-vendor-cyapa.quirks',
254         'quirks/30-vendor-elantech.quirks',
255         'quirks/30-vendor-huion.quirks',
256         'quirks/30-vendor-ibm.quirks',
257         'quirks/30-vendor-kensington.quirks',
258         'quirks/30-vendor-logitech.quirks',
259         'quirks/30-vendor-microsoft.quirks',
260         'quirks/30-vendor-razer.quirks',
261         'quirks/30-vendor-synaptics.quirks',
262         'quirks/30-vendor-vmware.quirks',
263         'quirks/30-vendor-wacom.quirks',
264         'quirks/50-system-acer.quirks',
265         'quirks/50-system-apple.quirks',
266         'quirks/50-system-asus.quirks',
267         'quirks/50-system-chicony.quirks',
268         'quirks/50-system-cyborg.quirks',
269         'quirks/50-system-dell.quirks',
270         'quirks/50-system-google.quirks',
271         'quirks/50-system-hp.quirks',
272         'quirks/50-system-lenovo.quirks',
273         'quirks/50-system-system76.quirks',
274         'quirks/50-system-toshiba.quirks',
275 ]
276
277 test('quirks-in-meson.build',
278      find_program('quirks/test-quirks-in-meson.build.sh'),
279      args : [meson.source_root()])
280
281 config_h.set_quoted('LIBINPUT_QUIRKS_FILES', ':'.join(quirks_data))
282 config_h.set_quoted('LIBINPUT_QUIRKS_SRCDIR', dir_src_quirks)
283
284 install_data(quirks_data, install_dir : dir_data)
285
286 src_libquirks = [
287         'src/quirks.c',
288         'src/quirks.h',
289         'src/builddir.h',
290 ]
291
292 deps_libquirks = [dep_udev, dep_libinput_util]
293 libquirks = static_library('quirks', src_libquirks,
294                            dependencies : deps_libquirks,
295                            include_directories : includes_include)
296 dep_libquirks = declare_dependency(link_with : libquirks)
297
298 ############ libinput.so ############
299 install_headers('src/libinput.h')
300 src_libinput = src_libfilter + [
301         'src/libinput.c',
302         'src/libinput.h',
303         'src/libinput-private.h',
304         'src/evdev.c',
305         'src/evdev.h',
306         'src/evdev-debounce.c',
307         'src/evdev-fallback.c',
308         'src/evdev-fallback.h',
309         'src/evdev-middle-button.c',
310         'src/evdev-mt-touchpad.c',
311         'src/evdev-mt-touchpad.h',
312         'src/evdev-mt-touchpad-tap.c',
313         'src/evdev-mt-touchpad-buttons.c',
314         'src/evdev-mt-touchpad-edge-scroll.c',
315         'src/evdev-mt-touchpad-gestures.c',
316         'src/evdev-tablet.c',
317         'src/evdev-tablet.h',
318         'src/evdev-tablet-pad.c',
319         'src/evdev-tablet-pad.h',
320         'src/evdev-tablet-pad-leds.c',
321         'src/path-seat.h',
322         'src/path-seat.c',
323         'src/udev-seat.c',
324         'src/udev-seat.h',
325         'src/timer.c',
326         'src/timer.h',
327         'include/linux/input.h'
328 ]
329
330 deps_libinput = [
331         dep_mtdev,
332         dep_udev,
333         dep_libevdev,
334         dep_libepoll,
335         dep_lm,
336         dep_rt,
337         dep_libwacom,
338         dep_libinput_util,
339         dep_libquirks
340 ]
341
342 libinput_version_h_config = configuration_data()
343 libinput_version_h_config.set('LIBINPUT_VERSION_MAJOR', libinput_version[0])
344 libinput_version_h_config.set('LIBINPUT_VERSION_MINOR', libinput_version[1])
345 libinput_version_h_config.set('LIBINPUT_VERSION_MICRO', libinput_version[2])
346 libinput_version_h_config.set('LIBINPUT_VERSION', meson.project_version())
347
348 libinput_version_h = configure_file(
349                 input : 'src/libinput-version.h.in',
350                 output : 'libinput-version.h',
351                 configuration : libinput_version_h_config,
352                 install : false,
353 )
354
355 mapfile = join_paths(dir_src, 'libinput.sym')
356 version_flag = '-Wl,--version-script,@0@'.format(mapfile)
357 lib_libinput = shared_library('input',
358                 src_libinput,
359                 include_directories : [include_directories('.'), includes_include],
360                 dependencies : deps_libinput,
361                 version : libinput_so_version,
362                 link_args : version_flag,
363                 link_depends : mapfile,
364                 install : true
365                 )
366
367 dep_libinput = declare_dependency(
368                 link_with : lib_libinput,
369                 dependencies : deps_libinput)
370
371 pkgconfig.generate(
372         filebase : 'libinput',
373         name : 'Libinput',
374         description : 'Input device library',
375         version : meson.project_version(),
376         libraries : lib_libinput
377 )
378
379 git_version_h = vcs_tag(command : ['git', 'describe'],
380                         fallback : 'unknown',
381                         input : 'src/libinput-git-version.h.in',
382                         output :'libinput-git-version.h')
383
384 if meson.version().version_compare('<0.43.0')
385         # Restore the SELinux context for the libinput.so.a.b.c on install
386         # meson bug https://github.com/mesonbuild/meson/issues/1967
387         meson.add_install_script('src/libinput-restore-selinux-context.sh',
388                                  dir_lib, lib_libinput.full_path())
389 endif
390
391 ############ documentation ############
392
393 if get_option('documentation')
394         subdir('doc/api')
395         subdir('doc/user')
396 endif
397
398 ############ tools ############
399 libinput_tool_path = dir_libexec
400 config_h.set_quoted('LIBINPUT_TOOL_PATH', libinput_tool_path)
401 tools_shared_sources = [ 'tools/shared.c',
402                          'tools/shared.h',
403                          'src/builddir.h' ]
404 deps_tools_shared = [ dep_libinput, dep_libevdev ]
405 lib_tools_shared = static_library('tools_shared',
406                                   tools_shared_sources,
407                                   include_directories : [includes_src, includes_include],
408                                   dependencies : deps_tools_shared)
409 dep_tools_shared = declare_dependency(link_with : lib_tools_shared,
410                                       dependencies : deps_tools_shared)
411
412 man_config = configuration_data()
413 man_config.set('LIBINPUT_VERSION', meson.project_version())
414 man_config.set('LIBINPUT_DATA_DIR', dir_data)
415
416 deps_tools = [ dep_tools_shared, dep_libinput ]
417 libinput_debug_events_sources = [ 'tools/libinput-debug-events.c' ]
418 executable('libinput-debug-events',
419            libinput_debug_events_sources,
420            dependencies : deps_tools,
421            include_directories : [includes_src, includes_include],
422            install_dir : libinput_tool_path,
423            install : true
424            )
425 configure_file(input : 'tools/libinput-debug-events.man',
426                output : 'libinput-debug-events.1',
427                configuration : man_config,
428                install : true,
429                install_dir : dir_man1,
430                )
431
432 libinput_quirks_sources = [ 'tools/libinput-quirks.c' ]
433 libinput_quirks = executable('libinput-quirks',
434                              libinput_quirks_sources,
435                              dependencies : [dep_libquirks, dep_tools_shared, dep_libinput],
436                              include_directories : [includes_src, includes_include],
437                              install_dir : libinput_tool_path,
438                              install : true
439                             )
440 test('validate-quirks',
441      libinput_quirks,
442      args: ['validate', '--data-dir=@0@'.format(dir_src_quirks)]
443      )
444
445 configure_file(input : 'tools/libinput-quirks.man',
446                output : 'libinput-quirks.1',
447                configuration : man_config,
448                install : true,
449                install_dir : dir_man1,
450                )
451 # Same man page for the subtools to stay consistent with the other tools
452 configure_file(input : 'tools/libinput-quirks.man',
453                output : 'libinput-quirks-list.1',
454                configuration : man_config,
455                install : true,
456                install_dir : dir_man1,
457                )
458 configure_file(input : 'tools/libinput-quirks.man',
459                output : 'libinput-quirks-validate.1',
460                configuration : man_config,
461                install : true,
462                install_dir : dir_man1,
463                )
464
465 libinput_list_devices_sources = [ 'tools/libinput-list-devices.c' ]
466 libinput_list_devices = executable('libinput-list-devices',
467                                    libinput_list_devices_sources,
468                                    dependencies : deps_tools,
469                                    include_directories : [includes_src, includes_include],
470                                    install_dir : libinput_tool_path,
471                                    install : true,
472                                   )
473 test('list-devices', libinput_list_devices)
474
475 configure_file(input : 'tools/libinput-list-devices.man',
476                output : 'libinput-list-devices.1',
477                configuration : man_config,
478                install : true,
479                install_dir : dir_man1,
480                )
481
482 libinput_measure_sources = [ 'tools/libinput-measure.c' ]
483 executable('libinput-measure',
484            libinput_measure_sources,
485            dependencies : deps_tools,
486            include_directories : [includes_src, includes_include],
487            install_dir : libinput_tool_path,
488            install : true,
489            )
490 configure_file(input : 'tools/libinput-measure.man',
491                output : 'libinput-measure.1',
492                configuration : man_config,
493                install : true,
494                install_dir : dir_man1,
495                )
496
497 src_python_tools = files(
498               'tools/libinput-measure-fuzz.py',
499               'tools/libinput-measure-touchpad-tap.py',
500               'tools/libinput-measure-touchpad-pressure.py',
501               'tools/libinput-measure-touch-size.py',
502 )
503
504 config_noop = configuration_data()
505 # Set a dummy replacement to silence meson warnings:
506 # meson.build:487: WARNING: Got an empty configuration_data() object and
507 #                  found no substitutions in the input file 'foo'. If you
508 #                  want to copy a file to the build dir, use the 'copy:'
509 #                  keyword argument added in 0.47.0
510 config_noop.set('dummy', 'dummy')
511 foreach t : src_python_tools
512         configure_file(input: t,
513                        output: '@BASENAME@',
514                        configuration : config_noop,
515                        install : true,
516                        install_dir : libinput_tool_path
517                       )
518 endforeach
519
520 src_man = files(
521               'tools/libinput-measure-fuzz.man',
522               'tools/libinput-measure-touchpad-tap.man',
523               'tools/libinput-measure-touchpad-pressure.man',
524               'tools/libinput-measure-touch-size.man',
525 )
526
527 foreach m : src_man
528         configure_file(input : m,
529                        output : '@BASENAME@.1',
530                        configuration : man_config,
531                        install : true,
532                        install_dir : dir_man1)
533 endforeach
534
535 libinput_record_sources = [ 'tools/libinput-record.c', git_version_h ]
536 executable('libinput-record',
537            libinput_record_sources,
538            dependencies : deps_tools + [dep_udev],
539            include_directories : [includes_src, includes_include],
540            install_dir : libinput_tool_path,
541            install : true,
542            )
543 configure_file(input : 'tools/libinput-record.man',
544                output : 'libinput-record.1',
545                configuration : man_config,
546                install : true,
547                install_dir : dir_man1,
548                )
549
550 install_data('tools/libinput-replay',
551              install_dir : libinput_tool_path)
552 configure_file(input : 'tools/libinput-replay.man',
553                output : 'libinput-replay.1',
554                configuration : man_config,
555                install : true,
556                install_dir : dir_man1,
557                )
558
559 if get_option('debug-gui')
560         dep_gtk = dependency('gtk+-3.0', version : '>= 3.20')
561         dep_cairo = dependency('cairo')
562         dep_glib = dependency('glib-2.0')
563
564         debug_gui_sources = [ 'tools/libinput-debug-gui.c' ]
565         deps_debug_gui = [
566                         dep_gtk,
567                         dep_cairo,
568                         dep_glib,
569                         ] + deps_tools
570         executable('libinput-debug-gui',
571                    debug_gui_sources,
572                    dependencies : deps_debug_gui,
573                    include_directories : [includes_src, includes_include],
574                    install_dir : libinput_tool_path,
575                    install : true
576                    )
577         configure_file(input : 'tools/libinput-debug-gui.man',
578                        output : 'libinput-debug-gui.1',
579                        configuration : man_config,
580                        install : true,
581                        install_dir : dir_man1,
582                        )
583 endif
584
585 libinput_sources = [ 'tools/libinput-tool.c' ]
586
587 libinput_tool = executable('libinput',
588                            libinput_sources,
589                            dependencies : deps_tools,
590                            include_directories : [includes_src, includes_include],
591                            install : true
592                           )
593 configure_file(input : 'tools/libinput.man',
594                output : 'libinput.1',
595                configuration : man_config,
596                install : true,
597                install_dir : dir_man1,
598                )
599
600 ptraccel_debug_sources = [ 'tools/ptraccel-debug.c' ]
601 executable('ptraccel-debug',
602            ptraccel_debug_sources,
603            dependencies : [ dep_libfilter, dep_libinput ],
604            include_directories : [includes_src, includes_include],
605            install : false
606            )
607
608 # Don't run the test during a release build because we rely on the magic
609 # subtool lookup
610 if get_option('buildtype') == 'debug' or get_option('buildtype') == 'debugoptimized'
611         test('tool-option-parsing',
612              find_program('tools/test-tool-option-parsing.py'),
613              args : ['--tool-path', libinput_tool.full_path()],
614              timeout : 120)
615 endif
616
617 # the libinput tools check whether we execute from the builddir, this is
618 # the test to verify that lookup. We test twice, once as normal test
619 # run from the builddir, once after copying to /tmp
620 test_builddir_lookup = executable('test-builddir-lookup',
621                                   'test/test-builddir-lookup.c',
622                                   dependencies : [ dep_tools_shared],
623                                   include_directories : [includes_src, includes_include],
624                                   install : false)
625 test('tools-builddir-lookup',
626      test_builddir_lookup,
627      args : ['--builddir-is-set'])
628 test('tools-builddir-lookup-installed',
629      find_program('test/helper-copy-and-exec-from-tmp.sh'),
630      args : [test_builddir_lookup.full_path(), '--builddir-is-null'],
631      env : ['LD_LIBRARY_PATH=@0@'.format(meson.build_root())],
632      workdir : '/tmp')
633
634 ############ tests ############
635
636 test('symbols-leak-test',
637      find_program('test/symbols-leak-test'),
638      args : [ join_paths(dir_src, 'libinput.sym'), dir_src])
639
640 # build-test only
641 executable('test-build-pedantic',
642            'test/build-pedantic.c',
643            dependencies : [dep_udev],
644            include_directories : [includes_src, includes_include],
645            c_args : ['-std=c99', '-pedantic', '-Werror'],
646            install : false)
647 # build-test only
648 executable('test-build-std-gnuc90',
649            'test/build-pedantic.c',
650            dependencies : [dep_udev],
651            include_directories : [includes_src, includes_include],
652            c_args : ['-std=gnu89', '-Werror'],
653            install : false)
654 # test for linking with the minimal linker flags
655 executable('test-build-linker',
656            'test/build-pedantic.c',
657            include_directories : [includes_src, includes_include],
658            dependencies : [ dep_libinput, dep_libinput_util ],
659            install : false)
660 # test including from C++ (in case CPP compiler is available)
661 if add_languages('cpp', required: false)
662         executable('test-build-cxx',
663                    'test/build-cxx.cc',
664                    dependencies : [dep_udev],
665                    include_directories : [includes_src, includes_include],
666                    install : false)
667 endif
668
669 # This is the test suite runner, we allow disabling that one because of
670 # dependencies
671 if get_option('tests')
672         dep_check = dependency('check', version : '>= 0.9.10')
673
674         leftover_rules = find_program('test/check-leftover-udev-rules.sh')
675         test('leftover-rules', leftover_rules, is_parallel : false)
676
677         gstack = find_program('gstack', required : false)
678         config_h.set10('HAVE_GSTACK', gstack.found())
679
680         # for inhibit support during test run
681         dep_libsystemd = dependency('libsystemd', version : '>= 221', required : false)
682         config_h.set10('HAVE_LIBSYSTEMD', dep_libsystemd.found())
683
684         litest_sources = [
685                 'test/litest.h',
686                 'test/litest-int.h',
687                 'test/litest-device-acer-hawaii-keyboard.c',
688                 'test/litest-device-acer-hawaii-touchpad.c',
689                 'test/litest-device-aiptek-tablet.c',
690                 'test/litest-device-alps-semi-mt.c',
691                 'test/litest-device-alps-dualpoint.c',
692                 'test/litest-device-anker-mouse-kbd.c',
693                 'test/litest-device-apple-appletouch.c',
694                 'test/litest-device-apple-internal-keyboard.c',
695                 'test/litest-device-apple-magicmouse.c',
696                 'test/litest-device-asus-rog-gladius.c',
697                 'test/litest-device-atmel-hover.c',
698                 'test/litest-device-bcm5974.c',
699                 'test/litest-device-calibrated-touchscreen.c',
700                 'test/litest-device-cyborg-rat-5.c',
701                 'test/litest-device-elantech-touchpad.c',
702                 'test/litest-device-generic-singletouch.c',
703                 'test/litest-device-gpio-keys.c',
704                 'test/litest-device-huion-pentablet.c',
705                 'test/litest-device-hp-wmi-hotkeys.c',
706                 'test/litest-device-ignored-mouse.c',
707                 'test/litest-device-keyboard.c',
708                 'test/litest-device-keyboard-all-codes.c',
709                 'test/litest-device-keyboard-razer-blackwidow.c',
710                 'test/litest-device-keyboard-razer-blade-stealth.c',
711                 'test/litest-device-keyboard-razer-blade-stealth-videoswitch.c',
712                 'test/litest-device-lid-switch.c',
713                 'test/litest-device-lid-switch-surface3.c',
714                 'test/litest-device-logitech-trackball.c',
715                 'test/litest-device-nexus4-touch-screen.c',
716                 'test/litest-device-magic-trackpad.c',
717                 'test/litest-device-mouse.c',
718                 'test/litest-device-mouse-wheel-tilt.c',
719                 'test/litest-device-mouse-roccat.c',
720                 'test/litest-device-mouse-low-dpi.c',
721                 'test/litest-device-mouse-wheel-click-angle.c',
722                 'test/litest-device-mouse-wheel-click-count.c',
723                 'test/litest-device-ms-nano-transceiver-mouse.c',
724                 'test/litest-device-ms-surface-cover.c',
725                 'test/litest-device-protocol-a-touch-screen.c',
726                 'test/litest-device-qemu-usb-tablet.c',
727                 'test/litest-device-synaptics-x220.c',
728                 'test/litest-device-synaptics-hover.c',
729                 'test/litest-device-synaptics-i2c.c',
730                 'test/litest-device-synaptics-rmi4.c',
731                 'test/litest-device-synaptics-st.c',
732                 'test/litest-device-synaptics-t440.c',
733                 'test/litest-device-synaptics-x1-carbon-3rd.c',
734                 'test/litest-device-thinkpad-extrabuttons.c',
735                 'test/litest-device-trackpoint.c',
736                 'test/litest-device-touch-screen.c',
737                 'test/litest-device-touchscreen-invalid-range.c',
738                 'test/litest-device-touchscreen-fuzz.c',
739                 'test/litest-device-touchscreen-mt-tool.c',
740                 'test/litest-device-uclogic-tablet.c',
741                 'test/litest-device-wacom-bamboo-2fg-finger.c',
742                 'test/litest-device-wacom-bamboo-2fg-pad.c',
743                 'test/litest-device-wacom-bamboo-2fg-pen.c',
744                 'test/litest-device-wacom-bamboo-16fg-pen.c',
745                 'test/litest-device-wacom-cintiq-12wx-pen.c',
746                 'test/litest-device-wacom-cintiq-13hdt-finger.c',
747                 'test/litest-device-wacom-cintiq-13hdt-pad.c',
748                 'test/litest-device-wacom-cintiq-13hdt-pen.c',
749                 'test/litest-device-wacom-cintiq-24hd-pen.c',
750                 'test/litest-device-wacom-cintiq-24hdt-pad.c',
751                 'test/litest-device-wacom-cintiq-pro-16-finger.c',
752                 'test/litest-device-wacom-cintiq-pro-16-pad.c',
753                 'test/litest-device-wacom-cintiq-pro-16-pen.c',
754                 'test/litest-device-wacom-ekr.c',
755                 'test/litest-device-wacom-hid4800-pen.c',
756                 'test/litest-device-wacom-intuos3-pad.c',
757                 'test/litest-device-wacom-intuos5-finger.c',
758                 'test/litest-device-wacom-intuos5-pad.c',
759                 'test/litest-device-wacom-intuos5-pen.c',
760                 'test/litest-device-wacom-isdv4-e6-pen.c',
761                 'test/litest-device-wacom-isdv4-e6-finger.c',
762                 'test/litest-device-wacom-mobilestudio-pro-pad.c',
763                 'test/litest-device-waltop-tablet.c',
764                 'test/litest-device-wheel-only.c',
765                 'test/litest-device-xen-virtual-pointer.c',
766                 'test/litest-device-vmware-virtual-usb-mouse.c',
767                 'test/litest-device-yubikey.c',
768                 'test/litest.c'
769         ]
770
771         dep_dl = cc.find_library('dl')
772         deps_litest = [
773                 dep_libinput,
774                 dep_check,
775                 dep_udev,
776                 dep_libevdev,
777                 dep_dl,
778                 dep_lm,
779                 dep_libsystemd,
780                 dep_libquirks,
781         ]
782
783         litest_config_h = configuration_data()
784         litest_config_h.set_quoted('LIBINPUT_DEVICE_GROUPS_RULES_FILE',
785                             join_paths(meson.build_root(), '80-libinput-device-groups.rules'))
786         litest_config_h.set_quoted('LIBINPUT_MODEL_QUIRKS_UDEV_RULES_FILE',
787                             join_paths(meson.build_root(), '90-libinput-model-quirks.rules'))
788
789         def_no_main = '-DLITEST_NO_MAIN'
790         def_disable_backtrace = '-DLITEST_DISABLE_BACKTRACE_LOGGING'
791         defs_litest_selftest = [
792                 def_no_main,
793                 def_disable_backtrace
794         ]
795         test_litest_selftest_sources = [
796                 'test/litest-selftest.c',
797                 'test/litest.c',
798                 'test/litest.h'
799         ]
800         test_litest_selftest = executable('test-litest-selftest',
801                                           test_litest_selftest_sources,
802                                           include_directories : [includes_src, includes_include],
803                                           dependencies : deps_litest,
804                                           c_args : defs_litest_selftest,
805                                           install : false)
806         test('test-litest-selftest', test_litest_selftest)
807
808         def_LT_VERSION = '-DLIBINPUT_LT_VERSION="@0@:@1@:@2@"'.format(libinput_lt_c, libinput_lt_r, libinput_lt_a)
809         test_library_version = executable('test-library-version',
810                                           ['test/test-library-version.c'],
811                                           c_args : [ def_LT_VERSION ],
812                                           install : false)
813         test('test-library-version', test_library_version)
814
815         test_utils_sources = [
816                 'src/libinput-util.h',
817                 'src/libinput-util.c',
818                 'test/test-utils.c',
819         ]
820         test_utils = executable('test-utils',
821                                 test_utils_sources,
822                                 include_directories : [includes_src, includes_include],
823                                 dependencies : deps_litest,
824                                 install: false)
825         test('test-utils', test_utils)
826
827         libinput_test_runner_sources = litest_sources + [
828                 'src/libinput-util.h',
829                 'src/libinput-util.c',
830                 'test/test-udev.c',
831                 'test/test-path.c',
832                 'test/test-pointer.c',
833                 'test/test-touch.c',
834                 'test/test-log.c',
835                 'test/test-tablet.c',
836                 'test/test-pad.c',
837                 'test/test-touchpad.c',
838                 'test/test-touchpad-tap.c',
839                 'test/test-touchpad-buttons.c',
840                 'test/test-trackpoint.c',
841                 'test/test-trackball.c',
842                 'test/test-misc.c',
843                 'test/test-keyboard.c',
844                 'test/test-device.c',
845                 'test/test-gestures.c',
846                 'test/test-switch.c',
847                 'test/test-quirks.c',
848         ]
849         libinput_test_runner = executable('libinput-test-suite',
850                                           libinput_test_runner_sources,
851                                           include_directories : [includes_src, includes_include],
852                                           dependencies : deps_litest,
853                                           install_dir : libinput_tool_path,
854                                           install : get_option('install-tests'))
855         configure_file(input : 'test/libinput-test-suite.man',
856                        output : 'libinput-test-suite.1',
857                        configuration : man_config,
858                        install : true,
859                        install_dir : dir_man1,
860                        )
861
862         test('libinput-test-suite-runner',
863              libinput_test_runner,
864              timeout : 1200)
865
866         test('libinput-test-deviceless',
867              libinput_test_runner,
868              args: ['--filter-deviceless'])
869
870         valgrind = find_program('valgrind', required : false)
871         if valgrind.found()
872                 valgrind_env = environment()
873                 valgrind_env.set('CK_FORK', 'no')
874                 valgrind_env.set('USING_VALGRIND', '1')
875                 valgrind_suppressions_file = join_paths(dir_src_test, 'valgrind.suppressions')
876                 add_test_setup('valgrind',
877                                 exe_wrapper : [ valgrind,
878                                                 '--leak-check=full',
879                                                 '--gen-suppressions=all',
880                                                 '--error-exitcode=3',
881                                                 '--suppressions=' + valgrind_suppressions_file ],
882                                 env :  valgrind_env,
883                                 timeout_multiplier : 100)
884         else
885                 message('valgrind not found, disabling valgrind test suite')
886         endif
887         configure_file(output : 'litest-config.h',
888                        install : false,
889                        configuration : litest_config_h)
890 endif
891 ############ output files ############
892 configure_file(output : 'config.h', install : false, configuration : config_h)