diff options
author | Daniel P. Berrangé <berrange@redhat.com> | 2022-04-21 16:48:16 +0100 |
---|---|---|
committer | John Levon <levon@movementarian.org> | 2022-05-09 23:28:10 +0100 |
commit | 5b69b60c197695579fd48abaa81c39b9984f1cab (patch) | |
tree | cd4717b8a875b2810af93d72e21b34248c62e761 | |
parent | 18fb66bcec7b88301f949e586dbd773b8e3ee067 (diff) | |
download | libvfio-user-5b69b60c197695579fd48abaa81c39b9984f1cab.zip libvfio-user-5b69b60c197695579fd48abaa81c39b9984f1cab.tar.gz libvfio-user-5b69b60c197695579fd48abaa81c39b9984f1cab.tar.bz2 |
build: introduce Meson build file rules
The Meson build system used by many other virt projects (QEMU, libvirt
and others) is easier to understand & maintain rules for than cmake,
guiding towards best practice.
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
-rw-r--r-- | docs/meson.build | 9 | ||||
-rw-r--r-- | include/meson.build | 15 | ||||
-rw-r--r-- | include/pci_caps/meson.build | 14 | ||||
-rw-r--r-- | lib/meson.build | 47 | ||||
-rw-r--r-- | meson.build | 67 | ||||
-rw-r--r-- | meson_options.txt | 6 | ||||
-rw-r--r-- | samples/meson.build | 94 | ||||
-rw-r--r-- | test/meson.build | 99 | ||||
-rw-r--r-- | test/py/meson.build | 71 |
9 files changed, 422 insertions, 0 deletions
diff --git a/docs/meson.build b/docs/meson.build new file mode 100644 index 0000000..029e348 --- /dev/null +++ b/docs/meson.build @@ -0,0 +1,9 @@ + +if rstlint.found() + test( + 'rstlint', + rstlint, + suite: 'style', + args: ['vfio-user.rst'], + ) +endif diff --git a/include/meson.build b/include/meson.build new file mode 100644 index 0000000..07e1482 --- /dev/null +++ b/include/meson.build @@ -0,0 +1,15 @@ + +public_include_dir = [include_directories('.')] + +libvfio_user_includes = files( + 'libvfio-user.h', + 'pci_defs.h', + 'vfio-user.h' +) + +install_headers( + libvfio_user_includes, + subdir: 'vfio-user' +) + +subdir('pci_caps') diff --git a/include/pci_caps/meson.build b/include/pci_caps/meson.build new file mode 100644 index 0000000..e21194e --- /dev/null +++ b/include/pci_caps/meson.build @@ -0,0 +1,14 @@ + +libvfio_user_pci_caps_includes = files( + 'common.h', + 'dsn.h', + 'msi.h', + 'msix.h', + 'pm.h', + 'px.h', +) + +install_headers( + libvfio_user_pci_caps_includes, + subdir: 'vfio-user' / 'pci_caps' +) diff --git a/lib/meson.build b/lib/meson.build new file mode 100644 index 0000000..dc9ec4e --- /dev/null +++ b/lib/meson.build @@ -0,0 +1,47 @@ + +lib_include_dir = [include_directories('.')] + +libvfio_user_cflags = [] + +libvfio_user_sources = [ + 'dma.c', + 'irq.c', + 'libvfio-user.c', + 'migration.c', + 'pci.c', + 'pci_caps.c', + 'tran.c', + 'tran_sock.c', +] + +if opt_tran_pipe + libvfio_user_sources += ['tran_pipe.c'] + libvfio_user_cflags += ['-DWITH_TRAN_PIPE'] +endif + +libvfio_user_deps = [ + json_c_dep, +] + +libvfio_user = library( + 'vfio-user', + sources: libvfio_user_sources, + c_args: libvfio_user_cflags + common_cflags, + dependencies: libvfio_user_deps, + include_directories: public_include_dir, + gnu_symbol_visibility: 'hidden', + # We're not providing a stable ABI yet, so + # this remains 0 regardless of API changes + soversion: 0, + version: '0.0.1', + install: true, + install_rpath: rpathdir, +) + +libvfio_user_dep = declare_dependency( + link_with: libvfio_user, + dependencies: libvfio_user_deps, + include_directories: public_include_dir, +) + +libvfio_so_dir = meson.current_build_dir() diff --git a/meson.build b/meson.build new file mode 100644 index 0000000..726d185 --- /dev/null +++ b/meson.build @@ -0,0 +1,67 @@ +project( + 'libvfio-user', + 'c', + version: '0.0.1', + license: 'BSD-3-Clause', + meson_version: '>= 0.53.0', + default_options: [ + 'buildtype=debugoptimized', + 'c_std=gnu99', + 'warning_level=2', + ], +) + +opt_rpath = get_option('rpath') +opt_tran_pipe = get_option('tran-pipe') +opt_debug_logs = get_option('debug-logs') +opt_sanitizers = get_option('b_sanitize') +opt_debug = get_option('debug') + +cc = meson.get_compiler('c') + +prefix = get_option('prefix') +libdir = prefix / get_option('libdir') + +if prefix == '/usr' and not opt_rpath.enabled() + rpathdir = '' +else + rpathdir = libdir +endif + +thread_dep = dependency('threads') +dl_dep = cc.find_library('dl', required: true) + +json_c_version = '0.11' +json_c_dep = dependency('json-c', version: '>=' + json_c_version) + +cmocka_version = '' +cmocka_dep = dependency('cmocka', version: '>=' + cmocka_version) + + +pytest = find_program('pytest-3', required: false) +flake8 = find_program('flake8', required: false) +rstlint = find_program('restructuredtext-lint', required: false) +valgrind = find_program('valgrind', required: false) + +common_cflags = [ + '-D_GNU_SOURCE', +] + +if opt_debug_logs.enabled() or (not opt_debug_logs.disabled() and opt_debug) + common_cflags += ['-DDEBUG'] +endif + +if get_option('warning_level') == '2' + # -Wall is set for 'warning_level>=1' + # -Wextra is set for 'warning_level>=2' + common_cflags += cc.get_supported_arguments([ + '-Wno-missing-field-initializers', + '-Wmissing-declarations', + ]) +endif + +subdir('include') +subdir('lib') +subdir('samples') +subdir('test') +subdir('docs') diff --git a/meson_options.txt b/meson_options.txt new file mode 100644 index 0000000..49e4d9a --- /dev/null +++ b/meson_options.txt @@ -0,0 +1,6 @@ +option('rpath', type: 'feature', value: 'auto', + description: 'whether to include rpath information in installed binaries and libraries') +option('tran-pipe', type: 'boolean', value: false, + description: 'enable pipe transport for testing') +option('debug-logs', type: 'feature', value: 'auto', + description: 'enable extra debugging code (default for debug builds)') diff --git a/samples/meson.build b/samples/meson.build new file mode 100644 index 0000000..d1d435c --- /dev/null +++ b/samples/meson.build @@ -0,0 +1,94 @@ + +client_sources = [ + 'client.c', + '../lib/migration.c', + '../lib/tran.c', + '../lib/tran_sock.c', +] + +client_deps = [ + json_c_dep, + thread_dep, +] + +client = executable( + 'client', + client_sources, + c_args: common_cflags, + dependencies: client_deps, + include_directories: public_include_dir + lib_include_dir, + install: false, +) + + +server_sources = [ + 'server.c', +] + +server_deps = [ + libvfio_user_dep, +] + +server = executable( + 'server', + server_sources, + c_args: common_cflags, + dependencies: server_deps, + include_directories: lib_include_dir, + install: false, +) + + +null_sources = [ + 'null.c', +] + +null_deps = [ + libvfio_user_dep, + thread_dep, +] + +null = executable( + 'null', + null_sources, + c_args: common_cflags, + dependencies: null_deps, + include_directories: lib_include_dir, + install: false, +) + + +gpio_pci_idio_16_sources = [ + 'gpio-pci-idio-16.c', +] + +gpio_pci_idio_16_deps = [ + libvfio_user_dep, +] + +gpio_pci_idio_16 = executable( + 'gpio-pci-idio-16', + gpio_pci_idio_16_sources, + c_args: common_cflags, + dependencies: gpio_pci_idio_16_deps, + include_directories: lib_include_dir, + install: false, +) + + +lspci_sources = [ + 'lspci.c', +] + +lspci_deps = [ + libvfio_user_dep, +] + +lspci = executable( + 'lspci', + lspci_sources, + c_args: common_cflags, + dependencies: lspci_deps, + include_directories: lib_include_dir, + install: false, +) diff --git a/test/meson.build b/test/meson.build new file mode 100644 index 0000000..ba6f7c5 --- /dev/null +++ b/test/meson.build @@ -0,0 +1,99 @@ + +if valgrind.found() + valgrind_common_wrapper = [ + valgrind, + '--quiet', + '--track-origins=yes', + '--error-exitcode=1', + '--exit-on-first-error=yes', + '--leak-check=full', + ] + + valgrind_unit_wrapper = valgrind_common_wrapper + [ + '--suppressions=' + ( meson.current_source_dir() / 'valgrind.supp' ), + '--show-leak-kinds=all', + ] + if meson.version().version_compare('<0.57.0') + add_test_setup('valgrind', + exe_wrapper: valgrind_unit_wrapper) + else + add_test_setup('valgrind', + exclude_suites: ['functional', 'pyunit', 'style'], + exe_wrapper: valgrind_unit_wrapper) + endif +endif + +unit_tests_sources = [ + 'unit-tests.c', + 'mocks.c', + '../lib/dma.c', + '../lib/irq.c', + '../lib/libvfio-user.c', + '../lib/migration.c', + '../lib/pci.c', + '../lib/pci_caps.c', + '../lib/tran.c', + '../lib/tran_pipe.c', + '../lib/tran_sock.c', +] + +unit_tests_deps = [ + json_c_dep, + cmocka_dep, + dl_dep, +] +unit_tests_cflags = [ + '-DUNIT_TEST', + '-DWITH_TRAN_PIPE', +] + +unit_tests = executable( + 'unit_tests', + unit_tests_sources, + c_args: unit_tests_cflags + common_cflags, + dependencies: unit_tests_deps, + include_directories: public_include_dir + lib_include_dir, + install: false, +) + +test( + 'unit_tests', + unit_tests, + suite: 'unit', +) + +test( + 'test-lspci', + find_program('test-lspci.sh'), + suite: 'functional', + args: [lspci], +) + +csenv = [] +if opt_sanitizers != 'none' + csenv += ['WITH_ASAN=1'] +endif + +test( + 'test-client-server', + find_program('test-client-server.sh'), + env: csenv, + suite: 'functional', + args: [client, server], + timeout: 90, +) + +if opt_sanitizers == 'none' + test( + 'test-linkage.sh', + find_program('test-linkage.sh'), + suite: 'functional', + args: [ + meson.source_root(), + meson.build_root(), + ' '.join(cc.cmd_array()), + ] + ) +endif + +subdir('py') diff --git a/test/py/meson.build b/test/py/meson.build new file mode 100644 index 0000000..e8266e7 --- /dev/null +++ b/test/py/meson.build @@ -0,0 +1,71 @@ + +if valgrind.found() + valgrind_pyunit_wrapper = valgrind_common_wrapper + [ + '--suppressions=' + ( meson.current_source_dir() / 'valgrind.supp' ), + '--show-leak-kinds=definite', + '--errors-for-leak-kinds=definite', + ] + valgrind_pyunit_env = ['PYTHONMALLOC=malloc'] + + if meson.version().version_compare('<0.57.0') + add_test_setup('pyvalgrind', + env: valgrind_pyunit_env, + exe_wrapper: valgrind_pyunit_wrapper, + timeout_multiplier: 10) + else + add_test_setup('pyvalgrind', + exclude_suites: ['functional', 'unit', 'style'], + env: valgrind_pyunit_env, + exe_wrapper: valgrind_pyunit_wrapper, + timeout_multiplier: 10) + endif +endif + +python_tests_common = [ + 'libvfio_user.py', +] + +python_tests = [ + 'test_destroy.py', + 'test_device_get_info.py', + 'test_device_get_irq_info.py', + 'test_device_get_region_info.py', + 'test_device_get_region_info_zero_size.py', + 'test_device_get_region_io_fds.py', + 'test_device_set_irqs.py', + 'test_dirty_pages.py', + 'test_dma_map.py', + 'test_dma_unmap.py', + 'test_irq_trigger.py', + 'test_map_unmap_sg.py', + 'test_migration.py', + 'test_negotiate.py', + 'test_pci_caps.py', + 'test_pci_ext_caps.py', + 'test_quiesce.py', + 'test_request_errors.py', + 'test_setup_region.py', + 'test_vfu_create_ctx.py', + 'test_vfu_realize_ctx.py', +] + +python_files = python_tests_common + python_tests + +if pytest.found() and opt_sanitizers == 'none' + foreach testname: python_tests + test(testname, + pytest, + suite: 'pyunit', + env: environment({'LIBVFIO_SO_DIR': libvfio_so_dir}), + args: [files(testname)]) + endforeach +endif + +if flake8.found() + flake8_ignore = 'F405,F403,E128,E131,E127' + test('flake8', + flake8, + suite: 'style', + args: ['--extend-ignore', flake8_ignore, + files(python_files)]) +endif |