aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel P. Berrangé <berrange@redhat.com>2022-04-21 16:48:16 +0100
committerJohn Levon <levon@movementarian.org>2022-05-09 23:28:10 +0100
commit5b69b60c197695579fd48abaa81c39b9984f1cab (patch)
treecd4717b8a875b2810af93d72e21b34248c62e761
parent18fb66bcec7b88301f949e586dbd773b8e3ee067 (diff)
downloadlibvfio-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.build9
-rw-r--r--include/meson.build15
-rw-r--r--include/pci_caps/meson.build14
-rw-r--r--lib/meson.build47
-rw-r--r--meson.build67
-rw-r--r--meson_options.txt6
-rw-r--r--samples/meson.build94
-rw-r--r--test/meson.build99
-rw-r--r--test/py/meson.build71
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