Signed-off-by: Peter Hutterer <peter.hutte...@who-t.net> --- meson.build | 596 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ meson_options.txt | 16 ++ 2 files changed, 612 insertions(+) create mode 100644 meson.build create mode 100644 meson_options.txt
diff --git a/meson.build b/meson.build new file mode 100644 index 0000000..a6cbb81 --- /dev/null +++ b/meson.build @@ -0,0 +1,596 @@ +project('libinput', 'c', 'cpp', + version : '1.7.0', + license: 'MIT/Expat', + default_options : [ 'c_std=gnu99' ], + meson_version : '>= 0.38.0') + +libinput_version = meson.project_version().split('.') + +# 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=22 +libinput_lt_r=2 +libinput_lt_a=12 + +# 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 = ['-Wall', '-Wextra', '-Wno-unused-parameter', '-g', '-fvisibility=hidden'] +cflags = cppflags + ['-Wmissing-prototypes', '-Wstrict-prototypes'] +add_global_arguments(cflags, language: 'c') +add_global_arguments(cppflags, language: 'cpp') + +config_h = configuration_data() +config_h.set('_GNU_SOURCE', '1') + +code = ''' +#define _GNU_SOURCE +#include <assert.h> +static_assert(1 == 1, "msg"); +''' +if not cc.compiles(code, + name : 'static_assert check', + args : [ '-Werror' ]) + config_h.set('static_assert(...)', '/* */') +endif + +# Dependencies +pkgconfig = import('pkgconfig') +dep_udev = dependency('libudev') +dep_mtdev = dependency('mtdev', version: '>= 1.1.0') +dep_libevdev = dependency('libevdev', version: '>= 0.4') +dep_lm = cc.find_library('m') +dep_rt = cc.find_library('rt') + +############ libwacom configuration ############ + +if get_option('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, + args : '-lwacom', + name : 'libwacom_get_paired_device check', + dependencies : dep_libwacom) + if result + config_h.set('HAVE_LIBWACOM_GET_PAIRED_DEVICE', '1') + endif +endif + +############ udev bits ############ + +udev_dir = get_option('udev-dir') +if udev_dir == '' + udev_dir = '@0@/lib/udev'.format(get_option('prefix')) +endif +udev_rules_dir = '@0@/rules.d'.format(udev_dir) +udev_hwdb_dir = '@0@/hwdb.d'.format(udev_dir) + +executable('libinput-device-group', + 'udev/libinput-device-group.c', + dependencies : [dep_udev, dep_libwacom], + include_directories : include_directories('src'), + install : true, + install_dir : udev_dir) +executable('libinput-model-quirks', + 'udev/libinput-model-quirks.c', + dependencies : dep_udev, + include_directories : include_directories('src'), + install : true, + install_dir : udev_dir) + +model_quirks = 'udev/90-libinput-model-quirks.hwdb' +install_data(model_quirks, + install_dir : udev_hwdb_dir) + +parse_hwdb_py = find_program('udev/parse_hwdb.py') +test('parse-hwdb', + parse_hwdb_py, + args : ['@0@/@1@'.format(meson.source_root(), model_quirks)]) + +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, + install_dir : udev_rules_dir, + configuration : udev_rules_config) +configure_file(input : 'udev/90-libinput-model-quirks.rules.in', + output : '90-libinput-model-quirks.rules', + install : true, + install_dir : udev_rules_dir, + configuration : udev_rules_config) + +litest_udev_rules_config = configuration_data() +litest_udev_rules_config.set('UDEV_TEST_PATH', meson.build_root()) +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) +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) + +############ libinput-util.a ############ +src_libinput_util = [ + 'src/libinput-util.c', + 'src/libinput-util.h' +] +libinput_util = static_library('libinput-util', + src_libinput_util, + dependencies : dep_udev) +dep_libinput_util = declare_dependency(link_with: libinput_util) + +############ libfilter.a ############ +src_libfilter = [ + 'src/filter.c', + 'src/filter.h', + 'src/filter-private.h' +] +libfilter = static_library('filter', src_libfilter) +dep_libfilter = declare_dependency(link_with: libfilter) + +############ libinput.so ############ +install_headers('src/libinput.h') +src_libinput = [ + 'src/libinput.c', + 'src/libinput.h', + 'src/libinput-private.h', + 'src/evdev.c', + 'src/evdev.h', + 'src/evdev-lid.c', + '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/filter.c', + 'src/filter.h', + 'src/filter-private.h', + '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' +] +deps_libinput = [ + dep_mtdev, + dep_udev, + dep_libevdev, + dep_lm, + dep_rt, + dep_libwacom, + dep_libinput_util +] + +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, + install: false, +) + +mapfile = 'src/libinput.sym' +version_flag = '-Wl,--version-script,@0@/@1@'.format(meson.current_source_dir(), mapfile) +lib_libinput = shared_library('input', + src_libinput, + include_directories : include_directories('.'), + 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( + filebase: 'libinput', + name: 'Libinput', + description: 'Input device library', + version: meson.project_version(), + libraries: lib_libinput +) + +############ documentation ############ + +doxygen = find_program('doxygen', + required : false) +if doxygen.found() + doxygen_version_cmd = run_command(doxygen.path(), '--version') + if doxygen_version_cmd.returncode() != 0 + error('Command "doxygen --version" failed.') + endif + doxygen_version = doxygen_version_cmd.stdout() + if doxygen_version.version_compare('< 1.8.3') + error('doxygen needs to be at least version 1.8.3 (have @0@)'.format(doxygen_version)) + endif + dot = find_program('dot') + grep = find_program('grep') + dot_version_cmd = run_command(dot.path(), '-V') + if dot_version_cmd.returncode() != 0 + error('Command "dot -V" failed.') + endif + # dot -V output is (to stderr): + # dot - graphviz version 2.38.0 (20140413.2041) + dot_version = dot_version_cmd.stderr().split(' ')[4] + if dot_version.version_compare('< 2.26') + error('Graphviz dot needs to be at least version 2.26 (have @0@)'.format(dot_version)) + endif + + src_doxygen = [ + # source files + meson.source_root() + '/src/libinput.h', + # written docs + meson.source_root() + '/doc/absolute-axes.dox', + meson.source_root() + '/doc/absolute-coordinate-ranges.dox', + meson.source_root() + '/doc/building.dox', + meson.source_root() + '/doc/clickpad-softbuttons.dox', + meson.source_root() + '/doc/contributing.dox', + meson.source_root() + '/doc/device-configuration-via-udev.dox', + meson.source_root() + '/doc/faqs.dox', + meson.source_root() + '/doc/gestures.dox', + meson.source_root() + '/doc/middle-button-emulation.dox', + meson.source_root() + '/doc/normalization-of-relative-motion.dox', + meson.source_root() + '/doc/palm-detection.dox', + meson.source_root() + '/doc/page-hierarchy.dox', + meson.source_root() + '/doc/pointer-acceleration.dox', + meson.source_root() + '/doc/reporting-bugs.dox', + meson.source_root() + '/doc/scrolling.dox', + meson.source_root() + '/doc/seats.dox', + meson.source_root() + '/doc/switches.dox', + meson.source_root() + '/doc/t440-support.dox', + meson.source_root() + '/doc/tablet-support.dox', + meson.source_root() + '/doc/tapping.dox', + meson.source_root() + '/doc/test-suite.dox', + meson.source_root() + '/doc/tools.dox', + meson.source_root() + '/doc/touchpad-jumping-cursors.dox', + meson.source_root() + '/doc/touchpads.dox', + meson.source_root() + '/doc/what-is-libinput.dox', + # dot drawings + meson.source_root() + '/doc/dot/seats-sketch.gv', + meson.source_root() + '/doc/dot/seats-sketch-libinput.gv', + meson.source_root() + '/doc/dot/libinput-stack-wayland.gv', + meson.source_root() + '/doc/dot/libinput-stack-xorg.gv', + meson.source_root() + '/doc/dot/libinput-stack-gnome.gv', + meson.source_root() + '/doc/dot/evemu.gv', + # svgs + meson.source_root() + '/doc/svg/button-scrolling.svg', + meson.source_root() + '/doc/svg/clickfinger.svg', + meson.source_root() + '/doc/svg/clickfinger-distance.svg', + meson.source_root() + '/doc/svg/edge-scrolling.svg', + meson.source_root() + '/doc/svg/gesture-2fg-ambiguity.svg', + meson.source_root() + '/doc/svg/palm-detection.svg', + meson.source_root() + '/doc/svg/pinch-gestures.svg', + meson.source_root() + '/doc/svg/pinch-gestures-softbuttons.svg', + meson.source_root() + '/doc/svg/ptraccel-linear.svg', + meson.source_root() + '/doc/svg/ptraccel-low-dpi.svg', + meson.source_root() + '/doc/svg/ptraccel-touchpad.svg', + meson.source_root() + '/doc/svg/ptraccel-trackpoint.svg', + meson.source_root() + '/doc/svg/software-buttons.svg', + meson.source_root() + '/doc/svg/swipe-gestures.svg', + meson.source_root() + '/doc/svg/tablet-axes.svg', + meson.source_root() + '/doc/svg/tablet-cintiq24hd-modes.svg', + meson.source_root() + '/doc/svg/tablet-interfaces.svg', + meson.source_root() + '/doc/svg/tablet-intuos-modes.svg', + meson.source_root() + '/doc/svg/tablet-left-handed.svg', + meson.source_root() + '/doc/svg/tablet-out-of-bounds.svg', + meson.source_root() + '/doc/svg/tablet.svg', + meson.source_root() + '/doc/svg/tap-n-drag.svg', + meson.source_root() + '/doc/svg/thumb-detection.svg', + meson.source_root() + '/doc/svg/top-software-buttons.svg', + meson.source_root() + '/doc/svg/touchscreen-gestures.svg', + meson.source_root() + '/doc/svg/twofinger-scrolling.svg', + # style files + meson.source_root() + '/doc/style/header.html', + meson.source_root() + '/doc/style/footer.html', + meson.source_root() + '/doc/style/customdoxygen.css', + meson.source_root() + '/doc/style/bootstrap.css', + meson.source_root() + '/doc/style/libinputdoxygen.css', + meson.source_root() + '/README.md' + ] + + doc_config = configuration_data() + doc_config.set('PACKAGE_NAME', meson.project_name()) + doc_config.set('PACKAGE_VERSION', meson.project_version()) + doc_config.set('top_srcdir', meson.source_root()) + doc_config.set('INPUT', ' '.join(src_doxygen)) + + doxyfile = configure_file(input : 'doc/libinput.doxygen.in', + output : 'libinput.doxygen', + configuration : doc_config, + install : false) + custom_target('doxygen', + input : doxyfile, + output : [ 'html' ], + command : [ doxygen, doxyfile ], + install : false, + build_by_default : true) + +endif + +############ tools ############ +tools_shared_sources = [ 'tools/shared.c', + 'tools/shared.h' ] +event_debug_sources = [ 'tools/event-debug.c' ] + tools_shared_sources +executable('event-debug', + event_debug_sources, + dependencies : dep_libinput, + include_directories : include_directories('src'), + install : false + ) + +libinput_debug_events_sources = event_debug_sources +executable('libinput-debug-events', + libinput_debug_events_sources, + dependencies : dep_libinput, + include_directories : include_directories('src'), + install : true + ) + +libinput_list_devices_sources = [ 'tools/libinput-list-devices.c' ] + tools_shared_sources +executable('libinput-list-devices', + libinput_list_devices_sources, + dependencies : [ dep_libinput ], + include_directories : include_directories('src'), + install : true + ) + +ptraccel_debug_sources = [ 'tools/ptraccel-debug.c' ] +executable('ptraccel-debug', + ptraccel_debug_sources, + dependencies : [ dep_libfilter, dep_libinput ], + include_directories : include_directories('src'), + install : false + ) + +if get_option('event-gui') + dep_gtk = dependency('gtk+-3.0') + dep_cairo = dependency('cairo') + dep_glib = dependency('glib-2.0') + + event_gui_sources = [ 'tools/event-gui.c' ] + tools_shared_sources + deps_event_gui = [ + dep_gtk, + dep_cairo, + dep_glib, + dep_libevdev, + dep_libinput + ] + executable('event-gui', + event_gui_sources, + dependencies : deps_event_gui, + include_directories : include_directories('src'), + install : false + ) +endif + +install_man('tools/libinput-list-devices.1', + 'tools/libinput-debug-events.1') + + +############ tests ############ + +if get_option('enable-tests') + dep_check = dependency('check', version : '>= 0.9.10') + valgrind = find_program('valgrind') + addr2line = find_program('addr2line') + + if addr2line.found() + config_h.set('HAVE_ADDR2LINE', '1') + config_h.set('ADDR2LINE', '"@0@"'.format(addr2line.path())) + endif + + dep_libunwind = dependency('libunwind', required: false) + if dep_libunwind.found() + config_h.set('HAVE_LIBUNWIND', '1') + endif + + lib_litest_sources = [ + 'test/litest.h', + 'test/litest-int.h', + 'test/litest-device-acer-hawaii-keyboard.c', + 'test/litest-device-acer-hawaii-touchpad.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-elantech-touchpad.c', + 'test/litest-device-generic-singletouch.c', + 'test/litest-device-huion-pentablet.c', + 'test/litest-device-keyboard.c', + 'test/litest-device-keyboard-all-codes.c', + 'test/litest-device-keyboard-razer-blackwidow.c', + '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', + 'test/litest-device-ms-surface-cover.c', + 'test/litest-device-protocol-a-touch-screen.c', + 'test/litest-device-qemu-usb-tablet.c', + 'test/litest-device-synaptics.c', + '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', + 'test/litest-device-trackpoint.c', + 'test/litest-device-touch-screen.c', + 'test/litest-device-touchscreen-fuzz.c', + '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', + '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', + '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_libunwind, + dep_udev, + dep_libevdev, + dep_dl, + dep_lm + ] + def_quirks_rules_file = '-DLIBINPUT_MODEL_QUIRKS_UDEV_RULES_FILE="@0@"'.format(litest_model_quirks_file) + def_quirks_hwdb_file = '-DLIBINPUT_MODEL_QUIRKS_UDEV_HWDB_FILE="@0@/udev/90-libinput-model-quirks.hwdb"'.format(meson.source_root()) + def_test_rules_file = '-DLIBINPUT_TEST_DEVICE_RULES_FILE="@0@/udev/80-libinput-test-device.rules"'.format(meson.source_root()) + defs_litest = [def_quirks_rules_file, + def_quirks_hwdb_file, + def_test_rules_file] + + lib_litest = static_library('litest', + lib_litest_sources, + include_directories : include_directories('src'), + dependencies : deps_litest, + c_args : defs_litest) + dep_litest = declare_dependency(link_with : lib_litest, + dependencies : deps_litest) + + def_no_main = '-DLITEST_NO_MAIN' + def_disable_backtrace = '-DLITEST_DISABLE_BACKTRACE_LOGGING' + defs_litest_selftest = [ + def_no_main, + def_disable_backtrace + ] + defs_litest + test_litest_selftest_sources = [ + 'test/litest-selftest.c', + 'test/litest.c', + 'test/litest-int.h', + 'test/litest.h' + ] + deps_litest_selftest = [dep_litest] + test_litest_selftest = executable('test-litest-selftest', + test_litest_selftest_sources, + include_directories : include_directories('src'), + dependencies : deps_litest_selftest, + c_args : defs_litest_selftest, + install : false) + test('test-litest-selftest', test_litest_selftest) + + test_symbols_leak = find_program('test/symbols-leak-test.in') + test('symbols-leak-test', + test_symbols_leak, + args : [ meson.current_source_dir() ]) + + libinput_test_runner_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-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-lid.c' + ] + 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, + include_directories : include_directories('src'), + dependencies : dep_litest, + c_args : [ def_LT_VERSION ], + install : false) + test('libinput-test-suite-runner', + libinput_test_runner, + timeout : 3600, + env : [ 'LITEST_VERBOSE=1' ]) + + # build-test only + executable('test-build-pedantic', + 'test/build-pedantic.c', + include_directories : include_directories('src'), + c_args : ['-std=c99', '-pedantic', '-Werror'], + install : false) + # build-test only + executable('test-build-std-gnuc90', + 'test/build-pedantic.c', + include_directories : include_directories('src'), + 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 : include_directories('src'), + dependencies : [ dep_libinput, dep_libinput_util ], + install : false) + # test including from C++ + executable('test-build-cxx', + 'test/build-cxx.cc', + include_directories : include_directories('src'), + install : false) + +endif +############ output files ############ +configure_file(output: 'config.h', install: false, configuration: config_h) diff --git a/meson_options.txt b/meson_options.txt new file mode 100644 index 0000000..93a7440 --- /dev/null +++ b/meson_options.txt @@ -0,0 +1,16 @@ +option('udev-dir', + type: 'string', + default: '', + description: 'udev base directory [default=$prefix/lib/udev]') +option('libwacom', + type: 'boolean', + default: true, + description: 'Use libwacom for tablet identification (default=enabled)') +option('event-gui', + type: 'boolean', + default: true, + description: 'Build the GUI event viewer [default=enabled]') +option('enable-tests', + type: 'boolean', + default: true, + description: 'Build the tests [default=yes]') -- 2.9.3 _______________________________________________ wayland-devel mailing list wayland-devel@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/wayland-devel