Skip to content

Commit

Permalink
add Meson build system
Browse files Browse the repository at this point in the history
Meson is a fast and simple build system. Adoption started mainly in the
desktop space (Gnome, X11, Mesa) to replace autotools, but since then,
some low level projects (systemd, qemu) have switched to it too.

Since liburing is a rather small codebase, the difference in
speed and simplicity are not as huge as with other projects.
Nonetheless, there are still some advantages:

* It comes with some nice features (e.g. out-of-source builds),
  that one would need to implement in shell otherwise.
* Other projects that use Meson could integrate liburing easily
  into their build system by using Meson's subproject() functionality.
* Meson provides some useful editor/IDE integration,
  e.g. by generating compile_commands.json for clangd.
* Distribution packagers are provided with a "standard" build system,
  with well known options/features/behavior, that is actively developed.

Signed-off-by: Peter Eszlari <[email protected]>
  • Loading branch information
eszlari committed Feb 11, 2021
1 parent 7856add commit 6048e9f
Show file tree
Hide file tree
Showing 10 changed files with 394 additions and 0 deletions.
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -123,3 +123,5 @@ config-host.mak
config.log

liburing.pc

/build/
21 changes: 21 additions & 0 deletions examples/meson.build
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
executable('io_uring-cp',
'io_uring-cp.c',
include_directories : inc,
link_with : liburing)

executable('io_uring-test',
'io_uring-test.c',
include_directories : inc,
link_with : liburing)

executable('link-cp',
'link-cp.c',
include_directories : inc,
link_with : liburing)

if has_ucontext
executable('ucontext-cp',
'ucontext-cp.c',
include_directories : inc,
link_with : liburing)
endif
7 changes: 7 additions & 0 deletions man/meson.build
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
install_man('io_uring.7',
'io_uring_enter.2',
'io_uring_get_sqe.3',
'io_uring_queue_exit.3',
'io_uring_queue_init.3',
'io_uring_register.2',
'io_uring_setup.2')
135 changes: 135 additions & 0 deletions meson.build
Original file line number Diff line number Diff line change
@@ -0,0 +1,135 @@
project('liburing', ['c','cpp'],
version : '0.7',
license : ['MIT', 'LGPL-2.1-only', 'GPL-2.0-only WITH Linux-syscall-note'],
meson_version : '>=0.53.0',
default_options : ['default_library=both',
'buildtype=debugoptimized',
'c_std=c11',
'cpp_std=c++11',
'warning_level=3'])

lib_version = '2.0.0'

add_project_arguments('-D_GNU_SOURCE',
'-D__SANE_USERSPACE_TYPES__',
'-include', meson.current_build_dir() + '/config-host.h',
'-Wno-unused-parameter',
'-Wno-sign-compare',
'-fomit-frame-pointer',
language: ['c', 'cpp'])

thread_dep = dependency('threads')

cc = meson.get_compiler('c')

code = '''#include <linux/fs.h>
int main(int argc, char **argv)
{
__kernel_rwf_t x;
x = 0;
return x;
}
'''
has__kernel_rwf_t = cc.compiles(code, name : '__kernel_rwf_t')

code = '''#include <linux/time.h>
#include <linux/time_types.h>
int main(int argc, char **argv)
{
struct __kernel_timespec ts;
ts.tv_sec = 0;
ts.tv_nsec = 1;
return 0;
}
'''
has__kernel_timespec = cc.compiles(code, name : '__kernel_timespec')

code = '''#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
int main(int argc, char **argv)
{
struct open_how how;
how.flags = 0;
how.mode = 0;
how.resolve = 0;
return 0;
}
'''
has_open_how = cc.compiles(code, name : 'open_how')

code = '''#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
#include <linux/stat.h>
int main(int argc, char **argv)
{
struct statx x;
return memset(&x, 0, sizeof(x)) != NULL;
}
'''
has_statx = cc.compiles(code, name : 'statx')

cpp = meson.get_compiler('cpp')

code = '''#include <iostream>
int main(int argc, char **argv)
{
std::cout << "Test";
return 0;
}
'''
has_cxx = cpp.compiles(code, name : 'C++')

code = '''#include <ucontext.h>
int main(int argc, char **argv)
{
ucontext_t ctx;
getcontext(&ctx);
return 0;
}
'''
has_ucontext = cc.compiles(code, name : 'ucontext')

conf_data = configuration_data()
conf_data.set('CONFIG_HAVE_KERNEL_RWF_T', has__kernel_rwf_t)
conf_data.set('CONFIG_HAVE_KERNEL_TIMESPEC', has__kernel_timespec)
conf_data.set('CONFIG_HAVE_OPEN_HOW', has_open_how)
conf_data.set('CONFIG_HAVE_STATX', has_statx)
conf_data.set('CONFIG_HAVE_CXX', has_cxx)
conf_data.set('CONFIG_HAVE_UCONTEXT', has_ucontext)
configure_file(output : 'config-host.h',
configuration : conf_data)

subdir('src')
subdir('man')

if get_option('examples')
subdir('examples')
endif

if get_option('tests')
if get_option('default_library') != 'both'
error('default_library=both required to build tests')
endif
subdir('test')
endif

pkg_mod = import('pkgconfig')
pkg_mod.generate(libraries : liburing,
name : 'liburing',
version : meson.project_version(),
description : 'io_uring library',
url : 'http://git.kernel.dk/cgit/liburing/')

summary({'bindir' : get_option('bindir'),
'libdir' : get_option('libdir'),
'datadir' : get_option('datadir'),
}, section : 'Directories')
summary({'examples': get_option('examples'),
'tests' : get_option('tests')
}, section : 'Configuration', bool_yn : true)
9 changes: 9 additions & 0 deletions meson_options.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
option('examples',
type : 'boolean',
value : false,
description : 'Build example programs')

option('tests',
type : 'boolean',
value : false,
description : 'Build test programs')
7 changes: 7 additions & 0 deletions src/include/liburing/compat.h.in
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
/* SPDX-License-Identifier: MIT */
#ifndef LIBURING_COMPAT_H
#define LIBURING_COMPAT_H
@__kernel_rwf_t_compat@
@__kernel_timespec_compat@
@open_how_compat@
#endif
46 changes: 46 additions & 0 deletions src/include/liburing/meson.build
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
if has__kernel_rwf_t
__kernel_rwf_t_compat = ''
else
__kernel_rwf_t_compat = '''typedef int __kernel_rwf_t;
'''
endif

if has__kernel_timespec
__kernel_timespec_compat = '''#include <linux/time_types.h>
'''
else
__kernel_timespec_compat = '''#include <stdint.h>
struct __kernel_timespec {
int64_t tv_sec;
long long tv_nsec;
};
'''
endif

if has_open_how
open_how_compat = ''
else
open_how_compat = '''#include <inttypes.h>
struct open_how {
uint64_t flags;
uint64_t mode;
uint64_t resolve;
};
'''
endif

conf_data = configuration_data()
conf_data.set('__kernel_rwf_t_compat', __kernel_rwf_t_compat)
conf_data.set('__kernel_timespec_compat', __kernel_timespec_compat)
conf_data.set('open_how_compat', open_how_compat)
configure_file(input : 'compat.h.in',
output : 'compat.h',
configuration : conf_data,
install : true,
install_dir : get_option('includedir') / 'liburing')

install_headers('barrier.h',
'io_uring.h',
subdir : 'liburing')
3 changes: 3 additions & 0 deletions src/include/meson.build
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
install_headers('liburing.h')

subdir('liburing')
17 changes: 17 additions & 0 deletions src/meson.build
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
subdir('include')

inc = include_directories(['include', '.'])

liburing = library('uring',
'queue.c',
'register.c',
'setup.c',
'syscall.c',
include_directories : inc,
version : lib_version,
link_args: '-Wl,--version-script=' + meson.current_source_dir() + '/liburing.map',
link_depends: 'liburing.map',
install : true)

uring = declare_dependency(link_with: liburing,
include_directories: inc)
Loading

0 comments on commit 6048e9f

Please sign in to comment.