X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=meson.build;h=6e433f480e5e29c23dcc4b6bd37a40f9cb846ab5;hb=d9a22f29c03dcf3c4df2b12b57f62818464a2f22;hp=7b584c535282b3d95936155ed36c40d6f028a23f;hpb=ed57fb8b869ba1edd226b55953ace0719fe8e1c1;p=platform%2Fupstream%2Flibxkbcommon.git diff --git a/meson.build b/meson.build index 7b584c5..6e433f4 100644 --- a/meson.build +++ b/meson.build @@ -1,7 +1,7 @@ project( 'libxkbcommon', 'c', - version: '0.10.0', + version: '1.0.1', default_options: [ 'c_std=c99', 'warning_level=2', @@ -12,15 +12,12 @@ project( 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')) +dir_libexec = get_option('prefix')/get_option('libexecdir')/'xkbcommon' # Compiler flags. -foreach cflag: [ - '-fvisibility=hidden', +cflags = [ '-fno-strict-aliasing', '-fsanitize-undefined-trap-on-error', - '-Wextra', '-Wno-unused-parameter', '-Wno-missing-field-initializers', '-Wpointer-arith', @@ -36,10 +33,7 @@ foreach cflag: [ '-Wwrite-strings', '-Wno-documentation-deprecated-sync', ] - if cc.has_argument(cflag) - add_project_arguments(cflag, language: 'c') - endif -endforeach +add_project_arguments(cc.get_supported_arguments(cflags), language: 'c') # The XKB config root. @@ -49,15 +43,19 @@ if XKBCONFIGROOT == '' if xkeyboard_config_dep.found() XKBCONFIGROOT = xkeyboard_config_dep.get_pkgconfig_variable('xkb_base') else - XKBCONFIGROOT = join_paths(get_option('prefix'), get_option('datadir'), 'X11', 'xkb') + XKBCONFIGROOT = get_option('prefix')/get_option('datadir')/'X11'/'xkb' endif endif +XKBCONFIGEXTRAPATH = get_option('xkb-config-extra-path') +if XKBCONFIGEXTRAPATH == '' + XKBCONFIGEXTRAPATH = join_paths(get_option('prefix'), get_option('sysconfdir'), 'xkb') +endif # The X locale directory for compose. XLOCALEDIR = get_option('x-locale-root') if XLOCALEDIR == '' - XLOCALEDIR = join_paths(get_option('prefix'), get_option('datadir'), 'X11', 'locale') + XLOCALEDIR = get_option('prefix')/get_option('datadir')/'X11'/'locale' endif @@ -76,6 +74,7 @@ endif configh_data.set(system_extensions, 1) system_ext_define = '#define ' + system_extensions configh_data.set_quoted('DFLT_XKB_CONFIG_ROOT', XKBCONFIGROOT) +configh_data.set_quoted('DFLT_XKB_CONFIG_EXTRA_PATH', XKBCONFIGEXTRAPATH) configh_data.set_quoted('XLOCALEDIR', XLOCALEDIR) configh_data.set_quoted('DEFAULT_XKB_RULES', get_option('default-rules')) configh_data.set_quoted('DEFAULT_XKB_MODEL', get_option('default-model')) @@ -90,6 +89,9 @@ if get_option('default-options') != '' else configh_data.set('DEFAULT_XKB_OPTIONS', 'NULL') endif +if cc.has_header('unistd.h') + configh_data.set('HAVE_UNISTD_H', 1) +endif if cc.links('int main(){if(__builtin_expect(1<0,0)){}}', name: '__builtin_expect') configh_data.set('HAVE___BUILTIN_EXPECT', 1) endif @@ -123,11 +125,15 @@ 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 = cc.has_header_symbol('getopt.h', 'getopt') have_getopt_long = cc.has_header_symbol('getopt.h', 'getopt_long', prefix: '#define _GNU_SOURCE') -if have_getopt_long - configh_data.set10('HAVE_GETOPT_LONG', true) +if not cc.has_header_symbol('limits.h', 'PATH_MAX', prefix: system_ext_define) + if host_machine.system() == 'windows' + # see https://docs.microsoft.com/en-us/windows/win32/fileio/naming-a-file#maximum-path-length-limitation + configh_data.set('PATH_MAX', 260) + else + configh_data.set('PATH_MAX', 4096) + endif endif # Silence some security & deprecation warnings on MSVC @@ -142,7 +148,7 @@ configh_data.set('WIN32_LEAN_AND_MEAN', 1) # Supports -Wl,--version-script? have_version_script = cc.links( 'int main(){}', - args: '-Wl,--version-script=' + join_paths(meson.source_root(), 'xkbcommon.map'), + args: '-Wl,--version-script=' + meson.source_root()/'xkbcommon.map', name: '-Wl,--version-script', ) @@ -155,7 +161,7 @@ if bison.found() yacc_gen = generator( bison, output: ['@BASENAME@.c', '@BASENAME@.h'], - arguments: ['@INPUT@', '--defines=@OUTPUT1@', '--output=@OUTPUT0@', '-p _xkbcommon_'], + arguments: ['--defines=@OUTPUT1@', '-o', '@OUTPUT0@', '-p', '_xkbcommon_', '@INPUT@'], ) else byacc = find_program('byacc', required: false) @@ -163,7 +169,7 @@ else yacc_gen = generator( byacc, output: ['@BASENAME@.c', '@BASENAME@.h'], - arguments: ['@INPUT@', '-H', '@OUTPUT1@', '-o', '@OUTPUT0@', '-p _xkbcommon_'], + arguments: ['-H', '@OUTPUT1@', '-o', '@OUTPUT0@', '-p', '_xkbcommon_', '@INPUT@'], ) else error('Could not find a compatible YACC program (bison or byacc)') @@ -226,7 +232,7 @@ libxkbcommon_sources = [ ] libxkbcommon_link_args = [] if have_version_script - libxkbcommon_link_args += '-Wl,--version-script=' + join_paths(meson.source_root(), 'xkbcommon.map') + libxkbcommon_link_args += '-Wl,--version-script=' + meson.source_root()/'xkbcommon.map' endif libxkbcommon = library( 'xkbcommon', @@ -234,6 +240,7 @@ libxkbcommon = library( libxkbcommon_sources, link_args: libxkbcommon_link_args, link_depends: 'xkbcommon.map', + gnu_symbol_visibility: 'hidden', version: '0.0.0', install: true, include_directories: include_directories('src'), @@ -246,6 +253,9 @@ install_headers( 'xkbcommon/xkbcommon-names.h', subdir: 'xkbcommon', ) +libxkbcommon_dep = declare_dependency( + link_with: libxkbcommon, +) pkgconfig.generate( libxkbcommon, name: 'xkbcommon', @@ -278,7 +288,7 @@ You can disable X11 support with -Denable-x11=false.''') ] libxkbcommon_x11_link_args = [] if have_version_script - libxkbcommon_x11_link_args += '-Wl,--version-script=' + join_paths(meson.source_root(), 'xkbcommon-x11.map') + libxkbcommon_x11_link_args += '-Wl,--version-script=' + meson.source_root()/'xkbcommon-x11.map' endif libxkbcommon_x11 = library( 'xkbcommon-x11', @@ -286,6 +296,7 @@ You can disable X11 support with -Denable-x11=false.''') libxkbcommon_x11_sources, link_args: libxkbcommon_x11_link_args, link_depends: 'xkbcommon-x11.map', + gnu_symbol_visibility: 'hidden', version: '0.0.0', install: true, include_directories: include_directories('src'), @@ -299,6 +310,9 @@ You can disable X11 support with -Denable-x11=false.''') 'xkbcommon/xkbcommon-x11.h', subdir: 'xkbcommon', ) + libxkbcommon_x11_dep = declare_dependency( + link_with: libxkbcommon_x11, + ) pkgconfig.generate( libxkbcommon_x11, name: 'xkbcommon-x11', @@ -323,7 +337,7 @@ if get_option('enable-xkbregistry') ] libxkbregistry_link_args = [] if have_version_script - libxkbregistry_link_args += '-Wl,--version-script=' + join_paths(meson.source_root(), 'xkbregistry.map') + libxkbregistry_link_args += '-Wl,--version-script=' + meson.source_root()/'xkbregistry.map' endif libxkbregistry = library( 'xkbregistry', @@ -331,6 +345,7 @@ if get_option('enable-xkbregistry') libxkbregistry_sources, link_args: libxkbregistry_link_args, link_depends: 'xkbregistry.map', + gnu_symbol_visibility: 'hidden', dependencies: deps_libxkbregistry, version: '0.0.0', install: true, @@ -354,15 +369,143 @@ if get_option('enable-xkbregistry') ) endif +man_pages = [] + +# Tools +build_tools = have_getopt_long +if build_tools + libxkbcommon_tools_internal = static_library( + 'tools-internal', + 'tools/tools-common.h', + 'tools/tools-common.c', + dependencies: libxkbcommon_dep, + ) + tools_dep = declare_dependency( + include_directories: [include_directories('tools')], + link_with: libxkbcommon_tools_internal, + ) + + executable('xkbcli', 'tools/xkbcli.c', + dependencies: tools_dep, install: true) + install_man('tools/xkbcli.1') + + 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')], + install: false) + 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) + install_man('tools/xkbcli-how-to-type.1') + 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) + install_man('tools/xkbcli-interactive-evdev.1') + endif + 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 + 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_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 = 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 + + 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 +endif + + +# xkeyboard-config "verifier" +xkct_config = configuration_data() +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) + # Tests test_env = environment() test_env.set('XKB_LOG_LEVEL', 'debug') test_env.set('XKB_LOG_VERBOSITY', '10') test_env.set('top_srcdir', meson.source_root()) test_env.set('top_builddir', meson.build_root()) +test_env.set('HAVE_XKBCLI_INTERACTIVE_EVDEV', configh_data.get('HAVE_XKBCLI_INTERACTIVE_EVDEV', 0).to_string()) +test_env.set('HAVE_XKBCLI_INTERACTIVE_WAYLAND', configh_data.get('HAVE_XKBCLI_INTERACTIVE_WAYLAND', 0).to_string()) +test_env.set('HAVE_XKBCLI_INTERACTIVE_X11', configh_data.get('HAVE_XKBCLI_INTERACTIVE_X11', 0).to_string()) +test_env.set('HAVE_XKBCLI_LIST', configh_data.get('HAVE_XKBCLI_LIST', 0).to_string()) test_configh_data = configuration_data() -test_configh_data.set_quoted('TEST_XKB_CONFIG_ROOT', join_paths(meson.source_root(), 'test', 'data')) +test_configh_data.set_quoted('TEST_XKB_CONFIG_ROOT', meson.source_root()/'test'/'data') configure_file(output: 'test-config.h', configuration: test_configh_data) # Some tests need to use unexported symbols, so we link them against @@ -507,6 +650,12 @@ if get_option('enable-xkbregistry') env: test_env, ) endif +if build_tools + test('tool-option-parsing', + find_program('test/tool-option-parsing.py'), + env: test_env, + suite: ['python-tests']) +endif valgrind = find_program('valgrind', required: false) if valgrind.found() @@ -526,110 +675,6 @@ endif executable('fuzz-keymap', 'fuzz/keymap/target.c', dependencies: test_dep) executable('fuzz-compose', 'fuzz/compose/target.c', dependencies: test_dep) -man_pages = [] - -# Tools -build_tools = have_getopt -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'), - ) - tools_dep = declare_dependency( - include_directories: [include_directories('src'), include_directories('tools')], - link_with: libxkbcommon_tools_internal, - ) - - executable('xkbcli', 'tools/xkbcli.c', - dependencies: tools_dep, install: true) - man_pages += 'tools/xkbcli.1.ronn' - - if have_getopt_long - executable('xkbcommon-rmlvo-to-keymap', 'tools/rmlvo-to-keymap.c', dependencies: tools_dep) - executable('xkbcommon-how-to-type', 'tools/how-to-type.c', dependencies: tools_dep) - endif - if cc.has_header('linux/input.h') - executable('xkbcommon-interactive-evdev', 'tools/interactive-evdev.c', dependencies: tools_dep) - 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('xkbcommon-interactive-x11', 'tools/interactive-x11.c', dependencies: x11_tools_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@'], - ) - 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('xkbcommon-interactive-wayland', - 'tools/interactive-wayland.c', - xdg_shell_sources, - dependencies: [tools_dep, wayland_client_dep]) - endif - - if have_getopt_long and get_option('enable-xkbregistry') - executable('xkbcommon-registry-list', - 'tools/registry-list.c', - dependencies: dep_libxkbregistry, - install: false) - endif -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" -xkct_config = configuration_data() -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) - # Benchmarks. libxkbcommon_bench_internal = static_library( @@ -699,12 +744,12 @@ You can disable the documentation with -Denable-docs=false.''') configuration: doxygen_data, ) # TODO: Meson should provide this. - docdir = join_paths(get_option('datadir'), 'doc', meson.project_name()) + docdir = get_option('datadir')/'doc'/meson.project_name() custom_target( 'doc', input: [doxyfile] + doxygen_input, output: 'html', - command: [doxygen_wrapper, doxygen.path(), join_paths(meson.build_root(), 'Doxyfile'), meson.source_root()], + command: [doxygen_wrapper, doxygen.path(), meson.build_root()/'Doxyfile', meson.source_root()], install: true, install_dir: docdir, build_by_default: true,