X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=meson.build;h=f6e9a490248a085c5a8a69a598275dc3bf96a4b8;hb=d480f053d2ffa9202b8632efa4817bce9c97f1e9;hp=6f48c653a65d417daa41ce880ba8d7410d4e6484;hpb=1b23a650abf09a8bbebc566900d0e22a58a826d3;p=platform%2Fupstream%2Flibxkbcommon.git diff --git a/meson.build b/meson.build index 6f48c65..f6e9a49 100644 --- a/meson.build +++ b/meson.build @@ -7,11 +7,13 @@ project( 'warning_level=2', 'b_lundef=true', ], - meson_version : '>= 0.41.0', + meson_version : '>= 0.49.0', ) pkgconfig = import('pkgconfig') cc = meson.get_compiler('c') +dir_libexec = join_paths(get_option('prefix'), get_option('libexecdir'), 'xkbcommon') +dir_man = join_paths(get_option('prefix'), get_option('mandir')) # Compiler flags. foreach cflag: [ @@ -61,6 +63,9 @@ endif # config.h. configh_data = configuration_data() +configh_data.set('EXIT_INVALID_USAGE', '2') +configh_data.set_quoted('LIBXKBCOMMON_VERSION', meson.project_version()) +configh_data.set_quoted('LIBXKBCOMMON_TOOL_PATH', dir_libexec) # Like AC_USE_SYSTEM_EXTENSIONS, what #define to use to get extensions # beyond the base POSIX function set. if host_machine.system() == 'sunos' @@ -77,9 +82,13 @@ configh_data.set_quoted('DEFAULT_XKB_MODEL', get_option('default-model')) configh_data.set_quoted('DEFAULT_XKB_LAYOUT', get_option('default-layout')) if get_option('default-variant') != '' configh_data.set_quoted('DEFAULT_XKB_VARIANT', get_option('default-variant')) +else + configh_data.set('DEFAULT_XKB_VARIANT', 'NULL') endif if get_option('default-options') != '' configh_data.set_quoted('DEFAULT_XKB_OPTIONS', get_option('default-options')) +else + configh_data.set('DEFAULT_XKB_OPTIONS', 'NULL') endif if cc.links('int main(){if(__builtin_expect(1<0,0)){}}', name: '__builtin_expect') configh_data.set('HAVE___BUILTIN_EXPECT', 1) @@ -114,6 +123,9 @@ elif cc.has_header_symbol('stdlib.h', '__secure_getenv', prefix: system_ext_defi else message('C library does not support secure_getenv, using getenv instead') endif +have_getopt_long = cc.has_header_symbol('getopt.h', 'getopt_long', + prefix: '#define _GNU_SOURCE') + # Silence some security & deprecation warnings on MSVC # for some unix/C functions we use. # https://docs.microsoft.com/en-us/cpp/error-messages/compiler-warnings/compiler-warning-level-3-c4996?view=vs-2019 @@ -122,8 +134,6 @@ configh_data.set('_CRT_NONSTDC_NO_WARNINGS', 1) configh_data.set('_CRT_NONSTDC_NO_DEPRECATE', 1) # Reduce unnecessary includes on MSVC. configh_data.set('WIN32_LEAN_AND_MEAN', 1) -configure_file(output: 'config.h', configuration: configh_data) - # Supports -Wl,--version-script? have_version_script = cc.links( @@ -233,9 +243,9 @@ install_headers( subdir: 'xkbcommon', ) pkgconfig.generate( + libxkbcommon, name: 'xkbcommon', filebase: 'xkbcommon', - libraries: libxkbcommon, version: meson.project_version(), description: 'XKB API common to servers and clients', ) @@ -262,16 +272,6 @@ You can disable X11 support with -Denable-x11=false.''') 'src/atom.h', 'src/atom.c', ] - libxkbcommon_x11_internal = static_library( - 'xkbcommon-x11-internal', - libxkbcommon_x11_sources, - include_directories: include_directories('src'), - link_with: libxkbcommon, - dependencies: [ - xcb_dep, - xcb_xkb_dep, - ], - ) libxkbcommon_x11_link_args = [] if have_version_script libxkbcommon_x11_link_args += '-Wl,--version-script=' + join_paths(meson.source_root(), 'xkbcommon-x11.map') @@ -296,9 +296,9 @@ You can disable X11 support with -Denable-x11=false.''') subdir: 'xkbcommon', ) pkgconfig.generate( + libxkbcommon_x11, name: 'xkbcommon-x11', filebase: 'xkbcommon-x11', - libraries: libxkbcommon_x11, version: meson.project_version(), description: 'XKB API common to servers and clients - X11 support', requires: ['xkbcommon'], @@ -306,6 +306,51 @@ You can disable X11 support with -Denable-x11=false.''') ) endif +man_pages = [] + +# 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 = [] + if have_version_script + libxkbregistry_link_args += '-Wl,--version-script=' + join_paths(meson.source_root(), 'xkbregistry.map') + endif + libxkbregistry = library( + 'xkbregistry', + 'xkbcommon/xkbregistry.h', + libxkbregistry_sources, + link_args: libxkbregistry_link_args, + link_depends: 'xkbregistry.map', + dependencies: deps_libxkbregistry, + version: '0.0.0', + install: true, + include_directories: include_directories('src'), + ) + install_headers( + '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( + include_directories: include_directories('xkbcommon'), + link_with: libxkbregistry + ) +endif # Tests test_env = environment() @@ -333,6 +378,16 @@ test_dep = declare_dependency( link_with: libxkbcommon_test_internal, ) if get_option('enable-x11') + libxkbcommon_x11_internal = static_library( + 'xkbcommon-x11-internal', + libxkbcommon_x11_sources, + include_directories: include_directories('src'), + link_with: libxkbcommon_test_internal, + dependencies: [ + xcb_dep, + xcb_xkb_dep, + ], + ) x11_test_dep = declare_dependency( link_with: libxkbcommon_x11_internal, dependencies: [ @@ -421,9 +476,15 @@ test( env: test_env, ) test( + 'utils', + executable('test-utils', 'test/utils.c', dependencies: test_dep), + env: test_env, +) +test( 'symbols-leak-test', - find_program('test/symbols-leak-test.bash'), + find_program('test/symbols-leak-test.py'), env: test_env, + suite: ['python-tests'], ) if get_option('enable-x11') test( @@ -435,52 +496,169 @@ if get_option('enable-x11') # See: https://github.com/xkbcommon/libxkbcommon/issues/30 executable('test-x11comp', 'test/x11comp.c', dependencies: x11_test_dep) endif +if get_option('enable-xkbregistry') + test( + 'registry', + executable('test-registry', 'test/registry.c', + include_directories: include_directories('src'), + dependencies: dep_libxkbregistry), + env: test_env, + ) +endif + +valgrind = find_program('valgrind', required: false) +if valgrind.found() + add_test_setup('valgrind', + exe_wrapper: [valgrind, + '--leak-check=full', + '--track-origins=yes', + '--gen-suppressions=all', + '--error-exitcode=99'], + timeout_multiplier : 10) +else + message('valgrind not found, disabling valgrind test setup') +endif # Fuzzing target programs. executable('fuzz-keymap', 'fuzz/keymap/target.c', dependencies: test_dep) executable('fuzz-compose', 'fuzz/compose/target.c', dependencies: test_dep) +man_pages = [] -# Demo programs. -if cc.has_header_symbol('getopt.h', 'getopt_long', prefix: '#define _GNU_SOURCE') - executable('rmlvo-to-kccgst', 'test/rmlvo-to-kccgst.c', dependencies: test_dep) - executable('rmlvo-to-keymap', 'test/rmlvo-to-keymap.c', dependencies: test_dep) - executable('print-compiled-keymap', 'test/print-compiled-keymap.c', dependencies: test_dep) -endif -if cc.has_header('linux/input.h') - executable('interactive-evdev', 'test/interactive-evdev.c', dependencies: test_dep) -endif -if get_option('enable-x11') - executable('interactive-x11', 'test/interactive-x11.c', dependencies: x11_test_dep) -endif -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 demo programs require wayland-client >= 1.2.0, wayland-protocols >= 1.7 which were not found. -You can disable the Wayland demo programs with -Denable-wayland=false.''') - endif - - wayland_scanner = find_program(wayland_scanner_dep.get_pkgconfig_variable('wayland_scanner')) - wayland_scanner_code_gen = generator( - wayland_scanner, - output: '@BASENAME@-protocol.c', - arguments: ['code', '@INPUT@', '@OUTPUT@'], +# Tools +build_tools = have_getopt_long +if build_tools + libxkbcommon_tools_internal = static_library( + 'tools-internal', + 'tools/tools-common.h', + 'tools/tools-common.c', + libxkbcommon_sources, + include_directories: include_directories('src'), ) - wayland_scanner_client_header_gen = generator( - wayland_scanner, - output: '@BASENAME@-client-protocol.h', - arguments: ['client-header', '@INPUT@', '@OUTPUT@'], + tools_dep = declare_dependency( + include_directories: [include_directories('src'), include_directories('tools')], + link_with: libxkbcommon_tools_internal, ) - wayland_protocols_datadir = wayland_protocols_dep.get_pkgconfig_variable('pkgdatadir') - xdg_shell_xml = join_paths(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('interactive-wayland', 'test/interactive-wayland.c', xdg_shell_sources, dependencies: [test_dep, wayland_client_dep]) + + executable('xkbcli', 'tools/xkbcli.c', + dependencies: tools_dep, install: true) + man_pages += 'tools/xkbcli.1.ronn' + + executable('xkbcli-compile-keymap', + 'tools/compile-keymap.c', + dependencies: tools_dep, + install: true, + install_dir: dir_libexec) + man_pages += 'tools/xkbcli-compile-keymap.1.ronn' + configh_data.set10('HAVE_XKBCLI_COMPILE_KEYMAP', true) + executable('xkbcli-how-to-type', + 'tools/how-to-type.c', + dependencies: tools_dep, + install: true, + install_dir: dir_libexec) + man_pages += 'tools/xkbcli-how-to-type.1.ronn' + configh_data.set10('HAVE_XKBCLI_HOW_TO_TYPE', true) + 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) + man_pages += 'tools/xkbcli-interactive-evdev.1.ronn' + endif + if get_option('enable-x11') + x11_tools_dep = declare_dependency( + link_with: libxkbcommon_x11_internal, + 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) + man_pages += 'tools/xkbcli-interactive-x11.1.ronn' + configh_data.set10('HAVE_XKBCLI_INTERACTIVE_X11', true) + endif + 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 demo programs require wayland-client >= 1.2.0, wayland-protocols >= 1.7 which were not found. + You can disable the Wayland demo programs with -Denable-wayland=false.''') + endif + + wayland_scanner = find_program(wayland_scanner_dep.get_pkgconfig_variable('wayland_scanner')) + wayland_scanner_code_gen = generator( + wayland_scanner, + output: '@BASENAME@-protocol.c', + arguments: ['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_pkgconfig_variable('pkgdatadir') + xdg_shell_xml = join_paths(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) + man_pages += 'tools/xkbcli-interactive-wayland.1.ronn' + configh_data.set10('HAVE_XKBCLI_INTERACTIVE_WAYLAND', true) + endif + + 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) + man_pages += 'tools/xkbcli-list.1.ronn' + endif + + # pytest finds files named test_foo_bar.py but not + # test-foo-bar.py, let's rename the source file so it only ever finds the + # built one. + config_tool_option_test = configuration_data() + config_tool_option_test.set('MESON_BUILD_ROOT', meson.current_build_dir()) + tool_option_test = configure_file(input: 'tools/test-tool-option-parsing.py', + output: 'test_tool_option_parsing.py', + configuration : config_tool_option_test) + test('tool-option-parsing', + tool_option_test, + args: [tool_option_test, '-n', 'auto']) +endif + +if get_option('enable-manpages') + prog_ronn = find_program('ronn', required: true) + foreach manpage : man_pages + # man page filenames adhere to directory/topic.section.ronn + topic = manpage.split('/')[-1].split('.')[-3] + section = manpage.split('.')[-2] + output = '@0@.@1@'.format(topic, section) + custom_target(output, + input: manpage, + output: output, + command: [prog_ronn, '--manual=libxkbcommon manual', '--pipe', '--roff', files(manpage)], + capture: true, + install: true, + install_dir: join_paths(dir_man, section)) + endforeach endif # xkeyboard-config "verifier" @@ -489,8 +667,7 @@ xkct_config.set('MESON_BUILD_ROOT', meson.build_root()) xkct_config.set('XKB_CONFIG_ROOT', XKBCONFIGROOT) configure_file(input: 'test/xkeyboard-config-test.py.in', output: 'xkeyboard-config-test', - configuration: xkct_config, - install: false) + configuration: xkct_config) # Benchmarks. @@ -542,10 +719,13 @@ You can disable the documentation with -Denable-docs=false.''') 'doc/doxygen-extra.css', 'doc/quick-guide.md', 'doc/compat.md', + 'doc/user-configuration.md', + 'doc/rules-format.md', 'xkbcommon/xkbcommon.h', 'xkbcommon/xkbcommon-names.h', 'xkbcommon/xkbcommon-x11.h', 'xkbcommon/xkbcommon-compose.h', + 'xkbcommon/xkbregistry.h', ] doxygen_data = configuration_data() doxygen_data.set('PACKAGE_NAME', meson.project_name()) @@ -569,3 +749,5 @@ You can disable the documentation with -Denable-docs=false.''') build_by_default: true, ) endif + +configure_file(output: 'config.h', configuration: configh_data)