+# libxkbregistry
+if get_option('enable-xkbregistry')
+ dep_libxml = dependency('libxml-2.0')
+ deps_libxkbregistry = [dep_libxml]
+ libxkbregistry_sources = [
+ 'src/registry.c',
+ 'src/utils.h',
+ 'src/utils.c',
+ 'src/util-list.h',
+ 'src/util-list.c',
+ ]
+ libxkbregistry_link_args = []
+ libxkbregistry_link_deps = []
+ if have_version_script
+ libxkbregistry_link_args += '-Wl,--version-script=' + meson.current_source_dir()/'xkbregistry.map'
+ libxkbregistry_link_deps += 'xkbregistry.map'
+ elif cc.get_argument_syntax() == 'msvc'
+ libxkbregistry_def = custom_target('xkbregistry.def',
+ command: [map_to_def, '@INPUT@', '@OUTPUT@'],
+ input: 'xkbregistry.map',
+ output: 'xkbregistry.def',
+ )
+ libxkbregistry_link_deps += libxkbregistry_def
+ libxkbregistry_link_args += '/DEF:' + libxkbregistry_def.full_path()
+ endif
+ libxkbregistry = library(
+ 'xkbregistry',
+ 'include/xkbcommon/xkbregistry.h',
+ libxkbregistry_sources,
+ link_args: libxkbregistry_link_args,
+ link_depends: libxkbregistry_link_deps,
+ gnu_symbol_visibility: 'hidden',
+ dependencies: deps_libxkbregistry,
+ version: '0.0.0',
+ install: true,
+ include_directories: include_directories('src', 'include'),
+ )
+ install_headers(
+ 'include/xkbcommon/xkbregistry.h',
+ subdir: 'xkbcommon',
+ )
+ pkgconfig.generate(
+ libxkbregistry,
+ name: 'xkbregistry',
+ filebase: 'xkbregistry',
+ version: meson.project_version(),
+ description: 'XKB API to query available rules, models, layouts, variants and options',
+ )
+
+ dep_libxkbregistry = declare_dependency(
+ link_with: libxkbregistry,
+ include_directories: include_directories('include'),
+ )
+ if meson.version().version_compare('>= 0.54.0')
+ meson.override_dependency('xkbregistry', dep_libxkbregistry)
+ endif
+endif
+
+man_pages = []
+
+# Tools
+build_tools = get_option('enable-tools') and cc.has_header_symbol('getopt.h', 'getopt_long', prefix: '#define _GNU_SOURCE')
+if build_tools
+ # Common resources
+ libxkbcommon_tools_internal_sources = [
+ 'tools/tools-common.h',
+ 'tools/tools-common.c',
+ ]
+ libxkbcommon_tools_internal = static_library(
+ 'tools-internal',
+ libxkbcommon_tools_internal_sources,
+ dependencies: dep_libxkbcommon,
+ )
+ tools_dep = declare_dependency(
+ include_directories: [include_directories('tools', 'include')],
+ link_with: libxkbcommon_tools_internal,
+ dependencies: dep_libxkbcommon,
+ )
+
+ # Tool: xkbcli
+ executable('xkbcli', 'tools/xkbcli.c',
+ dependencies: tools_dep, install: true)
+ install_man('tools/xkbcli.1')
+
+ if get_option('enable-bash-completion')
+ bash_completion_path = get_option('bash-completion-path')
+ if bash_completion_path == ''
+ bash_completion = dependency('bash-completion', required: false)
+ if bash_completion.found()
+ bash_completion_path = bash_completion.get_variable(pkgconfig: 'completionsdir')
+ else
+ bash_completion_path = get_option('datadir') / 'bash-completion/completions'
+ endif
+ endif
+ install_data('tools/xkbcli-bash-completion.sh',
+ rename: 'xkbcli',
+ install_dir: bash_completion_path)
+ endif
+
+ # Tool: compile-keymap
+ xkbcli_compile_keymap = executable('xkbcli-compile-keymap',
+ 'tools/compile-keymap.c',
+ dependencies: tools_dep,
+ install: true,
+ install_dir: dir_libexec)
+ install_man('tools/xkbcli-compile-keymap.1')
+ # The same tool again, but with access to some private APIs.
+ executable('compile-keymap',
+ 'tools/compile-keymap.c',
+ libxkbcommon_sources,
+ dependencies: [tools_dep],
+ c_args: ['-DENABLE_PRIVATE_APIS'],
+ include_directories: [include_directories('src', 'include')],
+ install: false)
+
+ # Tool: compose
+ executable('compose',
+ 'tools/compose.c',
+ dependencies: tools_dep,
+ include_directories: [include_directories('src', 'include')],
+ install: false)
+ configh_data.set10('HAVE_XKBCLI_COMPILE_KEYMAP', true)
+
+ # Tool: how-to-type
+ executable('xkbcli-how-to-type',
+ 'tools/how-to-type.c',
+ dependencies: tools_dep,
+ install: true,
+ install_dir: dir_libexec)
+ install_man('tools/xkbcli-how-to-type.1')
+ configh_data.set10('HAVE_XKBCLI_HOW_TO_TYPE', true)
+
+ # Tool: interactive-evdev
+ if cc.has_header('linux/input.h')
+ executable('xkbcli-interactive-evdev',
+ 'tools/interactive-evdev.c',
+ dependencies: tools_dep,
+ install: true,
+ install_dir: dir_libexec)
+ configh_data.set10('HAVE_XKBCLI_INTERACTIVE_EVDEV', true)
+ install_man('tools/xkbcli-interactive-evdev.1')
+ # The same tool again, but with access to some private APIs.
+ executable('interactive-evdev',
+ 'tools/interactive-evdev.c',
+ libxkbcommon_sources,
+ libxkbcommon_tools_internal_sources,
+ dependencies: [tools_dep],
+ c_args: ['-DENABLE_PRIVATE_APIS'],
+ include_directories: [include_directories('src', 'include')],
+ install: false)
+ endif
+
+ # Tool: interactive-x11
+ if get_option('enable-x11')
+ x11_tools_dep = declare_dependency(
+ link_with: libxkbcommon_x11,
+ dependencies: [
+ tools_dep,
+ xcb_dep,
+ xcb_xkb_dep,
+ ],
+ )
+ executable('xkbcli-interactive-x11',
+ 'tools/interactive-x11.c',
+ dependencies: x11_tools_dep,
+ install: true,
+ install_dir: dir_libexec)
+ install_man('tools/xkbcli-interactive-x11.1')
+ configh_data.set10('HAVE_XKBCLI_INTERACTIVE_X11', true)
+ endif
+
+ # Tool: interactive-wayland
+ if get_option('enable-wayland')
+ wayland_client_dep = dependency('wayland-client', version: '>=1.2.0', required: false)
+ wayland_protocols_dep = dependency('wayland-protocols', version: '>=1.12', required: false)
+ wayland_scanner_dep = dependency('wayland-scanner', required: false, native: true)
+ if not wayland_client_dep.found() or not wayland_protocols_dep.found() or not wayland_scanner_dep.found()
+ error('''The Wayland xkbcli programs require wayland-client >= 1.2.0, wayland-protocols >= 1.7 which were not found.
+You can disable the Wayland xkbcli programs with -Denable-wayland=false.''')
+ endif
+
+ wayland_scanner = find_program(wayland_scanner_dep.get_variable(pkgconfig: 'wayland_scanner'))
+ wayland_scanner_code_gen = generator(
+ wayland_scanner,
+ output: '@BASENAME@-protocol.c',
+ arguments: ['private-code', '@INPUT@', '@OUTPUT@'],
+ )
+ wayland_scanner_client_header_gen = generator(
+ wayland_scanner,
+ output: '@BASENAME@-client-protocol.h',
+ arguments: ['client-header', '@INPUT@', '@OUTPUT@'],
+ )
+ wayland_protocols_datadir = wayland_protocols_dep.get_variable(pkgconfig: 'pkgdatadir')
+ xdg_shell_xml = wayland_protocols_datadir/'stable/xdg-shell/xdg-shell.xml'
+ xdg_shell_sources = [
+ wayland_scanner_code_gen.process(xdg_shell_xml),
+ wayland_scanner_client_header_gen.process(xdg_shell_xml),
+ ]
+ executable('xkbcli-interactive-wayland',
+ 'tools/interactive-wayland.c',
+ xdg_shell_sources,
+ dependencies: [tools_dep, wayland_client_dep],
+ install: true,
+ install_dir: dir_libexec)
+ install_man('tools/xkbcli-interactive-wayland.1')
+ configh_data.set10('HAVE_XKBCLI_INTERACTIVE_WAYLAND', true)
+ endif
+
+ # Tool: list
+ if get_option('enable-xkbregistry')
+ configh_data.set10('HAVE_XKBCLI_LIST', true)
+ executable('xkbcli-list',
+ 'tools/registry-list.c',
+ dependencies: dep_libxkbregistry,
+ install: true,
+ install_dir: dir_libexec)
+ install_man('tools/xkbcli-list.1')
+ endif
+
+ # Tool: check-messages
+ executable('xkb-check-messages',
+ 'tools/check-messages.c',
+ 'tools/messages.c',
+ 'tools/messages.h',
+ 'src/messages-codes.h',
+ dependencies: [tools_dep],
+ include_directories: [include_directories('src', 'include', 'tools')],
+ install: false)
+endif
+
+
+# xkeyboard-config "verifier"
+xkct_config = configuration_data()
+xkct_config.set('MESON_BUILD_ROOT', meson.current_build_dir())
+xkct_config.set('XKB_CONFIG_ROOT', XKBCONFIGROOT)
+configure_file(input: 'test/xkeyboard-config-test.py.in',
+ output: 'xkeyboard-config-test',
+ configuration: xkct_config)