meson.build 28.6 KB
Newer Older
1
project('libinput', 'c',
Peter Hutterer's avatar
Peter Hutterer committed
2
	version : '1.12.3',
3
	license : 'MIT/Expat',
Peter Hutterer's avatar
Peter Hutterer committed
4
	default_options : [ 'c_std=gnu99', 'warning_level=2' ],
5
	meson_version : '>= 0.41.0')
Peter Hutterer's avatar
Peter Hutterer committed
6
7
8

libinput_version = meson.project_version().split('.')

9
10
11
12
13
14
dir_data        = join_paths(get_option('prefix'), get_option('datadir'), 'libinput')
dir_sysconf     = join_paths(get_option('prefix'), get_option('sysconfdir'), 'libinput')
dir_libexec     = join_paths(get_option('prefix'), get_option('libexecdir'), 'libinput')
dir_lib         = join_paths(get_option('prefix'), get_option('libdir'))
dir_man1        = join_paths(get_option('prefix'), get_option('mandir'), 'man1')
dir_system_udev = join_paths(get_option('prefix'), 'lib', 'udev')
Peter Hutterer's avatar
Peter Hutterer committed
15
dir_src_quirks  = join_paths(meson.source_root(), 'quirks')
16
17
18
19
20
21
22
23
24
25
26
27
dir_src_test    = join_paths(meson.source_root(), 'test')
dir_src         = join_paths(meson.source_root(), 'src')

dir_udev = get_option('udev-dir')
if dir_udev == ''
	dir_udev = dir_system_udev
endif
dir_udev_callouts = dir_udev
dir_udev_rules    = join_paths(dir_udev, 'rules.d')
dir_udev_hwdb     = join_paths(dir_udev, 'hwdb.d')


Peter Hutterer's avatar
Peter Hutterer committed
28
29
30
31
32
33
34
35
# 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
36
37
38
libinput_lt_c=23
libinput_lt_r=0
libinput_lt_a=13
Peter Hutterer's avatar
Peter Hutterer committed
39
40
41
42
43
44
45
46
47

# 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')
cppflags = ['-Wno-unused-parameter', '-g', '-fvisibility=hidden']
cflags = cppflags + ['-Wmissing-prototypes', '-Wstrict-prototypes']
48
49
add_project_arguments(cflags, language : 'c')
add_project_arguments(cppflags, language : 'cpp')
Peter Hutterer's avatar
Peter Hutterer committed
50

51
# config.h
Peter Hutterer's avatar
Peter Hutterer committed
52
53
config_h = configuration_data()
config_h.set('_GNU_SOURCE', '1')
54
55
56
57
58
if get_option('buildtype') == 'debug' or get_option('buildtype') == 'debugoptimized'
	config_h.set_quoted('MESON_BUILD_ROOT', meson.build_root())
else
	config_h.set_quoted('MESON_BUILD_ROOT', '')
endif
Peter Hutterer's avatar
Peter Hutterer committed
59
60
61
62
63
64
65
66

prefix = '''#define _GNU_SOURCE 1
#include <assert.h>
'''
if cc.get_define('static_assert', prefix : prefix) == ''
	config_h.set('static_assert(...)', '/* */')
endif

67
68
69
70
71
72
73
74
75
76
77
78
79
# 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')
80
81
82
83
	config_h.set('_Float32', 'int')
	config_h.set('_Float32x', 'int')
	config_h.set('_Float64', 'long')
	config_h.set('_Float64x', 'long')
84
85
endif

86
87
88
89
if cc.has_header_symbol('dirent.h', 'versionsort', prefix : prefix)
	config_h.set('HAVE_VERSIONSORT', '1')
endif

90
91
92
93
94
95
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

96
97
98
99
if cc.has_header('xlocale.h')
	config_h.set('HAVE_XLOCALE_H', '1')
endif

100
101
102
103
104
105
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

Peter Hutterer's avatar
Peter Hutterer committed
106
107
108
# Dependencies
pkgconfig = import('pkgconfig')
dep_udev = dependency('libudev')
109
dep_mtdev = dependency('mtdev', version : '>= 1.1.0')
110
dep_libevdev = dependency('libevdev')
Peter Hutterer's avatar
Peter Hutterer committed
111
112
113
dep_lm = cc.find_library('m', required : false)
dep_rt = cc.find_library('rt', required : false)

114
115
116
117
# Include directories
includes_include = include_directories('include')
includes_src = include_directories('src')

Peter Hutterer's avatar
Peter Hutterer committed
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
############ libwacom configuration ############

have_libwacom = get_option('libwacom')
config_h.set10('HAVE_LIBWACOM', have_libwacom)
if have_libwacom
	dep_libwacom = dependency('libwacom', version : '>= 0.20')

	code = '''
	#include <libwacom/libwacom.h>
	int main(void) { libwacom_get_paired_device(NULL); }
	'''
	result = cc.links(code,
			  name : 'libwacom_get_paired_device check',
			  dependencies : dep_libwacom)
	config_h.set10('HAVE_LIBWACOM_GET_PAIRED_DEVICE', result)
133
134
135
136
137
138
139
140
141

	code = '''
	#include <libwacom/libwacom.h>
	int main(void) { libwacom_get_button_evdev_code(NULL, 'A'); }
	'''
	result = cc.links(code,
			  name : 'libwacom_get_button_evdev_code check',
			  dependencies : dep_libwacom)
	config_h.set10('HAVE_LIBWACOM_GET_BUTTON_EVDEV_CODE', result)
142
143
else
	dep_libwacom = declare_dependency()
Peter Hutterer's avatar
Peter Hutterer committed
144
145
146
147
148
149
150
endif

############ udev bits ############

executable('libinput-device-group',
	   'udev/libinput-device-group.c',
	   dependencies : [dep_udev, dep_libwacom],
151
	   include_directories : [includes_src, includes_include],
Peter Hutterer's avatar
Peter Hutterer committed
152
	   install : true,
153
	   install_dir : dir_udev_callouts)
Peter Hutterer's avatar
Peter Hutterer committed
154
155
executable('libinput-model-quirks',
	   'udev/libinput-model-quirks.c',
156
	   dependencies : [dep_udev, dep_libevdev],
157
	   include_directories : [includes_src, includes_include],
Peter Hutterer's avatar
Peter Hutterer committed
158
	   install : true,
159
	   install_dir : dir_udev_callouts)
Peter Hutterer's avatar
Peter Hutterer committed
160
161
162
163
164
165

udev_rules_config = configuration_data()
udev_rules_config.set('UDEV_TEST_PATH', '')
configure_file(input : 'udev/80-libinput-device-groups.rules.in',
	       output : '80-libinput-device-groups.rules',
	       install : true,
166
	       install_dir : dir_udev_rules,
Peter Hutterer's avatar
Peter Hutterer committed
167
	       configuration : udev_rules_config)
168
169
170
171
172
configure_file(input : 'udev/90-libinput-model-quirks.rules.in',
              output : '90-libinput-model-quirks.rules',
              install : true,
              install_dir : dir_udev_rules,
              configuration : udev_rules_config)
Peter Hutterer's avatar
Peter Hutterer committed
173
174

litest_udev_rules_config = configuration_data()
175
litest_udev_rules_config.set('UDEV_TEST_PATH', meson.build_root() + '/')
Peter Hutterer's avatar
Peter Hutterer committed
176
177
178
179
litest_groups_rules_file = configure_file(input : 'udev/80-libinput-device-groups.rules.in',
	       output : '80-libinput-device-groups-litest.rules',
	       install : false,
	       configuration : litest_udev_rules_config)
180
181
182
183
litest_model_quirks_file = configure_file(input : 'udev/90-libinput-model-quirks.rules.in',
					  output : '90-libinput-model-quirks-litest.rules',
					  install : false,
					  configuration : litest_udev_rules_config)
Peter Hutterer's avatar
Peter Hutterer committed
184

185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
############ 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(join_paths(dir_libepoll, 'include/libepoll-shim'))
	dep_libepoll = cc.find_library('epoll-shim', dirs : join_paths(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

Peter Hutterer's avatar
Peter Hutterer committed
213
214
215
216
217
218
219
############ libinput-util.a ############
src_libinput_util = [
		'src/libinput-util.c',
		'src/libinput-util.h'
]
libinput_util = static_library('libinput-util',
			       src_libinput_util,
220
			       dependencies : [dep_udev, dep_libevdev],
221
			       include_directories : includes_include)
222
dep_libinput_util = declare_dependency(link_with : libinput_util)
Peter Hutterer's avatar
Peter Hutterer committed
223
224
225
226

############ libfilter.a ############
src_libfilter = [
		'src/filter.c',
227
		'src/filter-flat.c',
228
		'src/filter-low-dpi.c',
229
		'src/filter-mouse.c',
230
		'src/filter-touchpad.c',
231
		'src/filter-touchpad-x230.c',
232
		'src/filter-tablet.c',
233
		'src/filter-trackpoint.c',
Peter Hutterer's avatar
Peter Hutterer committed
234
235
236
		'src/filter.h',
		'src/filter-private.h'
]
237
238
239
libfilter = static_library('filter', src_libfilter,
			   dependencies : dep_udev,
			   include_directories : includes_include)
240
dep_libfilter = declare_dependency(link_with : libfilter)
Peter Hutterer's avatar
Peter Hutterer committed
241

242
############ libquirks.a #############
243
244
libinput_data_path = dir_data
libinput_data_override_path = join_paths(dir_sysconf, 'local-overrides.quirks')
Peter Hutterer's avatar
Peter Hutterer committed
245
246
config_h.set_quoted('LIBINPUT_QUIRKS_DIR', dir_data)
config_h.set_quoted('LIBINPUT_QUIRKS_OVERRIDE_FILE', libinput_data_override_path)
247
248

quirks_data = [
Peter Hutterer's avatar
Peter Hutterer committed
249
250
251
252
253
	'quirks/10-generic-keyboard.quirks',
	'quirks/10-generic-lid.quirks',
	'quirks/10-generic-trackball.quirks',
	'quirks/30-vendor-aiptek.quirks',
	'quirks/30-vendor-alps.quirks',
254
	'quirks/30-vendor-contour.quirks',
Peter Hutterer's avatar
Peter Hutterer committed
255
256
257
258
	'quirks/30-vendor-cyapa.quirks',
	'quirks/30-vendor-elantech.quirks',
	'quirks/30-vendor-huion.quirks',
	'quirks/30-vendor-ibm.quirks',
259
	'quirks/30-vendor-kensington.quirks',
Peter Hutterer's avatar
Peter Hutterer committed
260
261
262
263
264
	'quirks/30-vendor-logitech.quirks',
	'quirks/30-vendor-microsoft.quirks',
	'quirks/30-vendor-razer.quirks',
	'quirks/30-vendor-synaptics.quirks',
	'quirks/30-vendor-wacom.quirks',
265
	'quirks/30-vendor-vmware.quirks',
266
	'quirks/50-system-acer.quirks',
Peter Hutterer's avatar
Peter Hutterer committed
267
268
269
270
271
272
273
274
275
	'quirks/50-system-apple.quirks',
	'quirks/50-system-asus.quirks',
	'quirks/50-system-chicony.quirks',
	'quirks/50-system-cyborg.quirks',
	'quirks/50-system-dell.quirks',
	'quirks/50-system-google.quirks',
	'quirks/50-system-hp.quirks',
	'quirks/50-system-lenovo.quirks',
	'quirks/50-system-system76.quirks',
276
277
]

Peter Hutterer's avatar
Peter Hutterer committed
278
279
config_h.set_quoted('LIBINPUT_QUIRKS_FILES', ':'.join(quirks_data))
config_h.set_quoted('LIBINPUT_QUIRKS_SRCDIR', dir_src_quirks)
280

281
install_data(quirks_data, install_dir : dir_data)
282
283
284
285
286
287
288
289
290
291
292
293

src_libquirks = [
	'src/quirks.c',
	'src/quirks.h',
]

deps_libquirks = [dep_udev, dep_libinput_util]
libquirks = static_library('quirks', src_libquirks,
			   dependencies : deps_libquirks,
			   include_directories : includes_include)
dep_libquirks = declare_dependency(link_with : libquirks)

Peter Hutterer's avatar
Peter Hutterer committed
294
295
############ libinput.so ############
install_headers('src/libinput.h')
296
src_libinput = src_libfilter + [
Peter Hutterer's avatar
Peter Hutterer committed
297
298
299
300
301
	'src/libinput.c',
	'src/libinput.h',
	'src/libinput-private.h',
	'src/evdev.c',
	'src/evdev.h',
302
	'src/evdev-debounce.c',
303
	'src/evdev-fallback.c',
304
	'src/evdev-fallback.h',
Peter Hutterer's avatar
Peter Hutterer committed
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
	'src/evdev-middle-button.c',
	'src/evdev-mt-touchpad.c',
	'src/evdev-mt-touchpad.h',
	'src/evdev-mt-touchpad-tap.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.h',
	'src/evdev-tablet-pad.c',
	'src/evdev-tablet-pad.h',
	'src/evdev-tablet-pad-leds.c',
	'src/path-seat.h',
	'src/path-seat.c',
	'src/udev-seat.c',
	'src/udev-seat.h',
	'src/timer.c',
	'src/timer.h',
	'include/linux/input.h'
]
325

Peter Hutterer's avatar
Peter Hutterer committed
326
327
328
329
deps_libinput = [
	dep_mtdev,
	dep_udev,
	dep_libevdev,
330
	dep_libepoll,
Peter Hutterer's avatar
Peter Hutterer committed
331
332
333
	dep_lm,
	dep_rt,
	dep_libwacom,
334
335
	dep_libinput_util,
	dep_libquirks
Peter Hutterer's avatar
Peter Hutterer committed
336
337
338
339
340
341
342
343
344
345
346
347
]

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,
348
		install : false,
Peter Hutterer's avatar
Peter Hutterer committed
349
350
)

351
mapfile = join_paths(dir_src, 'libinput.sym')
Peter Hutterer's avatar
Peter Hutterer committed
352
353
354
version_flag = '-Wl,--version-script,@0@'.format(mapfile)
lib_libinput = shared_library('input',
		src_libinput,
355
		include_directories : [include_directories('.'), includes_include],
Peter Hutterer's avatar
Peter Hutterer committed
356
357
358
359
360
361
362
363
364
365
366
367
		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)

pkgconfig.generate(
368
369
370
371
372
	filebase : 'libinput',
	name : 'Libinput',
	description : 'Input device library',
	version : meson.project_version(),
	libraries : lib_libinput
Peter Hutterer's avatar
Peter Hutterer committed
373
374
)

375
376
git_version_h = vcs_tag(command : ['git', 'describe'],
			fallback : 'unknown',
377
378
			input : 'src/libinput-git-version.h.in',
			output :'libinput-git-version.h')
379

380
if meson.version().version_compare('<0.43.0')
381
382
383
	# Restore the SELinux context for the libinput.so.a.b.c on install
	# meson bug https://github.com/mesonbuild/meson/issues/1967
	meson.add_install_script('src/libinput-restore-selinux-context.sh',
384
				 dir_lib, lib_libinput.full_path())
385
endif
386

Peter Hutterer's avatar
Peter Hutterer committed
387
388
############ documentation ############

389
if get_option('documentation')
390
391
	subdir('doc/api')
	subdir('doc/user')
Peter Hutterer's avatar
Peter Hutterer committed
392
393
394
endif

############ tools ############
395
libinput_tool_path = dir_libexec
396
config_h.set_quoted('LIBINPUT_TOOL_PATH', libinput_tool_path)
Peter Hutterer's avatar
Peter Hutterer committed
397
398
tools_shared_sources = [ 'tools/shared.c',
			 'tools/shared.h' ]
399
400
401
deps_tools_shared = [ dep_libinput, dep_libevdev ]
lib_tools_shared = static_library('tools_shared',
				  tools_shared_sources,
402
				  include_directories : [includes_src, includes_include],
403
404
405
406
				  dependencies : deps_tools_shared)
dep_tools_shared = declare_dependency(link_with : lib_tools_shared,
				      dependencies : deps_tools_shared)

407
408
409
man_config = configuration_data()
man_config.set('LIBINPUT_VERSION', meson.project_version())

410
deps_tools = [ dep_tools_shared, dep_libinput ]
411
libinput_debug_events_sources = [ 'tools/libinput-debug-events.c' ]
Peter Hutterer's avatar
Peter Hutterer committed
412
413
executable('libinput-debug-events',
	   libinput_debug_events_sources,
414
	   dependencies : deps_tools,
415
	   include_directories : [includes_src, includes_include],
416
	   install_dir : libinput_tool_path,
Peter Hutterer's avatar
Peter Hutterer committed
417
418
	   install : true
	   )
419
420
421
422
configure_file(input : 'tools/libinput-debug-events.man',
	       output : 'libinput-debug-events.1',
	       configuration : man_config,
	       install : true,
423
	       install_dir : dir_man1,
424
	       )
Peter Hutterer's avatar
Peter Hutterer committed
425

426
427
428
429
430
431
432
433
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 : true
			    )
434
test('validate-quirks',
435
     libinput_quirks,
436
     args: ['validate', '--data-dir=@0@'.format(dir_src_quirks)]
437
     )
438

439
440
441
442
configure_file(input : 'tools/libinput-quirks.man',
	       output : 'libinput-quirks.1',
	       configuration : man_config,
	       install : true,
443
	       install_dir : dir_man1,
444
445
446
447
448
449
	       )
# 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 : true,
450
	       install_dir : dir_man1,
451
452
453
	       )
configure_file(input : 'tools/libinput-quirks.man',
	       output : 'libinput-quirks-validate.1',
454
455
	       configuration : man_config,
	       install : true,
456
	       install_dir : dir_man1,
457
458
	       )

459
libinput_list_devices_sources = [ 'tools/libinput-list-devices.c' ]
460
461
462
463
464
465
466
467
468
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 : true,
				  )
test('list-devices', libinput_list_devices)

469
470
471
472
configure_file(input : 'tools/libinput-list-devices.man',
	       output : 'libinput-list-devices.1',
	       configuration : man_config,
	       install : true,
473
	       install_dir : dir_man1,
474
	       )
Peter Hutterer's avatar
Peter Hutterer committed
475

476
477
478
479
libinput_measure_sources = [ 'tools/libinput-measure.c' ]
executable('libinput-measure',
	   libinput_measure_sources,
	   dependencies : deps_tools,
480
	   include_directories : [includes_src, includes_include],
481
482
483
	   install_dir : libinput_tool_path,
	   install : true,
	   )
484
485
486
487
configure_file(input : 'tools/libinput-measure.man',
	       output : 'libinput-measure.1',
	       configuration : man_config,
	       install : true,
488
	       install_dir : dir_man1,
489
	       )
490

491
492
493
494
495
496
497
src_python_tools = files(
	      'tools/libinput-measure-fuzz.py',
	      'tools/libinput-measure-touchpad-tap.py',
	      'tools/libinput-measure-touchpad-pressure.py',
	      'tools/libinput-measure-touch-size.py',
)

498
config_noop = configuration_data()
499
500
501
502
503
504
# Set a dummy replacement to silence meson warnings:
# meson.build:487: WARNING: Got an empty configuration_data() object and
# 		   found no substitutions in the input file 'foo'. If you
# 		   want to copy a file to the build dir, use the 'copy:'
# 		   keyword argument added in 0.47.0
config_noop.set('dummy', 'dummy')
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
foreach t : src_python_tools
	configure_file(input: t,
		       output: '@BASENAME@',
		       configuration : config_noop,
		       install : true,
		       install_dir : libinput_tool_path
		      )
endforeach

src_man = files(
	      'tools/libinput-measure-fuzz.man',
	      'tools/libinput-measure-touchpad-tap.man',
	      'tools/libinput-measure-touchpad-pressure.man',
	      'tools/libinput-measure-touch-size.man',
)
520

521
522
523
524
525
526
527
foreach m : src_man
	configure_file(input : m,
		       output : '@BASENAME@.1',
		       configuration : man_config,
		       install : true,
		       install_dir : dir_man1)
endforeach
528

529
libinput_record_sources = [ 'tools/libinput-record.c', git_version_h ]
530
531
executable('libinput-record',
	   libinput_record_sources,
532
	   dependencies : deps_tools + [dep_udev],
533
534
535
536
537
538
539
540
	   include_directories : [includes_src, includes_include],
	   install_dir : libinput_tool_path,
	   install : true,
	   )
configure_file(input : 'tools/libinput-record.man',
	       output : 'libinput-record.1',
	       configuration : man_config,
	       install : true,
541
	       install_dir : dir_man1,
542
543
	       )

544
545
546
547
548
549
install_data('tools/libinput-replay',
	     install_dir : libinput_tool_path)
configure_file(input : 'tools/libinput-replay.man',
	       output : 'libinput-replay.1',
	       configuration : man_config,
	       install : true,
550
	       install_dir : dir_man1,
551
552
	       )

553
if get_option('debug-gui')
Peter Hutterer's avatar
Peter Hutterer committed
554
	dep_gtk = dependency('gtk+-3.0', version : '>= 3.20')
Peter Hutterer's avatar
Peter Hutterer committed
555
556
557
	dep_cairo = dependency('cairo')
	dep_glib = dependency('glib-2.0')

558
	debug_gui_sources = [ 'tools/libinput-debug-gui.c' ]
559
	deps_debug_gui = [
Peter Hutterer's avatar
Peter Hutterer committed
560
561
562
			dep_gtk,
			dep_cairo,
			dep_glib,
563
			] + deps_tools
564
565
566
	executable('libinput-debug-gui',
		   debug_gui_sources,
		   dependencies : deps_debug_gui,
567
		   include_directories : [includes_src, includes_include],
568
		   install_dir : libinput_tool_path,
569
		   install : true
Peter Hutterer's avatar
Peter Hutterer committed
570
		   )
571
572
573
574
	configure_file(input : 'tools/libinput-debug-gui.man',
		       output : 'libinput-debug-gui.1',
		       configuration : man_config,
		       install : true,
575
		       install_dir : dir_man1,
576
		       )
Peter Hutterer's avatar
Peter Hutterer committed
577
578
endif

579
580
libinput_sources = [ 'tools/libinput-tool.c' ]

581
582
583
584
585
586
libinput_tool = executable('libinput',
			   libinput_sources,
			   dependencies : deps_tools,
			   include_directories : [includes_src, includes_include],
			   install : true
			  )
587
588
589
590
configure_file(input : 'tools/libinput.man',
	       output : 'libinput.1',
	       configuration : man_config,
	       install : true,
591
	       install_dir : dir_man1,
592
	       )
593
594
595
596
597

ptraccel_debug_sources = [ 'tools/ptraccel-debug.c' ]
executable('ptraccel-debug',
	   ptraccel_debug_sources,
	   dependencies : [ dep_libfilter, dep_libinput ],
598
	   include_directories : [includes_src, includes_include],
599
600
601
	   install : false
	   )

602
603
604
605
606
# Don't run the test during a release build because we rely on the magic
# subtool lookup
if get_option('buildtype') == 'debug' or get_option('buildtype') == 'debugoptimized'
	test('tool-option-parsing',
	     find_program('tools/test-tool-option-parsing.py'),
607
608
	     args : [libinput_tool.full_path()],
	     timeout : 120)
609
610
endif

611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
# 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',
				  'tools/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'])
test('tools-builddir-lookup-installed',
     find_program('tools/helper-copy-and-exec-from-tmp.sh'),
     args : [test_builddir_lookup.full_path(), '--builddir-is-null'],
     env : ['LD_LIBRARY_PATH=@0@'.format(meson.build_root())],
     workdir : '/tmp')

Peter Hutterer's avatar
Peter Hutterer committed
628
629
############ tests ############

630
test('symbols-leak-test',
631
632
     find_program('test/symbols-leak-test'),
     args : [ join_paths(dir_src, 'libinput.sym'), dir_src])
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653

# 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=gnu90', '-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)
654
655
656
657
658
659
660
661
# test including from C++ (in case CPP compiler is available)
if add_languages('cpp', required: false)
	executable('test-build-cxx',
		   'test/build-cxx.cc',
		   dependencies : [dep_udev],
		   include_directories : [includes_src, includes_include],
		   install : false)
endif
662
663
664

# This is the test suite runner, we allow disabling that one because of
# dependencies
665
if get_option('tests')
Peter Hutterer's avatar
Peter Hutterer committed
666
667
668
	dep_check = dependency('check', version : '>= 0.9.10')
	valgrind = find_program('valgrind')

669
670
671
	leftover_rules = find_program('test/check-leftover-udev-rules.sh')
	test('leftover-rules', leftover_rules, is_parallel : false)

672
673
	gstack = find_program('gstack', required : false)
	config_h.set10('HAVE_GSTACK', gstack.found())
Peter Hutterer's avatar
Peter Hutterer committed
674

675
	# for inhibit support during test run
676
	dep_libsystemd = dependency('libsystemd', version : '>= 221', required : false)
677
678
	config_h.set10('HAVE_LIBSYSTEMD', dep_libsystemd.found())

679
	litest_sources = [
Peter Hutterer's avatar
Peter Hutterer committed
680
681
682
683
		'test/litest.h',
		'test/litest-int.h',
		'test/litest-device-acer-hawaii-keyboard.c',
		'test/litest-device-acer-hawaii-touchpad.c',
684
		'test/litest-device-aiptek-tablet.c',
Peter Hutterer's avatar
Peter Hutterer committed
685
686
687
688
689
690
691
692
693
694
695
696
697
		'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-elantech-touchpad.c',
		'test/litest-device-generic-singletouch.c',
698
		'test/litest-device-gpio-keys.c',
Peter Hutterer's avatar
Peter Hutterer committed
699
		'test/litest-device-huion-pentablet.c',
700
		'test/litest-device-hp-wmi-hotkeys.c',
701
		'test/litest-device-ignored-mouse.c',
Peter Hutterer's avatar
Peter Hutterer committed
702
703
704
		'test/litest-device-keyboard.c',
		'test/litest-device-keyboard-all-codes.c',
		'test/litest-device-keyboard-razer-blackwidow.c',
705
706
		'test/litest-device-keyboard-razer-blade-stealth.c',
		'test/litest-device-keyboard-razer-blade-stealth-videoswitch.c',
Peter Hutterer's avatar
Peter Hutterer committed
707
708
709
710
711
712
713
714
715
716
717
		'test/litest-device-lid-switch.c',
		'test/litest-device-lid-switch-surface3.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-roccat.c',
		'test/litest-device-mouse-low-dpi.c',
		'test/litest-device-mouse-wheel-click-angle.c',
		'test/litest-device-mouse-wheel-click-count.c',
718
		'test/litest-device-ms-nano-transceiver-mouse.c',
Peter Hutterer's avatar
Peter Hutterer committed
719
720
721
		'test/litest-device-ms-surface-cover.c',
		'test/litest-device-protocol-a-touch-screen.c',
		'test/litest-device-qemu-usb-tablet.c',
722
		'test/litest-device-synaptics-x220.c',
Peter Hutterer's avatar
Peter Hutterer committed
723
724
725
726
727
728
		'test/litest-device-synaptics-hover.c',
		'test/litest-device-synaptics-i2c.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',
729
		'test/litest-device-thinkpad-extrabuttons.c',
Peter Hutterer's avatar
Peter Hutterer committed
730
731
		'test/litest-device-trackpoint.c',
		'test/litest-device-touch-screen.c',
732
		'test/litest-device-touchscreen-invalid-range.c',
Peter Hutterer's avatar
Peter Hutterer committed
733
		'test/litest-device-touchscreen-fuzz.c',
734
		'test/litest-device-touchscreen-mt-tool.c',
735
		'test/litest-device-uclogic-tablet.c',
736
737
738
		'test/litest-device-wacom-bamboo-2fg-finger.c',
		'test/litest-device-wacom-bamboo-2fg-pad.c',
		'test/litest-device-wacom-bamboo-2fg-pen.c',
Peter Hutterer's avatar
Peter Hutterer committed
739
740
741
742
743
744
745
		'test/litest-device-wacom-bamboo-16fg-pen.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',
746
747
748
		'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',
Peter Hutterer's avatar
Peter Hutterer committed
749
750
751
752
753
754
755
756
		'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-e6-pen.c',
		'test/litest-device-wacom-isdv4-e6-finger.c',
757
		'test/litest-device-wacom-mobilestudio-pro-pad.c',
Peter Hutterer's avatar
Peter Hutterer committed
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
		'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.c'
	]

	dep_dl = cc.find_library('dl')
	deps_litest = [
		dep_libinput,
		dep_check,
		dep_udev,
		dep_libevdev,
		dep_dl,
773
774
		dep_lm,
		dep_libsystemd,
775
		dep_libquirks,
Peter Hutterer's avatar
Peter Hutterer committed
776
777
	]

778
779
780
781
782
783
784
785
786
	configure_file(input : 'udev/80-libinput-test-device.rules',
		       output : '80-libinput-test-device.rules',
		       install : false,
		       configuration : udev_rules_config)

	config_h.set_quoted('LIBINPUT_TEST_DEVICE_RULES_FILE',
			    join_paths(meson.build_root(), '80-libinput-test-device.rules'))
	config_h.set_quoted('LIBINPUT_DEVICE_GROUPS_RULES_FILE',
			    join_paths(meson.build_root(), '80-libinput-device-groups.rules'))
787
788
	config_h.set_quoted('LIBINPUT_MODEL_QUIRKS_UDEV_RULES_FILE',
			    join_paths(meson.build_root(), '90-libinput-model-quirks.rules'))
Peter Hutterer's avatar
Peter Hutterer committed
789
790
791
792
793
794

	def_no_main = '-DLITEST_NO_MAIN'
	def_disable_backtrace = '-DLITEST_DISABLE_BACKTRACE_LOGGING'
	defs_litest_selftest = [
		def_no_main,
		def_disable_backtrace
795
	]
796
	test_litest_selftest_sources = [
Peter Hutterer's avatar
Peter Hutterer committed
797
798
799
800
801
802
		'test/litest-selftest.c',
		'test/litest.c',
		'test/litest.h'
	]
	test_litest_selftest = executable('test-litest-selftest',
					  test_litest_selftest_sources,
803
					  include_directories : [includes_src, includes_include],
804
					  dependencies : deps_litest,
Peter Hutterer's avatar
Peter Hutterer committed
805
806
807
808
					  c_args : defs_litest_selftest,
					  install : false)
	test('test-litest-selftest', test_litest_selftest)

809
	libinput_test_runner_sources = litest_sources + [
Peter Hutterer's avatar
Peter Hutterer committed
810
811
		'src/libinput-util.h',
		'src/libinput-util.c',
Peter Hutterer's avatar
Peter Hutterer committed
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
		'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-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',
828
829
		'test/test-switch.c',
		'test/test-quirks.c',
Peter Hutterer's avatar
Peter Hutterer committed
830
831
832
833
	]
	def_LT_VERSION = '-DLIBINPUT_LT_VERSION="@0@:@1@:@2@"'.format(libinput_lt_c, libinput_lt_r, libinput_lt_a)
	libinput_test_runner = executable('libinput-test-suite-runner',
					  libinput_test_runner_sources,
834
					  include_directories : [includes_src, includes_include],
835
					  dependencies : deps_litest,
Peter Hutterer's avatar
Peter Hutterer committed
836
837
838
839
					  c_args : [ def_LT_VERSION ],
					  install : false)
	test('libinput-test-suite-runner',
	     libinput_test_runner,
840
	     timeout : 1200)
Peter Hutterer's avatar
Peter Hutterer committed
841

842
843
844
	test('libinput-test-deviceless',
	     libinput_test_runner,
	     args: ['--filter-deviceless'])
845

846
847
848
	valgrind_env = environment()
	valgrind_env.set('CK_FORK', 'no')
	valgrind_env.set('USING_VALGRIND', '1')
849
	valgrind_suppressions_file = join_paths(dir_src_test, 'valgrind.suppressions')
850
851
852
	add_test_setup('valgrind',
			exe_wrapper : [ valgrind,
					'--leak-check=full',
853
					'--gen-suppressions=all',
854
855
856
857
					'--error-exitcode=3',
					'--suppressions=' + valgrind_suppressions_file ],
			env :  valgrind_env,
			timeout_multiplier : 100)
Peter Hutterer's avatar
Peter Hutterer committed
858
859
endif
############ output files ############
860
configure_file(output : 'config.h', install : false, configuration : config_h)