project('libei', 'c', version: '0.1', license: 'MIT/Expat', default_options: [ 'c_std=gnu99', 'warning_level=2' ], meson_version: '>= 0.50.0') pkgconfig = import('pkgconfig') cc = meson.get_compiler('c') cppflags = ['-Wno-unused-parameter', '-fvisibility=hidden'] cflags = cppflags + ['-Wmissing-prototypes', '-Wstrict-prototypes'] add_project_arguments(cflags, language: 'c') add_project_arguments(cppflags, language: 'cpp') config_h = configuration_data() config_h.set('_GNU_SOURCE', '1') subdir('proto') src_libutil = [ 'src/util-io.h', 'src/util-io.c', 'src/util-list.h', 'src/util-list.c', 'src/util-logger.h', 'src/util-logger.c', 'src/util-macros.h', 'src/util-memfile.h', 'src/util-memfile.c', 'src/util-color.h', 'src/util-object.h', 'src/util-sources.h', 'src/util-sources.c', 'src/util-strings.c', 'src/util-strings.h', ] lib_util = static_library('util', src_libutil) dep_libutil = declare_dependency(link_with: lib_util) src_libei = [ 'src/brei-shared.h', 'src/brei-shared.c', 'src/libei.h', 'src/libei.c', 'src/libei-device.c', 'src/libei-log.c', 'src/libei-seat.c', 'src/libei-socket.c', 'src/libei-fd.c', 'src/libei-proto.h', 'src/libei-proto.c', 'src/libei-stubs.c', proto_headers, ] if get_option('portal') dep_systemd = dependency('libsystemd') config_h.set10('ENABLE_LIBEI_PORTAL', 1) src_libei += [ 'src/libei-portal.c', ] else dep_systemd = dependency('', required: false) endif deps_libei = [ dep_libutil, dep_protobuf, dep_systemd, ] lib_libei = shared_library('ei', src_libei, dependencies: deps_libei, install: true ) install_headers('src/libei.h') dep_libei = declare_dependency(link_with: lib_libei, include_directories: 'src') pkgconfig.generate(lib_libei, filebase: 'libei', name: 'libEI', description: 'Emulated Input client library', version: meson.project_version(), libraries: lib_libei, variables: [ 'portal=' + get_option('portal').to_string() ], ) src_libeis = [ 'src/brei-shared.h', 'src/brei-shared.c', 'src/libeis.h', 'src/libeis.c', 'src/libeis-client.c', 'src/libeis-device.c', 'src/libeis-event.c', 'src/libeis-log.c', 'src/libeis-seat.c', 'src/libeis-socket.c', 'src/libeis-fd.c', 'src/libeis-proto.h', 'src/libeis-proto.c', proto_headers, ] lib_libeis = shared_library('eis', src_libeis, dependencies: [dep_libutil, dep_protobuf], install: true ) install_headers('src/libeis.h') dep_libeis = declare_dependency(link_with: lib_libeis, include_directories: 'src') pkgconfig.generate(lib_libeis, filebase: 'libeis', name: 'libEIS', description: 'Emulated Input server library', version: meson.project_version(), libraries: lib_libeis, ) lib_libreis = shared_library('reis', 'src/libreis.h', 'src/libreis.c', proto_headers, dependencies: [dep_libutil, dep_protobuf], install: true, include_directories: 'src', ) install_headers('src/libreis.h') dep_libreis = declare_dependency(link_with: lib_libreis, include_directories: 'src') pkgconfig.generate(lib_libreis, filebase: 'libreis', name: 'libREIS', description: 'Restriction handler for Emulated Input servers', version: meson.project_version(), libraries: lib_libreis, ) dep_libxkbcommon = dependency('xkbcommon', required: false) config_h.set10('HAVE_LIBXKBCOMMON', dep_libxkbcommon.found()) dep_libevdev = dependency('libevdev', required: false) config_h.set10('HAVE_LIBEVDEV', dep_libevdev.found()) src_eis_demo_server = [ 'tools/eis-demo-server.h', 'tools/eis-demo-server.c', ] if dep_libevdev.found() src_eis_demo_server += [ 'tools/eis-demo-server-uinput.c', ] endif executable('eis-demo-server', src_eis_demo_server, dependencies: [ dep_libutil, dep_libeis, dep_libxkbcommon, dep_libevdev ]) executable('ei-demo-client', 'tools/ei-demo-client.c', dependencies: [dep_libutil, dep_libei, dep_libxkbcommon]) if get_option('portal') executable('eis-fake-portal', 'tools/eis-fake-portal.c', include_directories: 'src', dependencies: [dep_libutil, dep_systemd]) endif # tests if get_option('tests') subproject('munit') munit = dependency('munit', fallback: ['munit', 'munit_dep']) lib_unittest = static_library('unittest', 'src/util-munit.h', 'src/util-munit.c', dependencies: munit, ) dep_unittest = declare_dependency( link_with: lib_unittest, dependencies: munit ) test('unit-tests-utils', executable('unit-tests-utils', 'test/unit-tests.c', src_libutil, include_directories: 'src', c_args: ['-D_enable_tests_'], dependencies: [dep_unittest])) test('unit-tests-ei', executable('unit-tests-ei', 'test/unit-tests.c', src_libei, include_directories: 'src', c_args: ['-D_enable_tests_'], dependencies: deps_libei + [dep_unittest])) test('unit-tests-eis', executable('unit-tests-eis', 'test/unit-tests.c', src_libeis, include_directories: 'src', c_args: ['-D_enable_tests_'], dependencies: [dep_unittest, dep_libutil, dep_protobuf])) lib_eierpecken = static_library('eierpecken', 'test/eierpecken.h', 'test/eierpecken.c', include_directories: 'src', dependencies: [munit, dep_libutil, dep_libei, dep_libeis], ) test('libei-integration-test', executable('eitest', 'test/test-main.c', 'test/test-ei.c', 'test/test-eis.c', link_with: lib_eierpecken, dependencies: [dep_unittest, dep_libei, dep_libeis])) valgrind = find_program('valgrind', required : false) if valgrind.found() add_test_setup('valgrind', exe_wrapper : [ valgrind, '--leak-check=full', '--gen-suppressions=all', '--error-exitcode=3' ], timeout_multiplier : 100) else message('valgrind not found, disabling valgrind test suite') endif # build-test only executable('test-build-libei', 'test/buildtest.c', dependencies : [dep_libei], include_directories : 'src', c_args : ['-Werror', '-DINCLUDE_LIBEI=1'], install : false) executable('test-build-libeis', 'test/buildtest.c', dependencies : [dep_libeis], include_directories : 'src', c_args : ['-Werror', '-DINCLUDE_LIBEIS=1'], install : false) executable('test-build-libreis', 'test/buildtest.c', dependencies : [dep_libreis], include_directories : 'src', c_args : ['-Werror', '-DINCLUDE_LIBREIS=1'], install : false) if add_languages('cpp', required: false) executable('test-build-cxx', 'test/buildtest.cc', dependencies: [dep_libei, dep_libeis], include_directories: 'src', install: false) endif endif # tests configure_file(output: 'config.h', configuration: config_h) if get_option('documentation') subdir('doc') endif